@arcware-cloud/pixelstreaming-websdk 1.2.13 → 1.2.14
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/index.cjs.js +2 -3
- package/index.esm.js +1 -3
- package/index.umd.js +2 -3
- package/package.json +2 -2
- package/types/index.d.ts +0 -3
- package/types/lib/ApplyUrlHack.d.ts +0 -2
- package/types/lib/ArcwareApplication.d.ts +0 -48
- package/types/lib/ArcwareConfig.d.ts +0 -35
- package/types/lib/ArcwareInit.d.ts +0 -15
- package/types/lib/ArcwarePixelStreaming.d.ts +0 -97
- package/types/lib/MessageTypes.d.ts +0 -4
- package/types/lib/domain/ArcwareSettingsSchema.d.ts +0 -209
- package/types/lib/domain/ConnectionIdentifier.d.ts +0 -27
- package/types/lib/domain/EventHandler.d.ts +0 -11
- package/types/lib/domain/Session.d.ts +0 -29
- package/types/lib/domain/Stats.d.ts +0 -36
- package/types/lib/domain/debounce.d.ts +0 -1
- package/types/lib/index.d.ts +0 -6
- package/types/lib/styles/ArcwarePixelStreamingApplicationStyles.d.ts +0 -478
- package/types/lib/ui/ArcwareLogoLoader/index.d.ts +0 -6
- package/types/lib/ui/AudioButton/AudioIcon.d.ts +0 -7
- package/types/lib/ui/AudioButton/index.d.ts +0 -15
- package/types/lib/ui/LoveLetters/index.d.ts +0 -6
- package/types/lib/ui/MicButton/index.d.ts +0 -14
- package/types/lib/ui/MicIcon/index.d.ts +0 -7
- package/types/lib/ui/MicrophoneOverlay/index.d.ts +0 -11
- package/types/lib/ui/PlayIcon/index.d.ts +0 -5
- package/types/lib/ui/StopButton/index.d.ts +0 -16
- package/types/lib/ui/StopIcon/index.d.ts +0 -5
- package/types/shared/index.d.ts +0 -1
- package/types/shared/lib/Messages/ErrorMessage.d.ts +0 -18
- package/types/shared/lib/Messages/LoveLetter.d.ts +0 -18
- package/types/shared/lib/Messages/Ping.d.ts +0 -15
- package/types/shared/lib/Messages/Queue.d.ts +0 -58
- package/types/shared/lib/Messages/SessionId.d.ts +0 -12
- package/types/shared/lib/Messages/Stats.d.ts +0 -182
- package/types/shared/lib/Messages/StreamInfo.d.ts +0 -338
- package/types/shared/lib/Messages/Version.d.ts +0 -12
- package/types/shared/lib/Messages/WebSdkSettings.d.ts +0 -96
- package/types/shared/lib/Messages/index.d.ts +0 -192
- package/types/shared/lib/index.d.ts +0 -1
package/index.esm.js
CHANGED
|
@@ -23356,7 +23356,7 @@ class ArcwareConfig extends _epicgames_ps_lib_pixelstreamingfrontend_ue5_5__WEBP
|
|
|
23356
23356
|
if (!config.initialSettings.ss)
|
|
23357
23357
|
config.initialSettings.ss = DefaultUrl;
|
|
23358
23358
|
super(config);
|
|
23359
|
-
this.VERSION = "1.2.
|
|
23359
|
+
this.VERSION = "1.2.14";
|
|
23360
23360
|
this.settings = settings;
|
|
23361
23361
|
this.session = new _domain_Session__WEBPACK_IMPORTED_MODULE_0__.Session();
|
|
23362
23362
|
this._initialSettings = config.initialSettings;
|
|
@@ -30913,5 +30913,3 @@ var __webpack_exports__isOptionId = __webpack_exports__.isOptionId;
|
|
|
30913
30913
|
var __webpack_exports__isTextId = __webpack_exports__.isTextId;
|
|
30914
30914
|
var __webpack_exports__overrideLogger = __webpack_exports__.overrideLogger;
|
|
30915
30915
|
export { __webpack_exports__AFKOverlay as AFKOverlay, __webpack_exports__ActionOverlay as ActionOverlay, __webpack_exports__AfkLogic as AfkLogic, __webpack_exports__AfkTimedOutEvent as AfkTimedOutEvent, __webpack_exports__AfkWarningActivateEvent as AfkWarningActivateEvent, __webpack_exports__AfkWarningDeactivateEvent as AfkWarningDeactivateEvent, __webpack_exports__AfkWarningUpdateEvent as AfkWarningUpdateEvent, __webpack_exports__AggregatedStats as AggregatedStats, __webpack_exports__Application as Application, __webpack_exports__ArcwareApplication as ArcwareApplication, __webpack_exports__ArcwareConfig as ArcwareConfig, __webpack_exports__ArcwareInit as ArcwareInit, __webpack_exports__ArcwarePixelStreaming as ArcwarePixelStreaming, __webpack_exports__ArcwareStyles as ArcwareStyles, __webpack_exports__CandidatePairStats as CandidatePairStats, __webpack_exports__CandidateStat as CandidateStat, __webpack_exports__Config as Config, __webpack_exports__ConfigUI as ConfigUI, __webpack_exports__ConnectOverlay as ConnectOverlay, __webpack_exports__ControlSchemeType as ControlSchemeType, __webpack_exports__DataChannelCloseEvent as DataChannelCloseEvent, __webpack_exports__DataChannelErrorEvent as DataChannelErrorEvent, __webpack_exports__DataChannelLatencyTestRecord as DataChannelLatencyTestRecord, __webpack_exports__DataChannelLatencyTestResponseEvent as DataChannelLatencyTestResponseEvent, __webpack_exports__DataChannelLatencyTestResultEvent as DataChannelLatencyTestResultEvent, __webpack_exports__DataChannelOpenEvent as DataChannelOpenEvent, __webpack_exports__DataChannelStats as DataChannelStats, __webpack_exports__DefaultUrl as DefaultUrl, __webpack_exports__DisconnectOverlay as DisconnectOverlay, __webpack_exports__EncoderSettings as EncoderSettings, __webpack_exports__ErrorOverlay as ErrorOverlay, __webpack_exports__EventEmitter as EventEmitter, __webpack_exports__Flags as Flags, __webpack_exports__FrameTimingInfo as FrameTimingInfo, __webpack_exports__HideFreezeFrameEvent as HideFreezeFrameEvent, __webpack_exports__InboundAudioStats as InboundAudioStats, __webpack_exports__InboundVideoStats as InboundVideoStats, __webpack_exports__InfoOverlay as InfoOverlay, __webpack_exports__InitialSettings as InitialSettings, __webpack_exports__InitialSettingsEvent as InitialSettingsEvent, __webpack_exports__InputCoordTranslator as InputCoordTranslator, __webpack_exports__KeepaliveMonitor as KeepaliveMonitor, __webpack_exports__LatencyCalculatedEvent as LatencyCalculatedEvent, __webpack_exports__LatencyCalculator as LatencyCalculator, __webpack_exports__LatencyInfo as LatencyInfo, __webpack_exports__LatencyTestResultEvent as LatencyTestResultEvent, __webpack_exports__LatencyTestResults as LatencyTestResults, __webpack_exports__LoadFreezeFrameEvent as LoadFreezeFrameEvent, __webpack_exports__LogLevel as LogLevel, __webpack_exports__Logger as Logger, __webpack_exports__MessageDirection as MessageDirection, __webpack_exports__MessageHelpers as MessageHelpers, __webpack_exports__MessageRegistry as MessageRegistry, __webpack_exports__Messages as Messages, __webpack_exports__NumericParameters as NumericParameters, __webpack_exports__OptionParameters as OptionParameters, __webpack_exports__OutboundRTPStats as OutboundRTPStats, __webpack_exports__OverlayBase as OverlayBase, __webpack_exports__PixelStreaming as PixelStreaming, __webpack_exports__PixelStreamingApplicationStyle as PixelStreamingApplicationStyle, __webpack_exports__PixelStreamingEventEmitter as PixelStreamingEventEmitter, __webpack_exports__PixelStreamingSettings as PixelStreamingSettings, __webpack_exports__PlayOverlay as PlayOverlay, __webpack_exports__PlayStreamErrorEvent as PlayStreamErrorEvent, __webpack_exports__PlayStreamEvent as PlayStreamEvent, __webpack_exports__PlayStreamRejectedEvent as PlayStreamRejectedEvent, __webpack_exports__PlayerCountEvent as PlayerCountEvent, __webpack_exports__RemoteOutboundRTPStats as RemoteOutboundRTPStats, __webpack_exports__SDPUtils as SDPUtils, __webpack_exports__SettingBase as SettingBase, __webpack_exports__SettingFlag as SettingFlag, __webpack_exports__SettingNumber as SettingNumber, __webpack_exports__SettingOption as SettingOption, __webpack_exports__SettingText as SettingText, __webpack_exports__SettingUIBase as SettingUIBase, __webpack_exports__SettingUIFlag as SettingUIFlag, __webpack_exports__SettingUINumber as SettingUINumber, __webpack_exports__SettingUIOption as SettingUIOption, __webpack_exports__SettingUIText as SettingUIText, __webpack_exports__SettingsChangedEvent as SettingsChangedEvent, __webpack_exports__ShowOnScreenKeyboardEvent as ShowOnScreenKeyboardEvent, __webpack_exports__SignallingProtocol as SignallingProtocol, __webpack_exports__StatsReceivedEvent as StatsReceivedEvent, __webpack_exports__StreamLoadingEvent as StreamLoadingEvent, __webpack_exports__StreamPreConnectEvent as StreamPreConnectEvent, __webpack_exports__StreamPreDisconnectEvent as StreamPreDisconnectEvent, __webpack_exports__StreamReconnectEvent as StreamReconnectEvent, __webpack_exports__StreamerIDChangedMessageEvent as StreamerIDChangedMessageEvent, __webpack_exports__StreamerListMessageEvent as StreamerListMessageEvent, __webpack_exports__SubscribeFailedEvent as SubscribeFailedEvent, __webpack_exports__TextOverlay as TextOverlay, __webpack_exports__TextParameters as TextParameters, __webpack_exports__UIElementCreationMode as UIElementCreationMode, __webpack_exports__VideoEncoderAvgQPEvent as VideoEncoderAvgQPEvent, __webpack_exports__VideoInitializedEvent as VideoInitializedEvent, __webpack_exports__WebRTCSettings as WebRTCSettings, __webpack_exports__WebRtcAutoConnectEvent as WebRtcAutoConnectEvent, __webpack_exports__WebRtcConnectedEvent as WebRtcConnectedEvent, __webpack_exports__WebRtcConnectingEvent as WebRtcConnectingEvent, __webpack_exports__WebRtcDisconnectedEvent as WebRtcDisconnectedEvent, __webpack_exports__WebRtcFailedEvent as WebRtcFailedEvent, __webpack_exports__WebRtcPlayerController as WebRtcPlayerController, __webpack_exports__WebRtcSdpAnswerEvent as WebRtcSdpAnswerEvent, __webpack_exports__WebRtcSdpEvent as WebRtcSdpEvent, __webpack_exports__WebRtcSdpOfferEvent as WebRtcSdpOfferEvent, __webpack_exports__WebRtcTCPRelayDetectedEvent as WebRtcTCPRelayDetectedEvent, __webpack_exports__WebSocketTransport as WebSocketTransport, __webpack_exports__WebSocketTransportNJS as WebSocketTransportNJS, __webpack_exports__WebXRController as WebXRController, __webpack_exports__XrFrameEvent as XrFrameEvent, __webpack_exports__XrSessionEndedEvent as XrSessionEndedEvent, __webpack_exports__XrSessionStartedEvent as XrSessionStartedEvent, __webpack_exports__isFlagId as isFlagId, __webpack_exports__isNumericId as isNumericId, __webpack_exports__isOptionId as isOptionId, __webpack_exports__isTextId as isTextId, __webpack_exports__overrideLogger as overrideLogger };
|
|
30916
|
-
|
|
30917
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXNtLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzQkFBc0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFLGdFQUFnRTtBQUM1STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFLGdFQUFnRTtBQUM1STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZUFBZTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSw4Q0FBOEMsS0FBSyxJQUFJLE1BQU07QUFDN0QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxZQUFZO0FBQzFELFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDaFBBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRCQUE0QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDN0VBO0FBQ3NFO0FBQzFCO0FBQzVDO0FBQ0E7QUFDQTtBQUNPLDRCQUE0QixxREFBVztBQUM5QztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxzRkFBWSxtQkFBbUIsTUFBTSwrQkFBK0IsU0FBUztBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzVFQTtBQUM0QztBQUM1QztBQUNBO0FBQ0E7QUFDTywwQkFBMEIscURBQVc7QUFDNUM7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNB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c0U7QUFDbEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ08sb0NBQW9DLDZEQUFlO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUZBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFDc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUZBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0NBQXNDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0NBQXNDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXLEtBQUsscUNBQXFDLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZIQTtBQUM2QztBQUM3QztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMseURBQWE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLHlEQUFhO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isc0ZBQVksMENBQTBDLFdBQVc7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ2xUQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0SUFBNEksS0FBSztBQUNqSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlIQUFpSCxLQUFLO0FBQ3RIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMz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QUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxRkFBVyw4QkFBOEIsaUJBQWlCO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0Q0FBNEM7QUFDN0M7Ozs7Ozs7Ozs7O0FDak5BO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM3Q0E7QUFDc0U7QUFDL0Q7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksd0ZBQWM7QUFDMUIsd0VBQXdFLHFCQUFxQjtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLHFCQUFxQjtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ25ZQTtBQUNzRTtBQUN0RTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0E7QUFDQSxRQUFRLHFGQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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cUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGO0FBQ0EsU0FBUztBQUNULDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGO0FBQ0EsU0FBUztBQUNULDREQUE0RCxxR0FBNkI7QUFDekY7QUFDQSw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2RjtBQUNBLFNBQVM7QUFDVCw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFD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QUFDQSxRQUFRLHFGQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELG1FQUF1QjtBQUM5RTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSx1Q0FBdUMsNERBQVksR0FBRyxhQUFhO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBOzs7Ozs7Ozs7OztBQ3BWQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeEJBO0FBQ2dEO0FBQ3pDLDRCQUE0Qix5REFBYTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDekdBO0FBQ3dFO0FBQ3hCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNPLDhCQUE4Qix5REFBYTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JDQTtBQUM0QztBQUM1QztBQUNBO0FBQ0E7QUFDTywyQkFBMkIscURBQVc7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDL0JBO0FBQzRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQixxREFBVztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMvQkE7QUFDZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ08sMEJBQTBCLHlEQUFhO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdkNBO0FBQzRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNPLDBCQUEwQixxREFBVztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ3pCQTtBQUNzQjtBQUNpQjtBQUNPO0FBQ3ZDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYiw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdEdBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZMQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDakRBO0FBQ3dFO0FBQ2pCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyw0RUFBeUI7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdUZBQVc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUMvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwREE7QUFDNEM7QUFDNEI7QUFDMUI7QUFDb0I7QUFDTztBQUN6RTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxXQUFXO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsV0FBVztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFdBQVc7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsV0FBVztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDaExBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDOUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ3dEO0FBQ2tDO0FBQ3hDO0FBQ007QUFDSjtBQUNNO0FBQ007QUFDVjtBQUNGO0FBQ0E7QUFDQTtBQUNQO0FBQ1U7QUFDQTtBQUNJO0FBQ0E7QUFDSjtBQUNXO0FBQ2xFOzs7Ozs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxQkFBcUI7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLFdBQVc7QUFDWCxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ2hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDZCQUE2QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIscUJBQXFCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsa0RBQWtEO0FBQ25EO0FBQ0E7QUFDQTtBQUNPO0FBQ1AseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0QkFBNEI7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvRnVCO0FBQ1I7QUFDZTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsbURBQW1EO0FBQ25EO0FBQ087QUFDUDtBQUNBLHdCQUF3QixzREFBWSxFQUFFO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzREFBWSxFQUFFO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixvRUFBZTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixtRUFBYztBQUMvQjtBQUNBLGlCQUFpQixtRUFBYztBQUMvQjtBQUNBO0FBQ0EsaUJBQWlCLDZFQUF3QjtBQUN6QztBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsd0VBQW1CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxzRUFBaUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsNENBQU07QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw2Q0FBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw0Q0FBTTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsNkNBQU87QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw0Q0FBTTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqTDRDO0FBQ2lCO0FBQ087QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLG1EQUFtRDtBQUNuRDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQSx3QkFBd0Isd0JBQXdCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix3QkFBd0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsb0NBQW9DO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxxREFBWTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLG9EQUFXO0FBQ25CLFFBQVEsMkRBQWE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxzREFBYTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEscURBQVk7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsb0RBQVc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsb0RBQVc7QUFDbkI7QUFDQTtBQUNBLFFBQVEsMkRBQWE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpREFBVztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixrREFBWTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlEQUFXO0FBQzlCLFFBQVEsMkRBQWE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGlEQUFXO0FBQzlCO0FBQ0E7QUFDQSxRQUFRLDJEQUFhO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixrREFBWTtBQUMvQixRQUFRLDJEQUFhO0FBQ3JCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0Esd0JBQXdCLFlBQVk7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixPQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzQ0FBc0M7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDeFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOzs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOZ0Q7QUFDQTtBQUNPO0FBQ0U7QUFDQTtBQUNJO0FBQ0E7QUFDYjtBQUNhO0FBQ25CO0FBQzJCO0FBQ3JCO0FBQ0Y7QUFDRDtBQUNwRCxpRkFBaUY7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxnRUFBa0I7QUFDbkQ7QUFDQSxrRkFBa0Ysc0JBQXNCLENBQUMsZ0VBQVksS0FBSyxlQUFlO0FBQ3pJLGdDQUFnQyx1RUFBbUI7QUFDbkQsaUNBQWlDLHlFQUFvQjtBQUNyRCxpQ0FBaUMseUVBQW9CO0FBQ3JELGdDQUFnQyw2RUFBc0I7QUFDdEQsZ0NBQWdDLDZFQUFzQjtBQUN0RDtBQUNBO0FBQ0Esc0JBQXNCLG9FQUFnQjtBQUN0QztBQUNBLFlBQVksaUZBQXNCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxpRkFBc0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvRUFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGlGQUFzQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGtFQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsdUVBQWU7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0Msd0VBQWdCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsbUVBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELGVBQWUsWUFBWSwrREFBZSxPQUFPO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3hHK0Q7QUFDL0Q7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLDZEQUFlO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCwyREFBYTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw2REFBZTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBCQUEwQiwyQkFBMkI7QUFDckQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBCQUEwQiwyQkFBMkI7QUFDckQsc0RBQXNEO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiw4RUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssZ0JBQWdCO0FBQ3JCO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUMsOEVBQVEsR0FBRztBQUM5QztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDBCQUEwQiwyQkFBMkI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtEQUFrRDs7QUFFbEQ7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsd0JBQXdCLDJCQUEyQjtBQUNuRDtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw4RUFBUSxHQUFHO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBLGtDQUFrQztBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUNBQXVDO0FBQzNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQix3Q0FBd0M7QUFDNUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQix5Q0FBeUM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IseUNBQXlDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLG1DQUFtQztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQix3Q0FBd0M7QUFDNUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUErQzs7QUFFL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxV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Q0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsOEVBQVEsR0FBRztBQUNqQztBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDJFQUEyRSxhQUFhO0FBQ3hGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSx3REFBTztBQUNYO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLE1BQU0sd0RBQU87QUFDYjtBQUNBOztBQUVBLEVBQUUsa0ZBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWUsS0FBSyxFQUFDO0FBQ3lJOzs7Ozs7OztBQ2h2RTlKO0FBQ2E7O0FBRWI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CO0FBQ3BCLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQsa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCLE9BQU87QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQSwwREFBMEQ7QUFDMUQsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGlEQUFpRDtBQUN2RjtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHlCQUF5QjtBQUMvRDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHVCQUF1QjtBQUM3RDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxnQ0FBZ0MsK0NBQStDO0FBQy9FO0FBQ0E7QUFDQSxnQ0FBZ0MsNkNBQTZDO0FBQzdFO0FBQ0E7QUFDQSxnQ0FBZ0MsK0NBQStDO0FBQy9FO0FBQ0E7QUFDQSxnQ0FBZ0MsOENBQThDO0FBQzlFO0FBQ0E7QUFDQSxnQ0FBZ0MsOENBQThDO0FBQzlFO0FBQ0E7QUFDQSxnQ0FBZ0MsK0NBQStDO0FBQy9FO0FBQ0E7QUFDQSxnQ0FBZ0MsOENBQThDO0FBQzlFO0FBQ0E7QUFDQSxnQ0FBZ0MsNENBQTRDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGNBQWM7QUFDMUQsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLHFCQUFxQjtBQUNqRSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMscUJBQXFCO0FBQ2pFLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsTUFBTTtBQUN0QjtBQUNBLG1DQUFtQyw2Q0FBNkM7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRTRxRDs7Ozs7OztTQ2g3SDdxRDtTQUNBOztTQUVBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBOztTQUVBO1NBQ0E7O1NBRUE7U0FDQTtTQUNBOzs7OztVQ3RCQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0EsaUNBQWlDLFdBQVc7VUFDNUM7VUFDQTs7Ozs7VUNQQTtVQUNBO1VBQ0E7VUFDQTtVQUNBLHlDQUF5Qyx3Q0FBd0M7VUFDakY7VUFDQTtVQUNBOzs7OztVQ1BBOzs7OztVQ0FBO1VBQ0E7VUFDQTtVQUNBLHVEQUF1RCxpQkFBaUI7VUFDeEU7VUFDQSxnREFBZ0QsYUFBYTtVQUM3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ04rRDtBQUNHO0FBQzVDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9FdmVudC9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9Mb2dnZXIvTG9nZ2VyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vTWVzc2FnZXMvbWVzc2FnZV9oZWxwZXJzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vTWVzc2FnZXMvbWVzc2FnZV9yZWdpc3RyeS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41L2Rpc3QvZXNtL01lc3NhZ2VzL3NpZ25hbGxpbmdfbWVzc2FnZXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9Qcm90b2NvbC9LZWVwYWxpdmVNb25pdG9yLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vUHJvdG9jb2wvU2lnbmFsbGluZ1Byb3RvY29sLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vVHJhbnNwb3J0L1dlYlNvY2tldFRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41L2Rpc3QvZXNtL1RyYW5zcG9ydC9XZWJTb2NrZXRUcmFuc3BvcnROSlMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9VdGlsL1NkcFV0aWxzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vcGl4ZWxzdHJlYW1pbmdjb21tb24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0FGSy9BRktDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9Db25maWcvQ29uZmlnLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9Db25maWcvU2V0dGluZ0Jhc2UuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nRmxhZy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdOdW1iZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nT3B0aW9uLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9Db25maWcvU2V0dGluZ1RleHQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0RhdGFDaGFubmVsL0RhdGFDaGFubmVsQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vRGF0YUNoYW5uZWwvRGF0YUNoYW5uZWxMYXRlbmN5VGVzdENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0RhdGFDaGFubmVsL0RhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXN1bHRzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbFNlbmRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vRGF0YUNoYW5uZWwvSW5pdGlhbFNldHRpbmdzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9EYXRhQ2hhbm5lbC9MYXRlbmN5VGVzdFJlc3VsdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0ZyZWV6ZUZyYW1lL0ZyZWV6ZUZyYW1lLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9GcmVlemVGcmFtZS9GcmVlemVGcmFtZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9HYW1lcGFkQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL0dhbWVwYWRUeXBlcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL0lucHV0Q2xhc3Nlc0ZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9LZXlDb2Rlcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL0tleWJvYXJkQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL01vdXNlQnV0dG9ucy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL01vdXNlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL01vdXNlQ29udHJvbGxlckhvdmVyaW5nLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvTW91c2VDb250cm9sbGVyTG9ja2VkLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvU3BlY2lhbEtleUNvZGVzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvVG91Y2hDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvVG91Y2hDb250cm9sbGVyRmFrZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL1hSR2FtZXBhZENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9BZ2dyZWdhdGVkU3RhdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9DYW5kaWRhdGVQYWlyU3RhdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9DYW5kaWRhdGVTdGF0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvRGF0YUNoYW5uZWxTdGF0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0luYm91bmRSVFBTdGF0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0xhdGVuY3lDYWxjdWxhdG9yLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvT3V0Qm91bmRSVFBTdGF0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL1Nlc3Npb25TdGF0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL1N0cmVhbVN0YXRzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9QaXhlbFN0cmVhbWluZy9QaXhlbFN0cmVhbWluZy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVWVJbnN0YW5jZU1lc3NhZ2UvUmVzcG9uc2VDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9VZUluc3RhbmNlTWVzc2FnZS9TZW5kTWVzc2FnZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1VlSW5zdGFuY2VNZXNzYWdlL1N0cmVhbU1lc3NhZ2VDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9VZUluc3RhbmNlTWVzc2FnZS9Ub1N0cmVhbWVyTWVzc2FnZXNDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9VdGlsL0Jyb3dzZXJVdGlscy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVXRpbC9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1V0aWwvRmlsZVV0aWwuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1V0aWwvSVVSTFNlYXJjaFBhcmFtcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVXRpbC9JbnB1dENvb3JkVHJhbnNsYXRvci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVXRpbC9SVENVdGlscy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVmlkZW9QbGF5ZXIvU3RyZWFtQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVmlkZW9QbGF5ZXIvVmlkZW9QbGF5ZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1dlYlJ0Y1BsYXllci9XZWJSdGNQbGF5ZXJDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9XZWJYUi9XZWJYUkNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL3BpeGVsc3RyZWFtaW5nZnJvbnRlbmQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL0FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9Db25maWcvQ29uZmlnVUkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nVUlCYXNlLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9Db25maWcvU2V0dGluZ1VJRmxhZy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdVSU51bWJlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdVSU9wdGlvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdVSVRleHQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL092ZXJsYXkvQUZLT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9BY3Rpb25PdmVybGF5LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9PdmVybGF5L0Jhc2VPdmVybGF5LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9PdmVybGF5L0Nvbm5lY3RPdmVybGF5LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9PdmVybGF5L0Rpc2Nvbm5lY3RPdmVybGF5LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9PdmVybGF5L0Vycm9yT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9JbmZvT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9QbGF5T3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9UZXh0T3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vU3R5bGVzL1BpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL0NvbnRyb2xzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9EYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9FZGl0VGV4dE1vZGFsLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9GdWxsc2NyZWVuSWNvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvTGFiZWxsZWRCdXR0b24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL0xhdGVuY3lUZXN0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9TZXR0aW5nc0ljb24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1N0YXRzSWNvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvU3RhdHNQYW5lbC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvVUlDb25maWd1cmF0aW9uVHlwZXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1ZpZGVvUXBJbmRpY2F0b3IuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1hSSWNvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVXRpbC9NYXRoVXRpbHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL3BpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvYXNzZXJ0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2Jhc2U2NC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9iaW5hcnktZm9ybWF0LWNvbnRyYWN0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2JpbmFyeS1yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvYmluYXJ5LXdyaXRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9nb29nLXZhcmludC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9qc29uLWZvcm1hdC1jb250cmFjdC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9qc29uLXR5cGluZ3MuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvbG93ZXItY2FtZWwtY2FzZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9tZXNzYWdlLXR5cGUtY29udHJhY3QuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvbWVzc2FnZS10eXBlLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L29uZW9mLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3BiLWxvbmcuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1iaW5hcnktcmVhZGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tYmluYXJ5LXdyaXRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWVxdWFscy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWluZm8uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1qc29uLXJlYWRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWpzb24td3JpdGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tbG9uZy1jb252ZXJ0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tbWVyZ2UtcGFydGlhbC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLXNjYWxhci1kZWZhdWx0LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tdHlwZS1jaGVjay5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9fbGliL3RvSW50ZWdlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9hZGRNaWxsaXNlY29uZHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vYWRkU2Vjb25kcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS9pc0JlZm9yZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2RhdGUtZm5zL2VzbS90b0RhdGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9oeXBoZW5hdGUtc3R5bGUtbmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL2lzLWluLWJyb3dzZXIvZGlzdC9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9qc3MtcGx1Z2luLWNhbWVsLWNhc2UvZGlzdC9qc3MtcGx1Z2luLWNhbWVsLWNhc2UuZXNtLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvanNzLXBsdWdpbi1nbG9iYWwvZGlzdC9qc3MtcGx1Z2luLWdsb2JhbC5lc20uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9qc3MvZGlzdC9qc3MuZXNtLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvc2RwL3NkcC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL3Rpbnktd2FybmluZy9kaXN0L3Rpbnktd2FybmluZy5lc20uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvQXBwbHlVcmxIYWNrLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL0FyY3dhcmVBcHBsaWNhdGlvbi50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9BcmN3YXJlQ29uZmlnLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL0FyY3dhcmVJbml0LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL0FyY3dhcmVQaXhlbFN0cmVhbWluZy50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9kb21haW4vQXJjd2FyZVNldHRpbmdzU2NoZW1hLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL2RvbWFpbi9Db25uZWN0aW9uSWRlbnRpZmllci50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9kb21haW4vRXZlbnRIYW5kbGVyLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL2RvbWFpbi9TZXNzaW9uLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL2RvbWFpbi9TdGF0cy50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9kb21haW4vZGVib3VuY2UudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvc3R5bGVzL0FyY3dhcmVQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL0FyY3dhcmVMb2dvTG9hZGVyL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL0F1ZGlvQnV0dG9uL0F1ZGlvSWNvbi50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9BdWRpb0J1dHRvbi9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9Mb3ZlTGV0dGVycy9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9NaWNCdXR0b24vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvdWkvTWljSWNvbi9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9NaWNyb3Bob25lT3ZlcmxheS9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9QbGF5SWNvbi9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9TdG9wQnV0dG9uL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL1N0b3BJY29uL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9FcnJvck1lc3NhZ2UudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL0xvdmVMZXR0ZXIudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1BpbmcudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1F1ZXVlLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9TZXNzaW9uSWQudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1N0YXRzLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9TdHJlYW1JbmZvLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9WZXJzaW9uLnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9XZWJTZGtTZXR0aW5ncy50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL3NoYXJlZC9saWIvTWVzc2FnZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvd3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1ByaW1pdGl2ZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvUHJvcGVydHlLZXkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC8uL25vZGVfbW9kdWxlcy96b2QvbGliL2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS1jbG91ZC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2FyY3dhcmUtY2xvdWQvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9hcmN3YXJlLWNsb3VkLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBUbyBtYXRjaCBOb2RlSlMnIEV2ZW50RW1pdHRlciBzeW50YXggd2l0aG91dCBkb3duc3RyZWFtIGNvZGUgY2hhbmdlcyB3ZSBuZWVkIHRvIHVzZSBgYW55YC5cbi8vIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBkaXNhYmxlIGxpbnRpbmcgYGFueWAgY2hlY2tzIG9uIHRoaXMgZmlsZS5cbi8vXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5jbGFzcyBQaXhlbFN0cmVhbWluZ0V2ZW50TGlzdGVuZXIge1xuICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX2FyZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgaGFuZGxlRXZlbnQoX2V2dCkge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayguLi50aGlzLl9hcmdzKTtcbiAgICAgICAgLy8gUmVzZXQgc3RvcmFnZSBvZiBhcmdzLlxuICAgICAgICB0aGlzLl9hcmdzID0gW107XG4gICAgfVxuICAgIHNldEFyZ3MoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9hcmdzID0gYXJncztcbiAgICB9XG59XG4vKipcbiAqIEEgZmVhdHVyZS1saW1pdGVkLCBidXQgX21vc3RseV8gZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgTm9kZSdzIEV2ZW50RW1pdHRlciB0eXBlIHRoYXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgRXZlbnRUYXJnZXQuXG4gKlxuICogRm9yIHRob3NlIHVuZmFtaWxpYXIgd2l0aCBOb2RlJ3MgRXZlbnRFbWl0dGVyLCBoZXJlIGlzIHNvbWUgaW5mbyBmcm9tIHRoZSBvZmZpY2lhbCBkb2NzOlxuICpcbiAqIFtJbiBOb2RlSlNdIGFsbCBvYmplY3RzIHRoYXQgZW1pdCBldmVudHMgYXJlIGluc3RhbmNlcyBvZiB0aGUgYEV2ZW50RW1pdHRlcmAgY2xhc3MuIFRoZXNlXG4gKiBvYmplY3RzIGV4cG9zZSBhbiBgZXZlbnRFbWl0dGVyLm9uKClgIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIG9uZSBvciBtb3JlXG4gKiBmdW5jdGlvbnMgdG8gYmUgYXR0YWNoZWQgdG8gbmFtZWQgZXZlbnRzIGVtaXR0ZWQgYnkgdGhlIG9iamVjdC4gVHlwaWNhbGx5LFxuICogZXZlbnQgbmFtZXMgYXJlIGNhbWVsLWNhc2VkIHN0cmluZ3MgYnV0IGFueSB2YWxpZCBKYXZhU2NyaXB0IHByb3BlcnR5IGtleVxuICogY2FuIGJlIHVzZWQuXG4gKlxuICogV2hlbiB0aGUgYEV2ZW50RW1pdHRlcmAgb2JqZWN0IGVtaXRzIGFuIGV2ZW50LCBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBhdHRhY2hlZFxuICogdG8gdGhhdCBzcGVjaWZpYyBldmVudCBhcmUgY2FsbGVkIF9zeW5jaHJvbm91c2x5Xy4gQW55IHZhbHVlcyByZXR1cm5lZCBieSB0aGVcbiAqIGNhbGxlZCBsaXN0ZW5lcnMgYXJlIF9pZ25vcmVkXyBhbmQgZGlzY2FyZGVkLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHNpbXBsZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZSB3aXRoIGEgc2luZ2xlXG4gKiBsaXN0ZW5lci4gVGhlIGBldmVudEVtaXR0ZXIub24oKWAgbWV0aG9kIGlzIHVzZWQgdG8gcmVnaXN0ZXIgbGlzdGVuZXJzLCB3aGlsZVxuICogdGhlIGBldmVudEVtaXR0ZXIuZW1pdCgpYCBtZXRob2QgaXMgdXNlZCB0byB0cmlnZ2VyIHRoZSBldmVudC5cbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuICpcbiAqIGNsYXNzIE15RW1pdHRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7fVxuICpcbiAqIGNvbnN0IG15RW1pdHRlciA9IG5ldyBNeUVtaXR0ZXIoKTtcbiAqIG15RW1pdHRlci5vbignZXZlbnQnLCAoKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdhbiBldmVudCBvY2N1cnJlZCEnKTtcbiAqIH0pO1xuICogbXlFbWl0dGVyLmVtaXQoJ2V2ZW50Jyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIHJlbW92ZUxpc3RlbmVySW50ZXJuYWwoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAodGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGFpciA9IGxpc3RlbmVyc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRQYWlyLmNhbGxiYWNrID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSBldmVudCB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50UGFpci5ldmVudExpc3RlbmVyV3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIG91ciBpbnRlcm5hbCBtYXBcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgYGVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcilgLlxuICAgICAqL1xuICAgIGFkZExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGBsaXN0ZW5lcmAgZnVuY3Rpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdGVuZXJzIGFycmF5IGZvciB0aGUgZXZlbnRcbiAgICAgKiBuYW1lZCBgZXZlbnROYW1lYC5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogc2VydmVyLm9uKCdjb25uZWN0aW9uJywgKHN0cmVhbSkgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coJ3NvbWVvbmUgY29ubmVjdGVkIScpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAsIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBXcmFwIG91ciBub3JtYWwgSlMgZnVuY3Rpb24gaW4gYSBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2VcbiAgICAgICAgLy8gc28gd2UgY2FuIHVzZSBpdCB3aXRoIGV2ZW50IHRhcmdldC5cbiAgICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcldyYXBwZXIgPSBuZXcgUGl4ZWxTdHJlYW1pbmdFdmVudExpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgICAgc3VwZXIuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50TGlzdGVuZXJXcmFwcGVyKTtcbiAgICAgICAgLy8gU3RvcmUgdGhlIGV2ZW50IGxpc3RlbmVyL2Z1bmN0aW9uIHBhaXIgZm9yIGxhdGVyIHJlbW92YWwuXG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ldyBBcnJheSgpKTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLl9ldmVudExpc3RlbmVyc1xuICAgICAgICAgICAgLmdldChldmVudE5hbWUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHVzaCh7IGNhbGxiYWNrOiBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lcldyYXBwZXI6IGV2ZW50TGlzdGVuZXJXcmFwcGVyIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhICoqb25lLXRpbWUqKiBgbGlzdGVuZXJgIGZ1bmN0aW9uIGZvciB0aGUgZXZlbnQgbmFtZWQgYGV2ZW50TmFtZWAuIFRoZVxuICAgICAqIG5leHQgdGltZSBgZXZlbnROYW1lYCBpcyB0cmlnZ2VyZWQsIHRoaXMgbGlzdGVuZXIgaXMgcmVtb3ZlZCBhbmQgdGhlbiBpbnZva2VkLlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBzZXJ2ZXIub25jZSgnY29ubmVjdGlvbicsIChzdHJlYW0pID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdBaCwgd2UgaGF2ZSBvdXIgZmlyc3QgdXNlciEnKTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkLlxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgb25jZShldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gUGFzcyBvcHRpb25zIHNvIHRoaXMgZXZlbnQgY2FsbGJhY2sgaXMgb25seSBjYWxsZWQgb25jZVxuICAgICAgICBjb25zdCBldmVudExpc3RlbmVyT3B0cyA9IHsgb25jZTogdHJ1ZSB9O1xuICAgICAgICAvLyBXcmFwIG91ciBub3JtYWwgSlMgZnVuY3Rpb24gaW4gYSBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2VcbiAgICAgICAgLy8gc28gd2UgY2FuIHVzZSBpdCB3aXRoIGV2ZW50IHRhcmdldCBhbmQgcmVtb3ZlIGl0IGZyb20gZXZlbnQgdGFyZ2V0IHdoZW4gdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMuXG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJXcmFwcGVyID0gbmV3IFBpeGVsU3RyZWFtaW5nRXZlbnRMaXN0ZW5lcigoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIoYXJncyk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVySW50ZXJuYWwoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgICAgIH0pO1xuICAgICAgICBzdXBlci5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lcldyYXBwZXIsIGV2ZW50TGlzdGVuZXJPcHRzKTtcbiAgICAgICAgLy8gU3RvcmUgdGhlIGV2ZW50IGxpc3RlbmVyL2Z1bmN0aW9uIHBhaXIgZm9yIGxhdGVyIHJlbW92YWwuXG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLnNldChldmVudE5hbWUsIG5ldyBBcnJheSgpKTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLl9ldmVudExpc3RlbmVyc1xuICAgICAgICAgICAgLmdldChldmVudE5hbWUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHVzaCh7IGNhbGxiYWNrOiBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lcldyYXBwZXI6IGV2ZW50TGlzdGVuZXJXcmFwcGVyIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGBsaXN0ZW5lcmAgZnJvbSB0aGlzIEV2ZW50RW1pdHRlci5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY2FsbGJhY2sgPSAoc3RyZWFtKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZygnc29tZW9uZSBjb25uZWN0ZWQhJyk7XG4gICAgICogfTtcbiAgICAgKiBzZXJ2ZXIub24oJ2Nvbm5lY3Rpb24nLCBjYWxsYmFjayk7XG4gICAgICogLy8gLi4uXG4gICAgICogc2VydmVyLnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0aW9uJywgY2FsbGJhY2spO1xuICAgICAqIGBgYFxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgLCBzbyB0aGF0IGNhbGxzIGNhbiBiZSBjaGFpbmVkLlxuICAgICAqL1xuICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lckludGVybmFsKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIGBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKClgLlxuICAgICAqL1xuICAgIG9mZihldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgYGV2ZW50TmFtZWAuXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAsIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWQuXG4gICAgICovXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50TmFtZSkge1xuICAgICAgICBpZiAodGhpcy5fZXZlbnRMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZW1vdmUgZWFjaCBldmVudCBsaXN0ZW5lciBmcm9tIHRoZSBldmVudCB0YXJnZXRcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXJQYWlyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyUGFpci5ldmVudExpc3RlbmVyV3JhcHBlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBtYXBwZWQgdG8gdGhpcyBldmVudCBmcm9tIG91ciBpbnRlcm5hbCBtYXBcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmRlbGV0ZShldmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91c2x5IGNhbGxzIGVhY2ggb2YgdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciB0aGUgZXZlbnQgbmFtZWQgYGV2ZW50TmFtZWAsIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgcmVnaXN0ZXJlZCwgcGFzc2luZyB0aGUgc3VwcGxpZWQgYXJndW1lbnRzXG4gICAgICogdG8gZWFjaC5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBldmVudCBoYWQgbGlzdGVuZXJzLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuICAgICAqIGNvbnN0IG15RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgKlxuICAgICAqIC8vIEZpcnN0IGxpc3RlbmVyXG4gICAgICogbXlFbWl0dGVyLm9uKCdldmVudCcsIGZ1bmN0aW9uIGZpcnN0TGlzdGVuZXIoKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnSGVsbG9vb28hIGZpcnN0IGxpc3RlbmVyJyk7XG4gICAgICogfSk7XG4gICAgICogLy8gU2Vjb25kIGxpc3RlbmVyXG4gICAgICogbXlFbWl0dGVyLm9uKCdldmVudCcsIGZ1bmN0aW9uIHNlY29uZExpc3RlbmVyKGFyZzEsIGFyZzIpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBldmVudCB3aXRoIHBhcmFtZXRlcnMgJHthcmcxfSwgJHthcmcyfSBpbiBzZWNvbmQgbGlzdGVuZXJgKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyBUaGlyZCBsaXN0ZW5lclxuICAgICAqIG15RW1pdHRlci5vbignZXZlbnQnLCBmdW5jdGlvbiB0aGlyZExpc3RlbmVyKC4uLmFyZ3MpIHtcbiAgICAgKiAgIGNvbnN0IHBhcmFtZXRlcnMgPSBhcmdzLmpvaW4oJywgJyk7XG4gICAgICogICBjb25zb2xlLmxvZyhgZXZlbnQgd2l0aCBwYXJhbWV0ZXJzICR7cGFyYW1ldGVyc30gaW4gdGhpcmQgbGlzdGVuZXJgKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG15RW1pdHRlci5saXN0ZW5lcnMoJ2V2ZW50JykpO1xuICAgICAqXG4gICAgICogbXlFbWl0dGVyLmVtaXQoJ2V2ZW50JywgMSwgMiwgMywgNCwgNSk7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHM6XG4gICAgICogLy8gW1xuICAgICAqIC8vICAgW0Z1bmN0aW9uOiBmaXJzdExpc3RlbmVyXSxcbiAgICAgKiAvLyAgIFtGdW5jdGlvbjogc2Vjb25kTGlzdGVuZXJdLFxuICAgICAqIC8vICAgW0Z1bmN0aW9uOiB0aGlyZExpc3RlbmVyXVxuICAgICAqIC8vIF1cbiAgICAgKiAvLyBIZWxsb29vbyEgZmlyc3QgbGlzdGVuZXJcbiAgICAgKiAvLyBldmVudCB3aXRoIHBhcmFtZXRlcnMgMSwgMiBpbiBzZWNvbmQgbGlzdGVuZXJcbiAgICAgKiAvLyBldmVudCB3aXRoIHBhcmFtZXRlcnMgMSwgMiwgMywgNCwgNSBpbiB0aGlyZCBsaXN0ZW5lclxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLl9ldmVudExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFbnN1cmUgZWFjaCBvZiBvdXIgbGlzdGVuZXJzIGhhdmUgdGhlIGFyZ3MgdGhlIGNhbGxiYWNrIGluamVjdGVkXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyUGFpciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lclBhaXIuZXZlbnRMaXN0ZW5lcldyYXBwZXIuc2V0QXJncyguLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZpcmUgb2ZmIHRoZSBhY3R1YWwgZXZlbnRcbiAgICAgICAgICAgIHN1cGVyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KGV2ZW50TmFtZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV2ZW50RW1pdHRlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IHZhciBMb2dMZXZlbDtcbihmdW5jdGlvbiAoTG9nTGV2ZWwpIHtcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkRpc2FibGVkXCJdID0gMF0gPSBcIkRpc2FibGVkXCI7XG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJFcnJvclwiXSA9IDFdID0gXCJFcnJvclwiO1xuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiV2FybmluZ1wiXSA9IDJdID0gXCJXYXJuaW5nXCI7XG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJJbmZvXCJdID0gM10gPSBcIkluZm9cIjtcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkRlYnVnXCJdID0gNF0gPSBcIkRlYnVnXCI7XG59KShMb2dMZXZlbCB8fCAoTG9nTGV2ZWwgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZ2xvYmFsIGNvbnRleHQgZm9yIHRoZSBsb2dnZXIgY29uZmlndXJhdGlvbi5cbiAqIFRoaXMgY2Fubm90IGJlIHN0b3JlZCBzdGF0aWNhbGx5IGluIHRoZSBMb2dnZXIgY2xhc3MgYmVjYXVzZSB3ZSBzb21ldGltZXMgaGF2ZSBtdWx0aXBsZSBleGVjdXRpb25cbiAqIGNvbnRleHRzLCBzdWNoIGFzIHN0YXRzIHJlcG9ydGluZy4gSW5zdGVhZCB3ZSBzdG9yZSB0aGUgbG9nZ2VyIGNvbmZpZyBjb250ZXh0IG9uIHRoZSB3aW5kb3cgb2JqZWN0XG4gKiB0byBiZSBzaGFyZWQgd2l0aCBhbnkgTG9nZ2VyIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dlckNvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxvZ0xldmVsID0gTG9nTGV2ZWwuRGVidWc7XG4gICAgICAgIHRoaXMuaW5jbHVkZVN0YWNrID0gdHJ1ZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVMb2dnZXIobG9nZ2VyKSB7XG4gICAgTG9nZ2VyID0gbG9nZ2VyO1xufVxuLyoqXG4gKiBBIGJhc2ljIGNvbnNvbGUgbG9nZ2VyIHV0aWxpemVkIGJ5IHRoZSBQaXhlbCBTdHJlYW1pbmcgZnJvbnRlbmQgdG8gYWxsb3dcbiAqIGxvZ2dpbmcgdG8gdGhlIGJyb3dzZXIgY29uc29sZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dlclR5cGUge1xuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbG9nIHZlcmJvc2l0eSBsZXZlbFxuICAgICAqL1xuICAgIEluaXRMb2dnaW5nKGxvZ0xldmVsLCBpbmNsdWRlU3RhY2spIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmxvZ0xldmVsID0gbG9nTGV2ZWw7XG4gICAgICAgIHRoaXMuY29udGV4dC5pbmNsdWRlU3RhY2sgPSBpbmNsdWRlU3RhY2s7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ2dpbmcgb3V0cHV0IGZvciBkZWJ1Z2dpbmdcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgICAqL1xuICAgIERlYnVnKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb2dMZXZlbCA+PSBMb2dMZXZlbC5EZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5Db21tb25Mb2coJ0RlYnVnJywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQmFzaWMgbG9nZ2luZyBvdXRwdXQgZm9yIHN0YW5kYXJkIG1lc3NhZ2VzXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWRcbiAgICAgKi9cbiAgICBJbmZvKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb2dMZXZlbCA+PSBMb2dMZXZlbC5JbmZvKSB7XG4gICAgICAgICAgICB0aGlzLkNvbW1vbkxvZygnSW5mbycsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ2dpbmcgZm9yIHdhcm5pbmdzXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWRcbiAgICAgKi9cbiAgICBXYXJuaW5nKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb2dMZXZlbCA+PSBMb2dMZXZlbC5XYXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLkNvbW1vbkxvZygnV2FybmluZycsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVycm9yIGxvZ2dpbmdcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgICAqL1xuICAgIEVycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUNvbnRleHQoKTtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5sb2dMZXZlbCA+PSBMb2dMZXZlbC5FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5Db21tb25Mb2coJ0Vycm9yJywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbW1vbiBsb2cgZnVuY3Rpb24gdGhhdCBhbGwgb3RoZXIgbG9nIGZ1bmN0aW9ucyBjYWxsIHRvLlxuICAgICAqIEBwYXJhbSBsZXZlbCAtIHRoZSBsZXZlbCBvZiB0aGlzIGxvZyBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBzdGFjayAtIGFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBmcm9tIHdoZXJlIHRoZSBsb2cgbWVzc2FnZSB3YXMgY2FsbGVkLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIENvbW1vbkxvZyhsZXZlbCwgbWVzc2FnZSkge1xuICAgICAgICBsZXQgbG9nTWVzc2FnZSA9IGBbJHtsZXZlbH1dIC0gJHttZXNzYWdlfWA7XG4gICAgICAgIGlmICh0aGlzLmNvbnRleHQuaW5jbHVkZVN0YWNrKSB7XG4gICAgICAgICAgICBsb2dNZXNzYWdlICs9IGBcXG5TdGFjazogJHt0aGlzLkdldFN0YWNrVHJhY2UoKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZXZlbCA9PT0gJ0Vycm9yJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihsb2dNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsZXZlbCA9PT0gJ1dhcm5pbmcnKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4obG9nTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYXB0dXJlcyB0aGUgc3RhY2sgYW5kIHJldHVybnMgaXRcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBzdGFja1xuICAgICAqL1xuICAgIEdldFN0YWNrVHJhY2UoKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgICAgIGxldCBmb3JtYXR0ZWRTdGFjayA9ICdObyBTdGFjayBBdmFpbGFibGUgZm9yIHRoaXMgYnJvd3Nlcic7XG4gICAgICAgIC8vIGZvcm1hdCB0aGUgZXJyb3JcbiAgICAgICAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRTdGFjayA9IGVycm9yLnN0YWNrLnRvU3RyaW5nKCkucmVwbGFjZSgvRXJyb3IvZywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZWRTdGFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGV4ZWN1dGlvbiBjb250ZXh0cywgKHN0YXRzIHJlcG9ydGluZyBhbmQgc29tZSB3ZWJ4ciBsb2dnaW5nIGNvbWVzIGZyb21cbiAgICAgKiBkaWZmZXJlbnQgZXhlY3V0aW9uIGNvbnRleHRzIHdlIGNhbiBlbmQgdXAgd2l0aCBtdWx0aXBsZSBzdGF0aWMgTG9nZ2VyIGluc3RhbmNlcy4gSGVyZSB3ZSB0cnkgdG9cbiAgICAgKiB3b3JrIGFyb3VuZCBpdCBieSBzdG9yaW5nIHRoZSBjb250ZXh0IG9uIHRoZSB3aW5kb3cgb2JqZWN0LlxuICAgICAqL1xuICAgIFZhbGlkYXRlQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09ICd1bmRlZmluZWQnIHx8ICF3aW5kb3cpIHtcbiAgICAgICAgICAgICAgICAvLyBubyB3aW5kb3cgb2JqZWN0IHNvIHdlIGNhbiBvbmx5IHN0b3JlIGEgbG9jYWwgY29udGV4dC5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgTG9nZ2VyQ29udGV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIXdpbmRvdy5sb2dnZXJDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IExvZ2dlckNvbnRleHQoKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9nZ2VyQ29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IHdpbmRvdy5sb2dnZXJDb250ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGxldCBMb2dnZXIgPSBuZXcgTG9nZ2VyVHlwZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TG9nZ2VyLmpzLm1hcCIsImltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL0xvZ2dlci9Mb2dnZXInO1xuaW1wb3J0IHsgTWVzc2FnZVJlZ2lzdHJ5IH0gZnJvbSAnLi9tZXNzYWdlX3JlZ2lzdHJ5Jztcbi8qKlxuICogQSBoZWxwZXIgZm9yIGNyZWF0aW5nIHNpZ25hbGxpbmcgbWVzc2FnZXMuIFRha2VzIGluIG9wdGlvbmFsIGdpdmVuIHBhcmFtZXRlcnMgYW5kXG4gKiBpbmNsdWRlcyB0aGVtIGluIGEgbWVzc2FnZSBvYmplY3Qgd2l0aCB0aGUgJ3R5cGUnIGZpZWxkIHNldCBwcm9wZXJseSBmb3IgdGhlIG1lc3NhZ2VcbiAqIHR5cGUgc3VwcGxpZWQuXG4gKiBAcGFyYW0gbWVzc2FnZVR5cGUgLSBBIG1lc3NhZ2UgdHlwZSBmcm9tIE1lc3NhZ2VSZWdpc3RyeSB0aGF0IGluZGljYXRlcyB0aGUgdHlwZSBvZiBtZXNzYWdlIHRvIGNyZWF0ZS5cbiAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvcHRpb25hbCBvYmplY3Qgd2hvc2UgZmllbGRzIGFyZSBhZGRlZCB0byB0aGUgbmV3bHkgY3JlYXRlZCBtZXNzYWdlLlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyBtZXNzYWdlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2UobWVzc2FnZVR5cGUsIHBhcmFtcykge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlVHlwZS5jcmVhdGUoKTtcbiAgICBtZXNzYWdlLnR5cGUgPSBtZXNzYWdlVHlwZS50eXBlTmFtZTtcbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgIG1lc3NhZ2VUeXBlLm1lcmdlUGFydGlhbChtZXNzYWdlLCBwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbn1cbi8qKlxuICogVGVzdHMgdGhhdCB0aGUgc3VwcGxpZWQgbWVzc2FnZSBpcyB2YWxpZC4gVGhhdCBpcyBjb250YWlucyBhbGwgZXhwZWN0ZWQgZmllbGRzIGFuZFxuICogZG9lc24ndCBjb250YWluIGFueSB1bmtub3duIGZpZWxkcy5cbiAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSBvYmplY3QgdG8gdGVzdC5cbiAqIEByZXR1cm5zIFRoZSBtZXNzYWdlIHR5cGUgZnJvbSBNZXNzYWdlUmVnaXN0cnkgb2YgdGhlIHN1cHBsaWVkIG1lc3NhZ2Ugb2JqZWN0IGlmIGl0J3MgdmFsaWQsIG9yIG51bGwgaWYgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWVzc2FnZShtc2cpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGlmICghbXNnLnR5cGUpIHtcbiAgICAgICAgTG9nZ2VyLkVycm9yKGBQYXJzZWQgbWVzc2FnZSBoYXMgbm8gdHlwZS4gUmVqZWN0ZWQuICR7SlNPTi5zdHJpbmdpZnkobXNnKX1gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gTWVzc2FnZVJlZ2lzdHJ5W21zZy50eXBlXTtcbiAgICBpZiAoIW1lc3NhZ2VUeXBlKSB7XG4gICAgICAgIExvZ2dlci5FcnJvcihgTWVzc2FnZSBpcyBvZiBhbiB1bmtub3duIHR5cGU6IFwiJHttc2cudHlwZX1cIi4gUmVqZWN0ZWQuYCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZVR5cGUuZmllbGRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgbWVzc2FnZVR5cGUuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoIWZpZWxkLm9wdCkge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1zZywgZmllbGQubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBNZXNzYWdlIFwiJHttc2cudHlwZX1cIlwiIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGQgXCIke2ZpZWxkLm5hbWV9XCIuIFJlamVjdGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBpbiBtc2cpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSBtZXNzYWdlVHlwZS5maWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLm5hbWUgPT09IGZpZWxkTmFtZSk7XG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgTWVzc2FnZSBcIiR7bXNnLnR5cGV9XCIgY29udGFpbnMgdW5rbm93biBmaWVsZCBcIiR7ZmllbGROYW1lfVwiLiBSZWplY3RlZC5gKTtcbiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkID8gbWVzc2FnZVR5cGUgOiBudWxsO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVzc2FnZV9oZWxwZXJzLmpzLm1hcCIsImltcG9ydCAqIGFzIE1lc3NhZ2VzIGZyb20gJy4vc2lnbmFsbGluZ19tZXNzYWdlcyc7XG4vKipcbiAqIEEgbWFwIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHNpZ25hbGxpbmcgbWVzc2FnZXMgaW4gdGhlIFBpeGVsIFN0cmVhbWluZ1xuICogc2lnbmFsbGluZyBwcm90b2NvbC4gVGhpcyBhbGxvd3MgbWFwcGluZyBvZiBzaWduYWxsaW5nIG1lc3NhZ2UgbmFtZXNcbiAqIHRvIGFjdHVhbCBtZXNzYWdlIHR5cGVzLlxuICovXG5leHBvcnQgY29uc3QgTWVzc2FnZVJlZ2lzdHJ5ID0ge1xuICAgIGFuc3dlcjogTWVzc2FnZXMuYW5zd2VyLFxuICAgIGNvbmZpZzogTWVzc2FnZXMuY29uZmlnLFxuICAgIGRpc2Nvbm5lY3RQbGF5ZXI6IE1lc3NhZ2VzLmRpc2Nvbm5lY3RQbGF5ZXIsXG4gICAgZW5kcG9pbnRJZDogTWVzc2FnZXMuZW5kcG9pbnRJZCxcbiAgICBlbmRwb2ludElkQ29uZmlybTogTWVzc2FnZXMuZW5kcG9pbnRJZENvbmZpcm0sXG4gICAgaWNlQ2FuZGlkYXRlOiBNZXNzYWdlcy5pY2VDYW5kaWRhdGUsXG4gICAgaWRlbnRpZnk6IE1lc3NhZ2VzLmlkZW50aWZ5LFxuICAgIGxpc3RTdHJlYW1lcnM6IE1lc3NhZ2VzLmxpc3RTdHJlYW1lcnMsXG4gICAgb2ZmZXI6IE1lc3NhZ2VzLm9mZmVyLFxuICAgIHBpbmc6IE1lc3NhZ2VzLnBpbmcsXG4gICAgcGxheWVyQ29ubmVjdGVkOiBNZXNzYWdlcy5wbGF5ZXJDb25uZWN0ZWQsXG4gICAgcGxheWVyQ291bnQ6IE1lc3NhZ2VzLnBsYXllckNvdW50LFxuICAgIHBsYXllckRpc2Nvbm5lY3RlZDogTWVzc2FnZXMucGxheWVyRGlzY29ubmVjdGVkLFxuICAgIHBvbmc6IE1lc3NhZ2VzLnBvbmcsXG4gICAgc3RhdHM6IE1lc3NhZ2VzLnN0YXRzLFxuICAgIHN0cmVhbWVyRGlzY29ubmVjdGVkOiBNZXNzYWdlcy5zdHJlYW1lckRpc2Nvbm5lY3RlZCxcbiAgICBzdHJlYW1lckxpc3Q6IE1lc3NhZ2VzLnN0cmVhbWVyTGlzdCxcbiAgICBzdWJzY3JpYmU6IE1lc3NhZ2VzLnN1YnNjcmliZSxcbiAgICB1bnN1YnNjcmliZTogTWVzc2FnZXMudW5zdWJzY3JpYmUsXG4gICAgbGF5ZXJQcmVmZXJlbmNlOiBNZXNzYWdlcy5sYXllclByZWZlcmVuY2UsXG4gICAgZGF0YUNoYW5uZWxSZXF1ZXN0OiBNZXNzYWdlcy5kYXRhQ2hhbm5lbFJlcXVlc3QsXG4gICAgcGVlckRhdGFDaGFubmVsczogTWVzc2FnZXMucGVlckRhdGFDaGFubmVscyxcbiAgICBwZWVyRGF0YUNoYW5uZWxzUmVhZHk6IE1lc3NhZ2VzLnBlZXJEYXRhQ2hhbm5lbHNSZWFkeSxcbiAgICBzdHJlYW1lckRhdGFDaGFubmVsczogTWVzc2FnZXMuc3RyZWFtZXJEYXRhQ2hhbm5lbHMsXG4gICAgc3RhcnRTdHJlYW1pbmc6IE1lc3NhZ2VzLnN0YXJ0U3RyZWFtaW5nLFxuICAgIHN0b3BTdHJlYW1pbmc6IE1lc3NhZ2VzLnN0b3BTdHJlYW1pbmdcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXNzYWdlX3JlZ2lzdHJ5LmpzLm1hcCIsImltcG9ydCB7IFdpcmVUeXBlIH0gZnJvbSBcIkBwcm90b2J1Zi10cy9ydW50aW1lXCI7XG5pbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyIH0gZnJvbSBcIkBwcm90b2J1Zi10cy9ydW50aW1lXCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsIH0gZnJvbSBcIkBwcm90b2J1Zi10cy9ydW50aW1lXCI7XG5pbXBvcnQgeyBNZXNzYWdlVHlwZSB9IGZyb20gXCJAcHJvdG9idWYtdHMvcnVudGltZVwiO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgYmFzZV9tZXNzYWdlJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiYmFzZV9tZXNzYWdlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGJhc2VfbWVzc2FnZVxuICovXG5leHBvcnQgY29uc3QgYmFzZV9tZXNzYWdlID0gbmV3IGJhc2VfbWVzc2FnZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBwZWVyQ29ubmVjdGlvbk9wdGlvbnMkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJwZWVyQ29ubmVjdGlvbk9wdGlvbnNcIiwgW10pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHBlZXJDb25uZWN0aW9uT3B0aW9uc1xuICovXG5leHBvcnQgY29uc3QgcGVlckNvbm5lY3Rpb25PcHRpb25zID0gbmV3IHBlZXJDb25uZWN0aW9uT3B0aW9ucyRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBjb25maWckVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJjb25maWdcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInBlZXJDb25uZWN0aW9uT3B0aW9uc1wiLCBraW5kOiBcIm1lc3NhZ2VcIiwgVDogKCkgPT4gcGVlckNvbm5lY3Rpb25PcHRpb25zIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInByb3RvY29sVmVyc2lvblwiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogcGVlckNvbm5lY3Rpb25PcHRpb25zIHBlZXJDb25uZWN0aW9uT3B0aW9ucyAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBlZXJDb25uZWN0aW9uT3B0aW9ucyA9IHBlZXJDb25uZWN0aW9uT3B0aW9ucy5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMsIG1lc3NhZ2UucGVlckNvbm5lY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgcHJvdG9jb2xWZXJzaW9uICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHJvdG9jb2xWZXJzaW9uID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogcGVlckNvbm5lY3Rpb25PcHRpb25zIHBlZXJDb25uZWN0aW9uT3B0aW9ucyA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBlZXJDb25uZWN0aW9uT3B0aW9ucylcbiAgICAgICAgICAgIHBlZXJDb25uZWN0aW9uT3B0aW9ucy5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UucGVlckNvbm5lY3Rpb25PcHRpb25zLCB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKS5qb2luKCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIHN0cmluZyBwcm90b2NvbFZlcnNpb24gPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wcm90b2NvbFZlcnNpb24gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wcm90b2NvbFZlcnNpb24pO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgY29uZmlnXG4gKi9cbmV4cG9ydCBjb25zdCBjb25maWcgPSBuZXcgY29uZmlnJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGlkZW50aWZ5JFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiaWRlbnRpZnlcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgaWRlbnRpZnlcbiAqL1xuZXhwb3J0IGNvbnN0IGlkZW50aWZ5ID0gbmV3IGlkZW50aWZ5JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGVuZHBvaW50SWQkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJlbmRwb2ludElkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJpZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMywgbmFtZTogXCJwcm90b2NvbFZlcnNpb25cIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuaWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgcHJvdG9jb2xWZXJzaW9uICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucHJvdG9jb2xWZXJzaW9uID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIGlkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UuaWQpO1xuICAgICAgICAvKiBvcHRpb25hbCBzdHJpbmcgcHJvdG9jb2xWZXJzaW9uID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucHJvdG9jb2xWZXJzaW9uICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UucHJvdG9jb2xWZXJzaW9uKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGVuZHBvaW50SWRcbiAqL1xuZXhwb3J0IGNvbnN0IGVuZHBvaW50SWQgPSBuZXcgZW5kcG9pbnRJZCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBlbmRwb2ludElkQ29uZmlybSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImVuZHBvaW50SWRDb25maXJtXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJjb21taXR0ZWRJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuY29tbWl0dGVkSWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgY29tbWl0dGVkSWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb21taXR0ZWRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBjb21taXR0ZWRJZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmNvbW1pdHRlZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLmNvbW1pdHRlZElkKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGVuZHBvaW50SWRDb25maXJtXG4gKi9cbmV4cG9ydCBjb25zdCBlbmRwb2ludElkQ29uZmlybSA9IG5ldyBlbmRwb2ludElkQ29uZmlybSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdHJlYW1lcklkQ2hhbmdlZCRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInN0cmVhbWVySWRDaGFuZ2VkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJuZXdJRFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UubmV3SUQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgbmV3SUQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uZXdJRCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBuZXdJRCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5ld0lEICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5ld0lEKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0cmVhbWVySWRDaGFuZ2VkXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJlYW1lcklkQ2hhbmdlZCA9IG5ldyBzdHJlYW1lcklkQ2hhbmdlZCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBsaXN0U3RyZWFtZXJzJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwibGlzdFN0cmVhbWVyc1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBsaXN0U3RyZWFtZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBsaXN0U3RyZWFtZXJzID0gbmV3IGxpc3RTdHJlYW1lcnMkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3RyZWFtZXJMaXN0JFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwic3RyZWFtZXJMaXN0XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJpZHNcIiwga2luZDogXCJzY2FsYXJcIiwgcmVwZWF0OiAyIC8qUmVwZWF0VHlwZS5VTlBBQ0tFRCovLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuaWRzID0gW107XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHJlcGVhdGVkIHN0cmluZyBpZHMgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5pZHMucHVzaChyZWFkZXIuc3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogcmVwZWF0ZWQgc3RyaW5nIGlkcyA9IDI7ICovXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZS5pZHMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UuaWRzW2ldKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0cmVhbWVyTGlzdFxuICovXG5leHBvcnQgY29uc3Qgc3RyZWFtZXJMaXN0ID0gbmV3IHN0cmVhbWVyTGlzdCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdWJzY3JpYmUkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdWJzY3JpYmVcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInN0cmVhbWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnN0cmVhbWVySWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgc3RyZWFtZXJJZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnN0cmVhbWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBzdHJpbmcgc3RyZWFtZXJJZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnN0cmVhbWVySWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc3RyZWFtZXJJZCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBzdWJzY3JpYmVcbiAqL1xuZXhwb3J0IGNvbnN0IHN1YnNjcmliZSA9IG5ldyBzdWJzY3JpYmUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgdW5zdWJzY3JpYmUkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJ1bnN1YnNjcmliZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSB1bnN1YnNjcmliZVxuICovXG5leHBvcnQgY29uc3QgdW5zdWJzY3JpYmUgPSBuZXcgdW5zdWJzY3JpYmUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3Vic2NyaWJlRmFpbGVkJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwic3Vic2NyaWJlRmFpbGVkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJtZXNzYWdlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5tZXNzYWdlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIG1lc3NhZ2UgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tZXNzYWdlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIG1lc3NhZ2UgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm1lc3NhZ2UpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3Vic2NyaWJlRmFpbGVkXG4gKi9cbmV4cG9ydCBjb25zdCBzdWJzY3JpYmVGYWlsZWQgPSBuZXcgc3Vic2NyaWJlRmFpbGVkJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHBsYXllckNvbm5lY3RlZCRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBsYXllckNvbm5lY3RlZFwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwiZGF0YUNoYW5uZWxcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInNmdVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA4IC8qU2NhbGFyVHlwZS5CT09MKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDUsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLmRhdGFDaGFubmVsID0gZmFsc2U7XG4gICAgICAgIG1lc3NhZ2Uuc2Z1ID0gZmFsc2U7XG4gICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBib29sIGRhdGFDaGFubmVsICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YUNoYW5uZWwgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGJvb2wgc2Z1ICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2Z1ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgcGxheWVySWQgKi8gNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIGJvb2wgZGF0YUNoYW5uZWwgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhQ2hhbm5lbCAhPT0gZmFsc2UpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLlZhcmludCkuYm9vbChtZXNzYWdlLmRhdGFDaGFubmVsKTtcbiAgICAgICAgLyogYm9vbCBzZnUgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZnUgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5WYXJpbnQpLmJvb2wobWVzc2FnZS5zZnUpO1xuICAgICAgICAvKiBzdHJpbmcgcGxheWVySWQgPSA1OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoNSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wbGF5ZXJJZCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBwbGF5ZXJDb25uZWN0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IHBsYXllckNvbm5lY3RlZCA9IG5ldyBwbGF5ZXJDb25uZWN0ZWQkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgcGxheWVyRGlzY29ubmVjdGVkJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwicGxheWVyRGlzY29ubmVjdGVkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJwbGF5ZXJJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgcGxheWVySWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBwbGF5ZXJJZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllcklkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHBsYXllckRpc2Nvbm5lY3RlZFxuICovXG5leHBvcnQgY29uc3QgcGxheWVyRGlzY29ubmVjdGVkID0gbmV3IHBsYXllckRpc2Nvbm5lY3RlZCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBvZmZlciRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcIm9mZmVyXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJzZHBcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJzZnVcIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA4IC8qU2NhbGFyVHlwZS5CT09MKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDUsIG5hbWU6IFwibXVsdGlwbGV4XCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiA2LCBuYW1lOiBcInNjYWxhYmlsaXR5TW9kZVwiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zZHAgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgc2RwICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2RwID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIG9wdGlvbmFsIHN0cmluZyBwbGF5ZXJJZCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIG9wdGlvbmFsIGJvb2wgc2Z1ICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2Z1ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBib29sIG11bHRpcGxleCAqLyA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm11bHRpcGxleCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgc3RyaW5nIHNjYWxhYmlsaXR5TW9kZSAqLyA2OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNjYWxhYmlsaXR5TW9kZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBzZHAgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZHAgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2RwKTtcbiAgICAgICAgLyogb3B0aW9uYWwgc3RyaW5nIHBsYXllcklkID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVySWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wbGF5ZXJJZCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIGJvb2wgc2Z1ID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2Z1ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIFdpcmVUeXBlLlZhcmludCkuYm9vbChtZXNzYWdlLnNmdSk7XG4gICAgICAgIC8qIG9wdGlvbmFsIGJvb2wgbXVsdGlwbGV4ID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UubXVsdGlwbGV4ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDUsIFdpcmVUeXBlLlZhcmludCkuYm9vbChtZXNzYWdlLm11bHRpcGxleCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIHN0cmluZyBzY2FsYWJpbGl0eU1vZGUgPSA2OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zY2FsYWJpbGl0eU1vZGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5zY2FsYWJpbGl0eU1vZGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugb2ZmZXJcbiAqL1xuZXhwb3J0IGNvbnN0IG9mZmVyID0gbmV3IG9mZmVyJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGFuc3dlciRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImFuc3dlclwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwic2RwXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInBsYXllcklkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwibWluQml0cmF0ZUJwc1wiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDUsIG5hbWU6IFwibWF4Qml0cmF0ZUJwc1wiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnNkcCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzZHAgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZHAgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgc3RyaW5nIHBsYXllcklkICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgaW50MzIgbWluQml0cmF0ZUJwcyAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1pbkJpdHJhdGVCcHMgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBpbnQzMiBtYXhCaXRyYXRlQnBzICovIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWF4Qml0cmF0ZUJwcyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIHNkcCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNkcCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5zZHApO1xuICAgICAgICAvKiBvcHRpb25hbCBzdHJpbmcgcGxheWVySWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgLyogb3B0aW9uYWwgaW50MzIgbWluQml0cmF0ZUJwcyA9IDQ7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm1pbkJpdHJhdGVCcHMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNCwgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLm1pbkJpdHJhdGVCcHMpO1xuICAgICAgICAvKiBvcHRpb25hbCBpbnQzMiBtYXhCaXRyYXRlQnBzID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UubWF4Qml0cmF0ZUJwcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg1LCBXaXJlVHlwZS5WYXJpbnQpLmludDMyKG1lc3NhZ2UubWF4Qml0cmF0ZUJwcyk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBhbnN3ZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGFuc3dlciA9IG5ldyBhbnN3ZXIkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgaWNlQ2FuZGlkYXRlRGF0YSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImljZUNhbmRpZGF0ZURhdGFcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJjYW5kaWRhdGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwic2RwTWlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInNkcE1MaW5lSW5kZXhcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJ1c2VybmFtZUZyYWdtZW50XCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLmNhbmRpZGF0ZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc2RwTWlkID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zZHBNTGluZUluZGV4ID0gMDtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgY2FuZGlkYXRlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2FuZGlkYXRlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzZHBNaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZHBNaWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgc2RwTUxpbmVJbmRleCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNkcE1MaW5lSW5kZXggPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgdXNlcm5hbWVGcmFnbWVudCAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVzZXJuYW1lRnJhZ21lbnQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIGNhbmRpZGF0ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmNhbmRpZGF0ZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5jYW5kaWRhdGUpO1xuICAgICAgICAvKiBzdHJpbmcgc2RwTWlkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2RwTWlkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnNkcE1pZCk7XG4gICAgICAgIC8qIGludDMyIHNkcE1MaW5lSW5kZXggPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZHBNTGluZUluZGV4ICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5WYXJpbnQpLmludDMyKG1lc3NhZ2Uuc2RwTUxpbmVJbmRleCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIHN0cmluZyB1c2VybmFtZUZyYWdtZW50ID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlcm5hbWVGcmFnbWVudCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg0LCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnVzZXJuYW1lRnJhZ21lbnQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgaWNlQ2FuZGlkYXRlRGF0YVxuICovXG5leHBvcnQgY29uc3QgaWNlQ2FuZGlkYXRlRGF0YSA9IG5ldyBpY2VDYW5kaWRhdGVEYXRhJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGljZUNhbmRpZGF0ZSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImljZUNhbmRpZGF0ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwiY2FuZGlkYXRlXCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiBpY2VDYW5kaWRhdGVEYXRhIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInBsYXllcklkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpY2VDYW5kaWRhdGVEYXRhIGNhbmRpZGF0ZSAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNhbmRpZGF0ZSA9IGljZUNhbmRpZGF0ZURhdGEuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCBtZXNzYWdlLmNhbmRpZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgc3RyaW5nIHBsYXllcklkICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBpY2VDYW5kaWRhdGVEYXRhIGNhbmRpZGF0ZSA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmNhbmRpZGF0ZSlcbiAgICAgICAgICAgIGljZUNhbmRpZGF0ZURhdGEuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmNhbmRpZGF0ZSwgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICAvKiBvcHRpb25hbCBzdHJpbmcgcGxheWVySWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGljZUNhbmRpZGF0ZVxuICovXG5leHBvcnQgY29uc3QgaWNlQ2FuZGlkYXRlID0gbmV3IGljZUNhbmRpZGF0ZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBkaXNjb25uZWN0UGxheWVyJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZGlzY29ubmVjdFBsYXllclwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwicmVhc29uXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHBsYXllcklkICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgc3RyaW5nIHJlYXNvbiAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlYXNvbiA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBwbGF5ZXJJZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllcklkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgLyogb3B0aW9uYWwgc3RyaW5nIHJlYXNvbiA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnJlYXNvbiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnJlYXNvbik7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBkaXNjb25uZWN0UGxheWVyXG4gKi9cbmV4cG9ydCBjb25zdCBkaXNjb25uZWN0UGxheWVyID0gbmV3IGRpc2Nvbm5lY3RQbGF5ZXIkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgcGluZyRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBpbmdcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInRpbWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UudGltZSA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHRpbWUgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aW1lID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBpbnQzMiB0aW1lID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZSAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnRpbWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgcGluZ1xuICovXG5leHBvcnQgY29uc3QgcGluZyA9IG5ldyBwaW5nJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHBvbmckVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJwb25nXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ0aW1lXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnRpbWUgPSAwO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQzMiB0aW1lICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudGltZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogaW50MzIgdGltZSA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnRpbWUgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS50aW1lKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHBvbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHBvbmcgPSBuZXcgcG9uZyRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdHJlYW1lckRpc2Nvbm5lY3RlZCRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInN0cmVhbWVyRGlzY29ubmVjdGVkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0cmVhbWVyRGlzY29ubmVjdGVkXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJlYW1lckRpc2Nvbm5lY3RlZCA9IG5ldyBzdHJlYW1lckRpc2Nvbm5lY3RlZCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBsYXllclByZWZlcmVuY2UkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJsYXllclByZWZlcmVuY2VcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInNwYXRpYWxMYXllclwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInRlbXBvcmFsTGF5ZXJcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJwbGF5ZXJJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc3BhdGlhbExheWVyID0gMDtcbiAgICAgICAgbWVzc2FnZS50ZW1wb3JhbExheWVyID0gMDtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHNwYXRpYWxMYXllciAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNwYXRpYWxMYXllciA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHRlbXBvcmFsTGF5ZXIgKi8gMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50ZW1wb3JhbExheWVyID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHBsYXllcklkICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBpbnQzMiBzcGF0aWFsTGF5ZXIgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zcGF0aWFsTGF5ZXIgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5zcGF0aWFsTGF5ZXIpO1xuICAgICAgICAvKiBpbnQzMiB0ZW1wb3JhbExheWVyID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudGVtcG9yYWxMYXllciAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnRlbXBvcmFsTGF5ZXIpO1xuICAgICAgICAvKiBzdHJpbmcgcGxheWVySWQgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoNCwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wbGF5ZXJJZCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBsYXllclByZWZlcmVuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyUHJlZmVyZW5jZSA9IG5ldyBsYXllclByZWZlcmVuY2UkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgZGF0YUNoYW5uZWxSZXF1ZXN0JFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZGF0YUNoYW5uZWxSZXF1ZXN0XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGRhdGFDaGFubmVsUmVxdWVzdFxuICovXG5leHBvcnQgY29uc3QgZGF0YUNoYW5uZWxSZXF1ZXN0ID0gbmV3IGRhdGFDaGFubmVsUmVxdWVzdCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBwZWVyRGF0YUNoYW5uZWxzJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwicGVlckRhdGFDaGFubmVsc1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwic2VuZFN0cmVhbUlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwicmVjdlN0cmVhbUlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zZW5kU3RyZWFtSWQgPSAwO1xuICAgICAgICBtZXNzYWdlLnJlY3ZTdHJlYW1JZCA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBwbGF5ZXJJZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHNlbmRTdHJlYW1JZCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRTdHJlYW1JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHJlY3ZTdHJlYW1JZCAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlY3ZTdHJlYW1JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIHBsYXllcklkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVySWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UucGxheWVySWQpO1xuICAgICAgICAvKiBpbnQzMiBzZW5kU3RyZWFtSWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZW5kU3RyZWFtSWQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5zZW5kU3RyZWFtSWQpO1xuICAgICAgICAvKiBpbnQzMiByZWN2U3RyZWFtSWQgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5yZWN2U3RyZWFtSWQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5yZWN2U3RyZWFtSWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgcGVlckRhdGFDaGFubmVsc1xuICovXG5leHBvcnQgY29uc3QgcGVlckRhdGFDaGFubmVscyA9IG5ldyBwZWVyRGF0YUNoYW5uZWxzJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHBlZXJEYXRhQ2hhbm5lbHNSZWFkeSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBlZXJEYXRhQ2hhbm5lbHNSZWFkeVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBwZWVyRGF0YUNoYW5uZWxzUmVhZHlcbiAqL1xuZXhwb3J0IGNvbnN0IHBlZXJEYXRhQ2hhbm5lbHNSZWFkeSA9IG5ldyBwZWVyRGF0YUNoYW5uZWxzUmVhZHkkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3RyZWFtZXJEYXRhQ2hhbm5lbHMkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdHJlYW1lckRhdGFDaGFubmVsc1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwic2Z1SWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwic2VuZFN0cmVhbUlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwicmVjdlN0cmVhbUlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnNmdUlkID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zZW5kU3RyZWFtSWQgPSAwO1xuICAgICAgICBtZXNzYWdlLnJlY3ZTdHJlYW1JZCA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzZnVJZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNmdUlkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHNlbmRTdHJlYW1JZCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRTdHJlYW1JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHJlY3ZTdHJlYW1JZCAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlY3ZTdHJlYW1JZCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIHNmdUlkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2Z1SWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2Z1SWQpO1xuICAgICAgICAvKiBpbnQzMiBzZW5kU3RyZWFtSWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZW5kU3RyZWFtSWQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5zZW5kU3RyZWFtSWQpO1xuICAgICAgICAvKiBpbnQzMiByZWN2U3RyZWFtSWQgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5yZWN2U3RyZWFtSWQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5yZWN2U3RyZWFtSWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3RyZWFtZXJEYXRhQ2hhbm5lbHNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmVhbWVyRGF0YUNoYW5uZWxzID0gbmV3IHN0cmVhbWVyRGF0YUNoYW5uZWxzJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHN0YXJ0U3RyZWFtaW5nJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwic3RhcnRTdHJlYW1pbmdcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3RhcnRTdHJlYW1pbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0U3RyZWFtaW5nID0gbmV3IHN0YXJ0U3RyZWFtaW5nJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHN0b3BTdHJlYW1pbmckVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdG9wU3RyZWFtaW5nXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0b3BTdHJlYW1pbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHN0b3BTdHJlYW1pbmcgPSBuZXcgc3RvcFN0cmVhbWluZyRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBwbGF5ZXJDb3VudCRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBsYXllckNvdW50XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJjb3VudFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5jb3VudCA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIGNvdW50ICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY291bnQgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIGludDMyIGNvdW50ID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuY291bnQgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5jb3VudCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBwbGF5ZXJDb3VudFxuICovXG5leHBvcnQgY29uc3QgcGxheWVyQ291bnQgPSBuZXcgcGxheWVyQ291bnQkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3RhdHMkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdGF0c1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwiZGF0YVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuZGF0YSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBkYXRhICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBkYXRhID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuZGF0YSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5kYXRhKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN0YXRzXG4gKi9cbmV4cG9ydCBjb25zdCBzdGF0cyA9IG5ldyBzdGF0cyRUeXBlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaWduYWxsaW5nX21lc3NhZ2VzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgKiBhcyBNZXNzYWdlcyBmcm9tICcuLi9NZXNzYWdlcy9zaWduYWxsaW5nX21lc3NhZ2VzJztcbmltcG9ydCAqIGFzIE1lc3NhZ2VIZWxwZXJzIGZyb20gJy4uL01lc3NhZ2VzL21lc3NhZ2VfaGVscGVycyc7XG4vKipcbiAqIFVzZWQgdG8gcmVndWxhcmx5IHBpbmcgYSBwcm90b2NvbCBjb25uZWN0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBnb29kIGFuZCBvcGVuLlxuICogV2hlbiB0aGUgcG9uZyBkb2Vzbid0IGNvbWUgaW4gcmVzcG9uc2UgdG8gYSBwaW5nIGluIHRpbWUgYSBjYWxsYmFjayBpcyBmaXJlZCB0aGF0IGNhbiBiZSBoYW5kZWRcbiAqIGJ5IHRoZSBvd25lci5cbiAqL1xuZXhwb3J0IGNsYXNzIEtlZXBhbGl2ZU1vbml0b3Ige1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIFJvdW5kIFRyaXAgVGltZSBvZiB0aGUgY3VycmVudCBjb25uZWN0aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKi9cbiAgICBnZXQgUlRUKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ydHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbW9uaXRvciBhbmQgc3RhcnRzIHRoZSBwaW5nIHRpbWVyLiBJZiBhIHBvbmcgZG9lcyBub3QgY29tZSBiYWNrIGJ5IHRoZSB0aW1lIHdlIHdhbnRcbiAgICAgKiB0byBzZW5kIGEgc2Vjb25kIHBpbmcgdGhlbiB0aGUgY29ubmVjdGlvbiBpcyBjb25zaWRlcmVkIGRlYWQgYW5kIHRoZSBvblRpbWVvdXQgY2FsbGJhY2sgaXMgZmlyZWQuXG4gICAgICogQHBhcmFtIHByb3RvY29sIC0gVGhlIGNvbm5lY3Rpb24gdGhhdCB3ZSB3YW50IHRvIG1vbml0b3IuXG4gICAgICogQHBhcmFtIHRpbWVvdXQgLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBwaW5nIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb3RvY29sLCB0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ydHQgPSAwO1xuICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIHRoaXMub25SZXNwb25zZSA9IHRoaXMub25IZWFydGJlYXRSZXNwb25zZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnByb3RvY29sLnRyYW5zcG9ydC5vbignY2xvc2UnLCB0aGlzLnN0b3AuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICB9XG4gICAgc3RhcnQoKSB7XG4gICAgICAgIHRoaXMuYWxpdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnByb3RvY29sLm9uKCdwb25nJywgdGhpcy5vblJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBzZXRJbnRlcnZhbCh0aGlzLnNlbmRIZWFydGJlYXQuYmluZCh0aGlzKSwgdGhpcy50aW1lb3V0KTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmtlZXBhbGl2ZSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wub2ZmKCdwb25nJywgdGhpcy5vblJlc3BvbnNlKTtcbiAgICB9XG4gICAgc2VuZEhlYXJ0YmVhdCgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBpZiB3ZSBuZXZlciBnb3QgYSByZXNwb25zZSBmcm9tIHRoZSBsYXN0IGhlYXJ0YmVhdCwgYXNzdW1lIHRoZSBjb25uZWN0aW9uIGlzIGRlYWQgYW5kIHRpbWVvdXRcbiAgICAgICAgaWYgKHRoaXMuYWxpdmUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAoX2EgPSB0aGlzLm9uVGltZW91dCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFyayB0aGUgY29ubmVjdGlvbiBhcyB0ZW1wb3JhcmlseSBkZWFkIHVudGlsIHdlIGdldCBhIHJlc3BvbnNlIGZyb20gdGhlIHBpbmdcbiAgICAgICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMucGluZywgeyB0aW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSB9KSk7XG4gICAgfVxuICAgIG9uSGVhcnRiZWF0UmVzcG9uc2UocG9uZ01zZykge1xuICAgICAgICAvLyB3ZSBnb3QgYSBwb25nIHJlc3BvbnNlIGZyb20gdGhlIG90aGVyIHNpZGUsIHRoZSBjb25uZWN0aW9uIGlzIGdvb2QuXG4gICAgICAgIC8vIHdlIGFsc28gc3RvcmUgdGhlIHJvdW5kIHRyaXAgdGltZSBpZiBhbnlvbmUgaXMgY3VyaW91c1xuICAgICAgICB0aGlzLnJ0dCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gcG9uZ01zZy50aW1lO1xuICAgICAgICB0aGlzLmFsaXZlID0gdHJ1ZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1LZWVwYWxpdmVNb25pdG9yLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9FdmVudC9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vTG9nZ2VyL0xvZ2dlcic7XG4vKipcbiAqIFNpZ25hbGxpbmcgcHJvdG9jb2wgZm9yIGhhbmRsaW5nIG1lc3NhZ2VzIGZyb20gdGhlIHNpZ25hbGxpbmcgc2VydmVyLlxuICpcbiAqIExpc3RlbiBvbiB0aGlzIGVtaXR0ZXIgZm9yIG1lc3NhZ2VzLiBNZXNzYWdlIHR5cGUgaXMgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuXG4gKiBFeGFtcGxlOlxuICogICAgICBzaWduYWxsaW5nUHJvdG9jb2wub24oJ2NvbmZpZycsIChtZXNzYWdlOiBNZXNzYWdlcy5jb25maWcpID1cXD4gY29uc29sZS5sb2coYEdvdCBhIGNvbmZpZyBtZXNzYWdlOiAke21lc3NhZ2V9YCkpKTtcbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGluIHRoaXMgY2xhc3Mgd2lsbCBhbHNvIGVtaXQgb24gbWVzc2FnZSBldmVudHMuXG4gKlxuICogRXZlbnRzIGVtaXR0ZWQgb24gdHJhbnNwb3J0OlxuICogICBtZXNzYWdlOlxuICogICAgICBFbWl0dGVkIGFueSB0aW1lIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBieSB0aGUgdHJhbnNwb3J0LiBMaXN0ZW4gb24gdGhpcyBpZlxuICogICAgICB5b3Ugd2lzaCB0byBjYXB0dXJlIGFsbCBtZXNzYWdlcywgcmF0aGVyIHRoYW4gc3BlY2lmaWMgbWVzc2FnZXMgb25cbiAqICAgICAgJ21lc3NhZ2VIYW5kbGVycycuXG4gKlxuICogICBvdXQ6XG4gKiAgICAgIEVtaXR0ZWQgd2hlbiBzZW5kaW5nIGEgbWVzc2FnZSBvdXQgb24gdGhlIHRyYW5zcG9ydC4gU2ltaWxhciB0byAnbWVzc2FnZScgYnV0XG4gKiAgICAgIG9ubHkgZm9yIHdoZW4gbWVzc2FnZXMgYXJlIHNlbnQgZnJvbSB0aGlzIGVuZHBvaW50LiBVc2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNpZ25hbGxpbmdQcm90b2NvbCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgc3RhdGljIGdldCBTSUdOQUxMSU5HX1ZFUlNJT04oKSB7XG4gICAgICAgIHJldHVybiAnMS4zLjAnO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih0cmFuc3BvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgIHRyYW5zcG9ydC5vbk1lc3NhZ2UgPSAobXNnKSA9PiB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkTWVzc2FnZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKG1zZyk7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkRlYnVnKCdQcm90b2NvbCByZWNlaXZlZCA9PiBcXG4nICsgSlNPTi5zdHJpbmdpZnkocGFyc2VkRGF0YSwgdW5kZWZpbmVkLCA0KSk7XG4gICAgICAgICAgICAgICAgcGFyc2VkTWVzc2FnZSA9IHBhcnNlZERhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBFcnJvciBwYXJzaW5nIG1lc3NhZ2Ugc3RyaW5nICR7bXNnfS5cXG4ke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgVW5rbm93biBlcnJvciB3aGlsZSBwYXJzaW5nIG1lc3NhZ2UgZGF0YSBpbiBoYW5kbGVPbk1lc3NhZ2VgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2FsbCB0aGUgaGFuZGxlcnNcbiAgICAgICAgICAgIHRyYW5zcG9ydC5lbWl0KCdtZXNzYWdlJywgcGFyc2VkTWVzc2FnZSk7IC8vIGVtaXQgdGhpcyBmb3IgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhbnkgbWVzc2FnZVxuICAgICAgICAgICAgaWYgKCF0aGlzLmVtaXQocGFyc2VkTWVzc2FnZS50eXBlLCBwYXJzZWRNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgIC8vIGVtaXQgdGhpcyBmb3IgbGlzdGVuZXJzIGxpc3RlbmluZyBmb3Igc3BlY2lmaWMgbWVzc2FnZXNcbiAgICAgICAgICAgICAgICAvLyBubyBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3VuaGFuZGxlZCcsIHBhcnNlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc2tzIHRoZSB0cmFuc3BvcnQgdG8gY29ubmVjdCB0byB0aGUgZ2l2ZW4gVVJMLlxuICAgICAqIEBwYXJhbSB1cmwgLSBUaGUgdXJsIHRvIGNvbm5lY3QgdG8uXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBjYWxsIHN1Y2NlZWRlZC5cbiAgICAgKi9cbiAgICBjb25uZWN0KHVybCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuY29ubmVjdCh1cmwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc2tzIHRoZSB0cmFuc3BvcnQgdG8gZGlzY29ubmVjdCBmcm9tIGFueSBjb25uZWN0aW9uIGl0IG1pZ2h0IGhhdmUuXG4gICAgICogQHBhcmFtIGNvZGUgLSBBbiBvcHRpb25hbCBkaXNjb25uZWN0aW9uIGNvZGUuXG4gICAgICogQHBhcmFtIHJlYXNvbiAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aXZlIHN0cmluZyBmb3IgdGhlIGRpc2Nvbm5lY3QgcmVhc29uLlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0LmRpc2Nvbm5lY3QoY29kZSwgcmVhc29uKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIGFuZCByZWFkeSB0byBzZW5kL3JlY2VpdmUgbWVzc2FnZXMuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvdG9jb2wgaXMgY29ubmVjdGVkLlxuICAgICAqL1xuICAgIGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuaXNDb25uZWN0ZWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFzc2VzIGEgbWVzc2FnZSB0byB0aGUgdHJhbnNwb3J0IHRvIHNlbmQgdG8gdGhlIG90aGVyIGVuZC5cbiAgICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBzZW5kTWVzc2FnZShtc2cpIHtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuc2VuZE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobXNnKSk7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0LmVtaXQoJ291dCcsIG1zZyk7IC8vIGVtaXQgdGhpcyBmb3IgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBvdXRnb2luZyBtZXNzYWdlc1xuICAgICAgICBMb2dnZXIuRGVidWcoJ1Byb3RvY29sIHNlbnQgPT4gXFxuJyArIEpTT04uc3RyaW5naWZ5KG1zZywgdW5kZWZpbmVkLCA0KSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2lnbmFsbGluZ1Byb3RvY29sLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9Mb2dnZXIvTG9nZ2VyJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL0V2ZW50L0V2ZW50RW1pdHRlcic7XG4vKipcbiAqIFRoZSBjb250cm9sbGVyIGZvciB0aGUgV2ViU29ja2V0IGFuZCBhbGwgYXNzb2NpYXRlZCBtZXRob2RzXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgV2ViU29ja2V0VHJhbnNwb3J0IGZvciBicm93c2VyIGNvbnRleHRzLlxuICAgICAqIEBwYXJhbSBwcm90b2NvbHMgLSBBbiBvcHRpb25hbCBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzIHRvIHBhc3MgdG8gdGhlIG5ldyB3ZWJzb2NrZXQgcHJvdG9jb2xzIHBhcmFtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdG9jb2xzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuV1NfT1BFTl9TVEFURSA9IDE7XG4gICAgICAgIHRoaXMucHJvdG9jb2xzID0gcHJvdG9jb2xzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIG1lc3NhZ2Ugb3ZlciB0aGUgd2Vic29ja2V0LlxuICAgICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBzZW5kLlxuICAgICAqL1xuICAgIHNlbmRNZXNzYWdlKG1zZykge1xuICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LnNlbmQobXNnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IHRvIHRoZSBzaWduYWxpbmcgc2VydmVyXG4gICAgICogQHBhcmFtIGNvbm5lY3Rpb25VUkwgLSBUaGUgQWRkcmVzcyBvZiB0aGUgc2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEByZXR1cm5zIElmIHRoZXJlIGlzIGEgY29ubmVjdGlvblxuICAgICAqL1xuICAgIGNvbm5lY3QoY29ubmVjdGlvblVSTCkge1xuICAgICAgICBMb2dnZXIuSW5mbyhjb25uZWN0aW9uVVJMKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldChjb25uZWN0aW9uVVJMLCB0aGlzLnByb3RvY29scyk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5vbm9wZW4gPSAoXykgPT4gdGhpcy5oYW5kbGVPbk9wZW4oKTtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0Lm9uZXJyb3IgPSAoXykgPT4gdGhpcy5oYW5kbGVPbkVycm9yKCk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5vbmNsb3NlID0gKGV2ZW50KSA9PiB0aGlzLmhhbmRsZU9uQ2xvc2UoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQub25tZXNzYWdlID0gKGV2ZW50KSA9PiB0aGlzLmhhbmRsZU9uTWVzc2FnZShldmVudCk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5vbm1lc3NhZ2ViaW5hcnkgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlT25NZXNzYWdlQmluYXJ5KGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNjb25uZWN0IHRoaXMgdHJhbnNwb3J0LlxuICAgICAqIEBwYXJhbSBjb2RlIC0gQW4gb3B0aW9uYWwgZGlzY29ubmVjdCBjb2RlLlxuICAgICAqIEBwYXJhbSByZWFzb24gLSBBIGRlc2NyaXB0aXZlIHN0cmluZyBmb3IgdGhlIGRpc2Nvbm5lY3QgcmVhc29uLlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgdHJhbnNwb3J0IGlzIGNvbm5lY3RlZCBhbmQgcmVhZHkgdG8gc2VuZC9yZWNlaXZlIG1lc3NhZ2VzLlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMud2ViU29ja2V0ICYmIHRoaXMud2ViU29ja2V0LnJlYWR5U3RhdGUgIT0gV2ViU29ja2V0LkNMT1NFRDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGF0IGhhcHBlbnMgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgaW4gYmluYXJ5IGZvcm1cbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBNZXNzYWdlIFJlY2VpdmVkXG4gICAgICovXG4gICAgaGFuZGxlT25NZXNzYWdlQmluYXJ5KGV2ZW50KSB7XG4gICAgICAgIC8vIGlmIHRoZSBldmVudCBpcyBlbXB0eSByZXR1cm5cbiAgICAgICAgaWYgKCFldmVudCB8fCAhZXZlbnQuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGhhbmRsZSB0aGUgYmluYXJ5IGFuZCB0aGVuIGhhbmRsZSB0aGUgbWVzc2FnZVxuICAgICAgICBldmVudC5kYXRhXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudGhlbigobWVzc2FnZVN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gYnVpbGQgYSBuZXcgbWVzc2FnZVxuICAgICAgICAgICAgY29uc3QgY29uc3RydWN0ZWRNZXNzYWdlID0gbmV3IE1lc3NhZ2VFdmVudCgnbWVzc2FnZUZyb21CaW5hcnknLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogbWVzc2FnZVN0cmluZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBzZW5kIHRoZSBuZXcgc3RyaW5naWZpZWQgZXZlbnQgYmFjayBpbnRvIGBvbm1lc3NhZ2VgXG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9uTWVzc2FnZShjb25zdHJ1Y3RlZE1lc3NhZ2UpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBGYWlsZWQgdG8gcGFyc2UgYmluYXJ5IGJsb2IgZnJvbSB3ZWJzb2NrZXQsIHJlYXNvbjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGF0IGhhcHBlbnMgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBNZXNzYWdlIFJlY2VpdmVkXG4gICAgICovXG4gICAgaGFuZGxlT25NZXNzYWdlKGV2ZW50KSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlYnNvY2tldCBtZXNzYWdlIGlzIGJpbmFyeSwgaWYgc28sIHN0cmluZ2lmeSBpdC5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YSBpbnN0YW5jZW9mIEJsb2IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT25NZXNzYWdlQmluYXJ5KGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMub25NZXNzYWdlKGV2ZW50LmRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgV2Vic29ja2V0IGlzIG9wZW5lZFxuICAgICAqL1xuICAgIGhhbmRsZU9uT3BlbigpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0Nvbm5lY3RlZCB0byB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIgdmlhIFdlYlNvY2tldCcpO1xuICAgICAgICB0aGlzLmVtaXQoJ29wZW4nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIG9uIHRoZSB3ZWJzb2NrZXRcbiAgICAgKi9cbiAgICBoYW5kbGVPbkVycm9yKCkge1xuICAgICAgICAvL0xvZ2dlci5FcnJvcihMb2dnZXIuR2V0U3RhY2tUcmFjZSgpLCAnV2ViU29ja2V0IGVycm9yJyk7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBXZWJzb2NrZXQgaXMgY2xvc2VkXG4gICAgICogQHBhcmFtIGV2ZW50IC0gQ2xvc2UgRXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVPbkNsb3NlKGV2ZW50KSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEaXNjb25uZWN0ZWQgdG8gdGhlIHNpZ25hbGxpbmcgc2VydmVyIHZpYSBXZWJTb2NrZXQ6ICcgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXZlbnQuY29kZSkgK1xuICAgICAgICAgICAgJyAtICcgK1xuICAgICAgICAgICAgZXZlbnQucmVhc29uKTtcbiAgICAgICAgdGhpcy5lbWl0KCdjbG9zZScsIGV2ZW50KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWJTb2NrZXRUcmFuc3BvcnQuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL0V2ZW50L0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgV2ViU29ja2V0IGZyb20gJ3dzJztcbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgV2ViU29ja2V0VHJhbnNwb3J0IGZyb20gcGl4ZWxzdHJlYW1pbmdjb21tb24gdGhhdCBzdXBwb3J0cyBub2RlLmpzIHdlYnNvY2tldHNcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIHNsaWdodCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSAnd3MnIG5vZGUuanMgcGFja2FnZSBhbmQgdGhlIHdlYnNvY2tldHNcbiAqIHN1cHBvcnRlZCBpbiB0aGUgYnJvd3NlcnMuXG4gKiBEbyBub3QgdXNlIHRoaXMgY29kZSBpbiBhIGJyb3dzZXIgdXNlICdXZWJTb2NrZXRUcmFuc3BvcnQnIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRUcmFuc3BvcnROSlMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuV1NfT1BFTl9TVEFURSA9IDE7XG4gICAgICAgIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIFdlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQgPSBhcmd1bWVudDtcbiAgICAgICAgICAgIHRoaXMuc2V0dXBTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdvcGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdG9jb2xzID0gYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBtZXNzYWdlIG92ZXIgdGhlIHdlYnNvY2tldC5cbiAgICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gc2VuZC5cbiAgICAgKi9cbiAgICBzZW5kTWVzc2FnZShtc2cpIHtcbiAgICAgICAgaWYgKHRoaXMud2ViU29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5zZW5kKG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byB0aGUgc2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEBwYXJhbSBjb25uZWN0aW9uVVJMIC0gVGhlIEFkZHJlc3Mgb2YgdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKiBAcGFyYW0gcHJvdG9jb2xzIC0gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyB0byBwYXNzIHRvIHRoZSBuZXcgd2Vic29ja2V0IHByb3RvY29scyBwYXJhbVxuICAgICAqIEByZXR1cm5zIElmIHRoZXJlIGlzIGEgY29ubmVjdGlvblxuICAgICAqL1xuICAgIGNvbm5lY3QoY29ubmVjdGlvblVSTCkge1xuICAgICAgICB0aGlzLndlYlNvY2tldCA9IG5ldyBXZWJTb2NrZXQoY29ubmVjdGlvblVSTCwgdGhpcy5wcm90b2NvbHMpO1xuICAgICAgICB0aGlzLnNldHVwU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3QgdGhpcyB0cmFuc3BvcnQuXG4gICAgICogQHBhcmFtIGNvZGUgLSBBbiBvcHRpb25hbCBkaXNjb25uZWN0IGNvZGUuXG4gICAgICogQHBhcmFtIHJlYXNvbiAtIEEgZGVzY3JpcHRpdmUgc3RyaW5nIGZvciB0aGUgZGlzY29ubmVjdCByZWFzb24uXG4gICAgICovXG4gICAgZGlzY29ubmVjdChjb2RlLCByZWFzb24pIHtcbiAgICAgICAgaWYgKHRoaXMud2ViU29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIGFuZCByZWFkeSB0byBzZW5kL3JlY2VpdmUgbWVzc2FnZXMuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIGNvbm5lY3RlZC5cbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy53ZWJTb2NrZXQgJiYgdGhpcy53ZWJTb2NrZXQucmVhZHlTdGF0ZSAhPSBXZWJTb2NrZXQuQ0xPU0VEO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoYXQgaGFwcGVucyB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgICAqIEBwYXJhbSBldmVudCAtIE1lc3NhZ2UgUmVjZWl2ZWRcbiAgICAgKi9cbiAgICBoYW5kbGVPbk1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMub25NZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLm9uTWVzc2FnZShldmVudC5kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIFdlYnNvY2tldCBpcyBvcGVuZWRcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBOb3QgVXNlZFxuICAgICAqL1xuICAgIGhhbmRsZU9uT3BlbihldmVudCkge1xuICAgICAgICB0aGlzLmVtaXQoJ29wZW4nLCBldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBvbiB0aGUgd2Vic29ja2V0XG4gICAgICogQHBhcmFtIGV2ZW50IC0gRXJyb3IgUGF5bG9hZFxuICAgICAqL1xuICAgIGhhbmRsZU9uRXJyb3IoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBXZWJzb2NrZXQgaXMgY2xvc2VkXG4gICAgICogQHBhcmFtIGV2ZW50IC0gQ2xvc2UgRXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVPbkNsb3NlKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZW1pdCgnY2xvc2UnLCBldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyB0aGUgV2Vic29ja2V0IGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLndlYlNvY2tldCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsb3NlKCk7XG4gICAgfVxuICAgIHNldHVwU29ja2V0SGFuZGxlcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoaXMuaGFuZGxlT25PcGVuLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLmhhbmRsZU9uRXJyb3IuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIHRoaXMuaGFuZGxlT25DbG9zZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZU9uTWVzc2FnZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYlNvY2tldFRyYW5zcG9ydE5KUy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IGNsYXNzIFNEUFV0aWxzIHtcbiAgICBzdGF0aWMgYWRkVmlkZW9IZWFkZXJFeHRlbnNpb25Ub1NkcChzZHAsIHVyaSkge1xuICAgICAgICAvLyBGaW5kIHRoZSBoaWdoZXN0IHVzZWQgaGVhZGVyIGV4dGVuc2lvbiBpZCBieSBzb3J0aW5nIHRoZSBleHRlbnNpb24gaWRzIHVzZWQsXG4gICAgICAgIC8vIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZXMgYW5kIGFkZGluZyBvbmUuXG4gICAgICAgIC8vIFRvZG86IFVwZGF0ZSB0aGlzIHdoZW4gV2ViUlRDIGluIENocm9tZSBzdXBwb3J0cyB0aGUgaGVhZGVyIGV4dGVuc2lvbiBBUEkuXG4gICAgICAgIGNvbnN0IHVzZWRJZHMgPSBzZHBcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aCgnYT1leHRtYXA6JykpXG4gICAgICAgICAgICAubWFwKChsaW5lKSA9PiBwYXJzZUludChsaW5lLnNwbGl0KCcgJylbMF0uc3Vic3RyaW5nKDkpLCAxMCkpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtLCBpbmRleCwgYXJyYXkpID0+IGFycmF5LmluZGV4T2YoaXRlbSkgPT09IGluZGV4KTtcbiAgICAgICAgY29uc3QgbmV4dElkID0gdXNlZElkc1t1c2VkSWRzLmxlbmd0aCAtIDFdICsgMTtcbiAgICAgICAgY29uc3QgZXh0bWFwTGluZSA9ICdhPWV4dG1hcDonICsgbmV4dElkICsgJyAnICsgdXJpICsgJ1xcclxcbic7XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gc2RwLnNwbGl0KCdcXG5tPScpLm1hcCgocGFydCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoaW5kZXggPiAwID8gJ209JyArIHBhcnQgOiBwYXJ0KS50cmltKCkgKyAnXFxyXFxuJztcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNlc3Npb25QYXJ0ID0gc2VjdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgLy8gT25seSBhZGQgZXh0ZW5zaW9uIHRvIG09dmlkZW8gbWVkaWEgc2VjdGlvblxuICAgICAgICByZXR1cm4gKHNlc3Npb25QYXJ0ICtcbiAgICAgICAgICAgIHNlY3Rpb25zXG4gICAgICAgICAgICAgICAgLm1hcCgobWVkaWFTZWN0aW9uKSA9PiBtZWRpYVNlY3Rpb24uc3RhcnRzV2l0aCgnbT12aWRlbycpID8gbWVkaWFTZWN0aW9uICsgZXh0bWFwTGluZSA6IG1lZGlhU2VjdGlvbilcbiAgICAgICAgICAgICAgICAuam9pbignJykpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNkcFV0aWxzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgeyBMb2dnZXIsIExvZ0xldmVsLCBvdmVycmlkZUxvZ2dlciB9IGZyb20gJy4vTG9nZ2VyL0xvZ2dlcic7XG5leHBvcnQgeyBXZWJTb2NrZXRUcmFuc3BvcnQgfSBmcm9tICcuL1RyYW5zcG9ydC9XZWJTb2NrZXRUcmFuc3BvcnQnO1xuZXhwb3J0IHsgV2ViU29ja2V0VHJhbnNwb3J0TkpTIH0gZnJvbSAnLi9UcmFuc3BvcnQvV2ViU29ja2V0VHJhbnNwb3J0TkpTJztcbmV4cG9ydCB7IFNpZ25hbGxpbmdQcm90b2NvbCB9IGZyb20gJy4vUHJvdG9jb2wvU2lnbmFsbGluZ1Byb3RvY29sJztcbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vRXZlbnQvRXZlbnRFbWl0dGVyJztcbmV4cG9ydCB7IE1lc3NhZ2VSZWdpc3RyeSB9IGZyb20gJy4vTWVzc2FnZXMvbWVzc2FnZV9yZWdpc3RyeSc7XG5pbXBvcnQgKiBhcyBNZXNzYWdlc18xIGZyb20gJy4vTWVzc2FnZXMvc2lnbmFsbGluZ19tZXNzYWdlcyc7XG5leHBvcnQgeyBNZXNzYWdlc18xIGFzIE1lc3NhZ2VzIH07XG5pbXBvcnQgKiBhcyBNZXNzYWdlSGVscGVyc18xIGZyb20gJy4vTWVzc2FnZXMvbWVzc2FnZV9oZWxwZXJzJztcbmV4cG9ydCB7IE1lc3NhZ2VIZWxwZXJzXzEgYXMgTWVzc2FnZUhlbHBlcnMgfTtcbmV4cG9ydCB7IEtlZXBhbGl2ZU1vbml0b3IgfSBmcm9tICcuL1Byb3RvY29sL0tlZXBhbGl2ZU1vbml0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9VdGlsL1NkcFV0aWxzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpeGVsc3RyZWFtaW5nY29tbW9uLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBGbGFncywgTnVtZXJpY1BhcmFtZXRlcnMgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IEFma1RpbWVkT3V0RXZlbnQsIEFma1dhcm5pbmdBY3RpdmF0ZUV2ZW50LCBBZmtXYXJuaW5nRGVhY3RpdmF0ZUV2ZW50LCBBZmtXYXJuaW5nVXBkYXRlRXZlbnQgfSBmcm9tICcuLi9VdGlsL0V2ZW50RW1pdHRlcic7XG5leHBvcnQgY2xhc3MgQUZLQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBwaXhlbFN0cmVhbWluZywgb25EaXNtaXNzQWZrKSB7XG4gICAgICAgIC8vIHRpbWUgb3V0IGxvZ2ljIGRldGFpbHNcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb3VudGRvd25BY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy53YXJuVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY291bnREb3duID0gMDtcbiAgICAgICAgdGhpcy5jb3VudERvd25UaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcgPSBwaXhlbFN0cmVhbWluZztcbiAgICAgICAgdGhpcy5vbkRpc21pc3NBZmsgPSBvbkRpc21pc3NBZms7XG4gICAgICAgIHRoaXMub25BRktUaW1lZE91dENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FGSyB0aW1lZCBvdXQsIGRpZCB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGlzIGNhbGxiYWNrPycpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0aG9kcyB0aGF0IG9jY3VyIHdoZW4gYW4gYWZrIGV2ZW50IGxpc3RlbmVyIGlzIGNsaWNrZWRcbiAgICAgKi9cbiAgICBvbkFma0NsaWNrKCkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuY291bnREb3duVGltZXIpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmUgfHwgdGhpcy5jb3VudGRvd25BY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRBZmtXYXJuaW5nVGltZXIoKTtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgQWZrV2FybmluZ0RlYWN0aXZhdGVFdmVudCgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydCB0aGUgd2FybmluZyB0aW1lciBpZiBhIHRpbWVvdXQgaXMgc2V0IGdyZWF0ZXIgdGhhdCAwIHNlY29uZHNcbiAgICAgKi9cbiAgICBzdGFydEFma1dhcm5pbmdUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MpID4gMCAmJlxuICAgICAgICAgICAgdGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5BRktEZXRlY3Rpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRBZmtXYXJuaW5nVGltZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcCB0aGUgYWZrIHdhcm5pbmcgdGltZXJcbiAgICAgKi9cbiAgICBzdG9wQWZrV2FybmluZ1RpbWVyKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvdW50ZG93bkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy53YXJuVGltZXIpO1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuY291bnREb3duVGltZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXVzZSB0aGUgdGltZXIgd2hpY2ggd2hlbiBlbGFwc2VkIHdpbGwgd2FybiB0aGUgdXNlciB0aGV5IGFyZSBpbmFjdGl2ZS5cbiAgICAgKi9cbiAgICBwYXVzZUFma1dhcm5pbmdUaW1lcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHVzZXIgaW50ZXJhY3RzIHRoZW4gcmVzZXQgdGhlIHdhcm5pbmcgdGltZXIuXG4gICAgICovXG4gICAgcmVzZXRBZmtXYXJuaW5nVGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSAmJiB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkFGS0RldGVjdGlvbikpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLndhcm5UaW1lcik7XG4gICAgICAgICAgICB0aGlzLndhcm5UaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hY3RpdmF0ZUFma0V2ZW50KCksIHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MpICogMTAwMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGUgQUZLIG92ZXJsYXkgYW5kIGJlZ2luIHRoZSBjb3VudERvd25cbiAgICAgKi9cbiAgICBhY3RpdmF0ZUFma0V2ZW50KCkge1xuICAgICAgICAvLyBQYXVzZSB0aGUgdGltZXIgd2hpbGUgdGhlIHVzZXIgaXMgbG9va2luZyBhdCB0aGUgaW5hY3Rpdml0eSB3YXJuaW5nIG92ZXJsYXlcbiAgICAgICAgdGhpcy5wYXVzZUFma1dhcm5pbmdUaW1lcigpO1xuICAgICAgICAvLyBpbnN0YW50aWF0ZSBhIG5ldyBvdmVybGF5XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgQWZrV2FybmluZ0FjdGl2YXRlRXZlbnQoe1xuICAgICAgICAgICAgY291bnREb3duOiB0aGlzLmNvdW50RG93bixcbiAgICAgICAgICAgIGRpc21pc3NBZms6IHRoaXMub25EaXNtaXNzQWZrXG4gICAgICAgIH0pKTtcbiAgICAgICAgLy8gdXBkYXRlIG91ciBjb3VudERvd24gdGltZXIgYW5kIG92ZXJsYXkgY29udGVudHNcbiAgICAgICAgdGhpcy5jb3VudERvd24gPSB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLkFGS0NvdW50ZG93blNlY3MpO1xuICAgICAgICB0aGlzLmNvdW50ZG93bkFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgQWZrV2FybmluZ1VwZGF0ZUV2ZW50KHsgY291bnREb3duOiB0aGlzLmNvdW50RG93biB9KSk7XG4gICAgICAgIC8vIGlmIHdlIGFyZSBpbiBsb2NrZWQgbW91c2UgZXhpdCBwb2ludGVybG9ja1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUpKSB7XG4gICAgICAgICAgICAvLyBtaW5vciBoYWNrIHRvIGFsbGV2aWF0ZSBpb3Mgbm90IHN1cHBvcnRpbmcgcG9pbnRlcmxvY2tcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5leGl0UG9pbnRlckxvY2spIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5leGl0UG9pbnRlckxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyByZXNldCBvdXIgY291bnREb3duIGludGVydmFsIGFjY29yZGluZ2x5XG4gICAgICAgIHRoaXMuY291bnREb3duVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvdW50RG93bi0tO1xuICAgICAgICAgICAgaWYgKHRoaXMuY291bnREb3duID09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBmYWlsZWQgdG8gY2xpY2sgc28gaGlkZSB0aGUgb3ZlcmxheSBhbmQgZGlzY29ubmVjdCB0aGVtLlxuICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgQWZrVGltZWRPdXRFdmVudCgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQUZLVGltZWRPdXRDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIExvZ2dlci5JbmZvKCdZb3UgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCBkdWUgdG8gaW5hY3Rpdml0eScpO1xuICAgICAgICAgICAgICAgIC8vIHN3aXRjaCBvZmYgdGhlIGFmayBmZWF0dXJlIGFzIHN0cmVhbSBoYXMgY2xvc2VkXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wQWZrV2FybmluZ1RpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IEFma1dhcm5pbmdVcGRhdGVFdmVudCh7IGNvdW50RG93bjogdGhpcy5jb3VudERvd24gfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BRktDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBTZXR0aW5nRmxhZyB9IGZyb20gJy4vU2V0dGluZ0ZsYWcnO1xuaW1wb3J0IHsgU2V0dGluZ051bWJlciB9IGZyb20gJy4vU2V0dGluZ051bWJlcic7XG5pbXBvcnQgeyBTZXR0aW5nVGV4dCB9IGZyb20gJy4vU2V0dGluZ1RleHQnO1xuaW1wb3J0IHsgU2V0dGluZ09wdGlvbiB9IGZyb20gJy4vU2V0dGluZ09wdGlvbic7XG5pbXBvcnQgeyBTZXR0aW5nc0NoYW5nZWRFdmVudCB9IGZyb20gJy4uL1V0aWwvRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IEJyb3dzZXJVdGlscyB9IGZyb20gJy4uL1V0aWwvQnJvd3NlclV0aWxzJztcbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGZsYWdzIHRoYXQgY2FuIGJlIHRvZ2dsZWQgYW5kIGFyZSBjb3JlIHRvIGFsbCBQaXhlbCBTdHJlYW1pbmcgZXhwZXJpZW5jZXMuXG4gKiBUaGVzZSBhcmUgdXNlZCBpbiB0aGUgYENvbmZpZy5GbGFnc2AgbWFwLlxuICovXG5leHBvcnQgY2xhc3MgRmxhZ3Mge1xufVxuRmxhZ3MuQXV0b0Nvbm5lY3QgPSAnQXV0b0Nvbm5lY3QnO1xuRmxhZ3MuQXV0b1BsYXlWaWRlbyA9ICdBdXRvUGxheVZpZGVvJztcbkZsYWdzLkFGS0RldGVjdGlvbiA9ICdUaW1lb3V0SWZJZGxlJztcbkZsYWdzLkhvdmVyaW5nTW91c2VNb2RlID0gJ0hvdmVyaW5nTW91c2UnO1xuRmxhZ3MuRm9yY2VNb25vQXVkaW8gPSAnRm9yY2VNb25vQXVkaW8nO1xuRmxhZ3MuRm9yY2VUVVJOID0gJ0ZvcmNlVFVSTic7XG5GbGFncy5GYWtlTW91c2VXaXRoVG91Y2hlcyA9ICdGYWtlTW91c2VXaXRoVG91Y2hlcyc7XG5GbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyID0gJ0NvbnRyb2xzUXVhbGl0eSc7XG5GbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbiA9ICdNYXRjaFZpZXdwb3J0UmVzJztcbkZsYWdzLlN0YXJ0VmlkZW9NdXRlZCA9ICdTdGFydFZpZGVvTXV0ZWQnO1xuRmxhZ3MuU3VwcHJlc3NCcm93c2VyS2V5cyA9ICdTdXBwcmVzc0Jyb3dzZXJLZXlzJztcbkZsYWdzLlVzZU1pYyA9ICdVc2VNaWMnO1xuRmxhZ3MuVXNlTW9kYWxGb3JUZXh0SW5wdXQgPSAnVXNlTW9kYWxGb3JUZXh0SW5wdXQnO1xuRmxhZ3MuVXNlQ2FtZXJhID0gJ1VzZUNhbWVyYSc7XG5GbGFncy5LZXlib2FyZElucHV0ID0gJ0tleWJvYXJkSW5wdXQnO1xuRmxhZ3MuTW91c2VJbnB1dCA9ICdNb3VzZUlucHV0JztcbkZsYWdzLlRvdWNoSW5wdXQgPSAnVG91Y2hJbnB1dCc7XG5GbGFncy5HYW1lcGFkSW5wdXQgPSAnR2FtZXBhZElucHV0JztcbkZsYWdzLlhSQ29udHJvbGxlcklucHV0ID0gJ1hSQ29udHJvbGxlcklucHV0JztcbkZsYWdzLldhaXRGb3JTdHJlYW1lciA9ICdXYWl0Rm9yU3RyZWFtZXInO1xuRmxhZ3MuSGlkZVVJID0gJ0hpZGVVSSc7XG5GbGFncy5FbmFibGVDYXB0dXJlVGltZUV4dCA9ICdFbmFibGVDYXB0dXJlVGltZUV4dCc7XG5leHBvcnQgY29uc3QgaXNGbGFnSWQgPSAoaWQpID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEZsYWdzKS5zb21lKChuYW1lKSA9PiBGbGFnc1tuYW1lXSA9PT0gaWQpO1xuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgbnVtZXJpYyBwYXJhbWV0ZXJzIHRoYXQgYXJlIGNvcmUgdG8gYWxsIFBpeGVsIFN0cmVhbWluZyBleHBlcmllbmNlcy5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBOdW1lcmljUGFyYW1ldGVycyB7XG59XG5OdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcyA9ICdBRktUaW1lb3V0Jztcbk51bWVyaWNQYXJhbWV0ZXJzLkFGS0NvdW50ZG93blNlY3MgPSAnQUZLQ291bnRkb3duJztcbk51bWVyaWNQYXJhbWV0ZXJzLk1pblFQID0gJ01pblFQJztcbk51bWVyaWNQYXJhbWV0ZXJzLk1heFFQID0gJ01heFFQJztcbk51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHkgPSAnTWluUXVhbGl0eSc7XG5OdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5ID0gJ01heFF1YWxpdHknO1xuTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbiA9ICdDb21wYXRRdWFsaXR5TWluJztcbk51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXggPSAnQ29tcGF0UXVhbGl0eU1heCc7XG5OdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFMgPSAnV2ViUlRDRlBTJztcbk51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUgPSAnV2ViUlRDTWluQml0cmF0ZSc7XG5OdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlID0gJ1dlYlJUQ01heEJpdHJhdGUnO1xuTnVtZXJpY1BhcmFtZXRlcnMuTWF4UmVjb25uZWN0QXR0ZW1wdHMgPSAnTWF4UmVjb25uZWN0QXR0ZW1wdHMnO1xuTnVtZXJpY1BhcmFtZXRlcnMuU3RyZWFtZXJBdXRvSm9pbkludGVydmFsID0gJ1N0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbCc7XG5OdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSA9ICdLZWVwYWxpdmVEZWxheSc7XG5leHBvcnQgY29uc3QgaXNOdW1lcmljSWQgPSAoaWQpID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE51bWVyaWNQYXJhbWV0ZXJzKS5zb21lKChuYW1lKSA9PiBOdW1lcmljUGFyYW1ldGVyc1tuYW1lXSA9PT0gaWQpO1xuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgdGV4dHVhbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGNvcmUgdG8gYWxsIFBpeGVsIFN0cmVhbWluZyBleHBlcmllbmNlcy5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0UGFyYW1ldGVycyB7XG59XG5UZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsID0gJ3NzJztcbmV4cG9ydCBjb25zdCBpc1RleHRJZCA9IChpZCkgPT4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoVGV4dFBhcmFtZXRlcnMpLnNvbWUoKG5hbWUpID0+IFRleHRQYXJhbWV0ZXJzW25hbWVdID09PSBpZCk7XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBlbnVtIGJhc2VkIHBhcmFtZXRlcnMgdGhhdCBhcmUgY29yZSB0byBhbGwgUGl4ZWwgU3RyZWFtaW5nIGV4cGVyaWVuY2VzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIE9wdGlvblBhcmFtZXRlcnMge1xufVxuT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYyA9ICdQcmVmZXJyZWRDb2RlYyc7XG5PcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQgPSAnU3RyZWFtZXJJZCc7XG5PcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkgPSAnUHJlZmVycmVkUXVhbGl0eSc7XG5leHBvcnQgY29uc3QgaXNPcHRpb25JZCA9IChpZCkgPT4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT3B0aW9uUGFyYW1ldGVycykuc29tZSgobmFtZSkgPT4gT3B0aW9uUGFyYW1ldGVyc1tuYW1lXSA9PT0gaWQpO1xuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gICAgLy8gLS0tLS0tLS0tLS0tIFNldHRpbmdzIC0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICAgICAgLyogQSBtYXAgb2YgZmxhZ3MgdGhhdCBjYW4gYmUgdG9nZ2xlZCAtIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluIHRoZSBhcHBsaWNhdGlvbiAtIGUuZy4gVXNlIE1pYz8gKi9cbiAgICAgICAgdGhpcy5mbGFncyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgbnVtZXJpY2FsIHNldHRpbmdzIC0gb3B0aW9ucyB0aGF0IGNhbiBiZSBpbiB0aGUgYXBwbGljYXRpb24gLSBlLmcuIE1pbkJpdHJhdGUgKi9cbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgdGV4dCBzZXR0aW5ncyAtIGUuZy4gc2lnbmFsbGluZyBzZXJ2ZXIgdXJsICovXG4gICAgICAgIHRoaXMudGV4dFBhcmFtZXRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8qIEEgbWFwIG9mIGVudW0gYmFzZWQgc2V0dGluZ3MgLSBlLmcuIHByZWZlcnJlZCBjb2RlYyAqL1xuICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IHsgaW5pdGlhbFNldHRpbmdzLCB1c2VVcmxQYXJhbXMsIHdlYlNvY2tldFByb3RvY29scyB9ID0gY29uZmlnO1xuICAgICAgICB0aGlzLl91c2VVcmxQYXJhbXMgPSAhIXVzZVVybFBhcmFtcztcbiAgICAgICAgdGhpcy5fd2ViU29ja2V0UHJvdG9jb2xzID0gd2ViU29ja2V0UHJvdG9jb2xzO1xuICAgICAgICB0aGlzLnBvcHVsYXRlRGVmYXVsdFNldHRpbmdzKHRoaXMuX3VzZVVybFBhcmFtcywgaW5pdGlhbFNldHRpbmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiByZWFkaW5nIGNvbmZpZ3VyYXRpb24gaW5pdGlhbCB2YWx1ZXMgZnJvbSBVUkwgcGFyYW1ldGVycywgYW5kXG4gICAgICogcGVyc2lzdGluZyBjaGFuZ2VzIGluIFVSTCB3aGVuIGNoYW5nZWQuXG4gICAgICovXG4gICAgZ2V0IHVzZVVybFBhcmFtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZVVybFBhcmFtcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHByb3RvY29sIG9yIGxpc3Qgb2YgcHJvdG9jb2xzIHRvIHBhc3MgdG8gdGhlIHdlYnNvY2tldCBpZiBzZXQuXG4gICAgICovXG4gICAgZ2V0IHdlYlNvY2tldFByb3RvY29scygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlYlNvY2tldFByb3RvY29scztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUG9wdWxhdGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIGEgUGl4ZWwgU3RyZWFtaW5nIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgcG9wdWxhdGVEZWZhdWx0U2V0dGluZ3ModXNlVXJsUGFyYW1zLCBzZXR0aW5ncykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGV4dCBQYXJhbWV0ZXJzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRleHRQYXJhbWV0ZXJzLnNldChUZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsLCBuZXcgU2V0dGluZ1RleHQoVGV4dFBhcmFtZXRlcnMuU2lnbmFsbGluZ1NlcnZlclVybCwgJ1NpZ25hbGxpbmcgdXJsJywgJ1VybCBvZiB0aGUgc2lnbmFsbGluZyBzZXJ2ZXInLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIFRleHRQYXJhbWV0ZXJzLlNpZ25hbGxpbmdTZXJ2ZXJVcmwpXG4gICAgICAgICAgICA/IHNldHRpbmdzW1RleHRQYXJhbWV0ZXJzLlNpZ25hbGxpbmdTZXJ2ZXJVcmxdXG4gICAgICAgICAgICA6IChsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzOi8vJyA6ICd3czovLycpICtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgK1xuICAgICAgICAgICAgICAgIC8vIGZvciByZWFkYWJpbGl0eSwgd2Ugb21pdCB0aGUgcG9ydCBpZiBpdCdzIDgwXG4gICAgICAgICAgICAgICAgKHdpbmRvdy5sb2NhdGlvbi5wb3J0ID09PSAnODAnIHx8IHdpbmRvdy5sb2NhdGlvbi5wb3J0ID09PSAnJ1xuICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgIDogYDoke3dpbmRvdy5sb2NhdGlvbi5wb3J0fWApLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzLnNldChPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQsIG5ldyBTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCwgJ1N0cmVhbWVyIElEJywgJ1RoZSBJRCBvZiB0aGUgc3RyZWFtZXIgdG8gc3RyZWFtLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWRdXG4gICAgICAgICAgICA6ICcnLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZClcbiAgICAgICAgICAgID8gW3NldHRpbmdzW09wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZF1dXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIGNvbnN0IGdldERlZmF1bHRWaWRlb0NvZGVjID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgdmlkZW9Db2RlY3MgPSBCcm93c2VyVXRpbHMuZ2V0U3VwcG9ydGVkVmlkZW9Db2RlY3MoKTtcbiAgICAgICAgICAgIC8vIElmIG9ubHkgb25lIG9wdGlvbiwgdGhlbiBzZWxlY3QgdGhhdC5cbiAgICAgICAgICAgIGlmICh2aWRlb0NvZGVjcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2aWRlb0NvZGVjc1swXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvQ29kZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0Q29kZWMgPSB2aWRlb0NvZGVjc1swXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGVjIG9mIHZpZGVvQ29kZWNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlYy5zdGFydHNXaXRoKCdIMjY0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2RlYztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvZGVjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKCdDb3VsZCBub3QgZmluZCBhbnkgcmVhc29uYWJsZSB2aWRlbyBjb2RlYyB0byBhc3NpZ24gYXMgYSBkZWZhdWx0LicpO1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtYXRjaFNwZWNpZmllZENvZGVjVG9DbG9zZXN0U3VwcG9ydGVkID0gZnVuY3Rpb24gKHNwZWNpZmllZENvZGVjKSB7XG4gICAgICAgICAgICBjb25zdCBicm93c2VyU3VwcG9ydGVkQ29kZWNzID0gQnJvd3NlclV0aWxzLmdldFN1cHBvcnRlZFZpZGVvQ29kZWNzKCk7XG4gICAgICAgICAgICAvLyBDb2RlYyBzdXBwbGllZCBpbiB1cmwgcGFyYW0gaXMgYW4gZXhhY3QgbWF0Y2ggZm9yIHRoZSBicm93c2VyIGNvZGVjLlxuICAgICAgICAgICAgLy8gKGUuZy4gSDI2NCBsZXZlbC1hc3ltbWV0cnktYWxsb3dlZD0xO3BhY2tldGl6YXRpb24tbW9kZT0xO3Byb2ZpbGUtbGV2ZWwtaWQ9NDJlMDFmKVxuICAgICAgICAgICAgaWYgKGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MuaW5jbHVkZXMoc3BlY2lmaWVkQ29kZWMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmllZENvZGVjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIHRoZSBzdGFydCBvZiB3aGF0ZXZlciBpcyBwYXNzZWQgaW50byB0aGUgdXJsIHBhcmFtZXRlciB3aXRoIHdoYXQgdGhlIGJyb3dzZXIgc3VwcG9ydHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgYnJvd3NlckNvZGVjIG9mIGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnJvd3NlckNvZGVjLnN0YXJ0c1dpdGgoc3BlY2lmaWVkQ29kZWMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBicm93c2VyQ29kZWM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZW4ndCBhYmxlIHRvIG1hdGNoLCBqdXN0IHJldHVybiB0aGUgY29kZWMgYXMgZnJvbSB0aGUgVVJMIGFzLWlzLlxuICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmllZENvZGVjO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogRW51bSBQYXJhbWV0ZXJzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnMuc2V0KE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMsIG5ldyBTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMsICdQcmVmZXJyZWQgQ29kZWMnLCAnVGhlIHByZWZlcnJlZCBjb2RlYyB0byBiZSB1c2VkIGR1cmluZyBjb2RlYyBuZWdvdGlhdGlvbicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYylcbiAgICAgICAgICAgID8gbWF0Y2hTcGVjaWZpZWRDb2RlY1RvQ2xvc2VzdFN1cHBvcnRlZChzZXR0aW5nc1tPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjXSlcbiAgICAgICAgICAgIDogZ2V0RGVmYXVsdFZpZGVvQ29kZWMoKSwgQnJvd3NlclV0aWxzLmdldFN1cHBvcnRlZFZpZGVvQ29kZWNzKCksIHVzZVVybFBhcmFtcywgbWF0Y2hTcGVjaWZpZWRDb2RlY1RvQ2xvc2VzdFN1cHBvcnRlZCkpO1xuICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnMuc2V0KE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSwgbmV3IFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5LCAnUHJlZmVycmVkIFF1YWxpdHknLCAnVGhlIHByZWZlcnJlZCBxdWFsaXR5IG9mIHRoZSBzdHJlYW0gKG9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIHRoZSBTRlUpJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkpXG4gICAgICAgICAgICA/IHNldHRpbmdzW09wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eV1cbiAgICAgICAgICAgIDogJ0RlZmF1bHQnLCBbJ0RlZmF1bHQnXSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCb29sZWFuIHBhcmFtZXRlcnNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkF1dG9Db25uZWN0LCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuQXV0b0Nvbm5lY3QsICdBdXRvIGNvbm5lY3QgdG8gc3RyZWFtJywgJ1doZXRoZXIgd2Ugc2hvdWxkIGF0dGVtcHQgdG8gYXV0byBjb25uZWN0IHRvIHRoZSBzaWduYWxsaW5nIHNlcnZlciBvciBzaG93IGEgY2xpY2sgdG8gc3RhcnQgcHJvbXB0LicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuQXV0b0Nvbm5lY3QpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkF1dG9Db25uZWN0XVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkF1dG9QbGF5VmlkZW8sIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5BdXRvUGxheVZpZGVvLCAnQXV0byBwbGF5IHZpZGVvJywgJ1doZW4gdmlkZW8gaXMgcmVhZHkgYXV0b21hdGljYWxseSBzdGFydCBwbGF5aW5nIGl0IGFzIG9wcG9zZWQgdG8gc2hvd2luZyBhIHBsYXkgYnV0dG9uLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuQXV0b1BsYXlWaWRlbylcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuQXV0b1BsYXlWaWRlb11cbiAgICAgICAgICAgIDogdHJ1ZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLlVzZU1pYywgbmV3IFNldHRpbmdGbGFnKEZsYWdzLlVzZU1pYywgJ1VzZSBtaWNyb3Bob25lJywgJ01ha2UgYnJvd3NlciByZXF1ZXN0IG1pY3JvcGhvbmUgYWNjZXNzIGFuZCBvcGVuIGFuIGlucHV0IGF1ZGlvIHRyYWNrLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuVXNlTWljKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5Vc2VNaWNdXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuVXNlTW9kYWxGb3JUZXh0SW5wdXQsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5Vc2VNb2RhbEZvclRleHRJbnB1dCwgJ1VzZSBtb2RhbCBmb3IgdGV4dCBpbnB1dCcsICdXaGVuIGVudGVyaW5nIGlucHV0IGludG8gYSBzdHJlYW1lZCBVRSB0ZXh0IHdpZGdldCwgdXNlIGFuIGlucHV0IG1vZGFsLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuVXNlTW9kYWxGb3JUZXh0SW5wdXQpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLlVzZU1vZGFsRm9yVGV4dElucHV0XVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuVXNlQ2FtZXJhLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuVXNlQ2FtZXJhLCAnVXNlIHdlYmNhbScsICdNYWtlIGJyb3dzZXIgcmVxdWVzdCB3ZWJjYW0gYWNjZXNzIGFuZCBvcGVuIGEgaW5wdXQgdmlkZW8gdHJhY2suJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Vc2VDYW1lcmEpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLlVzZUNhbWVyYV1cbiAgICAgICAgICAgIDogZmFsc2UsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5TdGFydFZpZGVvTXV0ZWQsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5TdGFydFZpZGVvTXV0ZWQsICdTdGFydCB2aWRlbyBtdXRlZCcsICdWaWRlbyB3aWxsIHN0YXJ0IG11dGVkIGlmIHRydWUuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5TdGFydFZpZGVvTXV0ZWQpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLlN0YXJ0VmlkZW9NdXRlZF1cbiAgICAgICAgICAgIDogZmFsc2UsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuU3VwcHJlc3NCcm93c2VyS2V5cywgJ1N1cHByZXNzIGJyb3dzZXIga2V5cycsICdTdXBwcmVzcyBjZXJ0YWluIGJyb3dzZXIga2V5cyB0aGF0IHdlIHVzZSBpbiBVRSwgZm9yIGV4YW1wbGUgRjUgdG8gc2hvdyBzaGFkZXIgY29tcGxleGl0eSBpbnN0ZWFkIG9mIHJlZnJlc2ggdGhlIHBhZ2UuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzXVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuSXNRdWFsaXR5Q29udHJvbGxlciwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXIsICdJcyBxdWFsaXR5IGNvbnRyb2xsZXI/JywgJ1RydWUgaWYgdGhpcyBwZWVyIGNvbnRyb2xzIHN0cmVhbSBxdWFsaXR5Jywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyXVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuRm9yY2VNb25vQXVkaW8sIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5Gb3JjZU1vbm9BdWRpbywgJ0ZvcmNlIG1vbm8gYXVkaW8nLCAnRm9yY2UgYnJvd3NlciB0byByZXF1ZXN0IG1vbm8gYXVkaW8gaW4gdGhlIFNEUCcsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuRm9yY2VNb25vQXVkaW8pXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkZvcmNlTW9ub0F1ZGlvXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkZvcmNlVFVSTiwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkZvcmNlVFVSTiwgJ0ZvcmNlIFRVUk4nLCAnT25seSBnZW5lcmF0ZSBUVVJOL1JlbGF5ZWQgSUNFIGNhbmRpZGF0ZXMuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Gb3JjZVRVUk4pXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkZvcmNlVFVSTl1cbiAgICAgICAgICAgIDogZmFsc2UsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5BRktEZXRlY3Rpb24sIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5BRktEZXRlY3Rpb24sICdBRksgaWYgaWRsZScsICdUaW1lb3V0IHRoZSBleHBlcmllbmNlIGlmIHVzZXIgaXMgQUZLIGZvciBhIHBlcmlvZC4nLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLkFGS0RldGVjdGlvbilcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuQUZLRGV0ZWN0aW9uXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb24sICdNYXRjaCB2aWV3cG9ydCByZXNvbHV0aW9uJywgJ1BpeGVsIFN0cmVhbWluZyB3aWxsIGJlIGluc3RydWN0ZWQgdG8gZHluYW1pY2FsbHkgcmVzaXplIHRoZSB2aWRlbyBzdHJlYW0gdG8gbWF0Y2ggdGhlIHNpemUgb2YgdGhlIHZpZGVvIGVsZW1lbnQuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbilcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb25dXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5Ib3ZlcmluZ01vdXNlTW9kZSwgJ0NvbnRyb2wgU2NoZW1lOiBMb2NrZWQgTW91c2UnLCAnRWl0aGVyIGxvY2tlZCBtb3VzZSwgd2hlcmUgdGhlIHBvaW50ZXIgaXMgY29uc3VtZWQgYnkgdGhlIHZpZGVvIGFuZCBsb2NrZWQgdG8gaXQsIG9yIGhvdmVyaW5nIG1vdXNlLCB3aGVyZSB0aGUgbW91c2UgaXMgbm90IGNvbnN1bWVkLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkhvdmVyaW5nTW91c2VNb2RlXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zLCAoaXNIb3ZlcmluZ01vdXNlLCBzZXR0aW5nKSA9PiB7XG4gICAgICAgICAgICBzZXR0aW5nLmxhYmVsID0gYENvbnRyb2wgU2NoZW1lOiAke2lzSG92ZXJpbmdNb3VzZSA/ICdIb3ZlcmluZycgOiAnTG9ja2VkJ30gTW91c2VgO1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkZha2VNb3VzZVdpdGhUb3VjaGVzLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMsICdGYWtlIG1vdXNlIHdpdGggdG91Y2hlcycsICdBIHNpbmdsZSBmaW5nZXIgdG91Y2ggaXMgY29udmVydGVkIGludG8gYSBtb3VzZSBldmVudC4gVGhpcyBhbGxvd3MgYSBub24tdG91Y2ggYXBwbGljYXRpb24gdG8gYmUgY29udHJvbGxlZCBwYXJ0aWFsbHkgdmlhIGEgdG91Y2ggZGV2aWNlLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkZha2VNb3VzZVdpdGhUb3VjaGVzXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLktleWJvYXJkSW5wdXQsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5LZXlib2FyZElucHV0LCAnS2V5Ym9hcmQgaW5wdXQnLCAnSWYgZW5hYmxlZCwgc2VuZCBrZXlib2FyZCBldmVudHMgdG8gc3RyZWFtZXInLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLktleWJvYXJkSW5wdXQpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLktleWJvYXJkSW5wdXRdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5Nb3VzZUlucHV0LCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuTW91c2VJbnB1dCwgJ01vdXNlIGlucHV0JywgJ0lmIGVuYWJsZWQsIHNlbmQgbW91c2UgZXZlbnRzIHRvIHN0cmVhbWVyJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Nb3VzZUlucHV0KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5Nb3VzZUlucHV0XVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuVG91Y2hJbnB1dCwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLlRvdWNoSW5wdXQsICdUb3VjaCBpbnB1dCcsICdJZiBlbmFibGVkLCBzZW5kIHRvdWNoIGV2ZW50cyB0byBzdHJlYW1lcicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuVG91Y2hJbnB1dClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuVG91Y2hJbnB1dF1cbiAgICAgICAgICAgIDogdHJ1ZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkdhbWVwYWRJbnB1dCwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkdhbWVwYWRJbnB1dCwgJ0dhbWVwYWQgaW5wdXQnLCAnSWYgZW5hYmxlZCwgc2VuZCBnYW1lcGFkIGV2ZW50cyB0byBzdHJlYW1lcicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuR2FtZXBhZElucHV0KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5HYW1lcGFkSW5wdXRdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5YUkNvbnRyb2xsZXJJbnB1dCwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLlhSQ29udHJvbGxlcklucHV0LCAnWFIgY29udHJvbGxlciBpbnB1dCcsICdJZiBlbmFibGVkLCBzZW5kIFhSIGNvbnRyb2xsZXIgZXZlbnRzIHRvIHN0cmVhbWVyJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5YUkNvbnRyb2xsZXJJbnB1dClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuWFJDb250cm9sbGVySW5wdXRdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5XYWl0Rm9yU3RyZWFtZXIsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5XYWl0Rm9yU3RyZWFtZXIsICdXYWl0IGZvciBzdHJlYW1lcicsICdXaWxsIGNvbnRpbnVlIHRyeWluZyB0byBjb25uZWN0IHRvIHRoZSBmaXJzdCBzdHJlYW1lciBhdmFpbGFibGUuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5XYWl0Rm9yU3RyZWFtZXIpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLldhaXRGb3JTdHJlYW1lcl1cbiAgICAgICAgICAgIDogdHJ1ZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkhpZGVVSSwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkhpZGVVSSwgJ0hpZGUgdGhlIFVJIG92ZXJsYXknLCAnV2lsbCBoaWRlIGFsbCBVSSBvdmVybGF5IGRldGFpbHMnLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLkhpZGVVSSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuSGlkZVVJXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkVuYWJsZUNhcHR1cmVUaW1lRXh0LCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuRW5hYmxlQ2FwdHVyZVRpbWVFeHQsICdFbmFibGUgYWJzLWNhcHR1cmUtdGltZScsICdFbmFibGVzIHRoZSBhYnMtY2FwdHVyZS10aW1lIFJUUCBoZWFkZXIgZXh0ZW5zaW9uJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5FbmFibGVDYXB0dXJlVGltZUV4dClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuRW5hYmxlQ2FwdHVyZVRpbWVFeHRdXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE51bWVyaWMgcGFyYW1ldGVyc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLkFGS1RpbWVvdXRTZWNzLCAnQUZLIHRpbWVvdXQnLCAnVGhlIHRpbWUgKGluIHNlY29uZHMpIGl0IHRha2VzIGZvciB0aGUgYXBwbGljYXRpb24gdG8gdGltZSBvdXQgaWYgQUZLIHRpbWVvdXQgaXMgZW5hYmxlZC4nLCAwIC8qbWluKi8sIG51bGwgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcylcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3NdXG4gICAgICAgICAgICA6IDEyMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5BRktDb3VudGRvd25TZWNzLCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5BRktDb3VudGRvd25TZWNzLCAnQUZLIGNvdW50ZG93bicsICdUaGUgdGltZSAoaW4gc2Vjb25kcykgZm9yIGEgdXNlciB0byByZXNwb25kIGJlZm9yZSB0aGUgc3RyZWFtIGlzIGVuZGVkIGFmdGVyIGFuIEFGSyB0aW1lb3V0LicsIDEwIC8qbWluKi8sIG51bGwgLyptYXgqLywgMTAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UmVjb25uZWN0QXR0ZW1wdHMsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1heFJlY29ubmVjdEF0dGVtcHRzLCAnTWF4IFJlY29ubmVjdHMnLCAnTWF4aW11bSBudW1iZXIgb2YgcmVjb25uZWN0cyB0aGUgYXBwbGljYXRpb24gd2lsbCBhdHRlbXB0IHdoZW4gYSBzdHJlYW1lciBkaXNjb25uZWN0cy4nLCAwIC8qbWluKi8sIDk5OSAvKm1heCovLCBzZXR0aW5ncyAmJlxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cylcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuTWF4UmVjb25uZWN0QXR0ZW1wdHNdXG4gICAgICAgICAgICA6IDMgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWluUVAsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1pblFQLCAnTWluIFFQJywgJ1RoZSBsb3dlciBib3VuZCBmb3IgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKFFQKSBvZiB0aGUgZW5jb2Rlci4gMCA9IEJlc3QgcXVhbGl0eSwgNTEgPSB3b3JzdCBxdWFsaXR5LicsIDAgLyptaW4qLywgNTEgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5NaW5RUClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuTWluUVBdXG4gICAgICAgICAgICA6IDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVAsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1heFFQLCAnTWF4IFFQJywgJ1RoZSB1cHBlciBib3VuZCBmb3IgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKFFQKSBvZiB0aGUgZW5jb2Rlci4gMCA9IEJlc3QgcXVhbGl0eSwgNTEgPSB3b3JzdCBxdWFsaXR5LicsIDAgLyptaW4qLywgNTEgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5NYXhRUClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVBdXG4gICAgICAgICAgICA6IDUxIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHksIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHksICdNaW4gUXVhbGl0eScsICdUaGUgbG93ZXIgYm91bmQgZm9yIHRoZSBxdWFsaXR5IGZhY3RvciBvZiB0aGUgZW5jb2Rlci4gMCA9IFdvcnN0IHF1YWxpdHksIDEwMCA9IEJlc3QgcXVhbGl0eS4nLCAwIC8qbWluKi8sIDEwMCAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHkpXG4gICAgICAgICAgICA/IHNldHRpbmdzW051bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHldXG4gICAgICAgICAgICA6IDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eSwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eSwgJ01heCBRdWFsaXR5JywgJ1RoZSB1cHBlciBib3VuZCBmb3IgdGhlIHF1YWxpdHkgZmFjdG9yIG9mIHRoZSBlbmNvZGVyLiAwID0gV29yc3QgcXVhbGl0eSwgMTAwID0gQmVzdCBxdWFsaXR5LicsIDAgLyptaW4qLywgMTAwIC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eV1cbiAgICAgICAgICAgIDogMTAwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4sIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4sICdNaW4gUXVhbGl0eScsICdUaGUgbG93ZXIgYm91bmQgZm9yIGVuY29kaW5nIHF1YWxpdHkuIDAgPSBXb3JzdCwgMTAwID0gQmVzdC4nLCAwIC8qbWluKi8sIDEwMCAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4pXG4gICAgICAgICAgICA/IHNldHRpbmdzW051bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW5dXG4gICAgICAgICAgICA6IDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCwgJ01heCBRdWFsaXR5JywgJ1RoZSB1cHBlciBib3VuZCBmb3IgZW5jb2RpbmcgcXVhbGl0eS4gMCA9IFdvcnN0LCAxMDAgPSBCZXN0LicsIDAgLyptaW4qLywgMTAwIC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heF1cbiAgICAgICAgICAgIDogMTAwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ0ZQUywgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTLCAnTWF4IEZQUycsICdUaGUgbWF4aW11bSBGUFMgdGhhdCBXZWJSVEMgd2lsbCB0cnkgdG8gdHJhbnNtaXQgZnJhbWVzIGF0LicsIDEgLyptaW4qLywgOTk5IC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFNdXG4gICAgICAgICAgICA6IDYwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUsICdNaW4gQml0cmF0ZSAoa2JwcyknLCAnVGhlIG1pbmltdW0gYml0cmF0ZSB0aGF0IFdlYlJUQyBzaG91bGQgdXNlLicsIDAgLyptaW4qLywgNTAwMDAwIC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZV1cbiAgICAgICAgICAgIDogMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlLCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlLCAnTWF4IEJpdHJhdGUgKGticHMpJywgJ1RoZSBtYXhpbXVtIGJpdHJhdGUgdGhhdCBXZWJSVEMgc2hvdWxkIHVzZS4nLCAwIC8qbWluKi8sIDUwMDAwMCAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpXG4gICAgICAgICAgICA/IHNldHRpbmdzW051bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGVdXG4gICAgICAgICAgICA6IDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuU3RyZWFtZXJBdXRvSm9pbkludGVydmFsLCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwsICdTdHJlYW1lciBBdXRvIEpvaW4gSW50ZXJ2YWwgKG1zKScsICdEZWxheSBiZXR3ZWVuIHJldHJpZXMgd2hlbiB3YWl0aW5nIGZvciBhbiBhdmFpbGFibGUgc3RyZWFtZXIuJywgNTAwIC8qbWluKi8sIDkwMDAwMCAvKm1heCovLCBzZXR0aW5ncyAmJlxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwpXG4gICAgICAgICAgICA/IHNldHRpbmdzW051bWVyaWNQYXJhbWV0ZXJzLlN0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbF1cbiAgICAgICAgICAgIDogMzAwMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuS2VlcGFsaXZlRGVsYXksICdDb25uZWN0aW9uIEtlZXBhbGl2ZSBkZWxheScsICdEZWxheSBiZXR3ZWVuIGtlZXBhbGl2ZSBwaW5ncyB0byB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIuJywgMCAvKm1pbiovLCA5MDAwMDAgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuS2VlcGFsaXZlRGVsYXldXG4gICAgICAgICAgICA6IDMwMDAwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgbnVtZXJpYyBzZXR0aW5nIGlzIHRvZ2dsZWQuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2VkTGlzdGVuZXIgVGhlIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgbnVtZXJpYyB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIF9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKGlkLCBvbkNoYW5nZWRMaXN0ZW5lcikge1xuICAgICAgICBpZiAodGhpcy5udW1lcmljUGFyYW1ldGVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmdldChpZCkuYWRkT25DaGFuZ2VkTGlzdGVuZXIob25DaGFuZ2VkTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9hZGRPbk9wdGlvblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoaWQsIG9uQ2hhbmdlZExpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvblBhcmFtZXRlcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmdldChpZCkuYWRkT25DaGFuZ2VkTGlzdGVuZXIob25DaGFuZ2VkTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG51bWVyaWMgc2V0dGluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBnZXR0aW5nIGEgdmFsdWUgZm9yLlxuICAgICAqIEByZXR1cm5zIFRoZSBudW1lcmljIHZhbHVlIHN0b3JlZCBpbiB0aGUgcGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBpZC5cbiAgICAgKi9cbiAgICBnZXROdW1lcmljU2V0dGluZ1ZhbHVlKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmdldChpZCkubnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBubyBudW1lcmljIHNldHRpbmcgd2l0aCB0aGUgaWQgb2YgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSB0ZXh0IHNldHRpbmcgd2UgYXJlIGludGVyZXN0ZWQgaW4gZ2V0dGluZyBhIHZhbHVlIGZvci5cbiAgICAgKiBAcmV0dXJucyBUaGUgdGV4dCB2YWx1ZSBzdG9yZWQgaW4gdGhlIHBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgaWQuXG4gICAgICovXG4gICAgZ2V0VGV4dFNldHRpbmdWYWx1ZShpZCkge1xuICAgICAgICBpZiAodGhpcy50ZXh0UGFyYW1ldGVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0UGFyYW1ldGVycy5nZXQoaWQpLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBubyBudW1lcmljIHNldHRpbmcgd2l0aCB0aGUgaWQgb2YgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgbnVtYmVyIGluIHRoZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG51bWVyaWMgc2V0dGluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbi5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIG51bWVyaWMgdmFsdWUgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldE51bWVyaWNTZXR0aW5nKGlkLCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5udW1lcmljUGFyYW1ldGVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmdldChpZCkubnVtYmVyID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIG51bWVyaWMgc2V0dGluZyB3aXRoIHRoZSBpZCBvZiAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgZmxhZyBpcyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGZsYWcuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlTGlzdGVuZXIgVGhlIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBfYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKGlkLCBvbkNoYW5nZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmZsYWdzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MuZ2V0KGlkKS5vbkNoYW5nZSA9IG9uQ2hhbmdlTGlzdGVuZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSB0ZXh0IGlzIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2VMaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIF9hZGRPblRleHRTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKGlkLCBvbkNoYW5nZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnRleHRQYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dFBhcmFtZXRlcnMuZ2V0KGlkKS5vbkNoYW5nZSA9IG9uQ2hhbmdlTGlzdGVuZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvcHRpb24gd2hpY2ggaGFzIHRoZSBnaXZlbiBpZC5cbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBvcHRpb24uXG4gICAgICogQHJldHVybnMgVGhlIFNldHRpbmdPcHRpb24gb2JqZWN0IG1hdGNoaW5nIGlkXG4gICAgICovXG4gICAgZ2V0U2V0dGluZ09wdGlvbihpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmdldChpZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmxhZyB3aGljaCBoYXMgdGhlIGdpdmVuIGlkLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgdW5pcXVlIGlkIGZvciB0aGUgZmxhZy5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmbGFnIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNGbGFnRW5hYmxlZChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFncy5nZXQoaWQpLmZsYWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBmbGFnIHRvIGJlIGVuYWJsZWQvZGlzYWJsZWQuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZmxhZyB0byB0b2dnbGUuXG4gICAgICogQHBhcmFtIGZsYWdFbmFibGVkIFRydWUgaWYgdGhlIGZsYWcgc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAgICovXG4gICAgc2V0RmxhZ0VuYWJsZWQoaWQsIGZsYWdFbmFibGVkKSB7XG4gICAgICAgIGlmICghdGhpcy5mbGFncy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgQ2Fubm90IHRvZ2dsZSBmbGFnIGNhbGxlZCAke2lkfSAtIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBDb25maWcuZmxhZ3MgbWFwLmApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mbGFncy5nZXQoaWQpLmZsYWcgPSBmbGFnRW5hYmxlZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHRleHQgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBzZXR0aW5nXG4gICAgICogQHBhcmFtIHNldHRpbmdWYWx1ZSBUaGUgdmFsdWUgdG8gc2V0IGluIHRoZSBzZXR0aW5nLlxuICAgICAqL1xuICAgIHNldFRleHRTZXR0aW5nKGlkLCBzZXR0aW5nVmFsdWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRleHRQYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBDYW5ub3Qgc2V0IHRleHQgc2V0dGluZyBjYWxsZWQgJHtpZH0gLSBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ29uZmlnLnRleHRQYXJhbWV0ZXJzIG1hcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGV4dFBhcmFtZXRlcnMuZ2V0KGlkKS50ZXh0ID0gc2V0dGluZ1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgb3B0aW9uIHNldHRpbmcgbGlzdCBvZiBvcHRpb25zLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHNldHRpbmdcbiAgICAgKiBAcGFyYW0gc2V0dGluZ09wdGlvbnMgVGhlIHZhbHVlcyB0aGUgc2V0dGluZyBjb3VsZCB0YWtlXG4gICAgICovXG4gICAgc2V0T3B0aW9uU2V0dGluZ09wdGlvbnMoaWQsIHNldHRpbmdPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBDYW5ub3Qgc2V0IHRleHQgc2V0dGluZyBjYWxsZWQgJHtpZH0gLSBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ29uZmlnLm9wdGlvblBhcmFtZXRlcnMgbWFwLmApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmdldChpZCkub3B0aW9ucyA9IHNldHRpbmdPcHRpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBvcHRpb24gZW51bSBzZXR0aW5ncyBzZWxlY3RlZCBvcHRpb24uXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgc2V0dGluZ1xuICAgICAqIEBwYXJhbSBzZXR0aW5nT3B0aW9ucyBUaGUgdmFsdWUgdG8gc2VsZWN0IG91dCBvZiBhbGwgdGhlIG9wdGlvbnNcbiAgICAgKi9cbiAgICBzZXRPcHRpb25TZXR0aW5nVmFsdWUoaWQsIHNldHRpbmdWYWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9uUGFyYW1ldGVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgQ2Fubm90IHNldCB0ZXh0IHNldHRpbmcgY2FsbGVkICR7aWR9IC0gaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIENvbmZpZy5lbnVtUGFyYW1ldGVycyBtYXAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25TZXR0aW5nID0gdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmdldChpZCk7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ09wdGlvbnMgPSBvcHRpb25TZXR0aW5nLm9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoIWV4aXN0aW5nT3B0aW9ucy5pbmNsdWRlcyhzZXR0aW5nVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdPcHRpb25zLnB1c2goc2V0dGluZ1ZhbHVlKTtcbiAgICAgICAgICAgICAgICBvcHRpb25TZXR0aW5nLm9wdGlvbnMgPSBleGlzdGluZ09wdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25TZXR0aW5nLnNlbGVjdGVkID0gc2V0dGluZ1ZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgZm9yIHRoZSBmbGFnLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGZsYWcuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBuZXcgbGFiZWwgdG8gdXNlIGZvciB0aGUgZmxhZy5cbiAgICAgKi9cbiAgICBzZXRGbGFnTGFiZWwoaWQsIGxhYmVsKSB7XG4gICAgICAgIGlmICghdGhpcy5mbGFncy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgQ2Fubm90IHNldCBsYWJlbCBmb3IgZmxhZyBjYWxsZWQgJHtpZH0gLSBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ29uZmlnLmZsYWdzIG1hcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3MuZ2V0KGlkKS5sYWJlbCA9IGxhYmVsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIHN1YnNldCBvZiBhbGwgc2V0dGluZ3MgaW4gb25lIGZ1bmN0aW9uIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgQSAocGFydGlhbCkgbGlzdCBvZiBzZXR0aW5ncyB0byBzZXRcbiAgICAgKi9cbiAgICBzZXRTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzZXR0aW5ncykpIHtcbiAgICAgICAgICAgIGlmIChpc0ZsYWdJZChrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRGbGFnRW5hYmxlZChrZXksIHNldHRpbmdzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNOdW1lcmljSWQoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TnVtZXJpY1NldHRpbmcoa2V5LCBzZXR0aW5nc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVGV4dElkKGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRleHRTZXR0aW5nKGtleSwgc2V0dGluZ3Nba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc09wdGlvbklkKGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldE9wdGlvblNldHRpbmdWYWx1ZShrZXksIHNldHRpbmdzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgc2V0dGluZ3NcbiAgICAgKiBAcmV0dXJucyBBbGwgc2V0dGluZyB2YWx1ZXMgYXMgYW4gb2JqZWN0IHdpdGggc2V0dGluZyBpZHMgYXMga2V5c1xuICAgICAqL1xuICAgIGdldFNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmZsYWdzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IHZhbHVlLmZsYWc7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5udW1lcmljUGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZS5udW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy50ZXh0UGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZS50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMub3B0aW9uUGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSB2YWx1ZS5zZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0dGluZ3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgRmxhZyBzZXR0aW5ncyBhcyBhbiBhcnJheS5cbiAgICAgKiBAcmV0dXJucyBBbGwgU2V0dGluZ0ZsYWcgb2JqZWN0c1xuICAgICAqL1xuICAgIGdldEZsYWdzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmZsYWdzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBUZXh0IHNldHRpbmdzIGFzIGFuIGFycmF5LlxuICAgICAqIEByZXR1cm5zIEFsbCBTZXR0aW5nVGV4dCBvYmplY3RzXG4gICAgICovXG4gICAgZ2V0VGV4dFNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnRleHRQYXJhbWV0ZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBOdW1iZXIgc2V0dGluZ3MgYXMgYW4gYXJyYXkuXG4gICAgICogQHJldHVybnMgQWxsIFNldHRpbmdOdW1iZXIgb2JqZWN0c1xuICAgICAqL1xuICAgIGdldE51bWVyaWNTZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5udW1lcmljUGFyYW1ldGVycy52YWx1ZXMoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgT3B0aW9uIHNldHRpbmdzIGFzIGFuIGFycmF5LlxuICAgICAqIEByZXR1cm5zIEFsbCBTZXR0aW5nT3B0aW9uIG9iamVjdHNcbiAgICAgKi9cbiAgICBnZXRPcHRpb25TZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5vcHRpb25QYXJhbWV0ZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdCBldmVudHMgd2hlbiBzZXR0aW5ncyBjaGFuZ2UuXG4gICAgICogQHBhcmFtIGV2ZW50RW1pdHRlclxuICAgICAqL1xuICAgIF9yZWdpc3Rlck9uQ2hhbmdlRXZlbnRzKGV2ZW50RW1pdHRlcikge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmZsYWdzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgZmxhZyA9IHRoaXMuZmxhZ3MuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoZmxhZykge1xuICAgICAgICAgICAgICAgIGZsYWcub25DaGFuZ2VFbWl0ID0gKG5ld1ZhbHVlKSA9PiBldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogZmxhZy5pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ZsYWcnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogZmxhZ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgbnVtYmVyID0gdGhpcy5udW1lcmljUGFyYW1ldGVycy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChudW1iZXIpIHtcbiAgICAgICAgICAgICAgICBudW1iZXIub25DaGFuZ2VFbWl0ID0gKG5ld1ZhbHVlKSA9PiBldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVtYmVyLmlkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG51bWJlclxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnRleHRQYXJhbWV0ZXJzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMudGV4dFBhcmFtZXRlcnMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgIHRleHQub25DaGFuZ2VFbWl0ID0gKG5ld1ZhbHVlKSA9PiBldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogdGV4dC5pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogdGV4dFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm9wdGlvblBhcmFtZXRlcnMua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvblBhcmFtZXRlcnMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uLm9uQ2hhbmdlRW1pdCA9IChuZXdWYWx1ZSkgPT4gZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFNldHRpbmdzQ2hhbmdlZEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG9wdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29wdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvcHRpb25cbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBlbnVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW91c2UgYmVpbmcgbG9ja2VkIG9yIGhvdmVyaW5nXG4gKi9cbmV4cG9ydCB2YXIgQ29udHJvbFNjaGVtZVR5cGU7XG4oZnVuY3Rpb24gKENvbnRyb2xTY2hlbWVUeXBlKSB7XG4gICAgQ29udHJvbFNjaGVtZVR5cGVbQ29udHJvbFNjaGVtZVR5cGVbXCJMb2NrZWRNb3VzZVwiXSA9IDBdID0gXCJMb2NrZWRNb3VzZVwiO1xuICAgIENvbnRyb2xTY2hlbWVUeXBlW0NvbnRyb2xTY2hlbWVUeXBlW1wiSG92ZXJpbmdNb3VzZVwiXSA9IDFdID0gXCJIb3ZlcmluZ01vdXNlXCI7XG59KShDb250cm9sU2NoZW1lVHlwZSB8fCAoQ29udHJvbFNjaGVtZVR5cGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29uZmlnLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGEgc2V0dGluZyB0aGF0IGhhcyBhIHRleHQgbGFiZWwgYW5kIGFuIGFyYml0cmFyeSBzZXR0aW5nIHZhbHVlIGl0IHN0b3Jlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBkZWZhdWx0U2V0dGluZ1ZhbHVlLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgLyogRG8gbm90aGluZywgdG8gYmUgb3ZlcnJpZGRlbi4gKi9cbiAgICB9KSB7XG4gICAgICAgIHRoaXMucGFyc2VVUkxQYXJhbXMoKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRW1pdCA9ICgpID0+IHtcbiAgICAgICAgICAgIC8qIERvIG5vdGhpbmcsIHRvIGJlIG92ZXJyaWRkZW4uICovXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gICAgICAgIHRoaXMudmFsdWUgPSBkZWZhdWx0U2V0dGluZ1ZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBsYWJlbCBzZXR0aW5nIGxhYmVsLlxuICAgICAqL1xuICAgIHNldCBsYWJlbChpbkxhYmVsKSB7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gaW5MYWJlbDtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgbGFiZWwgdGV4dCBmb3IgdGhlIHNldHRpbmcuXG4gICAgICovXG4gICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gVGhlIHNldHRpbmcncyB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBzZXR0aW5nJ3Mgc3RvcmVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBpblZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqL1xuICAgIHNldCB2YWx1ZShpblZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gaW5WYWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLl92YWx1ZSwgdGhpcyk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VFbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyc2lzdCB0aGUgc2V0dGluZyB2YWx1ZSBpbiBVUkwuXG4gICAgICovXG4gICAgdXBkYXRlVVJMUGFyYW1zKCkge1xuICAgICAgICBpZiAodGhpcy51c2VVcmxQYXJhbXMpIHtcbiAgICAgICAgICAgIC8vIHNldCB1cmwgcGFyYW1zXG4gICAgICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVTdHJpbmcgPSB0aGlzLmdldFZhbHVlQXNTdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIF92YWx1ZV0gb2YgdXJsUGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKSA9PSB0aGlzLmlkLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1zLnNldChuYW1lLCB2YWx1ZVN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIHNldCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2V0KSB7XG4gICAgICAgICAgICAgICAgdXJsUGFyYW1zLnNldCh0aGlzLmlkLCB2YWx1ZVN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICcnLCB1cmxQYXJhbXMudG9TdHJpbmcoKSAhPT0gJycgPyBgJHtsb2NhdGlvbi5wYXRobmFtZX0/JHt1cmxQYXJhbXN9YCA6IGAke2xvY2F0aW9uLnBhdGhuYW1lfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyBzdWIgdHlwZXMgdG8gcHJvdmlkZSB0aGVpciB2YWx1ZSBmb3IgdGhlIHVybCBzZWFyY2ggcGFyYW1zLlxuICAgICAqL1xuICAgIGdldFZhbHVlQXNTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcGFyc2VVUkxQYXJhbXMoKSB7XG4gICAgICAgIHRoaXMuX3VybFBhcmFtcyA9IHt9O1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgcGFyYW1zKSB7XG4gICAgICAgICAgICB0aGlzLl91cmxQYXJhbXNbbmFtZS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhc1VSTFBhcmFtKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKSBpbiB0aGlzLl91cmxQYXJhbXM7XG4gICAgfVxuICAgIGdldFVSTFBhcmFtKG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVVJMUGFyYW0obmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cmxQYXJhbXNbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2V0dGluZ0Jhc2UuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IFNldHRpbmdCYXNlIH0gZnJvbSAnLi9TZXR0aW5nQmFzZSc7XG4vKipcbiAqIEEgYm9vbGVhbiBmbGFnIHNldHRpbmcgb2JqZWN0IHdpdGggYSB0ZXh0IGxhYmVsLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ0ZsYWcgZXh0ZW5kcyBTZXR0aW5nQmFzZSB7XG4gICAgY29uc3RydWN0b3IoaWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgZGVmYXVsdEZsYWdWYWx1ZSwgdXNlVXJsUGFyYW1zLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgLyogRG8gbm90aGluZywgdG8gYmUgb3ZlcnJpZGRlbi4gKi9cbiAgICB9KSB7XG4gICAgICAgIHN1cGVyKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHRGbGFnVmFsdWUsIGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgaWYgKCF1c2VVcmxQYXJhbXMgfHwgIXRoaXMuaGFzVVJMUGFyYW0odGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhZyA9IGRlZmF1bHRGbGFnVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXJzZSBmbGFnIGZyb20gdXJsIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIGNvbnN0IHVybFBhcmFtRmxhZyA9IHRoaXMuZ2V0VVJMUGFyYW0odGhpcy5pZCk7XG4gICAgICAgICAgICB0aGlzLmZsYWcgPSB1cmxQYXJhbUZsYWcudG9Mb3dlckNhc2UoKSAhPSAnZmFsc2UnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlVXJsUGFyYW1zID0gdXNlVXJsUGFyYW1zO1xuICAgIH1cbiAgICBnZXRWYWx1ZUFzU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGFnID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGlzIGZsYWcuXG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLmZsYWcgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFRoZSBzZXR0aW5nJ3MgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0IGZsYWcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc2V0dGluZydzIHN0b3JlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gaW5WYWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgc2V0dGluZy5cbiAgICAgKi9cbiAgICBzZXQgZmxhZyhpblZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBpblZhbHVlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdGbGFnLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBTZXR0aW5nQmFzZSB9IGZyb20gJy4vU2V0dGluZ0Jhc2UnO1xuLyoqXG4gKiBBIG51bWJlciBzZXR0aW5nIG9iamVjdCB3aXRoIGEgdGV4dCBsYWJlbC4gTWluIGFuZCBtYXggbGltaXQgdGhlIHJhbmdlIG9mIGFsbG93ZWQgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ051bWJlciBleHRlbmRzIFNldHRpbmdCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBtaW4sIG1heCwgZGVmYXVsdE51bWJlciwgdXNlVXJsUGFyYW1zLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgLyogRG8gbm90aGluZywgdG8gYmUgb3ZlcnJpZGRlbi4gKi9cbiAgICB9KSB7XG4gICAgICAgIHN1cGVyKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHROdW1iZXIsIGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5fbWluID0gbWluO1xuICAgICAgICB0aGlzLl9tYXggPSBtYXg7XG4gICAgICAgIC8vIGF0dGVtcHQgdG8gcmVhZCB0aGUgbnVtYmVyIGZyb20gdGhlIHVybCBwYXJhbXNcbiAgICAgICAgaWYgKCF1c2VVcmxQYXJhbXMgfHwgIXRoaXMuaGFzVVJMUGFyYW0odGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMubnVtYmVyID0gZGVmYXVsdE51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gTnVtYmVyLnBhcnNlRmxvYXQodGhpcy5nZXRVUkxQYXJhbSh0aGlzLmlkKSk7XG4gICAgICAgICAgICB0aGlzLm51bWJlciA9IE51bWJlci5pc05hTihwYXJzZWRWYWx1ZSkgPyBkZWZhdWx0TnVtYmVyIDogcGFyc2VkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VVcmxQYXJhbXMgPSB1c2VVcmxQYXJhbXM7XG4gICAgfVxuICAgIGdldFZhbHVlQXNTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bWJlci50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG51bWJlciB2YWx1ZSAod2lsbCBiZSBjbGFtcGVkIHdpdGhpbiByYW5nZSkuXG4gICAgICovXG4gICAgc2V0IG51bWJlcihuZXdOdW1iZXIpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2xhbXAobmV3TnVtYmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIG51bWJlciBzdG9yZWQuXG4gICAgICovXG4gICAgZ2V0IG51bWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsYW1wcyBhIG51bWJlciBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCB2YWx1ZXMgKGluY2x1c2l2ZSkuXG4gICAgICogQHBhcmFtIGluTnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gICAgICogQHJldHVybnMgVGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqL1xuICAgIGNsYW1wKGluTnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9taW4gPT0gbnVsbCAmJiB0aGlzLl9tYXggPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGluTnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX21pbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5fbWF4LCBpbk51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fbWF4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLl9taW4sIGluTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih0aGlzLl9tYXgsIGluTnVtYmVyKSwgdGhpcy5fbWluKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlXG4gICAgICogQHJldHVybnMgVGhlIG1pbmltdW0gdmFsdWVcbiAgICAgKi9cbiAgICBnZXQgbWluKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlXG4gICAgICogQHJldHVybnMgVGhlIG1heGltdW0gdmFsdWVcbiAgICAgKi9cbiAgICBnZXQgbWF4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhlIG51bWJlciBvYmplY3QuXG4gICAgICovXG4gICAgYWRkT25DaGFuZ2VkTGlzdGVuZXIob25DaGFuZ2VkRnVuYykge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2VkRnVuYztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nTnVtYmVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBTZXR0aW5nQmFzZSB9IGZyb20gJy4vU2V0dGluZ0Jhc2UnO1xuLyoqXG4gKiBBbiBPcHRpb24gc2V0dGluZyBvYmplY3Qgd2l0aCBhIHRleHQgbGFiZWwuIEFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbiBhcnJheSBvZiBvcHRpb25zIGFuZCBzZWxlY3Qgb25lIG9mIHRoZW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nT3B0aW9uIGV4dGVuZHMgU2V0dGluZ0Jhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHRUZXh0VmFsdWUsIG9wdGlvbnMsIHVzZVVybFBhcmFtcywgZGVmYXVsdFVybFBhcmFtUmVzb2x2ZXIgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLyogUmV0dXJuIHRoZSBzdHJpbmcgYXMtaXMgYnkgZGVmYXVsdCAqL1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSwgZGVmYXVsdE9uQ2hhbmdlTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIC8qIERvIG5vdGhpbmcsIHRvIGJlIG92ZXJyaWRkZW4uICovXG4gICAgfSkge1xuICAgICAgICBzdXBlcihpZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBkZWZhdWx0VGV4dFZhbHVlLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuX3VybFBhcmFtUmVzb2x2ZXIgPSBkZWZhdWx0VXJsUGFyYW1SZXNvbHZlcjtcbiAgICAgICAgY29uc3Qgc3RyaW5nVG9NYXRjaCA9IHRoaXMuaGFzVVJMUGFyYW0odGhpcy5pZClcbiAgICAgICAgICAgID8gdGhpcy5fdXJsUGFyYW1SZXNvbHZlcih0aGlzLmdldFVSTFBhcmFtKHRoaXMuaWQpKVxuICAgICAgICAgICAgOiBkZWZhdWx0VGV4dFZhbHVlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiBbc3RyaW5nVG9NYXRjaF07XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzdHJpbmdUb01hdGNoO1xuICAgICAgICB0aGlzLnVzZVVybFBhcmFtcyA9IHVzZVVybFBhcmFtcztcbiAgICB9XG4gICAgZ2V0VmFsdWVBc1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNoYW5nZSBsaXN0ZW5lciB0byB0aGUgc2VsZWN0IGVsZW1lbnQuXG4gICAgICovXG4gICAgYWRkT25DaGFuZ2VkTGlzdGVuZXIob25DaGFuZ2VkRnVuYykge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2VkRnVuYztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgQWxsIGF2YWlsYWJsZSBvcHRpb25zIGFzIGFuIGFycmF5XG4gICAgICovXG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB2YWx1ZXMgQXJyYXkgb2Ygb3B0aW9uc1xuICAgICAqL1xuICAgIHNldCBvcHRpb25zKHZhbHVlcykge1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gdmFsdWVzO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgU2VsZWN0ZWQgb3B0aW9uIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgZ2V0IHNlbGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHNlbGVjdGVkIG9wdGlvbiBpZiBpdCBtYXRjaGVzIG9uZSBvZiB0aGUgYXZhaWxhYmxlIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0gdmFsdWUgU2VsZWN0ZWQgb3B0aW9uXG4gICAgICovXG4gICAgc2V0IHNlbGVjdGVkKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgb3B0aW9ucyBjb250YWlucyB0aGUgdmFsdWUsIHRoZW4gc2V0IHRoYXQgYXMgc2VsZWN0ZWRcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgQ291bGQgbm90IHNldCBcIiR7dmFsdWV9XCIgYXMgdGhlIHNlbGVjdGVkIG9wdGlvbiBmb3IgJHt0aGlzLmlkfSBiZWNhdXNlIGl0IHdhc24ndCBvbmUgb2YgdGhlIG9wdGlvbnMuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB1cmwgcGFyYW1ldGVyIHJlc29sdmVyIHRvIGRvIHNvbWUgdHJhbnNmb3JtYXRpb24gdG8gdGhlIHN0cmluZyB2YWx1ZVxuICAgICAqIHRoYXQgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHVybCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSB1cmxQYXJhbSBBIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgZXh0cmFjdGVkIHVybCBwYXJhbWV0ZXIgc3RyaW5nIGZvciB0aGlzIHNldHRpbmcgdG8gc29tZXRoaW5nIGVsc2UuXG4gICAgICovXG4gICAgc2V0IHVybFBhcmFtUmVzb2x2ZXIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdXJsUGFyYW1SZXNvbHZlciA9IHZhbHVlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdPcHRpb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IFNldHRpbmdCYXNlIH0gZnJvbSAnLi9TZXR0aW5nQmFzZSc7XG4vKipcbiAqIEEgdGV4dCBzZXR0aW5nIG9iamVjdCB3aXRoIGEgdGV4dCBsYWJlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdUZXh0IGV4dGVuZHMgU2V0dGluZ0Jhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHRUZXh0VmFsdWUsIHVzZVVybFBhcmFtcywgZGVmYXVsdE9uQ2hhbmdlTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgIC8qIERvIG5vdGhpbmcsIHRvIGJlIG92ZXJyaWRkZW4uICovXG4gICAgfSkge1xuICAgICAgICBzdXBlcihpZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBkZWZhdWx0VGV4dFZhbHVlLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lcik7XG4gICAgICAgIGlmICghdXNlVXJsUGFyYW1zIHx8ICF0aGlzLmhhc1VSTFBhcmFtKHRoaXMuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSBkZWZhdWx0VGV4dFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcGFyc2UgZmxhZyBmcm9tIHVybCBwYXJhbWV0ZXJzXG4gICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLmdldFVSTFBhcmFtKHRoaXMuaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlVXJsUGFyYW1zID0gdXNlVXJsUGFyYW1zO1xuICAgIH1cbiAgICBnZXRWYWx1ZUFzU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFRoZSBzZXR0aW5nJ3MgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHNldHRpbmcncyBzdG9yZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIGluVmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNldHRpbmcuXG4gICAgICovXG4gICAgc2V0IHRleHQoaW5WYWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gaW5WYWx1ZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nVGV4dC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuLyoqXG4gKiBIYW5kbGVzIHRoZSBTZW5kaW5nIGFuZCBSZWNlaXZpbmcgb2YgbWVzc2FnZXMgdG8gdGhlIFVFIEluc3RhbmNlIHZpYSB0aGUgRGF0YSBDaGFubmVsXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlzUmVjZWl2aW5nRnJlZXplRnJhbWUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZGF0YWNoYW5uZWwgY29udHJvbGxlciBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IERhdGFDaGFubmVsQ29udHJvbGxlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIGdldERhdGFDaGFubmVsSW5zdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUbyBDcmVhdGUgYW5kIFNldCB1cCBhIERhdGEgQ2hhbm5lbFxuICAgICAqIEBwYXJhbSBwZWVyQ29ubmVjdGlvbiAtIFRoZSBSVEMgUGVlciBDb25uZWN0aW9uXG4gICAgICogQHBhcmFtIGxhYmVsIC0gTGFiZWwgb2YgdGhlIERhdGEgQ2hhbm5lbFxuICAgICAqIEBwYXJhbSBkYXRhY2hhbm5lbE9wdGlvbnMgLSBPcHRpb25hbCBSVEMgRGF0YUNoYW5uZWwgb3B0aW9uc1xuICAgICAqL1xuICAgIGNyZWF0ZURhdGFDaGFubmVsKHBlZXJDb25uZWN0aW9uLCBsYWJlbCwgZGF0YWNoYW5uZWxPcHRpb25zKSB7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24gPSBwZWVyQ29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsT3B0aW9ucyA9IGRhdGFjaGFubmVsT3B0aW9ucztcbiAgICAgICAgaWYgKGRhdGFjaGFubmVsT3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFjaGFubmVsT3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgdGhpcy5kYXRhY2hhbm5lbE9wdGlvbnMub3JkZXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbCA9IHRoaXMucGVlckNvbm5lY3Rpb24uY3JlYXRlRGF0YUNoYW5uZWwodGhpcy5sYWJlbCwgdGhpcy5kYXRhY2hhbm5lbE9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNldHVwRGF0YUNoYW5uZWwoKTtcbiAgICB9XG4gICAgc2V0dXBEYXRhQ2hhbm5lbCgpIHtcbiAgICAgICAgLy9XZSBXYW50IGFuIEFycmF5IEJ1ZmZlciBub3QgYSBibG9iXG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWwuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWwub25vcGVuID0gKGV2KSA9PiB0aGlzLmhhbmRsZU9uT3Blbihldik7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWwub25jbG9zZSA9IChldikgPT4gdGhpcy5oYW5kbGVPbkNsb3NlKGV2KTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbC5vbm1lc3NhZ2UgPSAoZXYpID0+IHRoaXMuaGFuZGxlT25NZXNzYWdlKGV2KTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbC5vbmVycm9yID0gKGV2KSA9PiB0aGlzLmhhbmRsZU9uRXJyb3IoZXYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIERhdGEgQ2hhbm5lbCBpcyBvcGVuZWRcbiAgICAgKi9cbiAgICBoYW5kbGVPbk9wZW4oZXYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBMb2dnZXIuSW5mbyhgRGF0YSBDaGFubmVsICgke3RoaXMubGFiZWx9KSBvcGVuZWQuYCk7XG4gICAgICAgIHRoaXMub25PcGVuKChfYSA9IHRoaXMuZGF0YUNoYW5uZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYWJlbCwgZXYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIERhdGEgQ2hhbm5lbCBpcyBjbG9zZWRcbiAgICAgKi9cbiAgICBoYW5kbGVPbkNsb3NlKGV2KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgTG9nZ2VyLkluZm8oYERhdGEgQ2hhbm5lbCAoJHt0aGlzLmxhYmVsfSkgY2xvc2VkLmApO1xuICAgICAgICB0aGlzLm9uQ2xvc2UoKF9hID0gdGhpcy5kYXRhQ2hhbm5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhYmVsLCBldik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWRcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBNZXNzYWdlIEV2ZW50XG4gICAgICovXG4gICAgaGFuZGxlT25NZXNzYWdlKGV2ZW50KSB7XG4gICAgICAgIC8vIEhpZ2hlciBsb2cgbGV2ZWwgdG8gcHJldmVudCBsb2cgc3BhbSB3aXRoIG1lc3NhZ2VzIHJlY2VpdmVkXG4gICAgICAgIExvZ2dlci5JbmZvKGBEYXRhIENoYW5uZWwgKCR7dGhpcy5sYWJlbH0pIG1lc3NhZ2U6ICR7ZXZlbnR9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBhbiBlcnJvciBpcyB0aHJvd25cbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBFcnJvciBFdmVudFxuICAgICAqL1xuICAgIGhhbmRsZU9uRXJyb3IoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBMb2dnZXIuSW5mbyhgRGF0YSBDaGFubmVsICgke3RoaXMubGFiZWx9KSBlcnJvcjogJHtldmVudH1gKTtcbiAgICAgICAgdGhpcy5vbkVycm9yKChfYSA9IHRoaXMuZGF0YUNoYW5uZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYWJlbCwgZXZlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0byByZWdpc3RlciBvbk9wZW4gaGFuZGxlclxuICAgICAqIEBwYXJhbSBsYWJlbCBEYXRhIGNoYW5uZWwgbGFiZWwgKFwiZGF0YWNoYW5uZWxcIiwgXCJzZW5kLWRhdGFjaGFubmVsXCIsIFwicmVjdi1kYXRhY2hhbm5lbFwiKVxuICAgICAqIEBwYXJhbSBldiBldmVudFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvbk9wZW4obGFiZWwsIGV2KSB7XG4gICAgICAgIC8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgb25DbG9zZSBoYW5kbGVyXG4gICAgICogQHBhcmFtIGxhYmVsIERhdGEgY2hhbm5lbCBsYWJlbCAoXCJkYXRhY2hhbm5lbFwiLCBcInNlbmQtZGF0YWNoYW5uZWxcIiwgXCJyZWN2LWRhdGFjaGFubmVsXCIpXG4gICAgICogQHBhcmFtIGV2IGV2ZW50XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uQ2xvc2UobGFiZWwsIGV2KSB7XG4gICAgICAgIC8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICB9XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdG8gcmVnaXN0ZXIgb25FcnJvciBoYW5kbGVyXG4gICAgICogQHBhcmFtIGxhYmVsIERhdGEgY2hhbm5lbCBsYWJlbCAoXCJkYXRhY2hhbm5lbFwiLCBcInNlbmQtZGF0YWNoYW5uZWxcIiwgXCJyZWN2LWRhdGFjaGFubmVsXCIpXG4gICAgICogQHBhcmFtIGV2IGV2ZW50XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uRXJyb3IobGFiZWwsIGV2KSB7XG4gICAgICAgIC8vIGVtcHR5IGRlZmF1bHQgaW1wbGVtZW50YXRpb25cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhQ2hhbm5lbENvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IERhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZWNvcmQgfSBmcm9tICcuL0RhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXN1bHRzJztcbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Ioc2luaywgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5pbnRlcnZhbEhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zaW5rID0gc2luaztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLnJlY29yZHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc2VxID0gMDtcbiAgICB9XG4gICAgc3RhcnQoY29uZmlnKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnJlY29yZHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5pbnRlcnZhbEhhbmRsZSA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLnN0YXJ0VGltZSA+PSBjb25maWcuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFJlcXVlc3QoY29uZmlnLnJlcXVlc3RTaXplLCBjb25maWcucmVzcG9uc2VTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuYmluZCh0aGlzKSwgTWF0aC5mbG9vcigxMDAwIC8gY29uZmlnLnJwcykpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxIYW5kbGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxIYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbEhhbmRsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sodGhpcy5wcm9kdWNlUmVzdWx0KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb2R1Y2VSZXN1bHQoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFJlY29yZHMgPSBuZXcgTWFwKHRoaXMucmVjb3Jkcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWNvcmRzOiByZXN1bHRSZWNvcmRzLFxuICAgICAgICAgICAgZGF0YUNoYW5uZWxSdHQ6IE1hdGguY2VpbChBcnJheS5mcm9tKHRoaXMucmVjb3Jkcy52YWx1ZXMoKSkucmVkdWNlKChhY2MsIG5leHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgKG5leHQucGxheWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSBuZXh0LnBsYXllclNlbnRUaW1lc3RhbXApO1xuICAgICAgICAgICAgfSwgMCkgLyB0aGlzLnJlY29yZHMuc2l6ZSksXG4gICAgICAgICAgICBwbGF5ZXJUb1N0cmVhbWVyVGltZTogTWF0aC5jZWlsKEFycmF5LmZyb20odGhpcy5yZWNvcmRzLnZhbHVlcygpKS5yZWR1Y2UoKGFjYywgbmV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyAobmV4dC5zdHJlYW1lclJlY2VpdmVkVGltZXN0YW1wIC0gbmV4dC5wbGF5ZXJTZW50VGltZXN0YW1wKTtcbiAgICAgICAgICAgIH0sIDApIC8gdGhpcy5yZWNvcmRzLnNpemUpLFxuICAgICAgICAgICAgc3RyZWFtZXJUb1BsYXllclRpbWU6IE1hdGguY2VpbChBcnJheS5mcm9tKHRoaXMucmVjb3Jkcy52YWx1ZXMoKSkucmVkdWNlKChhY2MsIG5leHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgKG5leHQucGxheWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSBuZXh0LnN0cmVhbWVyU2VudFRpbWVzdGFtcCk7XG4gICAgICAgICAgICB9LCAwKSAvIHRoaXMucmVjb3Jkcy5zaXplKSxcbiAgICAgICAgICAgIGV4cG9ydExhdGVuY3lBc0NTVjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjc3YgPSAnVGltZXN0YW1wO1JUVDtQbGF5ZXJUb1N0cmVhbWVyO1N0cmVhbWVyVG9QbGF5ZXI7XFxuJztcbiAgICAgICAgICAgICAgICByZXN1bHRSZWNvcmRzLmZvckVhY2goKHJlY29yZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjc3YgKz0gcmVjb3JkLnBsYXllclNlbnRUaW1lc3RhbXAgKyAnOyc7XG4gICAgICAgICAgICAgICAgICAgIGNzdiArPSByZWNvcmQucGxheWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSByZWNvcmQucGxheWVyU2VudFRpbWVzdGFtcCArICc7JztcbiAgICAgICAgICAgICAgICAgICAgY3N2ICs9IHJlY29yZC5zdHJlYW1lclJlY2VpdmVkVGltZXN0YW1wIC0gcmVjb3JkLnBsYXllclNlbnRUaW1lc3RhbXAgKyAnOyc7XG4gICAgICAgICAgICAgICAgICAgIGNzdiArPSByZWNvcmQucGxheWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSByZWNvcmQuc3RyZWFtZXJTZW50VGltZXN0YW1wICsgJzsnO1xuICAgICAgICAgICAgICAgICAgICBjc3YgKz0gJ1xcbic7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNzdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgaXNSdW5uaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmludGVydmFsSGFuZGxlO1xuICAgIH1cbiAgICByZWNlaXZlKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcignVW5kZWZpbmVkIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldChyZXNwb25zZS5TZXEpO1xuICAgICAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgICAgICByZWNvcmQudXBkYXRlKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0U2l6ZSwgcmVzcG9uc2VTaXplKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmNyZWF0ZVJlcXVlc3QocmVxdWVzdFNpemUsIHJlc3BvbnNlU2l6ZSk7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IG5ldyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVjb3JkKHJlcXVlc3QpO1xuICAgICAgICB0aGlzLnJlY29yZHMuc2V0KHJlY29yZC5zZXEsIHJlY29yZCk7XG4gICAgICAgIHRoaXMuc2luayhyZXF1ZXN0KTtcbiAgICB9XG4gICAgY3JlYXRlUmVxdWVzdChyZXF1ZXN0U2l6ZSwgcmVzcG9uc2VTaXplKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBTZXE6IHRoaXMuc2VxKyssXG4gICAgICAgICAgICBGaWxsUmVzcG9uc2VTaXplOiByZXNwb25zZVNpemUsXG4gICAgICAgICAgICBGaWxsZXI6IHJlcXVlc3RTaXplID8gJ0EnLnJlcGVhdChyZXF1ZXN0U2l6ZSkgOiAnJ1xuICAgICAgICB9O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgY2xhc3MgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlY29yZCB7XG4gICAgY29uc3RydWN0b3IocmVxdWVzdCkge1xuICAgICAgICB0aGlzLnNlcSA9IHJlcXVlc3QuU2VxO1xuICAgICAgICB0aGlzLnBsYXllclNlbnRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnJlcXVlc3RGaWxsZXJTaXplID0gcmVxdWVzdC5GaWxsZXIgPyByZXF1ZXN0LkZpbGxlci5sZW5ndGggOiAwO1xuICAgIH1cbiAgICB1cGRhdGUocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXJSZWNlaXZlZFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuc3RyZWFtZXJSZWNlaXZlZFRpbWVzdGFtcCA9IHJlc3BvbnNlLlJlY2VpdmVkVGltZXN0YW1wO1xuICAgICAgICB0aGlzLnN0cmVhbWVyU2VudFRpbWVzdGFtcCA9IHJlc3BvbnNlLlNlbnRUaW1lc3RhbXA7XG4gICAgICAgIHRoaXMucmVzcG9uc2VGaWxsZXJTaXplID0gcmVzcG9uc2UuRmlsbGVyID8gcmVzcG9uc2UuRmlsbGVyLmxlbmd0aCA6IDA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogQSBjbGFzcyBmb3Igc2VuZGluZyBkYXRhIGNoYW5uZWwgbWVzc2FnZXNcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsU2VuZGVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZGF0YUNoYW5uZWxQcm92aWRlciAtIERhdGEgY2hhbm5lbCBvYmplY3QgdHlwZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGFDaGFubmVsUHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbFByb3ZpZGVyID0gZGF0YUNoYW5uZWxQcm92aWRlcjtcbiAgICB9XG4gICAgY2FuU2VuZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmRhdGFDaGFubmVsUHJvdmlkZXIuZ2V0RGF0YUNoYW5uZWxJbnN0YW5jZSgpLmRhdGFDaGFubmVsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5uZWxQcm92aWRlci5nZXREYXRhQ2hhbm5lbEluc3RhbmNlKCkuZGF0YUNoYW5uZWwucmVhZHlTdGF0ZSA9PSAnb3BlbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIERhdGEgb3ZlciB0aGUgRGF0YSBjaGFubmVsIHRvIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBkYXRhIC0gTWVzc2FnZSBEYXRhIEFycmF5IEJ1ZmZlclxuICAgICAqL1xuICAgIHNlbmREYXRhKGRhdGEpIHtcbiAgICAgICAgLy8gcmVzZXQgdGhlIGFmayBpbmFjdGl2aXR5XG4gICAgICAgIGNvbnN0IGRhdGFDaGFubmVsSW5zdGFuY2UgPSB0aGlzLmRhdGFDaGFubmVsUHJvdmlkZXIuZ2V0RGF0YUNoYW5uZWxJbnN0YW5jZSgpO1xuICAgICAgICBpZiAoZGF0YUNoYW5uZWxJbnN0YW5jZS5kYXRhQ2hhbm5lbC5yZWFkeVN0YXRlID09ICdvcGVuJykge1xuICAgICAgICAgICAgZGF0YUNoYW5uZWxJbnN0YW5jZS5kYXRhQ2hhbm5lbC5zZW5kKGRhdGEpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYE1lc3NhZ2UgU2VudDogJHtuZXcgVWludDhBcnJheShkYXRhKX1gKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRBZmtXYXJuaW5nVGltZXJPbkRhdGFTZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoYE1lc3NhZ2UgRmFpbGVkOiAke25ldyBVaW50OEFycmF5KGRhdGEpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG92ZXJyaWRlIG1ldGhvZCBmb3IgcmVzZXR0aW5nIHRoZSBBZmsgd2FybmluZyB0aW1lciB3aGVuIGRhdGEgaXMgc2VudCBvdmVyIHRoZSBkYXRhIGNoYW5uZWxcbiAgICAgKi9cbiAgICByZXNldEFma1dhcm5pbmdUaW1lck9uRGF0YVNlbmQoKSB7XG4gICAgICAgIC8vIEJhc2UgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURhdGFDaGFubmVsU2VuZGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIExhdGVuY3kgVGVzdCBSZXN1bHRzIERhdGFcbiAqL1xuZXhwb3J0IGNsYXNzIEluaXRpYWxTZXR0aW5ncyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuUGl4ZWxTdHJlYW1pbmdTZXR0aW5ncyA9IG5ldyBQaXhlbFN0cmVhbWluZ1NldHRpbmdzKCk7XG4gICAgICAgIHRoaXMuRW5jb2RlclNldHRpbmdzID0gbmV3IEVuY29kZXJTZXR0aW5ncygpO1xuICAgICAgICB0aGlzLldlYlJUQ1NldHRpbmdzID0gbmV3IFdlYlJUQ1NldHRpbmdzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBGUFMgYW5kIE1heEZQUyBzdGF0cyBiZXR3ZWVuIDQuMjcgYW5kIDVcbiAgICAgKi9cbiAgICB1ZUNvbXBhdGlibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLldlYlJUQ1NldHRpbmdzLk1heEZQUyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLldlYlJUQ1NldHRpbmdzLkZQUyA9IHRoaXMuV2ViUlRDU2V0dGluZ3MuTWF4RlBTO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGNsYXNzIGZvciBoYW5kbGluZyBQaXhlbCBTdHJlYW1pbmcgZGV0YWlsc1xuICovXG5leHBvcnQgY2xhc3MgUGl4ZWxTdHJlYW1pbmdTZXR0aW5ncyB7XG59XG4vKipcbiAqIEEgY2xhc3MgZm9yIGhhbmRsaW5nIGVuY29kZXIgc3RhdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEVuY29kZXJTZXR0aW5ncyB7XG59XG4vKipcbiAqIEEgY2xhc3MgZm9yIGhhbmRsaW5nIHdlYiBydGMgc3RhdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJUQ1NldHRpbmdzIHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUluaXRpYWxTZXR0aW5ncy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuLyoqXG4gKiBMYXRlbmN5IFRlc3QgUmVzdWx0cyBEYXRhXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXRlbmN5VGVzdFJlc3VsdHMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL0ZpZWxkcyBTZXQgZnJvbSB0aGUgbGF0ZW5jeSBwYXlsb2FkIHJlZ2FyZGxlc3Mgb2YgdmVyc2lvblxuICAgICAgICB0aGlzLlJlY2VpcHRUaW1lTXMgPSBudWxsO1xuICAgICAgICB0aGlzLlRyYW5zbWlzc2lvblRpbWVNcyA9IG51bGw7XG4gICAgICAgIC8vRmllbGRzIFNldCBmcm9tIHRoZSBsYXRlbmN5IHBheWxvYWQgZnJvbSA0LjI3LjJcbiAgICAgICAgdGhpcy5QcmVDYXB0dXJlVGltZU1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5Qb3N0Q2FwdHVyZVRpbWVNcyA9IG51bGw7XG4gICAgICAgIHRoaXMuUHJlRW5jb2RlVGltZU1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5Qb3N0RW5jb2RlVGltZU1zID0gbnVsbDtcbiAgICAgICAgLy9GaWVsZHMgU2V0IGZyb20gdGhlIGxhdGVuY3kgcGF5bG9hZCBmcm9tIDUuMFxuICAgICAgICB0aGlzLkVuY29kZU1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5DYXB0dXJlVG9TZW5kTXMgPSBudWxsO1xuICAgICAgICAvL0ZpZWxkcyBTZXQgd2hlbiBwcm9jZXNzZWRcbiAgICAgICAgdGhpcy50ZXN0U3RhcnRUaW1lTXMgPSAwO1xuICAgICAgICB0aGlzLmJyb3dzZXJSZWNlaXB0VGltZU1zID0gMDtcbiAgICAgICAgLy9GaWVsZHMgc2V0IGZyb20gY2FsY3VsYXRpb25zXG4gICAgICAgIHRoaXMubGF0ZW5jeUV4Y2x1ZGluZ0RlY29kZSA9IDA7XG4gICAgICAgIHRoaXMudGVzdER1cmF0aW9uID0gMDtcbiAgICAgICAgLy91ZUxhdGVuY3k6IG51bWJlciA9IDA7XG4gICAgICAgIHRoaXMubmV0d29ya0xhdGVuY3kgPSAwO1xuICAgICAgICB0aGlzLmJyb3dzZXJTZW5kTGF0ZW5jeSA9IDA7XG4gICAgICAgIHRoaXMuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgPSAwO1xuICAgICAgICB0aGlzLmVuZFRvRW5kTGF0ZW5jeSA9IDA7XG4gICAgICAgIC8vdWVQaXhlbFN0cmVhbUxhdGVuY3k6IG51bWJlciA9IDA7XG4gICAgICAgIHRoaXMuZW5jb2RlTGF0ZW5jeSA9IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIERlbHRhIFRpbWUgTWlsbGlzZWNvbmRzXG4gICAgICogQHBhcmFtIERlbHRhVGltZU1zIC0gRGVsdGEgVGltZSBNaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICBzZXRGcmFtZURpc3BsYXlEZWx0YVRpbWUoRGVsdGFUaW1lTXMpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5mcmFtZURpc3BsYXlEZWx0YVRpbWVNcyA9IE1hdGgucm91bmQoRGVsdGFUaW1lTXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIGVuY29kZXIgdGltZXMgYW5kIHNldCB0aGVtXG4gICAgICovXG4gICAgcHJvY2Vzc0ZpZWxkcygpIHtcbiAgICAgICAgaWYgKHRoaXMuRW5jb2RlTXMgPT0gbnVsbCAmJiAodGhpcy5QcmVFbmNvZGVUaW1lTXMgIT0gbnVsbCB8fCB0aGlzLlBvc3RFbmNvZGVUaW1lTXMgIT0gbnVsbCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGBTZXR0aW5nIEVuY29kZSBNcyBcXG4gJHt0aGlzLlBvc3RFbmNvZGVUaW1lTXN9IFxcbiAke3RoaXMuUHJlRW5jb2RlVGltZU1zfWApO1xuICAgICAgICAgICAgdGhpcy5FbmNvZGVNcyA9IHRoaXMuUG9zdEVuY29kZVRpbWVNcyAtIHRoaXMuUHJlRW5jb2RlVGltZU1zO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLkNhcHR1cmVUb1NlbmRNcyA9PSBudWxsICYmXG4gICAgICAgICAgICAodGhpcy5QcmVDYXB0dXJlVGltZU1zICE9IG51bGwgfHwgdGhpcy5Qb3N0Q2FwdHVyZVRpbWVNcyAhPSBudWxsKSkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYFNldHRpbmcgQ2FwdHVyZVRvU2VuZE1zIE1zIFxcbiAke3RoaXMuUG9zdENhcHR1cmVUaW1lTXN9IFxcbiAke3RoaXMuUHJlQ2FwdHVyZVRpbWVNc31gKTtcbiAgICAgICAgICAgIHRoaXMuQ2FwdHVyZVRvU2VuZE1zID0gdGhpcy5Qb3N0Q2FwdHVyZVRpbWVNcyAtIHRoaXMuUHJlQ2FwdHVyZVRpbWVNcztcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxhdGVuY3lUZXN0UmVzdWx0cy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBBIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgZnJlZXplIGZyYW1lIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgRnJlZXplRnJhbWUge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGZyZWV6ZSBmcmFtZVxuICAgICAqIEBwYXJhbSByb290RGl2IHRoZSBkaXYgdGhhdCBhIGZyZWV6ZSBmcmFtZSBlbGVtZW50IHdpbGwgYmUgaW5qZWN0ZWQgaW50b1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvb3REaXYpIHtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZUhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWVXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMucm9vdERpdiA9IHJvb3REaXY7XG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgb3ZlcmxheVxuICAgICAgICB0aGlzLnJvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuaWQgPSAnZnJlZXplRnJhbWUnO1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuekluZGV4ID0gJzIwJztcbiAgICAgICAgLy8gY3JlYXRlIHRoZSBpbWFnZSBwbGFjZSBob2xkZXJcbiAgICAgICAgdGhpcy5pbWFnZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgdGhpcy5pbWFnZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAvLyBhcHBlbmQgdGhlIGltYWdlIGludG8gdGhlIHJvb3QgZWxlbWVudCBhbmQgYXBwZW5kIHRoZSBlbGVtZW50IHRvIHRoZSByb290IGRpdlxuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMucm9vdEVsZW1lbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGZyZWV6ZSBmcmFtZSBlbGVtZW50IGZvciBzaG93aW5nXG4gICAgICovXG4gICAgc2V0RWxlbWVudEZvclNob3coKSB7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZnJlZXplIGZyYW1lIGVsZW1lbnQgZm9yIGhpZGluZ1xuICAgICAqL1xuICAgIHNldEVsZW1lbnRGb3JIaWRlKCkge1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgZnJlZXplIGZyYW1lcyBpbWFnZSBzb3VyY2VcbiAgICAgKiBAcGFyYW0ganBlZyAtIHRoZSBmcmVlemUgZnJhbWUgaW1hZ2UgYXMgYSBieXRlIGFycmF5IGRhdGFcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZUVsZW1lbnRTb3VyY2UoanBlZykge1xuICAgICAgICBjb25zdCBiYXNlNjQgPSBidG9hKGpwZWcucmVkdWNlKChkYXRhLCBieXRlKSA9PiBkYXRhICsgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSwgJycpKTtcbiAgICAgICAgdGhpcy5pbWFnZUVsZW1lbnQuc3JjID0gJ2RhdGE6aW1hZ2UvanBlZztiYXNlNjQsJyArIGJhc2U2NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkaW1lbnNpb25zIGZvciB0aGUgZnJlZXplIGZyYW1lIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJlc2l6ZSBpdFxuICAgICAqL1xuICAgIHNldERpbWVuc2lvbnNGcm9tRWxlbWVudEFuZFJlc2l6ZSgpIHtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZUhlaWdodCA9IHRoaXMuaW1hZ2VFbGVtZW50Lm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWVXaWR0aCA9IHRoaXMuaW1hZ2VFbGVtZW50Lm5hdHVyYWxXaWR0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzaXplIGEgZnJlZXplIGZyYW1lIGVsZW1lbnRcbiAgICAgKi9cbiAgICByZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmZyZWV6ZUZyYW1lV2lkdGggIT09IDAgJiYgdGhpcy5mcmVlemVGcmFtZUhlaWdodCAhPT0gMCkge1xuICAgICAgICAgICAgbGV0IGRpc3BsYXlXaWR0aCA9IDA7XG4gICAgICAgICAgICBsZXQgZGlzcGxheUhlaWdodCA9IDA7XG4gICAgICAgICAgICBsZXQgZGlzcGxheVRvcCA9IDA7XG4gICAgICAgICAgICBsZXQgZGlzcGxheUxlZnQgPSAwO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50QXNwZWN0UmF0aW8gPSB0aGlzLnJvb3REaXYuY2xpZW50V2lkdGggLyB0aGlzLnJvb3REaXYuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgY29uc3QgdmlkZW9Bc3BlY3RSYXRpbyA9IHRoaXMuZnJlZXplRnJhbWVXaWR0aCAvIHRoaXMuZnJlZXplRnJhbWVIZWlnaHQ7XG4gICAgICAgICAgICBpZiAocGFyZW50QXNwZWN0UmF0aW8gPCB2aWRlb0FzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoID0gdGhpcy5yb290RGl2LmNsaWVudFdpZHRoO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMucm9vdERpdi5jbGllbnRXaWR0aCAvIHZpZGVvQXNwZWN0UmF0aW8pO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlUb3AgPSBNYXRoLmZsb29yKCh0aGlzLnJvb3REaXYuY2xpZW50SGVpZ2h0IC0gZGlzcGxheUhlaWdodCkgKiAwLjUpO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlMZWZ0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCA9IE1hdGguZmxvb3IodGhpcy5yb290RGl2LmNsaWVudEhlaWdodCAqIHZpZGVvQXNwZWN0UmF0aW8pO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSB0aGlzLnJvb3REaXYuY2xpZW50SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGRpc3BsYXlUb3AgPSAwO1xuICAgICAgICAgICAgICAgIGRpc3BsYXlMZWZ0ID0gTWF0aC5mbG9vcigodGhpcy5yb290RGl2LmNsaWVudFdpZHRoIC0gZGlzcGxheVdpZHRoKSAqIDAuNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy5yb290RGl2Lm9mZnNldFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5yb290RGl2Lm9mZnNldEhlaWdodCArICdweCc7XG4gICAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLmxlZnQgPSAwICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUudG9wID0gMCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zdHlsZS53aWR0aCA9IGRpc3BsYXlXaWR0aCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBkaXNwbGF5SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VFbGVtZW50LnN0eWxlLmxlZnQgPSBkaXNwbGF5TGVmdCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zdHlsZS50b3AgPSBkaXNwbGF5VG9wICsgJ3B4JztcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyZWV6ZUZyYW1lLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBGcmVlemVGcmFtZSB9IGZyb20gJy4vRnJlZXplRnJhbWUnO1xuLyoqXG4gKiBBIGNsYXNzIGZvciBjb250cm9sbGluZyBmcmVlemUgZnJhbWUgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgY2xhc3MgRnJlZXplRnJhbWVDb250cm9sbGVyIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBmcmVlemUgZnJhbWUgY29udHJvbGxlclxuICAgICAqIEBwYXJhbSByb290RGl2IC0gdGhlIGRpdiB0aGF0IGEgZnJlZXplIGZyYW1lIGVsZW1lbnQgd2lsbCBiZSBpbmplY3RlZCBpbnRvXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdERpdikge1xuICAgICAgICB0aGlzLnJlY2VpdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgICB0aGlzLmpwZWcgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZURlbGF5ID0gNTA7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWUgPSBuZXcgRnJlZXplRnJhbWUocm9vdERpdik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgdGhlIGZyZWV6ZSBmcmFtZSBpZiBpdCBpcyB2YWxpZFxuICAgICAqL1xuICAgIHNob3dGcmVlemVGcmFtZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlZXplRnJhbWUuc2V0RWxlbWVudEZvclNob3coKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBmcmVlemUgZnJhbWUgYW5kIHNldCB0aGUgdmFsaWRpdHkgdG8gZmFsc2VcbiAgICAgKi9cbiAgICBoaWRlRnJlZXplRnJhbWUoKSB7XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZS5zZXRFbGVtZW50Rm9ySGlkZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGZyZWV6ZSBmcmFtZXMgaW1hZ2Ugc291cmNlIGFuZCBsb2FkIGl0XG4gICAgICogQHBhcmFtIGpwZWcgLSB0aGUgZnJlZXplIGZyYW1lIGltYWdlIGFzIGEgYnl0ZSBhcnJheSBkYXRhXG4gICAgICogQHBhcmFtIG9uTG9hZENhbGxCYWNrIC0gYSBjYWxsIGJhY2sgZm9yIG1hbmFnaW5nIGlmIHRoZSBwbGF5IG92ZXJsYXkgbmVlZHMgdG8gYmUgc2hvd24gb3Igbm90XG4gICAgICovXG4gICAgdXBkYXRlRnJlZXplRnJhbWVBbmRTaG93KGpwZWcsIG9uTG9hZENhbGxCYWNrKSB7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWUudXBkYXRlSW1hZ2VFbGVtZW50U291cmNlKGpwZWcpO1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lLmltYWdlRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lLnNldERpbWVuc2lvbnNGcm9tRWxlbWVudEFuZFJlc2l6ZSgpO1xuICAgICAgICAgICAgb25Mb2FkQ2FsbEJhY2soKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgbmV3IGZyZWV6ZSBmcmFtZSBpbWFnZSBhbmQgdXBkYXRlIGl0XG4gICAgICogQHBhcmFtIHZpZXcgLSB0aGUgZnJlZXplIGZyYW1lIGltYWdlIGFzIGEgYnl0ZSBhcnJheSBkYXRhXG4gICAgICogQHBhcmFtIG9uTG9hZENhbGxCYWNrIC0gYSBjYWxsIGJhY2sgZm9yIG1hbmFnaW5nIGlmIHRoZSBwbGF5IG92ZXJsYXkgbmVlZHMgdG8gYmUgc2hvd24gb3Igbm90XG4gICAgICovXG4gICAgcHJvY2Vzc0ZyZWV6ZUZyYW1lTWVzc2FnZSh2aWV3LCBvbkxvYWRDYWxsQmFjaykge1xuICAgICAgICAvLyBSZXNldCBmcmVlemUgZnJhbWUgaWYgd2UgZ290IGEgZnJlZXplIGZyYW1lIG1lc3NhZ2UgYW5kIHdlIGFyZSBub3QgXCJyZWNlaXZpbmdcIiB5ZXQuXG4gICAgICAgIGlmICghdGhpcy5yZWNlaXZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmpwZWcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXh0cmFjdCB0b3RhbCBzaXplIG9mIGZyZWV6ZSBmcmFtZSAoYWNyb3NzIGFsbCBjaHVua3MpXG4gICAgICAgIHRoaXMuc2l6ZSA9IG5ldyBEYXRhVmlldyh2aWV3LnNsaWNlKDEsIDUpLmJ1ZmZlcikuZ2V0SW50MzIoMCwgdHJ1ZSk7XG4gICAgICAgIC8vIEdldCB0aGUganBlZyBwYXJ0IG9mIHRoZSBwYXlsb2FkXG4gICAgICAgIGNvbnN0IGpwZWdCeXRlcyA9IHZpZXcuc2xpY2UoMSArIDQpO1xuICAgICAgICAvLyBBcHBlbmQgdG8gZXhpc3RpbmcganBlZyB0aGF0IGhvbGRzIHRoZSBmcmVlemUgZnJhbWVcbiAgICAgICAgaWYgKHRoaXMuanBlZykge1xuICAgICAgICAgICAgY29uc3QganBlZyA9IG5ldyBVaW50OEFycmF5KHRoaXMuanBlZy5sZW5ndGggKyBqcGVnQnl0ZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGpwZWcuc2V0KHRoaXMuanBlZywgMCk7XG4gICAgICAgICAgICBqcGVnLnNldChqcGVnQnl0ZXMsIHRoaXMuanBlZy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5qcGVnID0ganBlZztcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBleGlzdGluZyBmcmVlemUgZnJhbWUganBlZywgbWFrZSBvbmVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmpwZWcgPSBqcGVnQnl0ZXM7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmluZyA9IHRydWU7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhgcmVjZWl2ZWQgZmlyc3QgY2h1bmsgb2YgZnJlZXplIGZyYW1lOiAke3RoaXMuanBlZy5sZW5ndGh9LyR7dGhpcy5zaXplfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbmlzaGVkIHJlY2VpdmluZyBmcmVlemUgZnJhbWUsIHdlIGNhbiBzaG93IGl0IG5vd1xuICAgICAgICBpZiAodGhpcy5qcGVnLmxlbmd0aCA9PT0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhgcmVjZWl2ZWQgY29tcGxldGUgZnJlZXplIGZyYW1lICR7dGhpcy5zaXplfWApO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGcmVlemVGcmFtZUFuZFNob3codGhpcy5qcGVnLCBvbkxvYWRDYWxsQmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgcmVjZWl2ZWQgbW9yZSBkYXRhIHRoYW4gdGhlIGZyZWV6ZSBmcmFtZSBwYXlsb2FkIG1lc3NhZ2UgaW5kaWNhdGUgKHRoaXMgaXMgYW4gZXJyb3IpXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuanBlZy5sZW5ndGggPiB0aGlzLnNpemUpIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgcmVjZWl2ZWQgYmlnZ2VyIGZyZWV6ZSBmcmFtZSB0aGFuIGFkdmVydGlzZWQ6ICR7dGhpcy5qcGVnLmxlbmd0aH0vJHt0aGlzLnNpemV9YCk7XG4gICAgICAgICAgICB0aGlzLmpwZWcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnJlZXplRnJhbWVDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBkZWVwQ29weUdhbWVwYWQgfSBmcm9tICcuL0dhbWVwYWRUeXBlcyc7XG4vKipcbiAqIEdhbWVwYWQgbGF5b3V0IGNvZGVzIGVudW1cbiAqL1xuZXhwb3J0IHZhciBHYW1lcGFkTGF5b3V0O1xuKGZ1bmN0aW9uIChHYW1lcGFkTGF5b3V0KSB7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRDbHVzdGVyQm90dG9tQnV0dG9uXCJdID0gMF0gPSBcIlJpZ2h0Q2x1c3RlckJvdHRvbUJ1dHRvblwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlJpZ2h0Q2x1c3RlclJpZ2h0QnV0dG9uXCJdID0gMV0gPSBcIlJpZ2h0Q2x1c3RlclJpZ2h0QnV0dG9uXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRDbHVzdGVyTGVmdEJ1dHRvblwiXSA9IDJdID0gXCJSaWdodENsdXN0ZXJMZWZ0QnV0dG9uXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRDbHVzdGVyVG9wQnV0dG9uXCJdID0gM10gPSBcIlJpZ2h0Q2x1c3RlclRvcEJ1dHRvblwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRTaG91bGRlclwiXSA9IDRdID0gXCJMZWZ0U2hvdWxkZXJcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJSaWdodFNob3VsZGVyXCJdID0gNV0gPSBcIlJpZ2h0U2hvdWxkZXJcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0VHJpZ2dlclwiXSA9IDZdID0gXCJMZWZ0VHJpZ2dlclwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlJpZ2h0VHJpZ2dlclwiXSA9IDddID0gXCJSaWdodFRyaWdnZXJcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJTZWxlY3RPckJhY2tcIl0gPSA4XSA9IFwiU2VsZWN0T3JCYWNrXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiU3RhcnRPckZvcndhcmRcIl0gPSA5XSA9IFwiU3RhcnRPckZvcndhcmRcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0QW5hbG9nUHJlc3NcIl0gPSAxMF0gPSBcIkxlZnRBbmFsb2dQcmVzc1wiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlJpZ2h0QW5hbG9nUHJlc3NcIl0gPSAxMV0gPSBcIlJpZ2h0QW5hbG9nUHJlc3NcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0Q2x1c3RlclRvcEJ1dHRvblwiXSA9IDEyXSA9IFwiTGVmdENsdXN0ZXJUb3BCdXR0b25cIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0Q2x1c3RlckJvdHRvbUJ1dHRvblwiXSA9IDEzXSA9IFwiTGVmdENsdXN0ZXJCb3R0b21CdXR0b25cIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0Q2x1c3RlckxlZnRCdXR0b25cIl0gPSAxNF0gPSBcIkxlZnRDbHVzdGVyTGVmdEJ1dHRvblwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRDbHVzdGVyUmlnaHRCdXR0b25cIl0gPSAxNV0gPSBcIkxlZnRDbHVzdGVyUmlnaHRCdXR0b25cIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJDZW50cmVCdXR0b25cIl0gPSAxNl0gPSBcIkNlbnRyZUJ1dHRvblwiO1xuICAgIC8vIEF4ZXNcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0U3RpY2tIb3Jpem9udGFsXCJdID0gMF0gPSBcIkxlZnRTdGlja0hvcml6b250YWxcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJMZWZ0U3RpY2tWZXJ0aWNhbFwiXSA9IDFdID0gXCJMZWZ0U3RpY2tWZXJ0aWNhbFwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlJpZ2h0U3RpY2tIb3Jpem9udGFsXCJdID0gMl0gPSBcIlJpZ2h0U3RpY2tIb3Jpem9udGFsXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRTdGlja1ZlcnRpY2FsXCJdID0gM10gPSBcIlJpZ2h0U3RpY2tWZXJ0aWNhbFwiO1xufSkoR2FtZXBhZExheW91dCB8fCAoR2FtZXBhZExheW91dCA9IHt9KSk7XG4vKipcbiAqIEhhbmRsZXMgZ2FtZXBhZCBldmVudHMgZnJvbSB0aGUgZG9jdW1lbnQgdG8gc2VuZCB0byB0aGUgc3RyZWFtZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBHYW1lcGFkQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlciA9IHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyO1xuICAgICAgICB0aGlzLm9uR2FtZXBhZENvbm5lY3RlZExpc3RlbmVyID0gdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkdhbWVwYWREaXNjb25uZWN0ZWRMaXN0ZW5lciA9IHRoaXMub25HYW1lcGFkRGlzY29ubmVjdGVkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYmVmb3JlVW5sb2FkTGlzdGVuZXIgPSB0aGlzLm9uQmVmb3JlVW5sb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gKHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLmJpbmQod2luZG93KTtcbiAgICB9XG4gICAgcmVnaXN0ZXIoKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLmJlZm9yZVVubG9hZExpc3RlbmVyKTtcbiAgICAgICAgY29uc3QgYnJvd3NlcldpbmRvdyA9IHdpbmRvdztcbiAgICAgICAgaWYgKCdHYW1lcGFkRXZlbnQnIGluIGJyb3dzZXJXaW5kb3cpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdnYW1lcGFkY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZ2FtZXBhZGRpc2Nvbm5lY3RlZCcsIHRoaXMub25HYW1lcGFkRGlzY29ubmVjdGVkTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCdXZWJLaXRHYW1lcGFkRXZlbnQnIGluIGJyb3dzZXJXaW5kb3cpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRnYW1lcGFkY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0Z2FtZXBhZGRpc2Nvbm5lY3RlZCcsIHRoaXMub25HYW1lcGFkRGlzY29ubmVjdGVkTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSBbXTtcbiAgICAgICAgaWYgKG5hdmlnYXRvci5nZXRHYW1lcGFkcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBnYW1lcGFkIG9mIG5hdmlnYXRvci5nZXRHYW1lcGFkcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGdhbWVwYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWQobmV3IEdhbWVwYWRFdmVudCgnZ2FtZXBhZGNvbm5lY3RlZCcsIHsgZ2FtZXBhZCB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdnYW1lcGFkY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdnYW1lcGFkZGlzY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWREaXNjb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRnYW1lcGFkY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWRDb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRnYW1lcGFkZGlzY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWREaXNjb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbGxlciBvZiB0aGlzLmNvbnRyb2xsZXJzKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWREaXNjb25uZWN0ZWQnKShbY29udHJvbGxlci5pZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSBbXTtcbiAgICB9XG4gICAgb25HYW1lcGFkUmVzcG9uc2VSZWNlaXZlZChnYW1lcGFkSWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIHRoaXMuY29udHJvbGxlcnMpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyICYmIGNvbnRyb2xsZXIuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuaWQgPSBnYW1lcGFkSWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25HYW1lcGFkQ29ubmVjdGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGdhbWVwYWQgPSBldmVudC5nYW1lcGFkO1xuICAgICAgICBjb25zdCBuZXdDb250cm9sbGVyID0ge1xuICAgICAgICAgICAgY3VycmVudFN0YXRlOiBkZWVwQ29weUdhbWVwYWQoZ2FtZXBhZCksXG4gICAgICAgICAgICBwcmV2U3RhdGU6IGRlZXBDb3B5R2FtZXBhZChnYW1lcGFkKSxcbiAgICAgICAgICAgIGlkOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyc1tnYW1lcGFkLmluZGV4XSA9IG5ld0NvbnRyb2xsZXI7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy51cGRhdGVTdGF0dXMoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZENvbm5lY3RlZCcpKCk7XG4gICAgfVxuICAgIG9uR2FtZXBhZERpc2Nvbm5lY3RlZChldmVudCkge1xuICAgICAgICBjb25zdCBnYW1lcGFkID0gZXZlbnQuZ2FtZXBhZDtcbiAgICAgICAgY29uc3QgZGVsZXRlZENvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXJzW2dhbWVwYWQuaW5kZXhdO1xuICAgICAgICBkZWxldGUgdGhpcy5jb250cm9sbGVyc1tnYW1lcGFkLmluZGV4XTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IHRoaXMuY29udHJvbGxlcnMuZmlsdGVyKChjb250cm9sbGVyKSA9PiBjb250cm9sbGVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoZGVsZXRlZENvbnRyb2xsZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkRGlzY29ubmVjdGVkJykoW1xuICAgICAgICAgICAgICAgIGRlbGV0ZWRDb250cm9sbGVyLmlkXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FuR2FtZXBhZHMoKSB7XG4gICAgICAgIGNvbnN0IGdhbWVwYWRzID0gbmF2aWdhdG9yLmdldEdhbWVwYWRzXG4gICAgICAgICAgICA/IG5hdmlnYXRvci5nZXRHYW1lcGFkcygpXG4gICAgICAgICAgICA6IG5hdmlnYXRvci53ZWJraXRHZXRHYW1lcGFkc1xuICAgICAgICAgICAgICAgID8gbmF2aWdhdG9yLndlYmtpdEdldEdhbWVwYWRzKClcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhbWVwYWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ2FtZXBhZHNbaV0gJiYgdGhpcy5jb250cm9sbGVyc1tnYW1lcGFkc1tpXS5pbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNbZ2FtZXBhZHNbaV0uaW5kZXhdLmN1cnJlbnRTdGF0ZSA9IGdhbWVwYWRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVN0YXR1cygpIHtcbiAgICAgICAgdGhpcy5zY2FuR2FtZXBhZHMoKTtcbiAgICAgICAgY29uc3QgdG9TdHJlYW1lckhhbmRsZXJzID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnM7XG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBtdWx0aXBsZSBjb250cm9sbGVycyBpbiB0aGUgY2FzZSB0aGUgbXVsdGlwbGUgZ2FtZXBhZHMgYXJlIGNvbm5lY3RlZFxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5jb250cm9sbGVycykge1xuICAgICAgICAgICAgaWYgKCFjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHJlY2VpdmVkIGFuIGlkIChwb3NzaWJsZSBpZiB1c2luZyBhbiBvbGRlciB2ZXJzaW9uIG9mIFVFKSwgcmV0dXJuIHRvIG9yaWdpbmFsIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXJJZCA9IGNvbnRyb2xsZXIuaWQgPT09IHVuZGVmaW5lZCA/IHRoaXMuY29udHJvbGxlcnMuaW5kZXhPZihjb250cm9sbGVyKSA6IGNvbnRyb2xsZXIuaWQ7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBjb250cm9sbGVyLmN1cnJlbnRTdGF0ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbGxlci5jdXJyZW50U3RhdGUuYnV0dG9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRCdXR0b24gPSBjb250cm9sbGVyLmN1cnJlbnRTdGF0ZS5idXR0b25zW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQnV0dG9uID0gY29udHJvbGxlci5wcmV2U3RhdGUuYnV0dG9uc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJ1dHRvbi5wcmVzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IEdhbWVwYWRMYXlvdXQuTGVmdFRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVFcyBsZWZ0IGFuYWxvZyBoYXMgYSBidXR0b24gaW5kZXggb2YgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZEFuYWxvZycpKFtjb250cm9sbGVySWQsIDUsIGN1cnJlbnRCdXR0b24udmFsdWVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IEdhbWVwYWRMYXlvdXQuUmlnaHRUcmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVRXMgcmlnaHQgYW5hbG9nIGhhcyBhIGJ1dHRvbiBpbmRleCBvZiA2XG4gICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkQW5hbG9nJykoW2NvbnRyb2xsZXJJZCwgNiwgY3VycmVudEJ1dHRvbi52YWx1ZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZEJ1dHRvblByZXNzZWQnKShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCdXR0b24ucHJlc3NlZCA/IDEgOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghY3VycmVudEJ1dHRvbi5wcmVzc2VkICYmIHByZXZpb3VzQnV0dG9uLnByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBHYW1lcGFkTGF5b3V0LkxlZnRUcmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVRXMgbGVmdCBhbmFsb2cgaGFzIGEgYnV0dG9uIGluZGV4IG9mIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWRBbmFsb2cnKShbY29udHJvbGxlcklkLCA1LCAwXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA9PSBHYW1lcGFkTGF5b3V0LlJpZ2h0VHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUVzIHJpZ2h0IGFuYWxvZyBoYXMgYSBidXR0b24gaW5kZXggb2YgNlxuICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZEFuYWxvZycpKFtjb250cm9sbGVySWQsIDYsIDBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWRCdXR0b25SZWxlYXNlZCcpKFtjb250cm9sbGVySWQsIGksIDBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBnYW1lcGFkIGF4ZXMgKHdlIHdpbGwgaW5jcmVtZW50IGluIGxvdHMgb2YgMiBhcyB0aGVyZSBpcyAyIGF4ZXMgcGVyIHN0aWNrKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50U3RhdGUuYXhlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgICAgIC8vIEhvcml6b250YWwgYXhlcyBhcmUgZXZlbiBudW1iZXJlZFxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBwYXJzZUZsb2F0KGN1cnJlbnRTdGF0ZS5heGVzW2ldLnRvRml4ZWQoNCkpO1xuICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsIGF4ZXMgYXJlIG9kZCBudW1iZXJlZFxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9nYW1lcGFkLyNyZW1hcHBpbmcgR2FtZXBhZCBicm93c2VyIHNpZGUgc3RhbmRhcmQgbWFwcGluZyBoYXMgcG9zaXRpdmUgZG93biwgbmVnYXRpdmUgdXAuIFRoaXMgaXMgZG93bnJpZ2h0IGRpc2d1c3RpbmcuIFNvIHdlIGZpeCBpdC5cbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gLXBhcnNlRmxvYXQoY3VycmVudFN0YXRlLmF4ZXNbaSArIDFdLnRvRml4ZWQoNCkpO1xuICAgICAgICAgICAgICAgIC8vIFVFJ3MgYW5hbG9nIGF4ZXMgZm9sbG93IHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBicm93c2VycywgYnV0IHN0YXJ0IGF0IGluZGV4IDEgc28gd2Ugd2lsbCBvZmZzZXQgYXMgc3VjaFxuICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWRBbmFsb2cnKShbY29udHJvbGxlcklkLCBpICsgMSwgeF0pOyAvLyBIb3Jpem9udGFsIGF4ZXMsIG9ubHkgb2Zmc2V0IGJ5IDFcbiAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkQW5hbG9nJykoW2NvbnRyb2xsZXJJZCwgaSArIDIsIHldKTsgLy8gVmVydGljYWwgYXhlcywgb2Zmc2V0IGJ5IHR3byAoMSB0byBtYXRjaCBVRXMgYXhlcyBjb252ZW50aW9uIGFuZCB0aGVuIGFub3RoZXIgMSBmb3IgdGhlIHZlcnRpY2FsIGF4ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVySW5kZXggPSB0aGlzLmNvbnRyb2xsZXJzLmluZGV4T2YoY29udHJvbGxlcik7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW2NvbnRyb2xsZXJJbmRleF0ucHJldlN0YXRlID0gZGVlcENvcHlHYW1lcGFkKGN1cnJlbnRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy51cGRhdGVTdGF0dXMoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25CZWZvcmVVbmxvYWQoXykge1xuICAgICAgICAvLyBXaGVuIGEgdXNlciBuYXZpZ2F0ZXMgYXdheSBmcm9tIHRoZSBwYWdlLCB3ZSBuZWVkIHRvIGluZm9ybSBVRSBvZiBhbGwgdGhlIGRpc2Nvbm5lY3RpbmdcbiAgICAgICAgLy8gY29udHJvbGxlcnNcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIHRoaXMuY29udHJvbGxlcnMpIHtcbiAgICAgICAgICAgIGlmICghY29udHJvbGxlciB8fCBjb250cm9sbGVyLmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZERpc2Nvbm5lY3RlZCcpKFtjb250cm9sbGVyLmlkXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYW1lcGFkQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBEZWVwIGNvcGllcyB0aGUgdmFsdWVzIGZyb20gYSBnYW1lcGFkIGJ5IGZpcnN0IGNvbnZlcnRpbmcgaXQgdG8gYSBKU09OIG9iamVjdCBhbmQgdGhlbiBiYWNrIHRvIGEgZ2FtZXBhZFxuICpcbiAqIEBwYXJhbSBnYW1lcGFkIHRoZSBvcmlnaW5hbCBnYW1lcGFkXG4gKiBAcmV0dXJucyBhIG5ldyBnYW1lcGFkIG9iamVjdCwgcG9wdWxhdGVkIHdpdGggdGhlIG9yaWdpbmFsIGdhbWVwYWRzIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcENvcHlHYW1lcGFkKGdhbWVwYWQpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGJ1dHRvbnM6IGdhbWVwYWQuYnV0dG9ucy5tYXAoKGIpID0+IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgcHJlc3NlZDogYi5wcmVzc2VkLFxuICAgICAgICAgICAgdG91Y2hlZDogYi50b3VjaGVkLFxuICAgICAgICAgICAgdmFsdWU6IGIudmFsdWVcbiAgICAgICAgfSkpKSxcbiAgICAgICAgYXhlczogZ2FtZXBhZC5heGVzXG4gICAgfSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9R2FtZXBhZFR5cGVzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBLZXlib2FyZENvbnRyb2xsZXIgfSBmcm9tICcuL0tleWJvYXJkQ29udHJvbGxlcic7XG5pbXBvcnQgeyBNb3VzZUNvbnRyb2xsZXJMb2NrZWQgfSBmcm9tICcuL01vdXNlQ29udHJvbGxlckxvY2tlZCc7XG5pbXBvcnQgeyBNb3VzZUNvbnRyb2xsZXJIb3ZlcmluZyB9IGZyb20gJy4vTW91c2VDb250cm9sbGVySG92ZXJpbmcnO1xuaW1wb3J0IHsgVG91Y2hDb250cm9sbGVyIH0gZnJvbSAnLi9Ub3VjaENvbnRyb2xsZXInO1xuaW1wb3J0IHsgVG91Y2hDb250cm9sbGVyRmFrZSB9IGZyb20gJy4vVG91Y2hDb250cm9sbGVyRmFrZSc7XG5pbXBvcnQgeyBHYW1lcGFkQ29udHJvbGxlciB9IGZyb20gJy4vR2FtZXBhZENvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ29udHJvbFNjaGVtZVR5cGUgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogQ2xhc3MgZm9yIG1ha2luZyBhbmQgc2V0dGluZyB1cCBpbnB1dCBjbGFzcyB0eXBlc1xuICovXG5leHBvcnQgY2xhc3MgSW5wdXRDbGFzc2VzRmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyIC0gU3RyZWFtIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gdmlkZW9FbGVtZW50UHJvdmlkZXIgLSBWaWRlbyBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gY29vcmRpbmF0ZUNvbnZlcnRlciAtIEEgY29vcmRpbmF0ZUNvbnZlcnRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLCB2aWRlb0VsZW1lbnRQcm92aWRlciwgY29vcmRpbmF0ZUNvbnZlcnRlcikge1xuICAgICAgICB0aGlzLmFjdGl2ZUtleXMgPSBuZXcgQWN0aXZlS2V5cygpO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyID0gdG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXI7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIgPSB2aWRlb0VsZW1lbnRQcm92aWRlcjtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlQ29udmVydGVyID0gY29vcmRpbmF0ZUNvbnZlcnRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGJyb3dzZXIga2V5IGV2ZW50cy5cbiAgICAgKi9cbiAgICByZWdpc3RlcktleUJvYXJkKGNvbmZpZykge1xuICAgICAgICBMb2dnZXIuSW5mbygnUmVnaXN0ZXIgS2V5Ym9hcmQgRXZlbnRzJyk7XG4gICAgICAgIGNvbnN0IGtleWJvYXJkQ29udHJvbGxlciA9IG5ldyBLZXlib2FyZENvbnRyb2xsZXIodGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlciwgY29uZmlnLCB0aGlzLmFjdGl2ZUtleXMpO1xuICAgICAgICBrZXlib2FyZENvbnRyb2xsZXIucmVnaXN0ZXIoKTtcbiAgICAgICAgcmV0dXJuIGtleWJvYXJkQ29udHJvbGxlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogcmVnaXN0ZXIgbW91c2UgZXZlbnRzIGJhc2VkIG9uIGEgY29udHJvbCB0eXBlXG4gICAgICogQHBhcmFtIGNvbnRyb2xTY2hlbWUgLSBpZiB0aGUgbW91c2UgaXMgZWl0aGVyIGhvdmVyaW5nIG9yIGxvY2tlZFxuICAgICAqL1xuICAgIHJlZ2lzdGVyTW91c2UoY29udHJvbFNjaGVtZSkge1xuICAgICAgICBMb2dnZXIuSW5mbygnUmVnaXN0ZXIgTW91c2UgRXZlbnRzJyk7XG4gICAgICAgIGxldCBtb3VzZUNvbnRyb2xsZXI7XG4gICAgICAgIGlmIChjb250cm9sU2NoZW1lID09IENvbnRyb2xTY2hlbWVUeXBlLkhvdmVyaW5nTW91c2UpIHtcbiAgICAgICAgICAgIG1vdXNlQ29udHJvbGxlciA9IG5ldyBNb3VzZUNvbnRyb2xsZXJIb3ZlcmluZyh0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLCB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLCB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIsIHRoaXMuYWN0aXZlS2V5cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtb3VzZUNvbnRyb2xsZXIgPSBuZXcgTW91c2VDb250cm9sbGVyTG9ja2VkKHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIsIHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIsIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlciwgdGhpcy5hY3RpdmVLZXlzKTtcbiAgICAgICAgfVxuICAgICAgICBtb3VzZUNvbnRyb2xsZXIucmVnaXN0ZXIoKTtcbiAgICAgICAgcmV0dXJuIG1vdXNlQ29udHJvbGxlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogcmVnaXN0ZXIgdG91Y2ggZXZlbnRzXG4gICAgICogQHBhcmFtIGZha2VNb3VzZVRvdWNoIC0gdGhlIGZha2VkIG1vdXNlIHRvdWNoIGV2ZW50XG4gICAgICovXG4gICAgcmVnaXN0ZXJUb3VjaChmYWtlTW91c2VUb3VjaCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnUmVnaXN0ZXJpbmcgVG91Y2gnKTtcbiAgICAgICAgbGV0IHRvdWNoQ29udHJvbGxlcjtcbiAgICAgICAgaWYgKGZha2VNb3VzZVRvdWNoKSB7XG4gICAgICAgICAgICB0b3VjaENvbnRyb2xsZXIgPSBuZXcgVG91Y2hDb250cm9sbGVyRmFrZSh0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLCB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLCB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdG91Y2hDb250cm9sbGVyID0gbmV3IFRvdWNoQ29udHJvbGxlcih0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLCB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLCB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRvdWNoQ29udHJvbGxlci5yZWdpc3RlcigpO1xuICAgICAgICByZXR1cm4gdG91Y2hDb250cm9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZWdpc3RlcnMgYSBnYW1lcGFkXG4gICAgICovXG4gICAgcmVnaXN0ZXJHYW1lUGFkKCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnUmVnaXN0ZXIgR2FtZSBQYWQnKTtcbiAgICAgICAgY29uc3QgZ2FtZXBhZENvbnRyb2xsZXIgPSBuZXcgR2FtZXBhZENvbnRyb2xsZXIodGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlcik7XG4gICAgICAgIGdhbWVwYWRDb250cm9sbGVyLnJlZ2lzdGVyKCk7XG4gICAgICAgIHJldHVybiBnYW1lcGFkQ29udHJvbGxlcjtcbiAgICB9XG59XG4vKipcbiAqIEEgY2xhc3MgdGhhdCBrZWVwcyB0cmFjayBvZiBjdXJyZW50IGFjdGl2ZSBrZXlzXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3RpdmVLZXlzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVLZXlzID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlS2V5cyA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgYXJyYXkgb2YgYWN0aXZlIGtleXNcbiAgICAgKiBAcmV0dXJucyAtIGFuIGFycmF5IG9mIGFjdGl2ZSBrZXlzXG4gICAgICovXG4gICAgZ2V0QWN0aXZlS2V5cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlS2V5cztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnB1dENsYXNzZXNGYWN0b3J5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKlxuICogTmV3IGJyb3dzZXIgQVBJcyBoYXZlIG1vdmVkIGF3YXkgZnJvbSBLZXlib2FyZEV2ZW50LmtleUNvZGUgdG8gS2V5Ym9hcmRFdmVudC5Db2RlLlxuICogRm9yIGRldGFpbHMgc2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXlDb2RlI2NvbnN0YW50c19mb3Jfa2V5Y29kZV92YWx1ZVxuICogV2Ugc3RpbGwgdXNlIG9sZCBLZXlib2FyZEV2ZW50LmtleUNvZGUgaW50ZWdlcnMgaW4gdGhlIFVFIEMrKyBzaWRlLCBzbyB3ZSBuZWVkIGEgd2F5IHRvIG1hcCB0aGUgbmV3XG4gKiBzdHJpbmctYmFzZWQgS2V5Ym9hcmRFdmVudC5Db2RlIHRvIHRoZSBvbGQgaW50ZWdlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBDb2RlVG9LZXlDb2RlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgRXNjYXBlOiAyNyxcbiAgICBEaWdpdDA6IDQ4LFxuICAgIERpZ2l0MTogNDksXG4gICAgRGlnaXQyOiA1MCxcbiAgICBEaWdpdDM6IDUxLFxuICAgIERpZ2l0NDogNTIsXG4gICAgRGlnaXQ1OiA1MyxcbiAgICBEaWdpdDY6IDU0LFxuICAgIERpZ2l0NzogNTUsXG4gICAgRGlnaXQ4OiA1NixcbiAgICBEaWdpdDk6IDU3LFxuICAgIE1pbnVzOiAxNzMsXG4gICAgRXF1YWw6IDE4NyxcbiAgICBCYWNrc3BhY2U6IDgsXG4gICAgVGFiOiA5LFxuICAgIEtleVE6IDgxLFxuICAgIEtleVc6IDg3LFxuICAgIEtleUU6IDY5LFxuICAgIEtleVI6IDgyLFxuICAgIEtleVQ6IDg0LFxuICAgIEtleVk6IDg5LFxuICAgIEtleVU6IDg1LFxuICAgIEtleUk6IDczLFxuICAgIEtleU86IDc5LFxuICAgIEtleVA6IDgwLFxuICAgIEJyYWNrZXRMZWZ0OiAyMTksXG4gICAgQnJhY2tldFJpZ2h0OiAyMjEsXG4gICAgRW50ZXI6IDEzLFxuICAgIENvbnRyb2xMZWZ0OiAxNyxcbiAgICBLZXlBOiA2NSxcbiAgICBLZXlTOiA4MyxcbiAgICBLZXlEOiA2OCxcbiAgICBLZXlGOiA3MCxcbiAgICBLZXlHOiA3MSxcbiAgICBLZXlIOiA3MixcbiAgICBLZXlKOiA3NCxcbiAgICBLZXlLOiA3NSxcbiAgICBLZXlMOiA3NixcbiAgICBTZW1pY29sb246IDE4NixcbiAgICBRdW90ZTogMjIyLFxuICAgIEJhY2txdW90ZTogMTkyLFxuICAgIFNoaWZ0TGVmdDogMTYsXG4gICAgQmFja3NsYXNoOiAyMjAsXG4gICAgS2V5WjogOTAsXG4gICAgS2V5WDogODgsXG4gICAgS2V5QzogNjcsXG4gICAgS2V5VjogODYsXG4gICAgS2V5QjogNjYsXG4gICAgS2V5TjogNzgsXG4gICAgS2V5TTogNzcsXG4gICAgQ29tbWE6IDE4OCxcbiAgICBQZXJpb2Q6IDE5MCxcbiAgICBTbGFzaDogMTkxLFxuICAgIFNoaWZ0UmlnaHQ6IDI1MyxcbiAgICBBbHRMZWZ0OiAxOCxcbiAgICBTcGFjZTogMzIsXG4gICAgQ2Fwc0xvY2s6IDIwLFxuICAgIEYxOiAxMTIsXG4gICAgRjI6IDExMyxcbiAgICBGMzogMTE0LFxuICAgIEY0OiAxMTUsXG4gICAgRjU6IDExNixcbiAgICBGNjogMTE3LFxuICAgIEY3OiAxMTgsXG4gICAgRjg6IDExOSxcbiAgICBGOTogMTIwLFxuICAgIEYxMDogMTIxLFxuICAgIEYxMTogMTIyLFxuICAgIEYxMjogMTIzLFxuICAgIFBhdXNlOiAxOSxcbiAgICBTY3JvbGxMb2NrOiAxNDUsXG4gICAgTnVtcGFkRGl2aWRlOiAxMTEsXG4gICAgTnVtcGFkTXVsdGlwbHk6IDEwNixcbiAgICBOdW1wYWRTdWJ0cmFjdDogMTA5LFxuICAgIE51bXBhZEFkZDogMTA3LFxuICAgIE51bXBhZERlY2ltYWw6IDExMCxcbiAgICBOdW1wYWQ5OiAxMDUsXG4gICAgTnVtcGFkODogMTA0LFxuICAgIE51bXBhZDc6IDEwMyxcbiAgICBOdW1wYWQ2OiAxMDIsXG4gICAgTnVtcGFkNTogMTAxLFxuICAgIE51bXBhZDQ6IDEwMCxcbiAgICBOdW1wYWQzOiA5OSxcbiAgICBOdW1wYWQyOiA5OCxcbiAgICBOdW1wYWQxOiA5NyxcbiAgICBOdW1wYWQwOiA5NixcbiAgICBOdW1Mb2NrOiAxNDQsXG4gICAgQ29udHJvbFJpZ2h0OiAyNTQsXG4gICAgQWx0UmlnaHQ6IDI1NSxcbiAgICBIb21lOiAzNixcbiAgICBFbmQ6IDM1LFxuICAgIEFycm93VXA6IDM4LFxuICAgIEFycm93TGVmdDogMzcsXG4gICAgQXJyb3dSaWdodDogMzksXG4gICAgQXJyb3dEb3duOiA0MCxcbiAgICBQYWdlVXA6IDMzLFxuICAgIFBhZ2VEb3duOiAzNCxcbiAgICBJbnNlcnQ6IDQ1LFxuICAgIERlbGV0ZTogNDYsXG4gICAgQ29udGV4dE1lbnU6IDkzXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtleUNvZGVzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBTcGVjaWFsS2V5Q29kZXMgfSBmcm9tICcuL1NwZWNpYWxLZXlDb2Rlcyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBGbGFncyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgQ29kZVRvS2V5Q29kZSB9IGZyb20gJy4vS2V5Q29kZXMnO1xuLyoqXG4gKiBIYW5kbGVzIHRoZSBLZXlib2FyZCBJbnB1dHMgZm9yIHRoZSBkb2N1bWVudFxuICovXG5leHBvcnQgY2xhc3MgS2V5Ym9hcmRDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgY29uZmlnLCBhY3RpdmVLZXlzKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIgPSBzdHJlYW1NZXNzYWdlQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuYWN0aXZlS2V5cyA9IGFjdGl2ZUtleXM7XG4gICAgICAgIHRoaXMub25LZXlEb3duTGlzdGVuZXIgPSB0aGlzLmhhbmRsZU9uS2V5RG93bi5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uS2V5VXBMaXN0ZW5lciA9IHRoaXMuaGFuZGxlT25LZXlVcC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uS2V5UHJlc3NMaXN0ZW5lciA9IHRoaXMuaGFuZGxlT25LZXlQcmVzcy5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duTGlzdGVuZXIpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25LZXlVcExpc3RlbmVyKTtcbiAgICAgICAgLy9UaGlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYXMgYXQgSnVuIDEzIDIwMjFcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCB0aGlzLm9uS2V5UHJlc3NMaXN0ZW5lcik7XG4gICAgfVxuICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bkxpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLm9uS2V5VXBMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgdGhpcy5vbktleVByZXNzTGlzdGVuZXIpO1xuICAgIH1cbiAgICBoYW5kbGVPbktleURvd24oa2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGtleUNvZGUgPSB0aGlzLmdldEtleWNvZGUoa2V5Ym9hcmRFdmVudCk7XG4gICAgICAgIGlmICgha2V5Q29kZSB8fCBrZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b1N0cmVhbWVySGFuZGxlcnMgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICAgICAgKF9hID0gdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnS2V5RG93bicpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoW3RoaXMuZ2V0S2V5Y29kZShrZXlib2FyZEV2ZW50KSwga2V5Ym9hcmRFdmVudC5yZXBlYXQgPyAxIDogMF0pO1xuICAgICAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5hY3RpdmVLZXlzLmdldEFjdGl2ZUtleXMoKTtcbiAgICAgICAgYWN0aXZlS2V5cy5wdXNoKGtleUNvZGUpO1xuICAgICAgICAvLyBCYWNrc3BhY2UgaXMgbm90IGNvbnNpZGVyZWQgYSBrZXlwcmVzcyBpbiBKYXZhU2NyaXB0IGJ1dCB3ZSBuZWVkIGl0XG4gICAgICAgIC8vIHRvIGJlIHNvIGNoYXJhY3RlcnMgbWF5IGJlIGRlbGV0ZWQgaW4gYSBVRSB0ZXh0IGVudHJ5IGZpZWxkLlxuICAgICAgICAvLyBzaW5jZSBrZXlwcmVzcyBpcyBkZXByZWNhdGVkIHdlIHJlYWxseSBzaG91bGQgYmUgc2VuZGluZyBhbGwga2V5cyB0byBrZXlwcmVzc1xuICAgICAgICAvLyBvciB3ZSBjaGFuZ2UgZXZlcnl0aGluZyB0byBoYW5kbGUgdGhlIGRlcHJlY2F0aW9uIG9mIHRoZXNlIHBhcnRzXG4gICAgICAgIGlmIChrZXlDb2RlID09PSBTcGVjaWFsS2V5Q29kZXMuYmFja1NwYWNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9uS2V5UHJlc3MobmV3IEtleWJvYXJkRXZlbnQoJ2tleXByZXNzJywge1xuICAgICAgICAgICAgICAgIGNoYXJDb2RlOiBTcGVjaWFsS2V5Q29kZXMuYmFja1NwYWNlLFxuICAgICAgICAgICAgICAgIGtleUNvZGU6IFNwZWNpYWxLZXlDb2Rlcy5iYWNrU3BhY2VcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzKSAmJiB0aGlzLmlzS2V5Q29kZUJyb3dzZXJLZXkoa2V5Q29kZSkpIHtcbiAgICAgICAgICAgIGtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVPbktleVVwKGtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBrZXlDb2RlID0gdGhpcy5nZXRLZXljb2RlKGtleWJvYXJkRXZlbnQpO1xuICAgICAgICBpZiAoIWtleUNvZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b1N0cmVhbWVySGFuZGxlcnMgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICAgICAgKF9hID0gdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnS2V5VXAnKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKFtrZXlDb2RlXSk7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlN1cHByZXNzQnJvd3NlcktleXMpICYmIHRoaXMuaXNLZXlDb2RlQnJvd3NlcktleShrZXlDb2RlKSkge1xuICAgICAgICAgICAga2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZU9uS2V5UHJlc3Moa2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGtleUNvZGUgPSB0aGlzLmdldEtleWNvZGUoa2V5Ym9hcmRFdmVudCk7XG4gICAgICAgIGlmICgha2V5Q29kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICAoX2EgPSB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdLZXlQcmVzcycpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoW2tleUNvZGVdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgS2V5Y29kZSBvZiB0aGUgS2V5IHByZXNzZWRcbiAgICAgKiBAcGFyYW0ga2V5Ym9hcmRFdmVudCAtIEtleSBib2FyZCBFdmVudFxuICAgICAqIEByZXR1cm5zIC0gdGhlIGtleSBjb2RlIG9mIHRoZSBLZXlcbiAgICAgKi9cbiAgICBnZXRLZXljb2RlKGtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBrZXlDb2RlIHByb3BlcnR5IGJlY2F1c2UgYnJvd3NlciBBUEkgaXMgZGVwcmVjYXRlZCB0aGVuIHVzZSBLZXlib2FyZEV2ZW50LmNvZGUgaW5zdGVhZC5cbiAgICAgICAgLy8gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9rZXlDb2RlI2NvbnN0YW50c19mb3Jfa2V5Y29kZV92YWx1ZVxuICAgICAgICBpZiAoISgna2V5Q29kZScgaW4ga2V5Ym9hcmRFdmVudCkpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgdHlwZSBhc3NlcnRpb24gaGVyZSBpcyByZXF1aXJlZCBiZWNhdXNlIGlmICdrZXlDb2RlJyBkb2VzbnQgZXhpc3QgaW4ga2V5Ym9hcmRFdmVudCB0aGVuXG4gICAgICAgICAgICAvLyBpdCBjYW5ub3QgYmUgYSBLZXlib2FyZEV2ZW50IGFuZCBzbyBpdCBnZXRzIG5hcnJvd2VkIHRvICduZXZlcidcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0ga2V5Ym9hcmRFdmVudDtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgS2V5Ym9hcmRFdmVudC5jb2RlIHN0cmluZyBpbnRvIGludGVnZXItYmFzZWQga2V5IGNvZGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuXG4gICAgICAgICAgICBpZiAoZXZlbnQuY29kZSBpbiBDb2RlVG9LZXlDb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENvZGVUb0tleUNvZGVbZXZlbnQuY29kZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgS2V5Ym9hcmQgY29kZSBvZiAke2V2ZW50LmNvZGV9IGlzIG5vdCBzdXBwb3J0ZWQgaW4gb3VyIG1hcHBpbmcsIGlnbm9yaW5nIHRoaXMga2V5LmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIG1hZGUgaXQgaGVyZSBLZXlib2FyZEV2ZW50LmtleUNvZGUgaXMgc3RpbGwgc3VwcG9ydGVkIHNvIHdlIGNhbiBzYWZlbHkgdXNlIGl0LlxuICAgICAgICBpZiAoa2V5Ym9hcmRFdmVudC5rZXlDb2RlID09PSBTcGVjaWFsS2V5Q29kZXMuc2hpZnQgJiYga2V5Ym9hcmRFdmVudC5jb2RlID09PSAnU2hpZnRSaWdodCcpIHtcbiAgICAgICAgICAgIHJldHVybiBTcGVjaWFsS2V5Q29kZXMucmlnaHRTaGlmdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXlib2FyZEV2ZW50LmtleUNvZGUgPT09IFNwZWNpYWxLZXlDb2Rlcy5jb250cm9sICYmXG4gICAgICAgICAgICBrZXlib2FyZEV2ZW50LmNvZGUgPT09ICdDb250cm9sUmlnaHQnKSB7XG4gICAgICAgICAgICByZXR1cm4gU3BlY2lhbEtleUNvZGVzLnJpZ2h0Q29udHJvbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChrZXlib2FyZEV2ZW50LmtleUNvZGUgPT09IFNwZWNpYWxLZXlDb2Rlcy5hbHQgJiYga2V5Ym9hcmRFdmVudC5jb2RlID09PSAnQWx0UmlnaHQnKSB7XG4gICAgICAgICAgICByZXR1cm4gU3BlY2lhbEtleUNvZGVzLnJpZ2h0QWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGtleWJvYXJkRXZlbnQua2V5Q29kZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBCcm93c2VyIGtleXMgZG8gbm90IGhhdmUgYSBjaGFyQ29kZSBzbyB3ZSBvbmx5IG5lZWQgdG8gdGVzdCBrZXlDb2RlLlxuICAgICAqIEBwYXJhbSBrZXlDb2RlIC0gdGhlIGJyb3dzZXIga2V5Y29kZSBudW1iZXJcbiAgICAgKi9cbiAgICBpc0tleUNvZGVCcm93c2VyS2V5KGtleUNvZGUpIHtcbiAgICAgICAgLy8gRnVuY3Rpb24ga2V5cyBvciB0YWIga2V5IGFyZSBjb25zaWRlcmVkIFwiYnJvd3NlciBrZXlzXCIgdGhhdCB3ZSBtYXkgd2lzaCB0byBzdXBwcmVzcyBieSBwcmV2ZW50aW5nIHRoZW0gYmVpbmcgcHJvY2VzcyBieSBicm93c2VyLlxuICAgICAgICByZXR1cm4gKGtleUNvZGUgPj0gMTEyICYmIGtleUNvZGUgPD0gMTIzKSB8fCBrZXlDb2RlID09PSA5O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtleWJvYXJkQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBNb3VzZSBCdXR0b24gRGF0YVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Nb3VzZUV2ZW50L2J1dHRvbn1cbiAqL1xuZXhwb3J0IGNsYXNzIE1vdXNlQnV0dG9uIHtcbn1cbk1vdXNlQnV0dG9uLm1haW5CdXR0b24gPSAwOyAvLyBMZWZ0IGJ1dHRvbi5cbk1vdXNlQnV0dG9uLmF1eGlsaWFyeUJ1dHRvbiA9IDE7IC8vIFdoZWVsIGJ1dHRvbi5cbk1vdXNlQnV0dG9uLnNlY29uZGFyeUJ1dHRvbiA9IDI7IC8vIFJpZ2h0IGJ1dHRvbi5cbk1vdXNlQnV0dG9uLmZvdXJ0aEJ1dHRvbiA9IDM7IC8vIEJyb3dzZXIgQmFjayBidXR0b24uXG5Nb3VzZUJ1dHRvbi5maWZ0aEJ1dHRvbiA9IDQ7IC8vIEJyb3dzZXIgRm9yd2FyZCBidXR0b24uXG4vKipcbiAqIE1vdXNlIEJ1dHRvbiBNYXNrIERhdGFcbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTW91c2VFdmVudC9idXR0b25zfVxuICovXG5leHBvcnQgY2xhc3MgTW91c2VCdXR0b25zTWFzayB7XG59XG5Nb3VzZUJ1dHRvbnNNYXNrLnByaW1hcnlCdXR0b24gPSAxOyAvLyBMZWZ0IGJ1dHRvbi5cbk1vdXNlQnV0dG9uc01hc2suc2Vjb25kYXJ5QnV0dG9uID0gMjsgLy8gUmlnaHQgYnV0dG9uLlxuTW91c2VCdXR0b25zTWFzay5hdXhpbGlhcnlCdXR0b24gPSA0OyAvLyBXaGVlbCBidXR0b24uXG5Nb3VzZUJ1dHRvbnNNYXNrLmZvdXJ0aEJ1dHRvbiA9IDg7IC8vIEJyb3dzZXIgQmFjayBidXR0b24uXG5Nb3VzZUJ1dHRvbnNNYXNrLmZpZnRoQnV0dG9uID0gMTY7IC8vIEJyb3dzZXIgRm9yd2FyZCBidXR0b24uXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3VzZUJ1dHRvbnMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IE1vdXNlQnV0dG9uc01hc2ssIE1vdXNlQnV0dG9uIH0gZnJvbSAnLi9Nb3VzZUJ1dHRvbnMnO1xuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgbW91c2UgY29udHJvbGxlcnMuIFNpbmNlIHRoZXJlIGlzIGEgYnVuY2ggb2Ygc2hhcmVkIGJlaGF2aW91ciBiZXR3ZWVuIGxvY2tlZCBhbmRcbiAqIGhvdmVyIG1vdXNlIGNvbnRyb2xsZXJzIHRoaXMgaXMgd2hlcmUgdGhhdCBzaGFyZWQgYmVoYXZpb3VyIGxpdmVzLlxuICovXG5leHBvcnQgY2xhc3MgTW91c2VDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgdmlkZW9QbGF5ZXIsIGNvb3JkaW5hdGVDb252ZXJ0ZXIsIGFjdGl2ZUtleXMpIHtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlciA9IHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIgPSBjb29yZGluYXRlQ29udmVydGVyO1xuICAgICAgICB0aGlzLnZpZGVvUGxheWVyID0gdmlkZW9QbGF5ZXI7XG4gICAgICAgIHRoaXMuYWN0aXZlS2V5cyA9IGFjdGl2ZUtleXM7XG4gICAgICAgIHRoaXMub25FbnRlckxpc3RlbmVyID0gdGhpcy5vbk1vdXNlRW50ZXIuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbkxlYXZlTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VMZWF2ZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgdGhpcy5yZWdpc3Rlck1vdXNlRW50ZXJBbmRMZWF2ZUV2ZW50cygpO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyKCkge1xuICAgICAgICB0aGlzLnVucmVnaXN0ZXJNb3VzZUVudGVyQW5kTGVhdmVFdmVudHMoKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJNb3VzZUVudGVyQW5kTGVhdmVFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMudmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIHZpZGVvRWxlbWVudFBhcmVudCA9PT0gbnVsbCB8fCB2aWRlb0VsZW1lbnRQYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy5vbkVudGVyTGlzdGVuZXIpO1xuICAgICAgICB2aWRlb0VsZW1lbnRQYXJlbnQgPT09IG51bGwgfHwgdmlkZW9FbGVtZW50UGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMub25MZWF2ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgdW5yZWdpc3Rlck1vdXNlRW50ZXJBbmRMZWF2ZUV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50ID09PSBudWxsIHx8IHZpZGVvRWxlbWVudFBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLm9uRW50ZXJMaXN0ZW5lcik7XG4gICAgICAgIHZpZGVvRWxlbWVudFBhcmVudCA9PT0gbnVsbCB8fCB2aWRlb0VsZW1lbnRQYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5vbkxlYXZlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbk1vdXNlRW50ZXIoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlRW50ZXInKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKCk7XG4gICAgICAgIHRoaXMucHJlc3NNb3VzZUJ1dHRvbnMoZXZlbnQuYnV0dG9ucywgZXZlbnQueCwgZXZlbnQueSk7XG4gICAgfVxuICAgIG9uTW91c2VMZWF2ZShldmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VMZWF2ZScpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoKTtcbiAgICAgICAgdGhpcy5yZWxlYXNlTW91c2VCdXR0b25zKGV2ZW50LmJ1dHRvbnMsIGV2ZW50LngsIGV2ZW50LnkpO1xuICAgIH1cbiAgICByZWxlYXNlTW91c2VCdXR0b25zKGJ1dHRvbnMsIFgsIFkpIHtcbiAgICAgICAgY29uc3QgY29vcmQgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIudHJhbnNsYXRlVW5zaWduZWQoWCwgWSk7XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5wcmltYXJ5QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZVVwKE1vdXNlQnV0dG9uLm1haW5CdXR0b24sIGNvb3JkLngsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5zZWNvbmRhcnlCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlVXAoTW91c2VCdXR0b24uc2Vjb25kYXJ5QnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suYXV4aWxpYXJ5QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZVVwKE1vdXNlQnV0dG9uLmF1eGlsaWFyeUJ1dHRvbiwgY29vcmQueCwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvbnMgJiBNb3VzZUJ1dHRvbnNNYXNrLmZvdXJ0aEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5zZW5kTW91c2VVcChNb3VzZUJ1dHRvbi5mb3VydGhCdXR0b24sIGNvb3JkLngsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5maWZ0aEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5zZW5kTW91c2VVcChNb3VzZUJ1dHRvbi5maWZ0aEJ1dHRvbiwgY29vcmQueCwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJlc3NNb3VzZUJ1dHRvbnMoYnV0dG9ucywgWCwgWSkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChYLCBZKTtcbiAgICAgICAgaWYgKGJ1dHRvbnMgJiBNb3VzZUJ1dHRvbnNNYXNrLnByaW1hcnlCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlRG93bihNb3VzZUJ1dHRvbi5tYWluQnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suc2Vjb25kYXJ5QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZURvd24oTW91c2VCdXR0b24uc2Vjb25kYXJ5QnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suYXV4aWxpYXJ5QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZURvd24oTW91c2VCdXR0b24uYXV4aWxpYXJ5QnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suZm91cnRoQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZURvd24oTW91c2VCdXR0b24uZm91cnRoQnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suZmlmdGhCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlRG93bihNb3VzZUJ1dHRvbi5maWZ0aEJ1dHRvbiwgY29vcmQueCwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VuZE1vdXNlRG93bihidXR0b24sIFgsIFkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlRG93bicpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoW2J1dHRvbiwgWCwgWV0pO1xuICAgIH1cbiAgICBzZW5kTW91c2VVcChidXR0b24sIFgsIFkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChYLCBZKTtcbiAgICAgICAgKF9hID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZVVwJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYShbYnV0dG9uLCBjb29yZC54LCBjb29yZC55XSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW91c2VDb250cm9sbGVyLmpzLm1hcCIsImltcG9ydCB7IE1vdXNlQ29udHJvbGxlciB9IGZyb20gJy4vTW91c2VDb250cm9sbGVyJztcbi8qKlxuICogQSBtb3VzZSBjb250cm9sbGVyIHRoYXQgYWxsb3dzIHRoZSBtb3VzZSB0byBmcmVlbHkgZmxvYXQgb3ZlciB0aGUgdmlkZW8gZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb3VzZUNvbnRyb2xsZXJIb3ZlcmluZyBleHRlbmRzIE1vdXNlQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIsIHZpZGVvUGxheWVyLCBjb29yZGluYXRlQ29udmVydGVyLCBhY3RpdmVLZXlzKSB7XG4gICAgICAgIHN1cGVyKHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCB2aWRlb1BsYXllciwgY29vcmRpbmF0ZUNvbnZlcnRlciwgYWN0aXZlS2V5cyk7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50ID0gdmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VVcC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VEb3duLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZURibENsaWNrTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VEYmxDbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyID0gdGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyID0gdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uQ29udGV4dE1lbnVMaXN0ZW5lciA9IHRoaXMub25Db250ZXh0TWVudS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgc3VwZXIucmVnaXN0ZXIoKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vbk1vdXNlRG93bkxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMub25Db250ZXh0TWVudUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uTW91c2VEYmxDbGlja0xpc3RlbmVyKTtcbiAgICB9XG4gICAgdW5yZWdpc3RlcigpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vbk1vdXNlRG93bkxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMub25Db250ZXh0TWVudUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uTW91c2VEYmxDbGlja0xpc3RlbmVyKTtcbiAgICAgICAgc3VwZXIudW5yZWdpc3RlcigpO1xuICAgIH1cbiAgICBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZURvd24nKShbZXZlbnQuYnV0dG9uLCBjb29yZC54LCBjb29yZC55XSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uTW91c2VVcChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZVVwJykoW2V2ZW50LmJ1dHRvbiwgY29vcmQueCwgY29vcmQueV0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBvbkNvbnRleHRNZW51KGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICAgICAgICBjb25zdCBkZWx0YSA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVTaWduZWQoZXZlbnQubW92ZW1lbnRYLCBldmVudC5tb3ZlbWVudFkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlTW92ZScpKFtcbiAgICAgICAgICAgIGNvb3JkLngsXG4gICAgICAgICAgICBjb29yZC55LFxuICAgICAgICAgICAgZGVsdGEueCxcbiAgICAgICAgICAgIGRlbHRhLnlcbiAgICAgICAgXSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uTW91c2VXaGVlbChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZVdoZWVsJykoW1xuICAgICAgICAgICAgZXZlbnQud2hlZWxEZWx0YSxcbiAgICAgICAgICAgIGNvb3JkLngsXG4gICAgICAgICAgICBjb29yZC55XG4gICAgICAgIF0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBvbk1vdXNlRGJsQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29vcmQgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIudHJhbnNsYXRlVW5zaWduZWQoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VEb3VibGUnKShbZXZlbnQuYnV0dG9uLCBjb29yZC54LCBjb29yZC55XSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TW91c2VDb250cm9sbGVySG92ZXJpbmcuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IE1vdXNlQ29udHJvbGxlciB9IGZyb20gJy4vTW91c2VDb250cm9sbGVyJztcbi8qKlxuICogQSBtb3VzZSBjb250cm9sbGVyIHRoYXQgbG9ja3MgdGhlIG1vdXNlIHRvIHRoZSB2aWRlbyBkb2N1bWVudCBhbmQgcHJldmVudHMgaXQgZnJvbSBsZWF2aW5nIHRoZSB3aW5kb3dcbiAqL1xuZXhwb3J0IGNsYXNzIE1vdXNlQ29udHJvbGxlckxvY2tlZCBleHRlbmRzIE1vdXNlQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIsIHZpZGVvUGxheWVyLCBjb29yZGluYXRlQ29udmVydGVyLCBhY3RpdmVLZXlzKSB7XG4gICAgICAgIHN1cGVyKHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCB2aWRlb1BsYXllciwgY29vcmRpbmF0ZUNvbnZlcnRlciwgYWN0aXZlS2V5cyk7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50ID0gdmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMueCA9IHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy55ID0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC8gMjtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIudHJhbnNsYXRlVW5zaWduZWQodGhpcy54LCB0aGlzLnkpO1xuICAgICAgICB0aGlzLm9uUmVxdWVzdExvY2tMaXN0ZW5lciA9IHRoaXMub25SZXF1ZXN0TG9jay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZVVwTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VVcC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VEb3duLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZURibENsaWNrTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VEYmxDbGljay5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyID0gdGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyID0gdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgc3VwZXIucmVnaXN0ZXIoKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVxdWVzdFBvaW50ZXJMb2NrID1cbiAgICAgICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlcXVlc3RQb2ludGVyTG9jayB8fCB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5tb3pSZXF1ZXN0UG9pbnRlckxvY2s7XG4gICAgICAgIGRvY3VtZW50LmV4aXRQb2ludGVyTG9jayA9IGRvY3VtZW50LmV4aXRQb2ludGVyTG9jayB8fCBkb2N1bWVudC5tb3pFeGl0UG9pbnRlckxvY2s7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZXF1ZXN0UG9pbnRlckxvY2spIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vblJlcXVlc3RMb2NrTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5vbkxvY2tTdGF0ZUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96cG9pbnRlcmxvY2tjaGFuZ2UnLCB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXBMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5vbk1vdXNlV2hlZWxMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5vbk1vdXNlRGJsQ2xpY2tMaXN0ZW5lcik7XG4gICAgfVxuICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJMb2NrRWxlbWVudCA9IGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCB8fCBkb2N1bWVudC5tb3pQb2ludGVyTG9ja0VsZW1lbnQ7XG4gICAgICAgIGlmIChkb2N1bWVudC5leGl0UG9pbnRlckxvY2sgJiYgcG9pbnRlckxvY2tFbGVtZW50ID09PSB0aGlzLnZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuZXhpdFBvaW50ZXJMb2NrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uUmVxdWVzdExvY2tMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJsb2NrY2hhbmdlJywgdGhpcy5vbkxvY2tTdGF0ZUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW96cG9pbnRlcmxvY2tjaGFuZ2UnLCB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXBMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5vbk1vdXNlV2hlZWxMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgdGhpcy5vbk1vdXNlRGJsQ2xpY2tMaXN0ZW5lcik7XG4gICAgICAgIHN1cGVyLnVucmVnaXN0ZXIoKTtcbiAgICB9XG4gICAgb25SZXF1ZXN0TG9jaygpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVxdWVzdFBvaW50ZXJMb2NrKCk7XG4gICAgfVxuICAgIG9uTG9ja1N0YXRlQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBwb2ludGVyTG9ja0VsZW1lbnQgPSBkb2N1bWVudC5wb2ludGVyTG9ja0VsZW1lbnQgfHwgZG9jdW1lbnQubW96UG9pbnRlckxvY2tFbGVtZW50O1xuICAgICAgICBpZiAocG9pbnRlckxvY2tFbGVtZW50ID09PSB0aGlzLnZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1BvaW50ZXIgbG9ja2VkJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1RoZSBwb2ludGVyIGxvY2sgc3RhdHVzIGlzIG5vdyB1bmxvY2tlZCcpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIC8vIElmIG1vdXNlIGxvc2VzIGZvY3VzLCBzZW5kIGEga2V5IHVwIGZvciBhbGwgb2YgdGhlIGN1cnJlbnRseSBoZWxkLWRvd24ga2V5c1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYXMgd2hlbiB0aGUgbW91c2UgbG9zZXMgZm9jdXMsIHRoZSB3aW5kb3dzIHN0b3BzIGxpc3RlbmluZyBmb3IgZXZlbnRzIGFuZCBhcyBzdWNoXG4gICAgICAgICAgICAvLyB0aGUga2V5dXAgbGlzdGVuZXIgd29uJ3QgZ2V0IGZpcmVkXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5hY3RpdmVLZXlzLmdldEFjdGl2ZUtleXMoKTtcbiAgICAgICAgICAgIGFjdGl2ZUtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdLZXlVcCcpKFtrZXldKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VEb3duJykoW1xuICAgICAgICAgICAgZXZlbnQuYnV0dG9uLFxuICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBzdG9yZSB2YWx1ZSBvZiB0aGlzLmNvb3JkIGFzIG9wcG9zZWQgdG8gdGhlIG1vdXNlRXZlbnQueC95IGFzIHRoZSBtb3VzZUV2ZW50IGxvY2F0aW9uXG4gICAgICAgICAgICAvLyB1c2VzIHRoZSBzeXN0ZW0gY3Vyc29yIGxvY2F0aW9uIHdoaWNoIGhhc24ndCBtb3ZlZFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueCxcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZENvb3JkLnlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIG9uTW91c2VVcChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlVXAnKShbXG4gICAgICAgICAgICBldmVudC5idXR0b24sXG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHN0b3JlIHZhbHVlIG9mIHRoaXMuY29vcmQgYXMgb3Bwb3NlZCB0byB0aGUgbW91c2VFdmVudC54L3kgYXMgdGhlIG1vdXNlRXZlbnQgbG9jYXRpb25cbiAgICAgICAgICAgIC8vIHVzZXMgdGhlIHN5c3RlbSBjdXJzb3IgbG9jYXRpb24gd2hpY2ggaGFzbid0IG1vdmVkXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC54LFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3R5bGVXaWR0aCA9IHRoaXMudmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCkuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IHN0eWxlSGVpZ2h0ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKS5jbGllbnRIZWlnaHQ7XG4gICAgICAgIHRoaXMueCArPSBldmVudC5tb3ZlbWVudFg7XG4gICAgICAgIHRoaXMueSArPSBldmVudC5tb3ZlbWVudFk7XG4gICAgICAgIHdoaWxlICh0aGlzLnggPiBzdHlsZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLnggLT0gc3R5bGVXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy55ID4gc3R5bGVIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMueSAtPSBzdHlsZUhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy54IDwgMCkge1xuICAgICAgICAgICAgdGhpcy54ICs9IHN0eWxlV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHRoaXMueSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMueSArPSBzdHlsZUhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh0aGlzLngsIHRoaXMueSk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVNpZ25lZChldmVudC5tb3ZlbWVudFgsIGV2ZW50Lm1vdmVtZW50WSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VNb3ZlJykoW1xuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueCxcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZENvb3JkLnksXG4gICAgICAgICAgICBkZWx0YS54LFxuICAgICAgICAgICAgZGVsdGEueVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgb25Nb3VzZVdoZWVsKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VXaGVlbCcpKFtcbiAgICAgICAgICAgIGV2ZW50LndoZWVsRGVsdGEsXG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHN0b3JlIHZhbHVlIG9mIHRoaXMuY29vcmQgYXMgb3Bwb3NlZCB0byB0aGUgbW91c2VFdmVudC54L3kgYXMgdGhlIG1vdXNlRXZlbnQgbG9jYXRpb25cbiAgICAgICAgICAgIC8vIHVzZXMgdGhlIHN5c3RlbSBjdXJzb3IgbG9jYXRpb24gd2hpY2ggaGFzbid0IG1vdmVkXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC54LFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgb25Nb3VzZURibENsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VEb3VibGUnKShbXG4gICAgICAgICAgICBldmVudC5idXR0b24sXG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHN0b3JlIHZhbHVlIG9mIHRoaXMuY29vcmQgYXMgb3Bwb3NlZCB0byB0aGUgbW91c2VFdmVudC54L3kgYXMgdGhlIG1vdXNlRXZlbnQgbG9jYXRpb25cbiAgICAgICAgICAgIC8vIHVzZXMgdGhlIHN5c3RlbSBjdXJzb3IgbG9jYXRpb24gd2hpY2ggaGFzbid0IG1vdmVkXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC54LFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueVxuICAgICAgICBdKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3VzZUNvbnRyb2xsZXJMb2NrZWQuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBTcGVjaWFsIEtleSBjb2Rlc1xuICogIE11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggSmF2YVNjcmlwdEtleUNvZGVUb0ZLZXkgQysrIGFycmF5LlxuICogVGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgdGhlIHNwZWNpYWwga2V5IGNvZGUgZ2l2ZW4gYmVsb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGVjaWFsS2V5Q29kZXMge1xufVxuU3BlY2lhbEtleUNvZGVzLmJhY2tTcGFjZSA9IDg7XG5TcGVjaWFsS2V5Q29kZXMuc2hpZnQgPSAxNjtcblNwZWNpYWxLZXlDb2Rlcy5jb250cm9sID0gMTc7XG5TcGVjaWFsS2V5Q29kZXMuYWx0ID0gMTg7XG5TcGVjaWFsS2V5Q29kZXMucmlnaHRTaGlmdCA9IDI1MztcblNwZWNpYWxLZXlDb2Rlcy5yaWdodENvbnRyb2wgPSAyNTQ7XG5TcGVjaWFsS2V5Q29kZXMucmlnaHRBbHQgPSAyNTU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TcGVjaWFsS2V5Q29kZXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogVGhlIGJhc2ljIHRvdWNoIGNvbnRyb2xsZXIgdGhhdCBoYW5kbGVzIHRoZSB0b3VjaCBldmVudHMgb24gdGhlIGRvY3VtZW50LlxuICovXG5leHBvcnQgY2xhc3MgVG91Y2hDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgdmlkZW9QbGF5ZXIsIGNvb3JkaW5hdGVDb252ZXJ0ZXIpIHtcbiAgICAgICAgdGhpcy5maW5nZXJzID0gWzksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDBdO1xuICAgICAgICB0aGlzLmZpbmdlcklkcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5tYXhCeXRlVmFsdWUgPSAyNTU7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIgPSBzdHJlYW1NZXNzYWdlQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy52aWRlb1BsYXllciA9IHZpZGVvUGxheWVyO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIgPSBjb29yZGluYXRlQ29udmVydGVyO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudCA9IHZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpO1xuICAgICAgICB0aGlzLm9uVG91Y2hTdGFydExpc3RlbmVyID0gdGhpcy5vblRvdWNoU3RhcnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblRvdWNoRW5kTGlzdGVuZXIgPSB0aGlzLm9uVG91Y2hFbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyID0gdGhpcy5vblRvdWNoTW92ZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0TGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Ub3VjaEVuZExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgdW5yZWdpc3RlcigpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0TGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Ub3VjaEVuZExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgcmVtZW1iZXJUb3VjaCh0b3VjaCkge1xuICAgICAgICBjb25zdCBmaW5nZXIgPSB0aGlzLmZpbmdlcnMucG9wKCk7XG4gICAgICAgIGlmIChmaW5nZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ2V4aGF1c3RlZCB0b3VjaCBpZGVudGlmaWVycycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmluZ2VySWRzLnNldCh0b3VjaC5pZGVudGlmaWVyLCBmaW5nZXIpO1xuICAgIH1cbiAgICBmb3JnZXRUb3VjaCh0b3VjaCkge1xuICAgICAgICB0aGlzLmZpbmdlcnMucHVzaCh0aGlzLmZpbmdlcklkcy5nZXQodG91Y2guaWRlbnRpZmllcikpO1xuICAgICAgICAvLyBTb3J0IGFycmF5IGJhY2sgaW50byBkZXNjZW5kaW5nIG9yZGVyLiBUaGlzIG1lYW5zIGlmIGZpbmdlciAnMScgd2VyZSB0byBsaWZ0IGFmdGVyIGZpbmdlciAnMCcsIHdlIHdvdWxkIGVuc3VyZSB0aGF0IDAgd2lsbCBiZSB0aGUgZmlyc3QgaW5kZXggdG8gcG9wXG4gICAgICAgIHRoaXMuZmluZ2Vycy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYiAtIGE7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZpbmdlcklkcy5kZWxldGUodG91Y2guaWRlbnRpZmllcik7XG4gICAgfVxuICAgIG9uVG91Y2hTdGFydCh0b3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG91Y2hFdmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgdGhpcy5yZW1lbWJlclRvdWNoKHRvdWNoRXZlbnQuY2hhbmdlZFRvdWNoZXNbdF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdFRvdWNoRGF0YSgnVG91Y2hTdGFydCcsIHRvdWNoRXZlbnQuY2hhbmdlZFRvdWNoZXMpO1xuICAgICAgICB0b3VjaEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uVG91Y2hFbmQodG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXRUb3VjaERhdGEoJ1RvdWNoRW5kJywgdG91Y2hFdmVudC5jaGFuZ2VkVG91Y2hlcyk7XG4gICAgICAgIC8vIFJlLWN5Y2xlIHVuaXF1ZSBpZGVudGlmaWVycyBwcmV2aW91c2x5IGFzc2lnbmVkIHRvIGVhY2ggdG91Y2guXG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG91Y2hFdmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgdGhpcy5mb3JnZXRUb3VjaCh0b3VjaEV2ZW50LmNoYW5nZWRUb3VjaGVzW3RdKTtcbiAgICAgICAgfVxuICAgICAgICB0b3VjaEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uVG91Y2hNb3ZlKHRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0VG91Y2hEYXRhKCdUb3VjaE1vdmUnLCB0b3VjaEV2ZW50LnRvdWNoZXMpO1xuICAgICAgICB0b3VjaEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGVtaXRUb3VjaERhdGEodHlwZSwgdG91Y2hlcykge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCB0b1N0cmVhbWVySGFuZGxlcnMgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b3VjaGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBjb25zdCBudW1Ub3VjaGVzID0gMTsgLy8gdGhlIG51bWJlciBvZiB0b3VjaGVzIHRvIGJlIHNlbnQgdGhpcyBtZXNzYWdlXG4gICAgICAgICAgICBjb25zdCB0b3VjaCA9IHRvdWNoZXNbdF07XG4gICAgICAgICAgICBjb25zdCB4ID0gdG91Y2guY2xpZW50WCAtIG9mZnNldC5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgeSA9IHRvdWNoLmNsaWVudFkgLSBvZmZzZXQudG9wO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYEYke3RoaXMuZmluZ2VySWRzLmdldCh0b3VjaC5pZGVudGlmaWVyKX09KCR7eH0sICR7eX0pYCk7XG4gICAgICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh4LCB5KTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ1RvdWNoU3RhcnQnOlxuICAgICAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdUb3VjaFN0YXJ0JykoW1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtVG91Y2hlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLngsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC55LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5nZXJJZHMuZ2V0KHRvdWNoLmlkZW50aWZpZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhCeXRlVmFsdWUgKiAodG91Y2guZm9yY2UgPiAwID8gdG91Y2guZm9yY2UgOiAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLmluUmFuZ2UgPyAxIDogMFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVG91Y2hFbmQnOlxuICAgICAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdUb3VjaEVuZCcpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bVRvdWNoZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC54LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmQueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZ2VySWRzLmdldCh0b3VjaC5pZGVudGlmaWVyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4Qnl0ZVZhbHVlICogdG91Y2guZm9yY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC5pblJhbmdlID8gMSA6IDBcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1RvdWNoTW92ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1RvdWNoTW92ZScpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bVRvdWNoZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC54LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmQueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZ2VySWRzLmdldCh0b3VjaC5pZGVudGlmaWVyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4Qnl0ZVZhbHVlICogKHRvdWNoLmZvcmNlID4gMCA/IHRvdWNoLmZvcmNlIDogMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC5pblJhbmdlID8gMSA6IDBcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG91Y2hDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBNb3VzZUJ1dHRvbiB9IGZyb20gJy4vTW91c2VCdXR0b25zJztcbi8qKlxuICogQWxsb3dzIGZvciB0aGUgdXNhZ2Ugb2YgZmFrZSB0b3VjaCBldmVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIFRvdWNoQ29udHJvbGxlckZha2Uge1xuICAgIGNvbnN0cnVjdG9yKHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCB2aWRlb1BsYXllciwgY29vcmRpbmF0ZUNvbnZlcnRlcikge1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyID0gc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIgPSB2aWRlb1BsYXllcjtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlQ29udmVydGVyID0gY29vcmRpbmF0ZUNvbnZlcnRlcjtcbiAgICAgICAgdGhpcy5vblRvdWNoU3RhcnRMaXN0ZW5lciA9IHRoaXMub25Ub3VjaFN0YXJ0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Ub3VjaEVuZExpc3RlbmVyID0gdGhpcy5vblRvdWNoRW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Ub3VjaE1vdmVMaXN0ZW5lciA9IHRoaXMub25Ub3VjaE1vdmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG4gICAgcmVnaXN0ZXIoKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uVG91Y2hTdGFydExpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uVG91Y2hFbmRMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Ub3VjaE1vdmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uVG91Y2hTdGFydExpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm9uVG91Y2hFbmRMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Ub3VjaE1vdmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIG9uVG91Y2hTdGFydCh0b3VjaCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkgfHwgdG91Y2gudGFyZ2V0ICE9PSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmFrZVRvdWNoRmluZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0X3RvdWNoID0gdG91Y2guY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICAgICAgICB0aGlzLmZha2VUb3VjaEZpbmdlciA9IHtcbiAgICAgICAgICAgICAgICBpZDogZmlyc3RfdG91Y2guaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICB4OiBmaXJzdF90b3VjaC5jbGllbnRYIC0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0LmxlZnQsXG4gICAgICAgICAgICAgICAgeTogZmlyc3RfdG91Y2guY2xpZW50WSAtIHRoaXMudmlkZW9FbGVtZW50UGFyZW50Q2xpZW50UmVjdC50b3BcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgbW91c2VFdmVudCA9IG5ldyBNb3VzZUV2ZW50KCdtb3VzZWVudGVyJywgZmlyc3RfdG91Y2gpO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50LmRpc3BhdGNoRXZlbnQobW91c2VFdmVudCk7XG4gICAgICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh0aGlzLmZha2VUb3VjaEZpbmdlci54LCB0aGlzLmZha2VUb3VjaEZpbmdlci55KTtcbiAgICAgICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VEb3duJykoW01vdXNlQnV0dG9uLm1haW5CdXR0b24sIGNvb3JkLngsIGNvb3JkLnldKTtcbiAgICAgICAgfVxuICAgICAgICB0b3VjaC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBvblRvdWNoRW5kKHRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpIHx8IHRoaXMuZmFrZVRvdWNoRmluZ2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpO1xuICAgICAgICBjb25zdCB0b1N0cmVhbWVySGFuZGxlcnMgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b3VjaEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBjb25zdCB0b3VjaCA9IHRvdWNoRXZlbnQuY2hhbmdlZFRvdWNoZXNbdF07XG4gICAgICAgICAgICBpZiAodG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5mYWtlVG91Y2hGaW5nZXIuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gdG91Y2guY2xpZW50WCAtIHRoaXMudmlkZW9FbGVtZW50UGFyZW50Q2xpZW50UmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB0b3VjaC5jbGllbnRZIC0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0LnRvcDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh4LCB5KTtcbiAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZVVwJykoW01vdXNlQnV0dG9uLm1haW5CdXR0b24sIGNvb3JkLngsIGNvb3JkLnldKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtb3VzZUV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ21vdXNlbGVhdmUnLCB0b3VjaCk7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50LmRpc3BhdGNoRXZlbnQobW91c2VFdmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWtlVG91Y2hGaW5nZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRvdWNoRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgb25Ub3VjaE1vdmUodG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkgfHwgdGhpcy5mYWtlVG91Y2hGaW5nZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRvdWNoRXZlbnQudG91Y2hlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgY29uc3QgdG91Y2ggPSB0b3VjaEV2ZW50LnRvdWNoZXNbdF07XG4gICAgICAgICAgICBpZiAodG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5mYWtlVG91Y2hGaW5nZXIuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gdG91Y2guY2xpZW50WCAtIHRoaXMudmlkZW9FbGVtZW50UGFyZW50Q2xpZW50UmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB0b3VjaC5jbGllbnRZIC0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0LnRvcDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh4LCB5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVTaWduZWQoeCAtIHRoaXMuZmFrZVRvdWNoRmluZ2VyLngsIHkgLSB0aGlzLmZha2VUb3VjaEZpbmdlci55KTtcbiAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZU1vdmUnKShbY29vcmQueCwgY29vcmQueSwgZGVsdGEueCwgZGVsdGEueV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZmFrZVRvdWNoRmluZ2VyLnggPSB4O1xuICAgICAgICAgICAgICAgIHRoaXMuZmFrZVRvdWNoRmluZ2VyLnkgPSB5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRvdWNoRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub3VjaENvbnRyb2xsZXJGYWtlLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBkZWVwQ29weUdhbWVwYWQgfSBmcm9tICcuL0dhbWVwYWRUeXBlcyc7XG4vKipcbiAqIFRoZSBjbGFzcyB0aGF0IGhhbmRsZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgWFIgZ2FtZXBhZHMgYW5kIGNvbnRyb2xsZXJzLlxuICovXG5leHBvcnQgY2xhc3MgWFJHYW1lcGFkQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyIC0gU3RyZWFtIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlcikge1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyID0gdG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXI7XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSBbXTtcbiAgICB9XG4gICAgdXBkYXRlU3RhdHVzKHNvdXJjZSwgZnJhbWUsIHJlZlNwYWNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UuZ2FtZXBhZCkge1xuICAgICAgICAgICAgY29uc3QgZ2FtZXBhZFBvc2UgPSBmcmFtZS5nZXRQb3NlKHNvdXJjZS5ncmlwU3BhY2UsIHJlZlNwYWNlKTtcbiAgICAgICAgICAgIGlmICghZ2FtZXBhZFBvc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3lzdGVtID0gMDtcbiAgICAgICAgICAgIGlmIChzb3VyY2UucHJvZmlsZXMuaW5jbHVkZXMoJ2h0Yy12aXZlJykpIHtcbiAgICAgICAgICAgICAgICBzeXN0ZW0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlLnByb2ZpbGVzLmluY2x1ZGVzKCdvY3VsdXMtdG91Y2gnKSkge1xuICAgICAgICAgICAgICAgIHN5c3RlbSA9IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUT0RPICh3aWxsaWFtLmJlbGNoZXIpOiBBZGQgb3RoZXIgcHJvZmlsZXMgKFF1ZXN0LCBNaWNyb3NvZnQgTWl4ZWQgUmVhbGl0eSwgZXRjKVxuICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUlN5c3RlbScpKFtzeXN0ZW1dKTtcbiAgICAgICAgICAgIC8vIERlZmF1bHQ6IEFueUhhbmQgKDIpXG4gICAgICAgICAgICBsZXQgaGFuZGVkbmVzcyA9IDI7XG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZS5oYW5kZWRuZXNzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MgPSAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNlbmQgY29udHJvbGxlciB0cmFuc2Zvcm1cbiAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IGdhbWVwYWRQb3NlLnRyYW5zZm9ybS5tYXRyaXg7XG4gICAgICAgICAgICBjb25zdCBtYXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgICAgIG1hdFtpXSA9IG5ldyBGbG9hdDMyQXJyYXkoW21hdHJpeFtpXV0pWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSQ29udHJvbGxlclRyYW5zZm9ybScpKFtcbiAgICAgICAgICAgICAgICBtYXRbMF0sIG1hdFs0XSwgbWF0WzhdLCBtYXRbMTJdLFxuICAgICAgICAgICAgICAgIG1hdFsxXSwgbWF0WzVdLCBtYXRbOV0sIG1hdFsxM10sXG4gICAgICAgICAgICAgICAgbWF0WzJdLCBtYXRbNl0sIG1hdFsxMF0sIG1hdFsxNF0sXG4gICAgICAgICAgICAgICAgbWF0WzNdLCBtYXRbN10sIG1hdFsxMV0sIG1hdFsxNV0sXG4gICAgICAgICAgICAgICAgaGFuZGVkbmVzc1xuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBIYW5kbGUgY29udHJvbGxlciBidXR0b25zIGFuZCBheGVzXG4gICAgICAgICAgICBpZiAodGhpcy5jb250cm9sbGVyc1toYW5kZWRuZXNzXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc1toYW5kZWRuZXNzXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBpZDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW2hhbmRlZG5lc3NdLnByZXZTdGF0ZSA9IGRlZXBDb3B5R2FtZXBhZChzb3VyY2UuZ2FtZXBhZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW2hhbmRlZG5lc3NdLmN1cnJlbnRTdGF0ZSA9IGRlZXBDb3B5R2FtZXBhZChzb3VyY2UuZ2FtZXBhZCk7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5jb250cm9sbGVyc1toYW5kZWRuZXNzXTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJTdGF0ZSA9IGNvbnRyb2xsZXIuY3VycmVudFN0YXRlO1xuICAgICAgICAgICAgY29uc3QgcHJldlN0YXRlID0gY29udHJvbGxlci5wcmV2U3RhdGU7XG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYnV0dG9uc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyU3RhdGUuYnV0dG9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJCdXR0b24gPSBjdXJyU3RhdGUuYnV0dG9uc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2QnV0dG9uID0gcHJldlN0YXRlLmJ1dHRvbnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJCdXR0b24ucHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1JlcGVhdCA9IHByZXZCdXR0b24ucHJlc3NlZCA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSQnV0dG9uUHJlc3NlZCcpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyQnV0dG9uLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmV2QnV0dG9uLnByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUkJ1dHRvblJlbGVhc2VkJykoW1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGVkbmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VyckJ1dHRvbi50b3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvdWNoZWRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNSZXBlYXQgPSBwcmV2QnV0dG9uLnRvdWNoZWQgPyAxIDogMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUkJ1dHRvblRvdWNoZWQnKShbXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kZWRuZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmV2QnV0dG9uLnRvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUkJ1dHRvblRvdWNoUmVsZWFzZWQnKShbXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kZWRuZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGdhbWVwYWQgYXhlc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyU3RhdGUuYXhlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1ckF4aXNWYWx1ZSA9IGN1cnJTdGF0ZS5heGVzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZBeGlzVmFsdWUgPSBwcmV2U3RhdGUuYXhlc1tpXTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHNlbmQgYXhpcyB1cGRhdGUgaWYgdGhlcmUgaXMgYSBjaGFuZ2VcbiAgICAgICAgICAgICAgICBpZiAoY3VyQXhpc1ZhbHVlICE9IHByZXZBeGlzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUkFuYWxvZycpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQXhpc1ZhbHVlXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNbaGFuZGVkbmVzc10ucHJldlN0YXRlID0gY3VyclN0YXRlO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9WFJHYW1lcGFkQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgSW5ib3VuZFZpZGVvU3RhdHMsIEluYm91bmRBdWRpb1N0YXRzIH0gZnJvbSAnLi9JbmJvdW5kUlRQU3RhdHMnO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxTdGF0cyB9IGZyb20gJy4vRGF0YUNoYW5uZWxTdGF0cyc7XG5pbXBvcnQgeyBDYW5kaWRhdGVTdGF0IH0gZnJvbSAnLi9DYW5kaWRhdGVTdGF0JztcbmltcG9ydCB7IFJlbW90ZU91dGJvdW5kUlRQU3RhdHMsIE91dGJvdW5kUlRQU3RhdHMgfSBmcm9tICcuL091dEJvdW5kUlRQU3RhdHMnO1xuaW1wb3J0IHsgU2Vzc2lvblN0YXRzIH0gZnJvbSAnLi9TZXNzaW9uU3RhdHMnO1xuaW1wb3J0IHsgU3RyZWFtU3RhdHMgfSBmcm9tICcuL1N0cmVhbVN0YXRzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogVGhlIEFnZ3JlZ2F0ZWQgU3RhdHMgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgUlRDIFN0YXRzIFJlcG9ydFxuICovXG5leHBvcnQgY2xhc3MgQWdncmVnYXRlZFN0YXRzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbmJvdW5kVmlkZW9TdGF0cyA9IG5ldyBJbmJvdW5kVmlkZW9TdGF0cygpO1xuICAgICAgICB0aGlzLmluYm91bmRBdWRpb1N0YXRzID0gbmV3IEluYm91bmRBdWRpb1N0YXRzKCk7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cyA9IG5ldyBEYXRhQ2hhbm5lbFN0YXRzKCk7XG4gICAgICAgIHRoaXMub3V0Ym91bmRWaWRlb1N0YXRzID0gbmV3IE91dGJvdW5kUlRQU3RhdHMoKTtcbiAgICAgICAgdGhpcy5vdXRib3VuZEF1ZGlvU3RhdHMgPSBuZXcgT3V0Ym91bmRSVFBTdGF0cygpO1xuICAgICAgICB0aGlzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cyA9IG5ldyBSZW1vdGVPdXRib3VuZFJUUFN0YXRzKCk7XG4gICAgICAgIHRoaXMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzID0gbmV3IFJlbW90ZU91dGJvdW5kUlRQU3RhdHMoKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdHMgPSBuZXcgU2Vzc2lvblN0YXRzKCk7XG4gICAgICAgIHRoaXMuc3RyZWFtU3RhdHMgPSBuZXcgU3RyZWFtU3RhdHMoKTtcbiAgICAgICAgdGhpcy5jb2RlY3MgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdhdGhlciBhbGwgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb24gUmVwb3J0XG4gICAgICogQHBhcmFtIHJ0Y1N0YXRzUmVwb3J0IC0gUlRDIFN0YXRzIFJlcG9ydFxuICAgICAqL1xuICAgIHByb2Nlc3NTdGF0cyhydGNTdGF0c1JlcG9ydCkge1xuICAgICAgICB0aGlzLmxvY2FsQ2FuZGlkYXRlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICB0aGlzLnJlbW90ZUNhbmRpZGF0ZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdGhpcy5jYW5kaWRhdGVQYWlycyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBydGNTdGF0c1JlcG9ydC5mb3JFYWNoKChzdGF0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gc3RhdC50eXBlO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2FuZGlkYXRlLXBhaXInOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNhbmRpZGF0ZVBhaXIoc3RhdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NlcnRpZmljYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29kZWMnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvZGVjKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkYXRhLWNoYW5uZWwnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURhdGFDaGFubmVsKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdpbmJvdW5kLXJ0cCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5ib3VuZFJUUChzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbG9jYWwtY2FuZGlkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVMb2NhbENhbmRpZGF0ZShzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWEtc291cmNlJzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWEtcGxheW91dCc6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ291dGJvdW5kLXJ0cCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlTG9jYWxPdXRib3VuZChzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncGVlci1jb25uZWN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncmVtb3RlLWNhbmRpZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVtb3RlQ2FuZGlkYXRlKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdGUtaW5ib3VuZC1ydHAnOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdGUtb3V0Ym91bmQtcnRwJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZW1vdGVPdXRib3VuZChzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndHJhY2snOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyYWNrKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0cmFuc3BvcnQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyYW5zcG9ydChzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyZWFtJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdHJlYW0oc3RhdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcigndW5oYW5kbGVkIFN0YXQgVHlwZScpO1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbyhzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHN0cmVhbSBzdGF0cyBkYXRhIGZyb20gd2VicnRjXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhdCAtIHRoZSBzdGF0cyBjb21pbmcgaW4gZnJvbSB3ZWJydGNcbiAgICAgKi9cbiAgICBoYW5kbGVTdHJlYW0oc3RhdCkge1xuICAgICAgICB0aGlzLnN0cmVhbVN0YXRzID0gc3RhdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgSWNlIENhbmRpZGF0ZSBQYWlyIERhdGFcbiAgICAgKiBAcGFyYW0gc3RhdCAtIHRoZSBzdGF0cyBjb21pbmcgaW4gZnJvbSBpY2UgY2FuZGlkYXRlc1xuICAgICAqL1xuICAgIGhhbmRsZUNhbmRpZGF0ZVBhaXIoc3RhdCkge1xuICAgICAgICAvLyBBZGQgdGhlIGNhbmRpZGF0ZSBwYWlyIHRvIHRoZSBjYW5kaWRhdGUgcGFpciBhcnJheVxuICAgICAgICB0aGlzLmNhbmRpZGF0ZVBhaXJzLnB1c2goc3RhdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIERhdGEgQ2hhbm5lbCBEYXRhXG4gICAgICogQHBhcmFtIHN0YXQgLSB0aGUgc3RhdHMgY29taW5nIGluIGZyb20gdGhlIGRhdGEgY2hhbm5lbFxuICAgICAqL1xuICAgIGhhbmRsZURhdGFDaGFubmVsKHN0YXQpIHtcbiAgICAgICAgdGhpcy5kYXRhY2hhbm5lbFN0YXRzLmJ5dGVzUmVjZWl2ZWQgPSBzdGF0LmJ5dGVzUmVjZWl2ZWQ7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cy5ieXRlc1NlbnQgPSBzdGF0LmJ5dGVzU2VudDtcbiAgICAgICAgdGhpcy5kYXRhY2hhbm5lbFN0YXRzLmRhdGFDaGFubmVsSWRlbnRpZmllciA9IHN0YXQuZGF0YUNoYW5uZWxJZGVudGlmaWVyO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMuaWQgPSBzdGF0LmlkO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMubGFiZWwgPSBzdGF0LmxhYmVsO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMubWVzc2FnZXNSZWNlaXZlZCA9IHN0YXQubWVzc2FnZXNSZWNlaXZlZDtcbiAgICAgICAgdGhpcy5kYXRhY2hhbm5lbFN0YXRzLm1lc3NhZ2VzU2VudCA9IHN0YXQubWVzc2FnZXNTZW50O1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMucHJvdG9jb2wgPSBzdGF0LnByb3RvY29sO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMuc3RhdGUgPSBzdGF0LnN0YXRlO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMudGltZXN0YW1wID0gc3RhdC50aW1lc3RhbXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIExvY2FsIEljZSBDYW5kaWRhdGUgRGF0YVxuICAgICAqIEBwYXJhbSBzdGF0IC0gbG9jYWwgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVMb2NhbENhbmRpZGF0ZShzdGF0KSB7XG4gICAgICAgIGNvbnN0IGxvY2FsQ2FuZGlkYXRlID0gbmV3IENhbmRpZGF0ZVN0YXQoKTtcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUubGFiZWwgPSAnbG9jYWwtY2FuZGlkYXRlJztcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUuYWRkcmVzcyA9IHN0YXQuYWRkcmVzcztcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUucG9ydCA9IHN0YXQucG9ydDtcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUucHJvdG9jb2wgPSBzdGF0LnByb3RvY29sO1xuICAgICAgICBsb2NhbENhbmRpZGF0ZS5jYW5kaWRhdGVUeXBlID0gc3RhdC5jYW5kaWRhdGVUeXBlO1xuICAgICAgICBsb2NhbENhbmRpZGF0ZS5pZCA9IHN0YXQuaWQ7XG4gICAgICAgIGxvY2FsQ2FuZGlkYXRlLnJlbGF5UHJvdG9jb2wgPSBzdGF0LnJlbGF5UHJvdG9jb2w7XG4gICAgICAgIGxvY2FsQ2FuZGlkYXRlLnRyYW5zcG9ydElkID0gc3RhdC50cmFuc3BvcnRJZDtcbiAgICAgICAgdGhpcy5sb2NhbENhbmRpZGF0ZXMucHVzaChsb2NhbENhbmRpZGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIFJlbW90ZSBJY2UgQ2FuZGlkYXRlIERhdGFcbiAgICAgKiBAcGFyYW0gc3RhdCAtIGljZSBjYW5kaWRhdGUgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVSZW1vdGVDYW5kaWRhdGUoc3RhdCkge1xuICAgICAgICBjb25zdCByZW1vdGVDYW5kaWRhdGUgPSBuZXcgQ2FuZGlkYXRlU3RhdCgpO1xuICAgICAgICByZW1vdGVDYW5kaWRhdGUubGFiZWwgPSAncmVtb3RlLWNhbmRpZGF0ZSc7XG4gICAgICAgIHJlbW90ZUNhbmRpZGF0ZS5hZGRyZXNzID0gc3RhdC5hZGRyZXNzO1xuICAgICAgICByZW1vdGVDYW5kaWRhdGUucG9ydCA9IHN0YXQucG9ydDtcbiAgICAgICAgcmVtb3RlQ2FuZGlkYXRlLnByb3RvY29sID0gc3RhdC5wcm90b2NvbDtcbiAgICAgICAgcmVtb3RlQ2FuZGlkYXRlLmlkID0gc3RhdC5pZDtcbiAgICAgICAgcmVtb3RlQ2FuZGlkYXRlLmNhbmRpZGF0ZVR5cGUgPSBzdGF0LmNhbmRpZGF0ZVR5cGU7XG4gICAgICAgIHJlbW90ZUNhbmRpZGF0ZS5yZWxheVByb3RvY29sID0gc3RhdC5yZWxheVByb3RvY29sO1xuICAgICAgICByZW1vdGVDYW5kaWRhdGUudHJhbnNwb3J0SWQgPSBzdGF0LnRyYW5zcG9ydElkO1xuICAgICAgICB0aGlzLnJlbW90ZUNhbmRpZGF0ZXMucHVzaChyZW1vdGVDYW5kaWRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBJbmJvdW5kIFJUUCBBdWRpbyBhbmQgVmlkZW8gRGF0YVxuICAgICAqIEBwYXJhbSBzdGF0IC0gaW5ib3VuZCBydHAgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVJbmJvdW5kUlRQKHN0YXQpIHtcbiAgICAgICAgc3dpdGNoIChzdGF0LmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYml0cmF0ZSBiZXR3ZWVuIHN0YXQgdXBkYXRlc1xuICAgICAgICAgICAgICAgIGlmIChzdGF0LmJ5dGVzUmVjZWl2ZWQgPiB0aGlzLmluYm91bmRWaWRlb1N0YXRzLmJ5dGVzUmVjZWl2ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RhdC50aW1lc3RhbXAgPiB0aGlzLmluYm91bmRWaWRlb1N0YXRzLnRpbWVzdGFtcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKDggKiAoc3RhdC5ieXRlc1JlY2VpdmVkIC0gdGhpcy5pbmJvdW5kVmlkZW9TdGF0cy5ieXRlc1JlY2VpdmVkKSkgL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0LnRpbWVzdGFtcCAtIHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMudGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmJvdW5kVmlkZW9TdGF0cy5iaXRyYXRlID0gTWF0aC5mbG9vcih0aGlzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb3B5IG1lbWJlcnMgZnJvbSBzdGF0IGludG8gYHRoaXMuaW5ib3VuZFZpZGVvU3RhdHNgXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRWaWRlb1N0YXRzW2tleV0gPSBzdGF0W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXVkaW8nOlxuICAgICAgICAgICAgICAgIGlmIChzdGF0LmJ5dGVzUmVjZWl2ZWQgPiB0aGlzLmluYm91bmRBdWRpb1N0YXRzLmJ5dGVzUmVjZWl2ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RhdC50aW1lc3RhbXAgPiB0aGlzLmluYm91bmRBdWRpb1N0YXRzLnRpbWVzdGFtcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRBdWRpb1N0YXRzLmJpdHJhdGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKDggKiAoc3RhdC5ieXRlc1JlY2VpdmVkIC0gdGhpcy5pbmJvdW5kQXVkaW9TdGF0cy5ieXRlc1JlY2VpdmVkKSkgL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0LnRpbWVzdGFtcCAtIHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHMudGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmJvdW5kQXVkaW9TdGF0cy5iaXRyYXRlID0gTWF0aC5mbG9vcih0aGlzLmluYm91bmRBdWRpb1N0YXRzLmJpdHJhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb3B5IG1lbWJlcnMgZnJvbSBzdGF0IGludG8gYHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHNgXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRBdWRpb1N0YXRzW2tleV0gPSBzdGF0W2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEtpbmQgc2hvdWxkIGJlIGF1ZGlvIG9yIHZpZGVvLCB3ZSBnb3QgJHtzdGF0LmtpbmR9IC0gdGhhdCdzIHVuc3VwcG9ydGVkLmApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIFwibG9jYWxcIiBvdXRib3VuZCBSVFAgQXVkaW8gYW5kIFZpZGVvIHN0YXRzLlxuICAgICAqIEBwYXJhbSBzdGF0IC0gbG9jYWwgb3V0Ym91bmQgcnRwIHN0YXRzXG4gICAgICovXG4gICAgaGFuZGxlTG9jYWxPdXRib3VuZChzdGF0KSB7XG4gICAgICAgIGNvbnN0IGxvY2FsT3V0Ym91bmRTdGF0cyA9IHN0YXQua2luZCA9PT0gJ2F1ZGlvJyA/IHRoaXMub3V0Ym91bmRBdWRpb1N0YXRzIDogdGhpcy5vdXRib3VuZFZpZGVvU3RhdHM7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5hY3RpdmUgPSBzdGF0LmFjdGl2ZTtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmNvZGVjSWQgPSBzdGF0LmNvZGVjSWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5ieXRlc1NlbnQgPSBzdGF0LmJ5dGVzU2VudDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmZyYW1lSGVpZ2h0ID0gc3RhdC5mcmFtZUhlaWdodDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmZyYW1lV2lkdGggPSBzdGF0LmZyYW1lV2lkdGg7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5mcmFtZXNFbmNvZGVkID0gc3RhdC5mcmFtZXNFbmNvZGVkO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMuZnJhbWVzUGVyU2Vjb25kID0gc3RhdC5mcmFtZXNQZXJTZWNvbmQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5oZWFkZXJCeXRlc1NlbnQgPSBzdGF0LmhlYWRlckJ5dGVzU2VudDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmlkID0gc3RhdC5pZDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmtleUZyYW1lc0VuY29kZWQgPSBzdGF0LmtleUZyYW1lc0VuY29kZWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5raW5kID0gc3RhdC5raW5kO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMubWVkaWFTb3VyY2VJZCA9IHN0YXQubWVkaWFTb3VyY2VJZDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLm1pZCA9IHN0YXQubWlkO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMubmFja0NvdW50ID0gc3RhdC5uYWNrQ291bnQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5wYWNrZXRzU2VudCA9IHN0YXQucGFja2V0c1NlbnQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5xcFN1bSA9IHN0YXQucXBTdW07XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyA9IHN0YXQucXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5xdWFsaXR5TGltaXRhdGlvblJlYXNvbiA9IHN0YXQucXVhbGl0eUxpbWl0YXRpb25SZWFzb247XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5yZW1vdGVJZCA9IHN0YXQucmVtb3RlSWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50ID0gc3RhdC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50O1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMucmlkID0gc3RhdC5yaWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5zY2FsYWJpbGl0eU1vZGUgPSBzdGF0LnNjYWxhYmlsaXR5TW9kZTtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnNzcmMgPSBzdGF0LnNzcmM7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy50YXJnZXRCaXRyYXRlID0gc3RhdC50YXJnZXRCaXRyYXRlO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMudGltZXN0YW1wID0gc3RhdC50aW1lc3RhbXA7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy50b3RhbEVuY29kZVRpbWUgPSBzdGF0LnRvdGFsRW5jb2RlVGltZTtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnRvdGFsRW5jb2RlQnl0ZXNUYXJnZXQgPSBzdGF0LnRvdGFsRW5jb2RlQnl0ZXNUYXJnZXQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy50b3RhbFBhY2tldFNlbmREZWxheSA9IHN0YXQudG90YWxQYWNrZXRTZW5kRGVsYXk7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy50cmFuc3BvcnRJZCA9IHN0YXQudHJhbnNwb3J0SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIFwicmVtb3RlXCIgb3V0Ym91bmQgUlRQIEF1ZGlvIGFuZCBWaWRlbyBzdGF0cy5cbiAgICAgKiBAcGFyYW0gc3RhdCAtIHJlbW90ZSBvdXRib3VuZCBydHAgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVSZW1vdGVPdXRib3VuZChzdGF0KSB7XG4gICAgICAgIGNvbnN0IHJlbW90ZU91dGJvdW5kU3RhdHMgPSBzdGF0LmtpbmQgPT09ICdhdWRpbycgPyB0aGlzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cyA6IHRoaXMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzO1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLmJ5dGVzU2VudCA9IHN0YXQuYnl0ZXNTZW50O1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLmNvZGVjSWQgPSBzdGF0LmNvZGVjSWQ7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMuaWQgPSBzdGF0LmlkO1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLmtpbmQgPSBzdGF0LmtpbmQ7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMubG9jYWxJZCA9IHN0YXQubG9jYWxJZDtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy5wYWNrZXRzU2VudCA9IHN0YXQucGFja2V0c1NlbnQ7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMucmVtb3RlVGltZXN0YW1wID0gc3RhdC5yZW1vdGVUaW1lc3RhbXA7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMucmVwb3J0c1NlbnQgPSBzdGF0LnJlcG9ydHNTZW50O1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMgPSBzdGF0LnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMuc3NyYyA9IHN0YXQuc3NyYztcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy50aW1lc3RhbXAgPSBzdGF0LnRpbWVzdGFtcDtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy50b3RhbFJvdW5kVHJpcFRpbWUgPSBzdGF0LnRvdGFsUm91bmRUcmlwVGltZTtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy50cmFuc3BvcnRJZCA9IHN0YXQudHJhbnNwb3J0SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIEluYm91bmQgVmlkZW8gVHJhY2sgRGF0YVxuICAgICAqIEBwYXJhbSBzdGF0IC0gdmlkZW8gdHJhY2sgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVUcmFjayhzdGF0KSB7XG4gICAgICAgIC8vIHdlIG9ubHkgd2FudCB0byBleHRyYWN0IHN0YXRzIGZyb20gdGhlIHZpZGVvIHRyYWNrXG4gICAgICAgIGlmIChzdGF0LnR5cGUgPT09ICd0cmFjaycgJiYgKHN0YXQudHJhY2tJZGVudGlmaWVyID09PSAndmlkZW9fbGFiZWwnIHx8IHN0YXQua2luZCA9PT0gJ3ZpZGVvJykpIHtcbiAgICAgICAgICAgIHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzRHJvcHBlZCA9IHN0YXQuZnJhbWVzRHJvcHBlZDtcbiAgICAgICAgICAgIHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzUmVjZWl2ZWQgPSBzdGF0LmZyYW1lc1JlY2VpdmVkO1xuICAgICAgICAgICAgdGhpcy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZUhlaWdodCA9IHN0YXQuZnJhbWVIZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lV2lkdGggPSBzdGF0LmZyYW1lV2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlVHJhbnNwb3J0KHN0YXQpIHtcbiAgICAgICAgdGhpcy50cmFuc3BvcnRTdGF0cyA9IHN0YXQ7XG4gICAgfVxuICAgIGhhbmRsZUNvZGVjKHN0YXQpIHtcbiAgICAgICAgY29uc3QgY29kZWNJZCA9IHN0YXQuaWQ7XG4gICAgICAgIHRoaXMuY29kZWNzLnNldChjb2RlY0lkLCBzdGF0KTtcbiAgICB9XG4gICAgaGFuZGxlU2Vzc2lvblN0YXRpc3RpY3ModmlkZW9TdGFydFRpbWUsIGlucHV0Q29udHJvbGxlciwgdmlkZW9FbmNvZGVyQXZnUVApIHtcbiAgICAgICAgY29uc3QgZGVsdGFUaW1lID0gRGF0ZS5ub3coKSAtIHZpZGVvU3RhcnRUaW1lO1xuICAgICAgICB0aGlzLnNlc3Npb25TdGF0cy5ydW5UaW1lID0gbmV3IERhdGUoZGVsdGFUaW1lKS50b0lTT1N0cmluZygpLnN1YnN0cigxMSwgOCkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udHJvbHNTdHJlYW1JbnB1dCA9IGlucHV0Q29udHJvbGxlciA9PT0gbnVsbCA/ICdOb3Qgc2VudCB5ZXQnIDogaW5wdXRDb250cm9sbGVyID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdHMuY29udHJvbHNTdHJlYW1JbnB1dCA9IGNvbnRyb2xzU3RyZWFtSW5wdXQ7XG4gICAgICAgIHRoaXMuc2Vzc2lvblN0YXRzLnZpZGVvRW5jb2RlckF2Z1FQID0gdmlkZW9FbmNvZGVyQXZnUVA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgdmFsdWUgY29taW5nIGluIGZyb20gb3VyIHN0YXRzIGlzIGFjdHVhbGx5IGEgbnVtYmVyXG4gICAgICogQHBhcmFtIHZhbHVlIC0gdGhlIG51bWJlciB0byBiZSBjaGVja2VkXG4gICAgICovXG4gICAgaXNOdW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBhY3RpdmUgY2FuZGlkYXRlIHBhaXJcbiAgICAgKiBAcmV0dXJucyBUaGUgY2FuZGlkYXRlIHBhaXIgdGhhdCBpcyBjdXJyZW50bHkgcmVjZWl2aW5nIGRhdGFcbiAgICAgKi9cbiAgICBnZXRBY3RpdmVDYW5kaWRhdGVQYWlyKCkge1xuICAgICAgICBpZiAodGhpcy5jYW5kaWRhdGVQYWlycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgUlRDVHJhbnNwb3J0IHN0YXQgaXMgbm90IHVuZGVmaW5lZFxuICAgICAgICBpZiAodGhpcy50cmFuc3BvcnRTdGF0cykge1xuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBjYW5kaWRhdGUgcGFpciB0aGF0IG1hdGNoZXMgdGhlIHRyYW5zcG9ydCBjYW5kaWRhdGUgcGFpciBpZFxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYWlyID0gdGhpcy5jYW5kaWRhdGVQYWlycy5maW5kKChjYW5kaWRhdGVQYWlyKSA9PiBjYW5kaWRhdGVQYWlyLmlkID09PSB0aGlzLnRyYW5zcG9ydFN0YXRzLnNlbGVjdGVkQ2FuZGlkYXRlUGFpcklkKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFBhaXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkUGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGAuc2VsZWN0ZWRgIG1lbWJlciBvZiB0aGUgY2FuZGlkYXRlIHBhaXJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYWlyID0gdGhpcy5jYW5kaWRhdGVQYWlycy5maW5kKChjYW5kaWRhdGVQYWlyKSA9PiBjYW5kaWRhdGVQYWlyLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKHNlbGVjdGVkUGFpciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFBhaXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BZ2dyZWdhdGVkU3RhdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogSUNFIENhbmRpZGF0ZSBQYWlyIFN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5kaWRhdGVQYWlyU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FuZGlkYXRlUGFpclN0YXRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIElDRSBDYW5kaWRhdGUgU3RhdCBjb2xsZWN0ZWQgZnJvbSB0aGUgUlRDIFN0YXRzIFJlcG9ydFxuICovXG5leHBvcnQgY2xhc3MgQ2FuZGlkYXRlU3RhdCB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYW5kaWRhdGVTdGF0LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIERhdGEgQ2hhbm5lbCBTdGF0cyBjb2xsZWN0ZWQgZnJvbSB0aGUgUlRDIFN0YXRzIFJlcG9ydFxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNoYW5uZWxTdGF0cyB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhQ2hhbm5lbFN0YXRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEluYm91bmQgQXVkaW8gU3RhdHMgY29sbGVjdGVkIGZyb20gdGhlIFJUQyBTdGF0cyBSZXBvcnRcbiAqL1xuZXhwb3J0IGNsYXNzIEluYm91bmRBdWRpb1N0YXRzIHtcbn1cbi8qKlxuICogSW5ib3VuZCBWaWRlbyBTdGF0cyBjb2xsZWN0ZWQgZnJvbSB0aGUgUlRDIFN0YXRzIFJlcG9ydFxuICovXG5leHBvcnQgY2xhc3MgSW5ib3VuZFZpZGVvU3RhdHMge1xufVxuLyoqXG4gKiBJbmJvdW5kIFN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmJvdW5kUlRQU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5ib3VuZFJUUFN0YXRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIFJlcHJlc2VudHMgZWl0aGVyIGE6XG4gKiAtIHN5bmNocm9uaXphdGlvbiBzb3VyY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SVENSdHBSZWNlaXZlci9nZXRTeW5jaHJvbml6YXRpb25Tb3VyY2VzXG4gKiAtIGNvbnRyaWJ1dGluZyBzb3VyY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SVENSdHBSZWNlaXZlci9nZXRDb250cmlidXRpbmdTb3VyY2VzXG4gKiBXaGljaCBhbHNvIChpZiBicm93c2VyIHN1cHBvcnRzIGl0KSBtYXkgb3B0aW9uYWxsIGNvbnRhaW4gZmllbGRzIGZvciBjYXB0dXJlVGltZXN0YW1wICsgc2VuZGVyQ2FwdHVyZVRpbWVPZmZzZXRcbiAqIGlmIHRoZSBhYnMtY2FwdHVyZS10aW1lIFJUUCBoZWFkZXIgZXh0ZW5zaW9uIGlzIGVuYWJsZWQgKGN1cnJlbnRseSB0aGlzIG9ubHkgd29ya3MgaW4gQ2hyb21pdW0gYmFzZWQgYnJvd3NlcnMpLlxuICovXG5jbGFzcyBSVENSdHBDYXB0dXJlU291cmNlIHtcbn1cbi8qKlxuICogRnJhbWVUaW1pbmdJbmZvIGlzIGEgQ2hyb21pdW0tc3BlY2lmaWMgc2V0IG9mIFdlYlJUQyBzdGF0cyB1c2VmdWwgZm9yIGxhdGVuY3kgY2FsY3VsYXRpb24uIEl0IGlzIHN0b3JlZCBpbiBXZWJSVEMgc3RhdHMgYXMgYGdvb2dUaW1pbmdGcmFtZUluZm9gLlxuICogSXQgaXMgZGVmaW5lZCBhcyBhbiBSVFAgaGVhZGVyIGV4dGVuc2lvbiBoZXJlOiBodHRwczovL3dlYnJ0Yy5nb29nbGVzb3VyY2UuY29tL3NyYy8rL3JlZnMvaGVhZHMvbWFpbi9kb2NzL25hdGl2ZS1jb2RlL3J0cC1oZHJleHQvdmlkZW8tdGltaW5nL1JFQURNRS5tZFxuICogSXQgaXMgZGVmaW5lZCBpbiBzb3VyY2UgY29kZSBoZXJlOiBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFpbjp0aGlyZF9wYXJ0eS93ZWJydGMvYXBpL3ZpZGVvL3ZpZGVvX3RpbWluZy5jYztsPTgyO2RyYz04ZDM5OTgxNzI4MmUzYzEyZWQ1NGViMjNlYzQyYTVlNDE4Mjk4ZWM2XG4gKiBJdCBpcyBkaXNjdXNzZWQgYnkgaXRzIGF1dGhvciBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vdzNjL3dlYnJ0Yy1wcm92aXNpb25hbC1zdGF0cy9pc3N1ZXMvNDAjaXNzdWVjb21tZW50LTEyNzI5MTY2OTJcbiAqIEluIHN1bW1hcnkgaXQgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyAoaW4gdGhpcyBvcmRlcik6XG4gKiAxKSAgUlRQIHRpbWVzdGFtcDogdGhlIFJUUCB0aW1lc3RhbXAgb2YgdGhlIGZyYW1lXG4gKiAyKSAgQ2FwdHVyZSB0aW1lOiB0aW1lc3RhbXAgd2hlbiB0aGlzIGZyYW1lIHdhcyBjYXB0dXJlZFxuICogMykgIEVuY29kZSBzdGFydDogdGltZXN0YW1wIHdoZW4gdGhpcyBmcmFtZSBzdGFydGVkIHRvIGJlIGVuY29kZWRcbiAqIDQpICBFbmNvZGUgZmluaXNoOiB0aW1lc3RhbXAgd2hlbiB0aGlzIGZyYW1lIGZpbmlzaGVkIGVuY29kaW5nXG4gKiA1KSAgUGFja2V0aXphdGlvbiBmaW5pc2g6IHRpbWVzdGFtcCB3aGVuIHRoaXMgZnJhbWUgd2FzIHNwbGl0IGludG8gcGFja2V0cyBhbmQgd2FzIHJlYWR5IHRvIGJlIHNlbnQgb3ZlciB0aGUgbmV0d29ya1xuICogNikgIFBhY2VyIGV4aXQ6IHRpbWVzdGFtcCB3aGVuIGxhc3QgcGFja2V0IG9mIHRoaXMgZnJhbWUgd2FzIHNlbnQgb3ZlciB0aGUgbmV0d29yayBieSB0aGUgc2VuZGVyIGF0IHRoaXMgdGltZXN0YW1wXG4gKiA3KSAgTmV0d29yayB0aW1lc3RhbXAxOiBwbGFjZSBmb3IgdGhlIFNGVSB0byBtYXJrIHdoZW4gdGhlIGZyYW1lIHN0YXJ0ZWQgYmVpbmcgZm9yd2FyZGVkLiBBcHBsaWNhdGlvbiBzcGVjaWZpYy5cbiAqIDgpICBOZXR3b3JrIHRpbWVzdGFtcDI6IHBsYWNlIGZvciB0aGUgU0ZVIHRvIG1hcmsgd2hlbiB0aGUgZnJhbWUgZmluaXNoZWQgYmVpbmcgZm9yd2FyZGVkLiBBcHBsaWNhdGlvbiBzcGVjaWZpYy5cbiAqIDkpICBSZWNlaXZlIHN0YXJ0OiB0aW1lc3RhbXAgd2hlbiB0aGUgZmlyc3QgcGFja2V0IG9mIHRoaXMgZnJhbWUgd2FzIHJlY2VpdmVkXG4gKiAxMCkgUmVjZWl2ZSBmaW5pc2g6IHRpbWVzdGFtcCB3aGVuIHRoZSBsYXN0IHBhY2tldCBvZiB0aGlzIGZyYW1lIHdhcyByZWNlaXZlZFxuICogMTEpIERlY29kZSBzdGFydDogIHRpbWVzdGFtcCB3aGVuIHRoZSBmcmFtZSB3YXMgcGFzc2VkIHRvIGRlY29kZXJcbiAqIDEyKSBEZWNvZGUgZmluaXNoOiAgdGltZXN0YW1wIHdoZW4gdGhlIGZyYW1lIHdhcyBkZWNvZGVkXG4gKiAxMykgUmVuZGVyIHRpbWU6ICB0aW1lc3RhbXAgb2YgdGhlIHByb2plY3RlZCByZW5kZXIgdGltZSBmb3IgdGhpcyBmcmFtZVxuICogMTQpIFwiaXMgb3V0bGllclwiOiBhIGZsYWcgZm9yIGlmIHRoaXMgZnJhbWUgaXMgYmlnZ2VyIGluIGVuY29kZWQgc2l6ZSB0aGFuIHRoZSBhdmVyYWdlIGZyYW1lIGJ5IGF0IGxlYXN0IDV4LlxuICogMTUpIFwidHJpZ2dlcmVkIGJ5IHRpbWVyXCI6IGEgZmxhZyBmb3IgaWYgdGhpcyByZXBvcnQgd2FzIHRyaWdnZXJlZCBieSB0aGUgdGltZXIgKFRoZSByZXBvcnQgaXMgc2VudCBldmVyeSAyMDBtcylcbiAqL1xuZXhwb3J0IGNsYXNzIEZyYW1lVGltaW5nSW5mbyB7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgYSBjb21iaW5hdGlvbiBvZiBsYXRlbmN5IHN0YXRpc3RpY3MgdXNpbmcgcHVyZWx5IFdlYlJUQyBBUEkuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXRlbmN5Q2FsY3VsYXRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qIENsb2NrIG9mZnNldCBiZXR3ZWVuIHBlZXIgY2xvY2tzIGNhbm5vdCBhbHdheXMgYmUgY2FsY3VsYXRlZCBhcyBpdCByZWxpZXMgb2YgbGF0ZXN0IHNlbmRlciByZXBvcnRzLlxuICAgICAgICAgKiBzbyB3ZSBzdG9yZSB0aGUgbGFzdCB0aW1lIHdlIGhhZCBhIHZhbGlkIGNsb2NrIG9mZnNldCBpbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGNsb2NrcyBoYXZlbid0IGRyaWZ0ZWQgdG9vIG11Y2ggc2luY2UgdGhlbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGF0ZXN0U2VuZGVyUmVjdkNsb2NrT2Zmc2V0ID0gbnVsbDtcbiAgICB9XG4gICAgY2FsY3VsYXRlKHN0YXRzLCByZWNlaXZlcnMpIHtcbiAgICAgICAgY29uc3QgbGF0ZW5jeUluZm8gPSBuZXcgTGF0ZW5jeUluZm8oKTtcbiAgICAgICAgY29uc3QgcnR0TVMgPSB0aGlzLmdldFJUVE1zKHN0YXRzKTtcbiAgICAgICAgaWYgKHJ0dE1TICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLnJ0dE1zID0gcnR0TVM7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgc2VuZGVyIGxhdGVuY3kgdXNpbmcgdGhlIGZpcnN0IHZhbGlkIHZpZGVvIHNzcmMvY3NyY1xuICAgICAgICAgICAgY29uc3QgY2FwdHVyZVNvdXJjZSA9IHRoaXMuZ2V0Q2FwdHVyZVNvdXJjZShyZWNlaXZlcnMpO1xuICAgICAgICAgICAgaWYgKGNhcHR1cmVTb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbmRlckxhdGVuY3lNcyA9IHRoaXMuY2FsY3VsYXRlU2VuZGVyTGF0ZW5jeShzdGF0cywgY2FwdHVyZVNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbmRlckxhdGVuY3lNcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsYXRlbmN5SW5mby5zZW5kZXJMYXRlbmN5TXMgPSBzZW5kZXJMYXRlbmN5TXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJydGMtc3RhdHMvI2RvbS1ydGNpbmJvdW5kcnRwc3RyZWFtc3RhdHMtdG90YWxwcm9jZXNzaW5nZGVsYXlcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLnRvdGFsUHJvY2Vzc2luZ0RlbGF5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZVByb2Nlc3NpbmdEZWxheU1zID1cbiAgICAgICAgICAgICAgICAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMudG90YWxQcm9jZXNzaW5nRGVsYXkgLyBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEZWNvZGVkKSAqIDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1zdGF0cy8jZG9tLXJ0Y2luYm91bmRydHBzdHJlYW1zdGF0cy1qaXR0ZXJidWZmZXJtaW5pbXVtZGVsYXlcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmppdHRlckJ1ZmZlckRlbGF5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXRlbmN5SW5mby5hdmVyYWdlSml0dGVyQnVmZmVyRGVsYXlNcyA9XG4gICAgICAgICAgICAgICAgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmppdHRlckJ1ZmZlckRlbGF5IC9cbiAgICAgICAgICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50KSAqXG4gICAgICAgICAgICAgICAgICAgIDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1zdGF0cy8jZG9tLXJ0Y2luYm91bmRydHBzdHJlYW1zdGF0cy10b3RhbGRlY29kZXRpbWVcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMudG90YWxEZWNvZGVUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VEZWNvZGVMYXRlbmN5TXMgPVxuICAgICAgICAgICAgICAgIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy50b3RhbERlY29kZVRpbWUgLyBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEZWNvZGVkKSAqIDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1zdGF0cy8jZG9tLXJ0Y2luYm91bmRydHBzdHJlYW1zdGF0cy1mcmFtZXNhc3NlbWJsZWRmcm9tbXVsdGlwbGVwYWNrZXRzXG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy50b3RhbEFzc2VtYmx5VGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNBc3NlbWJsZWRGcm9tTXVsdGlwbGVQYWNrZXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VBc3NlbWJseURlbGF5TXMgPVxuICAgICAgICAgICAgICAgIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy50b3RhbEFzc2VtYmx5VGltZSAvXG4gICAgICAgICAgICAgICAgICAgIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0Fzc2VtYmxlZEZyb21NdWx0aXBsZVBhY2tldHMpICpcbiAgICAgICAgICAgICAgICAgICAgMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHRyYWN0IGV4dHJhIENocm9tZS1zcGVjaWZpYyBzdGF0cyBsaWtlIGVuY29kaW5nIGxhdGVuY3lcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmdvb2dUaW1pbmdGcmFtZUluZm8gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZ29vZ1RpbWluZ0ZyYW1lSW5mby5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsYXRlbmN5SW5mby5mcmFtZVRpbWluZyA9IHRoaXMuZXh0cmFjdEZyYW1lVGltaW5nSW5mbyhzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5nb29nVGltaW5nRnJhbWVJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxjdWxhdGUgRTJFIGxhdGVuY3kgdXNpbmcgdmlkZW8tdGltaW5nIGNhcHR1cmUgdG8gc2VuZCB0aW1lICsgb25lIHdheSBuZXR3b3JrIGxhdGVuY3kgKyByZWNlaXZlci1zaWRlIGxhdGVuY3lcbiAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmNhcHR1cmVUb1NlbmRMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZVByb2Nlc3NpbmdEZWxheU1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLnJ0dE1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VFMkVMYXRlbmN5ID1cbiAgICAgICAgICAgICAgICBsYXRlbmN5SW5mby5mcmFtZVRpbWluZy5jYXB0dXJlVG9TZW5kTGF0ZW5jeU1zICtcbiAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeUluZm8ucnR0TXMgKiAwLjUgK1xuICAgICAgICAgICAgICAgICAgICBsYXRlbmN5SW5mby5hdmVyYWdlUHJvY2Vzc2luZ0RlbGF5TXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsY3VsYXRlIEUyRSBsYXRlbmN5IGFzIGFicy1jYXB0dXJlLXRpbWUgY2FwdHVyZSB0byBzZW5kIGxhdGVuY3kgKyBvbmUgd2F5IG5ldHdvcmsgbGF0ZW5jeSArIHJlY2VpdmVyLXNpZGUgbGF0ZW5jeVxuICAgICAgICBpZiAobGF0ZW5jeUluZm8uc2VuZGVyTGF0ZW5jeU1zICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZVByb2Nlc3NpbmdEZWxheU1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLnJ0dE1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VFMkVMYXRlbmN5ID1cbiAgICAgICAgICAgICAgICBsYXRlbmN5SW5mby5zZW5kZXJMYXRlbmN5TXMgKyBsYXRlbmN5SW5mby5ydHRNcyAqIDAuNSArIGxhdGVuY3lJbmZvLmF2ZXJhZ2VQcm9jZXNzaW5nRGVsYXlNcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF0ZW5jeUluZm87XG4gICAgfVxuICAgIGV4dHJhY3RGcmFtZVRpbWluZ0luZm8oZ29vZ1RpbWluZ0ZyYW1lSW5mbykge1xuICAgICAgICBjb25zdCB0aW1pbmdJbmZvID0gbmV3IEZyYW1lVGltaW5nSW5mbygpO1xuICAgICAgICBjb25zdCB0aW1pbmdJbmZvQXJyID0gZ29vZ1RpbWluZ0ZyYW1lSW5mby5zcGxpdCgnLCcpO1xuICAgICAgICAvLyBTaG91bGQgaGF2ZSBleGFjdGx5IDE1IGVsZW1lbnRzIGFjY29yZGluZyB0bzpcbiAgICAgICAgLy8gaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL21haW46dGhpcmRfcGFydHkvd2VicnRjL2FwaS92aWRlby92aWRlb190aW1pbmcuY2M7bD04MjtkcmM9OGQzOTk4MTcyODJlM2MxMmVkNTRlYjIzZWM0MmE1ZTQxODI5OGVjNlxuICAgICAgICBpZiAodGltaW5nSW5mb0Fyci5sZW5ndGggPT09IDE1KSB7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLnJ0cFRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzBdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uY2FwdHVyZVRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzFdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uZW5jb2RlU3RhcnRUaW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0FyclsyXSk7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLmVuY29kZUZpbmlzaFRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzNdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ucGFja2V0aXplckZpbmlzaFRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzRdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ucGFjZXJFeGl0VGltZXN0YW1wID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbNV0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5uZXR3b3JrVGltZXN0YW1wMSA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzZdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ubmV0d29ya1RpbWVzdGFtcDIgPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0Fycls3XSk7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLnJlY2VpdmVTdGFydCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzhdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ucmVjZWl2ZUZpbmlzaCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzldKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uZGVjb2RlU3RhcnQgPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0FyclsxMF0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5kZWNvZGVGaW5pc2ggPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0FyclsxMV0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5yZW5kZXJUaW1lID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbMTJdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uaXNPdXRsaWVyID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbMTNdKSA+IDA7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLmlzVHJpZ2dlcmVkQnlUaW1lciA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzE0XSkgPiAwO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNvbWUgbGF0ZW5jeSBzdGF0c1xuICAgICAgICAgICAgdGltaW5nSW5mby5lbmNvZGVyTGF0ZW5jeU1zID0gdGltaW5nSW5mby5lbmNvZGVGaW5pc2hUaW1lc3RhbXAgLSB0aW1pbmdJbmZvLmVuY29kZVN0YXJ0VGltZXN0YW1wO1xuICAgICAgICAgICAgdGltaW5nSW5mby5wYWNrZXRpemVMYXRlbmN5TXMgPVxuICAgICAgICAgICAgICAgIHRpbWluZ0luZm8ucGFja2V0aXplckZpbmlzaFRpbWVzdGFtcCAtIHRpbWluZ0luZm8uZW5jb2RlRmluaXNoVGltZXN0YW1wO1xuICAgICAgICAgICAgdGltaW5nSW5mby5wYWNlckxhdGVuY3lNcyA9IHRpbWluZ0luZm8ucGFjZXJFeGl0VGltZXN0YW1wIC0gdGltaW5nSW5mby5wYWNrZXRpemVyRmluaXNoVGltZXN0YW1wO1xuICAgICAgICAgICAgdGltaW5nSW5mby5jYXB0dXJlVG9TZW5kTGF0ZW5jeU1zID0gdGltaW5nSW5mby5wYWNlckV4aXRUaW1lc3RhbXAgLSB0aW1pbmdJbmZvLmNhcHR1cmVUaW1lc3RhbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbWluZ0luZm87XG4gICAgfVxuICAgIGNhbGN1bGF0ZVNlbmRlckxhdGVuY3koc3RhdHMsIGNhcHR1cmVTb3VyY2UpIHtcbiAgICAgICAgLy8gVGhlIGNhbGN1bGF0aW9uIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGlzIGFzIHBlciB0aGUgcHJvY2VkdXJlIGRlZmluZWQgaGVyZTpcbiAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1leHRlbnNpb25zLyNkb20tcnRjcnRwY29udHJpYnV0aW5nc291cmNlLXNlbmRlcmNhcHR1cmV0aW1lb2Zmc2V0XG4gICAgICAgIC8vIEdldCB0aGUgc2VuZGVyIGNhcHR1cmUgaW4gdGhlIHNlbmRlcidzIGNsb2NrXG4gICAgICAgIGNvbnN0IHNlbmRlckNhcHR1cmVUaW1lc3RhbXAgPSBjYXB0dXJlU291cmNlLmNhcHR1cmVUaW1lc3RhbXAgKyBjYXB0dXJlU291cmNlLnNlbmRlckNhcHR1cmVUaW1lT2Zmc2V0O1xuICAgICAgICBsZXQgc2VuZFJlY3ZDbG9ja09mZnNldCA9IHRoaXMuY2FsY3VsYXRlU2VuZGVyUmVjZWl2ZXJDbG9ja09mZnNldChzdGF0cyk7XG4gICAgICAgIC8vIFVzZSBsYXRlc3QgY2xvY2sgb2Zmc2V0IGlmIHdlIGNvdWxkbid0IGNhbGN1bGF0ZSBvbmUgbm93XG4gICAgICAgIGlmIChzZW5kUmVjdkNsb2NrT2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhdGVzdFNlbmRlclJlY3ZDbG9ja09mZnNldCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2VuZFJlY3ZDbG9ja09mZnNldCA9IHRoaXMubGF0ZXN0U2VuZGVyUmVjdkNsb2NrT2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhdGVzdFNlbmRlclJlY3ZDbG9ja09mZnNldCA9IHNlbmRSZWN2Q2xvY2tPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBicmluZ3Mgc2VuZGVyIGNsb2NrIHJvdWdobHkgaW5saW5lIHdpdGggcmVjdiBjbG9ja1xuICAgICAgICBjb25zdCByZWN2Q2FwdHVyZVRpbWVzdGFtcE5UUCA9IHNlbmRlckNhcHR1cmVUaW1lc3RhbXAgKyBzZW5kUmVjdkNsb2NrT2Zmc2V0O1xuICAgICAgICAvLyBBcyBkZWZpbmVkIGluIENocm9tZSBzb3VyY2U6IGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9leHRlcm5hbC93ZWJydGMvKy9tYXN0ZXIvc3lzdGVtX3dyYXBwZXJzL2luY2x1ZGUvY2xvY2suaCMyNlxuICAgICAgICBjb25zdCBudHAxOTcwID0gMjIwODk4ODgwMDAwMDtcbiAgICAgICAgY29uc3QgcmVjdkNhcHR1cmVUaW1lc3RhbXAgPSByZWN2Q2FwdHVyZVRpbWVzdGFtcE5UUCAtIG50cDE5NzA7XG4gICAgICAgIGNvbnN0IHNlbmRlckxhdGVuY3kgPSBjYXB0dXJlU291cmNlLnRpbWVzdGFtcCAtIHJlY3ZDYXB0dXJlVGltZXN0YW1wO1xuICAgICAgICByZXR1cm4gc2VuZGVyTGF0ZW5jeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgZmlyc3QgdmFsaWQgc3NyYyBvciBjc3JjIHRoYXQgaGFzIGNhcHR1cmUgdGltZSBmaWVsZHMgcHJlc2VudCBmcm9tIGFicy1jYXB0dXJlLXRpbWUgaGVhZGVyIGV4dGVuc2lvbi5cbiAgICAgKiBAcGFyYW0gcmVjZWl2ZXJzIFRoZSBSVFAgcmVjZXZpZXJzIHRoaXMgcGVlciBjb25uZWN0aW9uIGhhcy5cbiAgICAgKiBAcmV0dXJucyBBIHNpbmdsZSB2YWxpZCBzc3JjIG9yIGNzcmMgdGhhdCBoYXMgY2FwdHVyZSB0aW1lIGZpZWxkcyBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUgKGUuZy4gaW4gbm9uLWNocm9taXVtIGJyb3dzZXJzIGl0IHdpbGwgYmUgbnVsbCkuXG4gICAgICovXG4gICAgZ2V0Q2FwdHVyZVNvdXJjZShyZWNlaXZlcnMpIHtcbiAgICAgICAgLy8gV2Ugb25seSB3YW50IHZpZGVvIHJlY2VpdmVyc1xuICAgICAgICByZWNlaXZlcnMgPSByZWNlaXZlcnMuZmlsdGVyKChyZWNlaXZlcikgPT4gcmVjZWl2ZXIudHJhY2sua2luZCA9PT0gJ3ZpZGVvJyk7XG4gICAgICAgIGZvciAoY29uc3QgcmVjZWl2ZXIgb2YgcmVjZWl2ZXJzKSB7XG4gICAgICAgICAgICAvLyBHbyB0aHJvdWdoIGFsbCBzc3JjIGFuZCBjc3JjIHRvIGNoZWNrIGZvciBjYXB0dXJlIHRpbWVzdGFtcFxuICAgICAgICAgICAgLy8gTm90ZTogQ29udmVyc2lvbiB0byBgYW55YCBoZXJlIGlzIGJlY2F1c2UgVFMgZG9lcyBub3QgaGF2ZSBjYXB0dXJlVGltZXN0YW1wIGV0YyBkZWZpbmVkIGluIHRoZSB0eXBlc1xuICAgICAgICAgICAgLy8gdGhlc2UgZmllbGRzIG9ubHkgZXhpc3QgaW4gQ2hyb21pdW0gY3VycmVudGx5LlxuICAgICAgICAgICAgY29uc3Qgc291cmNlcyA9IHJlY2VpdmVyXG4gICAgICAgICAgICAgICAgLmdldFN5bmNocm9uaXphdGlvblNvdXJjZXMoKVxuICAgICAgICAgICAgICAgIC5jb25jYXQocmVjZWl2ZXIuZ2V0Q29udHJpYnV0aW5nU291cmNlcygpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3JjIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3JjLmNhcHR1cmVUaW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBzcmMuc2VuZGVyQ2FwdHVyZVRpbWVPZmZzZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBzcmMudGltZXN0YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FwdHVyZVNyYyA9IG5ldyBSVENSdHBDYXB0dXJlU291cmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVTcmMudGltZXN0YW1wID0gc3JjLnRpbWVzdGFtcDtcbiAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNyYy5jYXB0dXJlVGltZXN0YW1wID0gc3JjLmNhcHR1cmVUaW1lc3RhbXA7XG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVTcmMuc2VuZGVyQ2FwdHVyZVRpbWVPZmZzZXQgPSBzcmMuc2VuZGVyQ2FwdHVyZVRpbWVPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXB0dXJlU3JjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY2FsY3VsYXRlU2VuZGVyUmVjZWl2ZXJDbG9ja09mZnNldChzdGF0cykge1xuICAgICAgICAvLyBUaGUgY2FsY3VsYXRpb24gcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gaXMgYXMgcGVyIHRoZSBwcm9jZWR1cmUgZGVmaW5lZCBoZXJlOlxuICAgICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2VicnRjLWV4dGVuc2lvbnMvI2RvbS1ydGNydHBjb250cmlidXRpbmdzb3VyY2Utc2VuZGVyY2FwdHVyZXRpbWVvZmZzZXRcbiAgICAgICAgY29uc3QgaGFzUmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzID0gc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy50aW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzLnJlbW90ZVRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBOb3RlOiBBcyBvZiBDaHJvbWUgMTMyLCByZW1vdGUtb3V0Ym91bmQtcnRwIHN0YXRzIGZvciB2aWRlbyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZCAoYXVkaW8gd29ya3MpLlxuICAgICAgICAvLyBUaGlzIGNvZGVwYXRoIHNob3VsZCBhY3RpdmF0ZSBvbmNlIHRoZXkgZG8gYmVnaW4gdG8gd29yay5cbiAgICAgICAgaWYgKCFoYXNSZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbW90ZVN0YXRzQXJyaXZlZFRpbWVzdGFtcCA9IHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy50aW1lc3RhbXA7XG4gICAgICAgIGNvbnN0IHJlbW90ZVN0YXRzU2VudFRpbWVzdGFtcCA9IHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy5yZW1vdGVUaW1lc3RhbXA7XG4gICAgICAgIGNvbnN0IHJ0dE1zID0gdGhpcy5nZXRSVFRNcyhzdGF0cyk7XG4gICAgICAgIGlmIChyZW1vdGVTdGF0c0Fycml2ZWRUaW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgcmVtb3RlU3RhdHNTZW50VGltZXN0YW1wICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHJ0dE1zICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBvbmV3YXlEZWxheSA9IHJ0dE1zICogMC41O1xuICAgICAgICAgICAgcmV0dXJuIHJlbW90ZVN0YXRzQXJyaXZlZFRpbWVzdGFtcCAtIChyZW1vdGVTdGF0c1NlbnRUaW1lc3RhbXAgKyBvbmV3YXlEZWxheSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ291bGQgbm90IGdldCBzdGF0cyB0byBjYWxjdWxhdGUgc2VuZGVyL3JlY2VpdmVyIGNsb2NrIG9mZnNldFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFJUVE1zKHN0YXRzKSB7XG4gICAgICAgIC8vIFRyeSB0byBnZXQgaXQgZnJvbSB0aGUgYWN0aXZlIGNhbmRpZGF0ZSBwYWlyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZVBhaXIgPSBzdGF0cy5nZXRBY3RpdmVDYW5kaWRhdGVQYWlyKCk7XG4gICAgICAgIGlmICghIWFjdGl2ZUNhbmRpZGF0ZVBhaXIgJiYgYWN0aXZlQ2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJSVFRTZWNvbmRzID0gYWN0aXZlQ2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZTtcbiAgICAgICAgICAgIHJldHVybiBjdXJSVFRTZWNvbmRzICogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZXh0IHRyeSB0byBnZXQgaXQgZnJvbSByZW1vdGUtb3V0Ym91bmQtcnRwIHZpZGVvIHN0YXRzXG4gICAgICAgIGlmICghIXN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cyAmJlxuICAgICAgICAgICAgc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzLnRvdGFsUm91bmRUcmlwVGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1J0dFNlY29uZHMgPSBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMudG90YWxSb3VuZFRyaXBUaW1lIC9cbiAgICAgICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cztcbiAgICAgICAgICAgIHJldHVybiBhdmdSdHRTZWNvbmRzICogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZXh0IHRyeSB0byBnZXQgaXQgZnJvbSByZW1vdGUtb3V0Ym91bmQtcnRwIGF1ZGlvIHN0YXRzXG4gICAgICAgIGlmICghIXN0YXRzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cyAmJlxuICAgICAgICAgICAgc3RhdHMucmVtb3RlT3V0Ym91bmRBdWRpb1N0YXRzLnRvdGFsUm91bmRUcmlwVGltZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZEF1ZGlvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZEF1ZGlvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1J0dFNlY29uZHMgPSBzdGF0cy5yZW1vdGVPdXRib3VuZEF1ZGlvU3RhdHMudG90YWxSb3VuZFRyaXBUaW1lIC9cbiAgICAgICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZEF1ZGlvU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cztcbiAgICAgICAgICAgIHJldHVybiBhdmdSdHRTZWNvbmRzICogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBsYXRlbmN5IGluZm9ybWF0aW9uIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIFdlYlJUQyBBUEkuXG4gKiBNb3N0IHN0YXRzIGFyZSBjYWxjdWxhdGVkIGZvbGxvd2luZyB0aGUgc3BlYzpcbiAqIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJydGMtc3RhdHMvI2RpY3Rpb25hcnktcnRjaW5ib3VuZHJ0cHN0cmVhbXN0YXRzLW1lbWJlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIExhdGVuY3lJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aW1lIHRha2VuIGZyb20gdGhlIG1vbWVudCBhIGZyYW1lIGlzIGRvbmUgY2FwdHVyaW5nIHRvIHRoZSBtb21lbnQgaXQgaXMgc2VudCBvdmVyIHRoZSBuZXR3b3JrLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGNhbiBvbmx5IGJlIGNhbGN1bGF0ZWQgaWYgYm90aCBvZmZlciBhbmQgYW5zd2VyIGNvbnRhaW4gdGhlXG4gICAgICAgICAqIHRoZSBSVFAgaGVhZGVyIGV4dGVuc2lvbiBmb3IgYHZpZGVvLXRpbWluZ2AgKENocm9tZSBvbmx5IGZvciBub3cpXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbmRlckxhdGVuY3lNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSB0aW1lIHRha2VuIGZyb20gdGhlIG1vbWVudCBhIGZyYW1lIGlzIGRvbmUgY2FwdHVyaW5nIHRvIHRoZSBtb21lbnQgaXQgaXMgc2VudCBvdmVyIHRoZSBuZXR3b3JrLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGNhbiBvbmx5IGJlIGNhbGN1bGF0ZWQgaWYgYm90aCBvZmZlciBhbmQgYW5zd2VyIGNvbnRhaW4gdGhlXG4gICAgICAgICAqIHRoZSBSVFAgaGVhZGVyIGV4dGVuc2lvbiBmb3IgYGFicy1jYXB0dXJlLXRpbWVgIChDaHJvbWUgb25seSBmb3Igbm93KVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZW5kZXJMYXRlbmN5QWJzQ2FwdHVyZVRpbWVNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyogVGhlIHJvdW5kIHRyaXAgdGltZSAobWlsbGlzZWNvbmRzKSBiZXR3ZWVuIGVhY2ggc2VuZGVyLT5yZWNlaXZlci0+c2VuZGVyICovXG4gICAgICAgIHRoaXMucnR0TXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qIEF2ZXJhZ2UgdGltZSB0YWtlbiAobWlsbGlzZWNvbmRzKSBmcm9tIHZpZGVvIHBhY2tldCByZWNlaXB0IHRvIHBvc3QtZGVjb2RlLiAqL1xuICAgICAgICB0aGlzLmF2ZXJhZ2VQcm9jZXNzaW5nRGVsYXlNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyogQXZlcmFnZSB0aW1lIHRha2VuIChtaWxsaXNlY29uZHMpIGluc2lkZSB0aGUgaml0dGVyIGJ1ZmZlciAod2hpY2ggaXMgcG9zdC1yZWNlaXB0IGJ1dCBwcmUtZGVjb2RlKS4gKi9cbiAgICAgICAgdGhpcy5hdmVyYWdlSml0dGVyQnVmZmVyRGVsYXlNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyogQXZlcmFnZSB0aW1lIHRha2VuIChtaWxsaXNlY29uZHMpIHRvIGRlY29kZSBhIHZpZGVvIGZyYW1lLiAqL1xuICAgICAgICB0aGlzLmF2ZXJhZ2VEZWNvZGVMYXRlbmN5TXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qIEF2ZXJhZ2UgdGltZSB0YWtlbiAobWlsbGlzZWNvbmRzKSB0byBiZXR3ZWVuIHJlY2VpcHQgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IHZpZGVvIHBhY2tldCBvZiBhLiAqL1xuICAgICAgICB0aGlzLmF2ZXJhZ2VBc3NlbWJseURlbGF5TXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qIFRoZSBzZW5kZXIgbGF0ZW5jeSArIFJUVC8yICsgcHJvY2Vzc2luZyBkZWxheSAqL1xuICAgICAgICB0aGlzLmF2ZXJhZ2VFMkVMYXRlbmN5ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiBUaW1pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdvcnN0IHBlcmZvcm1pbmcgZnJhbWUgc2luY2UgdGhlIGxhc3QgZ2V0U3RhdHMgY2FsbCAob25seSB3b3JrcyBvbiBDaHJvbWUpICovXG4gICAgICAgIHRoaXMuZnJhbWVUaW1pbmcgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGF0ZW5jeUNhbGN1bGF0b3IuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogT3V0Ym91bmQgUlRQIHN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0IHVuZGVyIGBvdXRib3VuZC1ydHBgLlxuICogV3JhcHBlciBhcm91bmQ6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SVENPdXRib3VuZFJ0cFN0cmVhbVN0YXRzXG4gKiBUaGVzZSBhcmUgc3RhdHMgZm9yIHZpZGVvIHdlIGFyZSBzZW5kaW5nIHRvIGEgcmVtb3RlIHBlZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBPdXRib3VuZFJUUFN0YXRzIHtcbn1cbi8qKlxuICogUmVtb3RlIG91dGJvdW5kIHN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0IHVuZGVyIGByZW1vdGUtb3V0Ym91bmQtcnRwYC5cbiAqIFdyYXBwZXIgYXJvdW5kOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUlRDUmVtb3RlT3V0Ym91bmRSdHBTdHJlYW1TdGF0c1xuICogVGhlc2UgYXJlIHN0YXRzIGZvciBtZWRpYSB3ZSBhcmUgcmVjZWl2aW5nIGZyb20gYSByZW1vdGUgcGVlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbW90ZU91dGJvdW5kUlRQU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3V0Qm91bmRSVFBTdGF0cy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBPcHRpb25QYXJhbWV0ZXJzLCBGbGFncyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgQWdncmVnYXRlZFN0YXRzIH0gZnJvbSAnLi9BZ2dyZWdhdGVkU3RhdHMnO1xuaW1wb3J0IHsgcGFyc2VSdHBQYXJhbWV0ZXJzLCBzcGxpdFNlY3Rpb25zIH0gZnJvbSAnc2RwJztcbmltcG9ydCB7IFJUQ1V0aWxzIH0gZnJvbSAnLi4vVXRpbC9SVENVdGlscyc7XG5pbXBvcnQgeyBTRFBVdGlscyB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IExhdGVuY3lDYWxjdWxhdG9yIH0gZnJvbSAnLi9MYXRlbmN5Q2FsY3VsYXRvcic7XG5leHBvcnQgY29uc3Qga0Fic0NhcHR1cmVUaW1lID0gJ2h0dHA6Ly93d3cud2VicnRjLm9yZy9leHBlcmltZW50cy9ydHAtaGRyZXh0L2Ficy1jYXB0dXJlLXRpbWUnO1xuLyoqXG4gKiBIYW5kbGVzIHRoZSBQZWVyIENvbm5lY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBlZXJDb25uZWN0aW9uQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IFJUQyBQZWVyIENvbm5lY3Rpb24gY2xpZW50XG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBQZWVyIGNvbm5lY3Rpb24gT3B0aW9uc1xuICAgICAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlnIGZvciBvdXIgUFMgZXhwZXJpZW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb25maWcsIHByZWZlcnJlZENvZGVjKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmNyZWF0ZVBlZXJDb25uZWN0aW9uKG9wdGlvbnMsIHByZWZlcnJlZENvZGVjKTtcbiAgICAgICAgdGhpcy5sYXRlbmN5Q2FsY3VsYXRvciA9IG5ldyBMYXRlbmN5Q2FsY3VsYXRvcigpO1xuICAgIH1cbiAgICBjcmVhdGVQZWVyQ29ubmVjdGlvbihvcHRpb25zLCBwcmVmZXJyZWRDb2RlYykge1xuICAgICAgICAvLyBTZXQgdGhlIElDRSB0cmFuc3BvcnQgdG8gcmVsYXkgaWYgVFVSTiBlbmFibGVkXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkZvcmNlVFVSTikpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaWNlVHJhbnNwb3J0UG9saWN5ID0gJ3JlbGF5JztcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdGb3JjaW5nIFRVUk4gdXNhZ2UgYnkgc2V0dGluZyBJQ0UgVHJhbnNwb3J0IFBvbGljeSBpbiBwZWVyIGNvbm5lY3Rpb24gY29uZmlnLicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJ1aWxkIGEgbmV3IHBlZXIgY29ubmVjdGlvbiB3aXRoIHRoZSBvcHRpb25zXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24gPSBuZXcgUlRDUGVlckNvbm5lY3Rpb24ob3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24ub25zaWduYWxpbmdzdGF0ZWNoYW5nZSA9IChldikgPT4gdGhpcy5oYW5kbGVTaWduYWxTdGF0ZUNoYW5nZShldik7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24ub25pY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UgPSAoZXYpID0+IHRoaXMuaGFuZGxlSWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlKGV2KTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5vbmljZWdhdGhlcmluZ3N0YXRlY2hhbmdlID0gKGV2KSA9PiB0aGlzLmhhbmRsZUljZUdhdGhlcmluZ1N0YXRlQ2hhbmdlKGV2KTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5vbnRyYWNrID0gKGV2KSA9PiB0aGlzLmhhbmRsZU9uVHJhY2soZXYpO1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uLm9uaWNlY2FuZGlkYXRlID0gKGV2KSA9PiB0aGlzLmhhbmRsZUljZUNhbmRpZGF0ZShldik7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24ub25kYXRhY2hhbm5lbCA9IChldikgPT4gdGhpcy5oYW5kbGVEYXRhQ2hhbm5lbChldik7XG4gICAgICAgIHRoaXMuYWdncmVnYXRlZFN0YXRzID0gbmV3IEFnZ3JlZ2F0ZWRTdGF0cygpO1xuICAgICAgICB0aGlzLnByZWZlcnJlZENvZGVjID0gcHJlZmVycmVkQ29kZWM7XG4gICAgICAgIHRoaXMudXBkYXRlQ29kZWNTZWxlY3Rpb24gPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gb2ZmZXIgZm9yIHRoZSBXZWIgUlRDIGhhbmRzaGFrZSBhbmQgc2VuZCB0aGUgb2ZmZXIgdG8gdGhlIHNpZ25hbGluZyBzZXJ2ZXIgdmlhIHdlYnNvY2tldFxuICAgICAqIEBwYXJhbSBvZmZlck9wdGlvbnMgLSBSVEMgT2ZmZXIgT3B0aW9uc1xuICAgICAqL1xuICAgIGNyZWF0ZU9mZmVyKG9mZmVyT3B0aW9ucywgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnQ3JlYXRlIE9mZmVyJyk7XG4gICAgICAgICAgICBjb25zdCBpc0xvY2FsaG9zdENvbm5lY3Rpb24gPSBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgbG9jYXRpb24uaG9zdG5hbWUgPT09ICcxMjcuMC4wLjEnO1xuICAgICAgICAgICAgY29uc3QgaXNIdHRwc0Nvbm5lY3Rpb24gPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICAgICAgICBsZXQgdXNlTWljID0gY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuVXNlTWljKTtcbiAgICAgICAgICAgIGxldCB1c2VDYW1lcmEgPSBjb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Vc2VDYW1lcmEpO1xuICAgICAgICAgICAgaWYgKCh1c2VNaWMgfHwgdXNlQ2FtZXJhKSAmJiAhKGlzTG9jYWxob3N0Q29ubmVjdGlvbiB8fCBpc0h0dHBzQ29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgICAgICB1c2VNaWMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB1c2VDYW1lcmEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoJ01pY3JvcGhvbmUgYW5kIFdlYmNhbSBhY2Nlc3MgaW4gdGhlIGJyb3dzZXIgd2lsbCBub3Qgd29yayBpZiB5b3UgYXJlIG5vdCBvbiBIVFRQUyBvciBsb2NhbGhvc3QuIERpc2FibGluZyBtaWMgYW5kIHdlYmNhbSBhY2Nlc3MuJyk7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKFwiRm9yIHRlc3RpbmcgeW91IGNhbiBlbmFibGUgSFRUUCBtaWNyb3Bob25lIGFjY2VzcyBDaHJvbWUgYnkgdmlzaXRpbmcgY2hyb21lOi8vZmxhZ3MvIGFuZCBlbmFibGluZyAndW5zYWZlbHktdHJlYXQtaW5zZWN1cmUtb3JpZ2luLWFzLXNlY3VyZSdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldHVwVHJhbnNjZWl2ZXJzQXN5bmModXNlTWljLCB1c2VDYW1lcmEpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3JlYXRlT2ZmZXIob2ZmZXJPcHRpb25zKS50aGVuKChvZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5Q29ubmVjdGluZygpO1xuICAgICAgICAgICAgICAgICAgICBvZmZlci5zZHAgPSB0aGlzLm11bmdlU0RQKG9mZmVyLnNkcCwgdXNlTWljKTtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldExvY2FsRGVzY3JpcHRpb24ob2ZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2VuZFdlYlJUQ09mZmVyKG9mZmVyKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5U2V0dXBGYWlsdXJlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlY2VpdmUgb2ZmZXIgZnJvbSBVRSBzaWRlIGFuZCBwcm9jZXNzIGl0IGFzIHRoZSByZW1vdGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwZWVyIGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICByZWNlaXZlT2ZmZXIob2ZmZXIsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1JlY2VpdmUgT2ZmZXInKTtcbiAgICAgICAgICAgIC8vIElmIFVFIG9yIEpTU3RyZWFtZXIgZGlkIHNlbmQgYWJzLWNhcHR1cmUtdGltZSBSVFAgaGVhZGVyIGV4dGVuc2lvbiB0byBhIG5vbi1DaHJvbWUgYnJvd3NlclxuICAgICAgICAgICAgLy8gdGhlbiByZW1vdmUgaXQgZnJvbSB0aGUgU0RQIGJlY2F1c2UgaWYgRmlyZWZveCBkZXRlY3RzIGl0IGluIG9mZmVyIG9yIGFuc3dlciBpdCB3aWxsIGZhaWwgdG8gY29ubmVjdFxuICAgICAgICAgICAgLy8gZHVlIGhhdmluZyAxNSBvciBtb3JlIGhlYWRlciBleHRlbnNpb25zOiBodHRwczovL21haWxhcmNoaXZlLmlldGYub3JnL2FyY2gvbXNnL3J0Y3dlYi9RUm5XTnVXekd1TFJvdldkSGtvZE5QNlZPZ2cvXG4gICAgICAgICAgICBpZiAodGhpcy5pc0ZpcmVmb3goKSkge1xuICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IGE9ZXh0bWFwOjE1IGh0dHA6Ly93d3cud2VicnRjLm9yZy9leHBlcmltZW50cy9ydHAtaGRyZXh0L2Ficy1jYXB0dXJlLXRpbWVcbiAgICAgICAgICAgICAgICBvZmZlci5zZHAgPSBvZmZlci5zZHAucmVwbGFjZSgvXmE9ZXh0bWFwOlxcZCsgaHR0cDpcXC9cXC93d3dcXC53ZWJydGNcXC5vcmdcXC9leHBlcmltZW50c1xcL3J0cC1oZHJleHRcXC9hYnMtY2FwdHVyZS10aW1lXFxyXFxuL2dtLCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEZpcmUgZXZlbnQgZm9yIHdoZW4gcmVtb3RlIG9mZmVyIGRlc2NyaXB0aW9uIGlzIHNldFxuICAgICAgICAgICAgICAgIHRoaXMub25TZXRSZW1vdGVEZXNjcmlwdGlvbihvZmZlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNMb2NhbGhvc3RDb25uZWN0aW9uID0gbG9jYXRpb24uaG9zdG5hbWUgPT09ICdsb2NhbGhvc3QnIHx8IGxvY2F0aW9uLmhvc3RuYW1lID09PSAnMTI3LjAuMC4xJztcbiAgICAgICAgICAgICAgICBjb25zdCBpc0h0dHBzQ29ubmVjdGlvbiA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgICAgICBsZXQgdXNlTWljID0gY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuVXNlTWljKTtcbiAgICAgICAgICAgICAgICBsZXQgdXNlQ2FtZXJhID0gY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuVXNlQ2FtZXJhKTtcbiAgICAgICAgICAgICAgICBpZiAoKHVzZU1pYyB8fCB1c2VDYW1lcmEpICYmICEoaXNMb2NhbGhvc3RDb25uZWN0aW9uIHx8IGlzSHR0cHNDb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICB1c2VNaWMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdXNlQ2FtZXJhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcignTWljcm9waG9uZSBhbmQgV2ViY2FtIGFjY2VzcyBpbiB0aGUgYnJvd3NlciB3aWxsIG5vdCB3b3JrIGlmIHlvdSBhcmUgbm90IG9uIEhUVFBTIG9yIGxvY2FsaG9zdC4gRGlzYWJsaW5nIG1pYyBhbmQgd2ViY2FtIGFjY2Vzcy4nKTtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKFwiRm9yIHRlc3RpbmcgeW91IGNhbiBlbmFibGUgSFRUUCBtaWNyb3Bob25lIGFjY2VzcyBDaHJvbWUgYnkgdmlzaXRpbmcgY2hyb21lOi8vZmxhZ3MvIGFuZCBlbmFibGluZyAndW5zYWZlbHktdHJlYXQtaW5zZWN1cmUtb3JpZ2luLWFzLXNlY3VyZSdcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFkZCBvdXIgbGlzdCBvZiBwcmVmZXJyZWQgY29kZWNzLCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ09wdGlvbnMoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYywgdGhpcy5mdXp6eUludGVyc2VjdFVFQW5kQnJvd3NlckNvZGVjcyhvZmZlcikpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0dXBUcmFuc2NlaXZlcnNBc3luYyh1c2VNaWMsIHVzZUNhbWVyYSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgKF9hID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNyZWF0ZUFuc3dlcigpLnRoZW4oKEFuc3dlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgQW5zd2VyLnNkcCA9IHRoaXMubXVuZ2VTRFAoQW5zd2VyLnNkcCwgdXNlTWljKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2V0TG9jYWxEZXNjcmlwdGlvbihBbnN3ZXIpO1xuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25TZXRMb2NhbERlc2NyaXB0aW9uKChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jdXJyZW50TG9jYWxEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgY3JlYXRlQW5zd2VyKCkgZmFpbGVkIC0gJHtlcnJ9YCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIFJlbW90ZSBEZXNjcmlwdG9yIGZyb20gdGhlIHNpZ25hbGluZyBzZXJ2ZXIgdG8gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0gYW5zd2VyIC0gUlRDIFNlc3Npb24gRGVzY3JpcHRvciBmcm9tIHRoZSBTaWduYWxpbmcgU2VydmVyXG4gICAgICovXG4gICAgcmVjZWl2ZUFuc3dlcihhbnN3ZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2V0UmVtb3RlRGVzY3JpcHRpb24oYW5zd2VyKTtcbiAgICAgICAgLy8gQWRkIG91ciBsaXN0IG9mIHByZWZlcnJlZCBjb2RlY3MsIGluIG9yZGVyIG9mIHByZWZlcmVuY2VcbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ09wdGlvbnMoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYywgdGhpcy5mdXp6eUludGVyc2VjdFVFQW5kQnJvd3NlckNvZGVjcyhhbnN3ZXIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgQWdncmVnYXRlZCBTdGF0cyBhbmQgdGhlbiBmaXJlIGEgb25WaWRlbyBTdGF0cyBldmVudFxuICAgICAqL1xuICAgIGdlbmVyYXRlU3RhdHMoKSB7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24uZ2V0U3RhdHMoKS50aGVuKChzdGF0c0RhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWdncmVnYXRlZFN0YXRzLnByb2Nlc3NTdGF0cyhzdGF0c0RhdGEpO1xuICAgICAgICAgICAgdGhpcy5vblZpZGVvU3RhdHModGhpcy5hZ2dyZWdhdGVkU3RhdHMpO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGxhdGVuY3kgdXNpbmcgc3RhdHMgYW5kIHZpZGVvIHJlY2VpdmVycyBhbmQgdGhlbiBjYWxsIHRoZSBoYW5kbGluZyBmdW5jdGlvblxuICAgICAgICAgICAgY29uc3QgbGF0ZW5jeUluZm8gPSB0aGlzLmxhdGVuY3lDYWxjdWxhdG9yLmNhbGN1bGF0ZSh0aGlzLmFnZ3JlZ2F0ZWRTdGF0cywgdGhpcy5wZWVyQ29ubmVjdGlvbi5nZXRSZWNlaXZlcnMoKSk7XG4gICAgICAgICAgICB0aGlzLm9uTGF0ZW5jeUNhbGN1bGF0ZWQobGF0ZW5jeUluZm8pO1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwcmVmZXJyZWQgY29kZWMgc2VsZWN0aW9uIGJhc2VkIG9uIHdoYXQgd2FzIGFjdHVhbGx5IG5lZ290aWF0ZWRcbiAgICAgICAgICAgIGlmICh0aGlzLnVwZGF0ZUNvZGVjU2VsZWN0aW9uICYmICEhdGhpcy5hZ2dyZWdhdGVkU3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuY29kZWNJZCkge1xuICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgcXVhbGlmaWVkIGNvZGVjIG5hbWUgZnJvbSB0aGUgbWltZXR5cGUgYW5kIGZtdHBcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlY1N0YXRzID0gdGhpcy5hZ2dyZWdhdGVkU3RhdHMuY29kZWNzLmdldCh0aGlzLmFnZ3JlZ2F0ZWRTdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5jb2RlY0lkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZWNTdGF0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZWNTaG9ydG5hbWUgPSBjb2RlY1N0YXRzLm1pbWVUeXBlLnJlcGxhY2UoJ3ZpZGVvLycsICcnKTtcbiAgICAgICAgICAgICAgICBsZXQgZnVsbENvZGVjTmFtZSA9IGNvZGVjU2hvcnRuYW1lO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlY1N0YXRzLnNkcEZtdHBMaW5lICYmIGNvZGVjU3RhdHMuc2RwRm10cExpbmUudHJpbSgpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBmdWxsQ29kZWNOYW1lID0gYCR7Y29kZWNTaG9ydG5hbWV9ICR7Y29kZWNTdGF0cy5zZHBGbXRwTGluZS50cmltKCl9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYWxsQnJvd3NlckNvZGVjcyA9IHRoaXMuY29uZmlnLmdldFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYykub3B0aW9ucztcbiAgICAgICAgICAgICAgICAvLyBUaGUgbGlzdCBvZiBjb2RlY3MgZGlyZWN0bHkgY29udGFpbnMgdGhlIG9uZSB0aGF0IHdhcyBuZWdvdGlhdGVkLCBzZWxlY3QgdGhhdFxuICAgICAgICAgICAgICAgIGlmIChhbGxCcm93c2VyQ29kZWNzLmluY2x1ZGVzKGZ1bGxDb2RlY05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE9wdGlvblNldHRpbmdWYWx1ZShPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjLCBmdWxsQ29kZWNOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBtYXRjaCBvbiB0aGUgZnVsbCBuYW1lLCB0cnkgdG8gbWF0Y2ggb24ganVzdCB0aGUgY29kZWMgc2hvcnRuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRMaXN0ID0gYWxsQnJvd3NlckNvZGVjcy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmluZGV4T2YoY29kZWNTaG9ydG5hbWUpICE9PSAtMSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcmVkTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE9wdGlvblNldHRpbmdWYWx1ZShPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjLCBmaWx0ZXJlZExpc3RbMF0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgVGhlIFBlZXIgQ29ubmVjdGlvblxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy5wZWVyQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTW9kaWZ5IHRoZSBTZXNzaW9uIERlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0gc2RwIC0gU2Vzc2lvbiBEZXNjcmlwdG9yIGFzIGEgc3RyaW5nXG4gICAgICogQHBhcmFtIHVzZU1pYyAtIElzIHRoZSBtaWNyb3Bob25lIGluIHVzZVxuICAgICAqIEByZXR1cm5zIEEgbW9kaWZpZWQgU2Vzc2lvbiBEZXNjcmlwdG9yXG4gICAgICovXG4gICAgbXVuZ2VTRFAoc2RwLCB1c2VNaWMpIHtcbiAgICAgICAgbGV0IG11bmdlZFNEUCA9IHNkcC5yZXBsYWNlKC8oYT1mbXRwOlxcZCsgLipsZXZlbC1hc3ltbWV0cnktYWxsb3dlZD0uKilcXHJcXG4vZ20sICckMTt4LWdvb2dsZS1zdGFydC1iaXRyYXRlPTEwMDAwO3gtZ29vZ2xlLW1heC1iaXRyYXRlPTEwMDAwMFxcclxcbicpO1xuICAgICAgICAvLyBzZXQgbWF4IGJpdHJhdGUgdG8gaGlnaGVzdCBiaXRyYXRlIE9wdXMgc3VwcG9ydHNcbiAgICAgICAgbGV0IGF1ZGlvU0RQID0gJ21heGF2ZXJhZ2ViaXRyYXRlPTUxMDAwMDsnO1xuICAgICAgICBpZiAodXNlTWljKSB7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIG1heCBjYXB0dXJlIHJhdGUgdG8gNDhraHogKHNvIHdlIGNhbiBzZW5kIGhpZ2ggcXVhbGl0eSBhdWRpbyBmcm9tIG1pYylcbiAgICAgICAgICAgIGF1ZGlvU0RQICs9ICdzcHJvcC1tYXhjYXB0dXJlcmF0ZT00ODAwMDsnO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvcmNlIG1vbm8gb3Igc3RlcmVvIGJhc2VkIG9uIHdoZXRoZXIgP2ZvcmNlTW9ubyB3YXMgcGFzc2VkIG9yIG5vdFxuICAgICAgICBhdWRpb1NEUCArPSB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkZvcmNlTW9ub0F1ZGlvKSA/ICdzdGVyZW89MDsnIDogJ3N0ZXJlbz0xOyc7XG4gICAgICAgIC8vIGVuYWJsZSBpbi1iYW5kIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiBmb3Igb3B1cyBhdWRpb1xuICAgICAgICBhdWRpb1NEUCArPSAndXNlaW5iYW5kZmVjPTEnO1xuICAgICAgICAvLyBXZSB1c2UgdGhlIGxpbmUgJ3VzZWluYmFuZGZlYz0xJyAod2hpY2ggT3B1cyB1c2VzKSB0byBzZXQgb3VyIE9wdXMgc3BlY2lmaWMgYXVkaW8gcGFyYW1ldGVycy5cbiAgICAgICAgbXVuZ2VkU0RQID0gbXVuZ2VkU0RQLnJlcGxhY2UoJ3VzZWluYmFuZGZlYz0xJywgYXVkaW9TRFApO1xuICAgICAgICAvLyBBZGQgYWJzLWNhcHR1cmUtdGltZSBSVFAgaGVhZGVyIGV4dGVuc2lvbiBpZiB3ZSBoYXZlIGVuYWJsZWQgdGhlIHNldHRpbmcuXG4gICAgICAgIC8vIE5vdGU6IEFzIGF0IEZlYiAyMDI1LCBDaHJvbWl1bSBiYXNlZCBicm93c2VycyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHN1cHBvcnQgdGhpcyBhbmRcbiAgICAgICAgLy8gbXVuZ2luZyBpdCBpbnRvIHRoZSBhbnN3ZXIgaW4gRmlyZWZveCB3aWxsIGNhdXNlIHRoZSBjb25uZWN0aW9uIHRvIGZhaWwuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkVuYWJsZUNhcHR1cmVUaW1lRXh0KSAmJiAhdGhpcy5pc0ZpcmVmb3goKSkge1xuICAgICAgICAgICAgbXVuZ2VkU0RQID0gU0RQVXRpbHMuYWRkVmlkZW9IZWFkZXJFeHRlbnNpb25Ub1NkcChtdW5nZWRTRFAsIGtBYnNDYXB0dXJlVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG11bmdlZFNEUDtcbiAgICB9XG4gICAgaXNGaXJlZm94KCkge1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIGEgSWNlIENhbmRpZGF0ZSBpcyByZWNlaXZlZCBhZGQgdG8gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0gaWNlQ2FuZGlkYXRlIC0gUlRDIEljZSBDYW5kaWRhdGUgZnJvbSB0aGUgU2lnbmFsaW5nIFNlcnZlclxuICAgICAqL1xuICAgIGhhbmRsZU9uSWNlKGljZUNhbmRpZGF0ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIExvZ2dlci5JbmZvKCdwZWVyY29ubmVjdGlvbiBoYW5kbGVPbkljZScpO1xuICAgICAgICAvLyAvLyBpZiBmb3JjaW5nIFRVUk4sIHJlamVjdCBhbnkgY2FuZGlkYXRlcyBub3QgcmVsYXlcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuRm9yY2VUVVJOKSkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgbm8gcmVsYXkgYWRkcmVzcyBpcyBmb3VuZCwgaWYgc28sIHdlIGFyZSBhc3N1bWluZyBpdCBtZWFucyBubyBUVVJOIHNlcnZlclxuICAgICAgICAgICAgaWYgKGljZUNhbmRpZGF0ZS5jYW5kaWRhdGUuaW5kZXhPZigncmVsYXknKSA8IDApIHtcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbyhgRHJvcHBpbmcgY2FuZGlkYXRlIGJlY2F1c2UgaXQgd2FzIG5vdCBUVVJOIHJlbGF5LiB8IFR5cGU9ICR7aWNlQ2FuZGlkYXRlLnR5cGV9IHwgUHJvdG9jb2w9ICR7aWNlQ2FuZGlkYXRlLnByb3RvY29sfSB8IEFkZHJlc3M9JHtpY2VDYW5kaWRhdGUuYWRkcmVzc30gfCBQb3J0PSR7aWNlQ2FuZGlkYXRlLnBvcnR9IHxgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKF9hID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFkZEljZUNhbmRpZGF0ZShpY2VDYW5kaWRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBSVEMgUGVlciBDb25uZWN0aW9uIFNpZ25hbGluZyBzZXJ2ZXIgc3RhdGUgQ2hhbmdlc1xuICAgICAqIEBwYXJhbSBzdGF0ZSAtIFNpZ25hbGluZyBTZXJ2ZXIgU3RhdGUgQ2hhbmdlIEV2ZW50XG4gICAgICovXG4gICAgaGFuZGxlU2lnbmFsU3RhdGVDaGFuZ2Uoc3RhdGUpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ3NpZ25hbGluZyBzdGF0ZSBjaGFuZ2U6ICcgKyBzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB3aGVuIHRoZSBJY2UgQ29ubmVjdGlvbiBTdGF0ZSBDaGFuZ2VzXG4gICAgICogQHBhcmFtIHN0YXRlIC0gSWNlIENvbm5lY3Rpb24gU3RhdGVcbiAgICAgKi9cbiAgICBoYW5kbGVJY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2Uoc3RhdGUpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ2ljZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZTogJyArIHN0YXRlKTtcbiAgICAgICAgdGhpcy5vbkljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB3aGVuIHRoZSBJY2UgR2F0aGVyaW5nIFN0YXRlIENoYW5nZXNcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBJY2UgR2F0aGVyaW5nIFN0YXRlIENoYW5nZVxuICAgICAqL1xuICAgIGhhbmRsZUljZUdhdGhlcmluZ1N0YXRlQ2hhbmdlKHN0YXRlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdpY2UgZ2F0aGVyaW5nIHN0YXRlIGNoYW5nZTogJyArIEpTT04uc3RyaW5naWZ5KHN0YXRlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgb25UcmFjayBtZXRob2RcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgd2ViUnRjIHRyYWNrIGV2ZW50XG4gICAgICovXG4gICAgaGFuZGxlT25UcmFjayhldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuc3RyZWFtcy5sZW5ndGggPCAxIHx8IGV2ZW50LnN0cmVhbXNbMF0uaWQgPT0gJ3Byb2JhdG9yJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50cmFjay5raW5kID09ICd2aWRlbycpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9UcmFjayA9IGV2ZW50LnRyYWNrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50cmFjay5raW5kID09ICdhdWRpbycpIHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9UcmFjayA9IGV2ZW50LnRyYWNrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25UcmFjayhldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgb25QZWVySWNlQ2FuZGlkYXRlXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHBlZXIgaWNlIGNhbmRpZGF0ZVxuICAgICAqL1xuICAgIGhhbmRsZUljZUNhbmRpZGF0ZShldmVudCkge1xuICAgICAgICB0aGlzLm9uUGVlckljZUNhbmRpZGF0ZShldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgb25EYXRhQ2hhbm5lbFxuICAgICAqIEBwYXJhbSBldmVudCAtIFRoZSBwZWVyJ3MgZGF0YSBjaGFubmVsXG4gICAgICovXG4gICAgaGFuZGxlRGF0YUNoYW5uZWwoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbkRhdGFDaGFubmVsKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3ZlcnJpZGUgbWV0aG9kIGZvciBvblRyYWNrIGZvciB1c2Ugb3V0c2lkZSBvZiB0aGUgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyXG4gICAgICogQHBhcmFtIHRyYWNrRXZlbnQgLSBUaGUgd2ViUnRjIHRyYWNrIGV2ZW50XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uVHJhY2sodHJhY2tFdmVudCkge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3ZlcnJpZGUgbWV0aG9kIGZvciBvbkljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSBmb3IgdXNlIG91dHNpZGUgb2YgdGhlIFBlZXJDb25uZWN0aW9uQ29udHJvbGxlclxuICAgICAqIEBwYXJhbSBldmVudCAtIFRoZSB3ZWJSdGMgaWNlY29ubmVjdGlvbnN0YXRlY2hhbmdlIGV2ZW50XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uSWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlKGV2ZW50KSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvdmVycmlkZSBtZXRob2QgZm9yIG9uUGVlckljZUNhbmRpZGF0ZSBmb3IgdXNlIG91dHNpZGUgb2YgdGhlIFBlZXJDb25uZWN0aW9uQ29udHJvbGxlclxuICAgICAqIEBwYXJhbSBwZWVyQ29ubmVjdGlvbkljZUV2ZW50IC0gVGhlIHBlZXIgaWNlIGNhbmRpZGF0ZVxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblBlZXJJY2VDYW5kaWRhdGUocGVlckNvbm5lY3Rpb25JY2VFdmVudCkge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3ZlcnJpZGUgbWV0aG9kIGZvciBvbkRhdGFDaGFubmVsIGZvciB1c2Ugb3V0c2lkZSBvZiB0aGUgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyXG4gICAgICogQHBhcmFtIGRhdGFjaGFubmVsRXZlbnQgLSBUaGUgcGVlcidzIGRhdGEgY2hhbm5lbFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvbkRhdGFDaGFubmVsKGRhdGFjaGFubmVsRXZlbnQpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmQgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIFVFIGFuZCBicm93c2VyIGNvZGVjcywgd2l0aCBmdXp6eSBtYXRjaGluZyBpZiBzb21lIHBhcmFtZXRlcnMgYXJlIG1pc21hdGNoZWQuXG4gICAgICogQHBhcmFtIHNkcCBUaGUgcmVtb3RlIHNkcFxuICAgICAqIEByZXR1cm5zIFRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiBicm93c2VyIHN1cHBvcnRlZCBjb2RlY3MgYW5kIHVlIHN1cHBvcnRlZCBjb2RlY3MuXG4gICAgICovXG4gICAgZnV6enlJbnRlcnNlY3RVRUFuZEJyb3dzZXJDb2RlY3Moc2RwKSB7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYnVpbGQgYW4gYXJyYXkgb2YgYWxsIHN1cHBvcnRlZCBjb2RlY3Mgb24gYm90aCBzaWRlc1xuICAgICAgICBjb25zdCBhbGxTdXBwb3J0ZWRDb2RlY3MgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgY29uc3QgYWxsVUVDb2RlY3MgPSB0aGlzLnBhcnNlQXZhaWxhYmxlQ29kZWNzKHNkcCk7XG4gICAgICAgIGNvbnN0IGFsbEJyb3dzZXJDb2RlY3MgPSB0aGlzLmNvbmZpZy5nZXRTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMpLm9wdGlvbnM7XG4gICAgICAgIGZvciAoY29uc3QgdWVDb2RlYyBvZiBhbGxVRUNvZGVjcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYnJvd3NlciBjb2RlY3MgZGlyZWN0bHkgbWF0Y2hlcyBVRSBjb2RlYyAod2l0aCBwYXJhbWV0ZXJzIGFuZCBldmVyeXRoaW5nKVxuICAgICAgICAgICAgaWYgKGFsbEJyb3dzZXJDb2RlY3MuaW5jbHVkZXModWVDb2RlYykpIHtcbiAgICAgICAgICAgICAgICBhbGxTdXBwb3J0ZWRDb2RlY3MucHVzaCh1ZUNvZGVjKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBpZiBicm93c2VyIGNvZGVjIGF0IGxlYXN0IGNvbnRhaW5zIGEgbWF0Y2ggZm9yIHRoZSBVRSBjb2RlYyBuYW1lICh3aXRob3V0IHBhcmFtZXRlcnMpLlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdWVDb2RlY05hbWVBbmRQYXJhbXMgPSB1ZUNvZGVjLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdWVDb2RlY05hbWUgPSB1ZUNvZGVjTmFtZUFuZFBhcmFtc1swXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGJyb3dzZXJDb2RlYyBvZiBhbGxCcm93c2VyQ29kZWNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChicm93c2VyQ29kZWMuaW5jbHVkZXModWVDb2RlY05hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBwYXNzIGJyb3dzZXIgY29kZWMgaGVyZSBhcyB0aGV5IG9wdGlvbiBjb250YWluIGV4dHJhIHBhcmFtZXRlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxTdXBwb3J0ZWRDb2RlY3MucHVzaChicm93c2VyQ29kZWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFsbFN1cHBvcnRlZENvZGVjcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0dXAgdHJhY2tzIG9uIHRoZSBSVEMgUGVlciBDb25uZWN0aW9uXG4gICAgICogQHBhcmFtIHVzZU1pYyAtIGlzIG1pYyBpbiB1c2VcbiAgICAgKiBAcGFyYW0gdXNlQ2FtZXJhIC0gaXMgd2ViY2FtIGluIHVzZVxuICAgICAqL1xuICAgIHNldHVwVHJhbnNjZWl2ZXJzQXN5bmModXNlTWljLCB1c2VDYW1lcmEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2g7XG4gICAgICAgICAgICBsZXQgaGFzVmlkZW9SZWNlaXZlciA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0cmFuc2NlaXZlciBvZiAoX2IgPSAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0VHJhbnNjZWl2ZXJzKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zY2VpdmVyICYmXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyICYmXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrICYmXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrLmtpbmQgPT09ICd2aWRlbycpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzVmlkZW9SZWNlaXZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldHVwIGEgdHJhbnNjZWl2ZXIgZm9yIHNlbmRpbmcgd2ViY2FtIHZpZGVvIHRvIFVFIGFuZCByZWNlaXZpbmcgdmlkZW8gZnJvbSBVRVxuICAgICAgICAgICAgaWYgKCF1c2VDYW1lcmEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc1ZpZGVvUmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgKF9jID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmFkZFRyYW5zY2VpdmVyKCd2aWRlbycsIHsgZGlyZWN0aW9uOiAncmVjdm9ubHknIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc2V0dXBWaWRlb1NlbmRlcihoYXNWaWRlb1JlY2VpdmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMgJiYgdGhpcy5wcmVmZXJyZWRDb2RlYyAhPSAnJykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdHJhbnNjZWl2ZXIgb2YgKF9lID0gKF9kID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmdldFRyYW5zY2VpdmVycygpKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBbXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlci50cmFjayAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sua2luZCA9PT0gJ3ZpZGVvJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2V0Q29kZWNQcmVmZXJlbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IG91ciBwcmVmZXJyZWQgY29kZWMgZnJvbSB0aGUgY29kZWNzIG9wdGlvbnMgZHJvcCBkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmVmZXJyZWRSVFBDb2RlYyA9IHRoaXMucHJlZmVycmVkQ29kZWMuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZlcnJlZFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZTogJ3ZpZGVvLycgKyBwcmVmZXJyZWRSVFBDb2RlY1swXSAvKiBOYW1lICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrUmF0ZTogOTAwMDAgLyogQWxsIGN1cnJlbnQgdmlkZW8gZm9ybWF0cyBpbiBicm93c2VycyBoYXZlIDkwa2h6IGNsb2NrIHJhdGUgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RwRm10cExpbmU6IHByZWZlcnJlZFJUUENvZGVjWzFdID8gcHJlZmVycmVkUlRQQ29kZWNbMV0gOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIGEgbGlzdCBvZiBjb2RlY3Mgd2Ugd2lsbCBzdXBwb3J0IHdpdGggb3VyIHByZWZlcnJlZCBvbmUgaW4gdGhlIGZpcnN0IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXJTdXBwb3J0ZWRDb2RlY3MgPSBbcHJlZmVycmVkUlRDUnRwQ29kZWNDYXBhYmlsaXR5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIGNvZGVjcyB0aGUgYnJvd3NlciBzdXBwb3J0cyBhbmQgYWRkIHRoZW0gdG8gdGhlIGxpc3QgKGluIGFueSBvcmRlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIFJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcygndmlkZW8nKS5jb2RlY3MuZm9yRWFjaCgoYnJvd3NlclN1cHBvcnRlZENvZGVjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWRkIG91ciBwcmVmZXJyZWQgY29kZWMgYWdhaW4sIGJ1dCBhZGQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyb3dzZXJTdXBwb3J0ZWRDb2RlYy5taW1lVHlwZSAhPSBwcmVmZXJyZWRSVENSdHBDb2RlY0NhcGFiaWxpdHkubWltZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyU3VwcG9ydGVkQ29kZWNzLnB1c2goYnJvd3NlclN1cHBvcnRlZENvZGVjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGJyb3dzZXJTdXBwb3J0ZWRDb2RlYyA9PT0gbnVsbCB8fCBicm93c2VyU3VwcG9ydGVkQ29kZWMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJyb3dzZXJTdXBwb3J0ZWRDb2RlYy5zZHBGbXRwTGluZSkgIT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZWZlcnJlZFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSA9PT0gbnVsbCB8fCBwcmVmZXJyZWRSVENSdHBDb2RlY0NhcGFiaWxpdHkgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByZWZlcnJlZFJUQ1J0cENvZGVjQ2FwYWJpbGl0eS5zZHBGbXRwTGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyU3VwcG9ydGVkQ29kZWNzLnB1c2goYnJvd3NlclN1cHBvcnRlZENvZGVjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29kZWMgb2Ygb3VyU3VwcG9ydGVkQ29kZWNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlYyA9PT0gbnVsbCB8fCBjb2RlYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29kZWMuc2RwRm10cExpbmUpID09PSB1bmRlZmluZWQgfHwgY29kZWMuc2RwRm10cExpbmUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGR5bmFtaWNhbGx5IGFkZCBtZW1iZXJzIHRvIHRoZSBjb2RlYywgc28gaW5zdGVhZCByZW1vdmUgdGhlIGZpZWxkIGlmIGl0J3MgZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvZGVjLnNkcEZtdHBMaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNldENvZGVjUHJlZmVyZW5jZXMob3VyU3VwcG9ydGVkQ29kZWNzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBoYXNBdWRpb1JlY2VpdmVyID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRyYW5zY2VpdmVyIG9mIChfZyA9IChfZiA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi5nZXRUcmFuc2NlaXZlcnMoKSkgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogW10pIHtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sgJiZcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sua2luZCA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgICAgICAgICBoYXNBdWRpb1JlY2VpdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0dXAgYSB0cmFuc2NlaXZlciBmb3Igc2VuZGluZyBtaWMgYXVkaW8gdG8gVUUgYW5kIHJlY2VpdmluZyBhdWRpbyBmcm9tIFVFXG4gICAgICAgICAgICBpZiAoIXVzZU1pYykge1xuICAgICAgICAgICAgICAgIGlmICghaGFzQXVkaW9SZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAoX2ggPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfaCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2guYWRkVHJhbnNjZWl2ZXIoJ2F1ZGlvJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAncmVjdm9ubHknXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc2V0dXBBdWRpb1NlbmRlcihoYXNBdWRpb1JlY2VpdmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldHVwVmlkZW9TZW5kZXIoaGFzVmlkZW9SZWNlaXZlcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBtZWRpYSBzZW5kIG9wdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhU2VuZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdmlkZW86IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBOb3RlIHVzaW5nIHdlYmNhbSBvbiBhbmRyb2lkIGNocm9tZSByZXF1aXJlcyBTU0wgb3IgY2hyb21lOi8vZmxhZ3MvIFwidW5zYWZlbHktdHJlYXQtaW5zZWN1cmUtb3JpZ2luLWFzLXNlY3VyZVwiXG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSB5aWVsZCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShtZWRpYVNlbmRPcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzVmlkZW9SZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYW5zY2VpdmVyIG9mIChfYiA9IChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRUcmFuc2NlaXZlcnMoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSVENVdGlscy5jYW5UcmFuc2NlaXZlclJlY2VpdmVWaWRlbyh0cmFuc2NlaXZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNrIG9mIHN0cmVhbS5nZXRUcmFja3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sua2luZCAmJiB0cmFjay5raW5kID09ICd2aWRlbycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlci5yZXBsYWNlVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIuZGlyZWN0aW9uID0gJ3NlbmRyZWN2JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0cmFjayBvZiBzdHJlYW0uZ2V0VHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay5raW5kICYmIHRyYWNrLmtpbmQgPT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfYyA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5hZGRUcmFuc2NlaXZlcih0cmFjaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdzZW5kcmVjdidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghaGFzVmlkZW9SZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAoX2QgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuYWRkVHJhbnNjZWl2ZXIoJ3ZpZGVvJywgeyBkaXJlY3Rpb246ICdyZWN2b25seScgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0dXBBdWRpb1NlbmRlcihoYXNBdWRpb1JlY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIGF1ZGlvIG9wdGlvbnMgYmFzZWQgb24gbWljIHVzYWdlXG4gICAgICAgICAgICBjb25zdCBhdWRpb09wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgYXV0b0dhaW5Db250cm9sOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQ6IDEsXG4gICAgICAgICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgICAgICBub2lzZVN1cHByZXNzaW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzYW1wbGVSYXRlOiA0ODAwMCxcbiAgICAgICAgICAgICAgICBzYW1wbGVTaXplOiAxNixcbiAgICAgICAgICAgICAgICB2b2x1bWU6IDEuMFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIHNldCB0aGUgbWVkaWEgc2VuZCBvcHRpb25zXG4gICAgICAgICAgICBjb25zdCBtZWRpYVNlbmRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHZpZGVvOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhdWRpbzogYXVkaW9PcHRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gTm90ZSB1c2luZyBtaWMgb24gYW5kcm9pZCBjaHJvbWUgcmVxdWlyZXMgU1NMIG9yIGNocm9tZTovL2ZsYWdzLyBcInVuc2FmZWx5LXRyZWF0LWluc2VjdXJlLW9yaWdpbi1hcy1zZWN1cmVcIlxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0geWllbGQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobWVkaWFTZW5kT3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0F1ZGlvUmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0cmFuc2NlaXZlciBvZiAoX2IgPSAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ2V0VHJhbnNjZWl2ZXJzKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUlRDVXRpbHMuY2FuVHJhbnNjZWl2ZXJSZWNlaXZlQXVkaW8odHJhbnNjZWl2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0cmFjayBvZiBzdHJlYW0uZ2V0VHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLmtpbmQgJiYgdHJhY2sua2luZCA9PSAnYXVkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIucmVwbGFjZVRyYWNrKHRyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9ICdzZW5kcmVjdic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdHJhY2sgb2Ygc3RyZWFtLmdldFRyYWNrcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sua2luZCAmJiB0cmFjay5raW5kID09ICdhdWRpbycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX2MgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuYWRkVHJhbnNjZWl2ZXIodHJhY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnc2VuZHJlY3YnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0F1ZGlvUmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgKF9kID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmFkZFRyYW5zY2VpdmVyKCdhdWRpbycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ3JlY3Zvbmx5J1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbmQgb3ZlcnJpZGUgZXZlbnQgZm9yIHdoZW4gdGhlIHZpZGVvIHN0YXRzIGFyZSBmaXJlZFxuICAgICAqIEBwYXJhbSBldmVudCAtIEFnZ3JlZ2F0ZWQgU3RhdHNcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25WaWRlb1N0YXRzKGV2ZW50KSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbmQgb3ZlcnJpZGUgZXZlbnQgZm9yIHdoZW4gbGF0ZW5jeSBpbmZvIGlzIGNhbGN1bGF0ZWRcbiAgICAgKiBAcGFyYW0gbGF0ZW5jeUluZm8gLSBDYWxjdWxhdGVkIGxhdGVuY3kgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uTGF0ZW5jeUNhbGN1bGF0ZWQobGF0ZW5jeUluZm8pIHtcbiAgICAgICAgLy8gRGVmYXVsdCBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV2ZW50IHRvIHNlbmQgdGhlIFJUQyBvZmZlciB0byB0aGUgU2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEBwYXJhbSBvZmZlciAtIFJUQyBPZmZlclxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblNlbmRXZWJSVENPZmZlcihvZmZlcikge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZlbnQgZmlyZWQgd2hlbiByZW1vdGUgb2ZmZXIgZGVzY3JpcHRpb24gaXMgc2V0LlxuICAgICAqIEBwYXJhbSBvZmZlciAtIFJUQyBPZmZlclxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblNldFJlbW90ZURlc2NyaXB0aW9uKG9mZmVyKSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmVudCBmaXJlIHdoZW4gbG9jYWwgZGVzY3JpcHRpb24gYW5zd2VyIGlzIHNldC5cbiAgICAgKiBAcGFyYW0gYW5zd2VyIC0gUlRDIEFuc3dlclxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblNldExvY2FsRGVzY3JpcHRpb24oYW5zd2VyKSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvdmVycmlkZSBmb3Igc2hvd2luZyB0aGUgUGVlciBjb25uZWN0aW9uIGNvbm5lY3RpbmcgT3ZlcmxheVxuICAgICAqL1xuICAgIHNob3dUZXh0T3ZlcmxheUNvbm5lY3RpbmcoKSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvdmVycmlkZSBmb3Igc2hvd2luZyB0aGUgUGVlciBjb25uZWN0aW9uIEZhaWxlZCBvdmVybGF5XG4gICAgICovXG4gICAgc2hvd1RleHRPdmVybGF5U2V0dXBGYWlsdXJlKCkge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgcGFyc2VBdmFpbGFibGVDb2RlY3MocnRjU2Vzc2lvbkRlc2NyaXB0aW9uKSB7XG4gICAgICAgIC8vIE5vIHBvaW50IGluIHVwZGF0aW5nIHRoZSBhdmFpbGFibGUgY29kZWNzIGlmIG9uIEZGXG4gICAgICAgIGlmICghUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzKVxuICAgICAgICAgICAgcmV0dXJuIFsnT25seSBhdmFpbGFibGUgb24gQ2hyb21lJ107XG4gICAgICAgIGNvbnN0IHVlU3VwcG9ydGVkQ29kZWNzID0gW107XG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gc3BsaXRTZWN0aW9ucyhydGNTZXNzaW9uRGVzY3JpcHRpb24uc2RwKTtcbiAgICAgICAgLy8gZGlzY2FyZCB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBhcyB3ZSBvbmx5IHdhbnQgbWVkaWEgcmVsYXRlZCBpbmZvXG4gICAgICAgIHNlY3Rpb25zLnNoaWZ0KCk7XG4gICAgICAgIHNlY3Rpb25zLmZvckVhY2goKG1lZGlhU2VjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb2RlY3MgfSA9IHBhcnNlUnRwUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24pO1xuICAgICAgICAgICAgLy8gRmlsdGVyIG9ubHkgZm9yIFZQWCAvIEgyNlggLyBBVjFcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXIgPSAvKFZQXFxkfEgyNlxcZHxBVjEpLiovO1xuICAgICAgICAgICAgY29kZWNzLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHIgPSBjLm5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjLnBhcmFtZXRlcnMgfHwge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwKSA9PiBwICsgJz0nICsgYy5wYXJhbWV0ZXJzW3BdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJzsnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG1hdGNoZXIuZXhlYyhzdHIpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYy5uYW1lID09ICdWUDknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVRSBhbnN3ZXJzIGRvbid0IHNwZWNpZnkgcHJvZmlsZSBidXQgd2Uga25vdyB3ZSB3YW50IHByb2ZpbGUgMFxuICAgICAgICAgICAgICAgICAgICAgICAgYy5wYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9maWxlLWlkJzogJzAnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVjU3RyID0gYy5uYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjLnBhcmFtZXRlcnMgfHwge30pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocCkgPT4gcCArICc9JyArIGMucGFyYW1ldGVyc1twXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignOycpO1xuICAgICAgICAgICAgICAgICAgICB1ZVN1cHBvcnRlZENvZGVjcy5wdXNoKGNvZGVjU3RyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB1ZVN1cHBvcnRlZENvZGVjcztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogU2Vzc2lvbiBzdGF0aXN0aWNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2Vzc2lvblN0YXRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIENsYXNzIHRvIGhvbGQgdGhlIHN0cmVhbSBzdGF0cyBkYXRhIGNvbWluZyBpbiBmcm9tIHdlYlJ0Y1xuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtU3RhdHMge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyZWFtU3RhdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IE9wdGlvblBhcmFtZXRlcnMgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnJztcbmltcG9ydCB7IFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIgfSBmcm9tICcuLi9XZWJSdGNQbGF5ZXIvV2ViUnRjUGxheWVyQ29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGFncywgTnVtZXJpY1BhcmFtZXRlcnMgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IFBpeGVsU3RyZWFtaW5nRXZlbnRFbWl0dGVyLCBJbml0aWFsU2V0dGluZ3NFdmVudCwgTGF0ZW5jeUNhbGN1bGF0ZWRFdmVudCwgTGF0ZW5jeVRlc3RSZXN1bHRFdmVudCwgU3RhdHNSZWNlaXZlZEV2ZW50LCBTdHJlYW1Mb2FkaW5nRXZlbnQsIFN0cmVhbVByZUNvbm5lY3RFdmVudCwgU3RyZWFtUmVjb25uZWN0RXZlbnQsIFN0cmVhbVByZURpc2Nvbm5lY3RFdmVudCwgVmlkZW9FbmNvZGVyQXZnUVBFdmVudCwgVmlkZW9Jbml0aWFsaXplZEV2ZW50LCBXZWJSdGNBdXRvQ29ubmVjdEV2ZW50LCBXZWJSdGNDb25uZWN0ZWRFdmVudCwgV2ViUnRjQ29ubmVjdGluZ0V2ZW50LCBXZWJSdGNEaXNjb25uZWN0ZWRFdmVudCwgV2ViUnRjRmFpbGVkRXZlbnQsIFdlYlJ0Y1NkcEV2ZW50LCBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2VFdmVudCwgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdEV2ZW50LCBQbGF5ZXJDb3VudEV2ZW50LCBXZWJSdGNUQ1BSZWxheURldGVjdGVkRXZlbnQsIFN1YnNjcmliZUZhaWxlZEV2ZW50LCBXZWJSdGNTZHBPZmZlckV2ZW50LCBXZWJSdGNTZHBBbnN3ZXJFdmVudCB9IGZyb20gJy4uL1V0aWwvRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IFdlYlhSQ29udHJvbGxlciB9IGZyb20gJy4uL1dlYlhSL1dlYlhSQ29udHJvbGxlcic7XG5pbXBvcnQgeyBNZXNzYWdlRGlyZWN0aW9uIH0gZnJvbSAnLi4vVWVJbnN0YW5jZU1lc3NhZ2UvU3RyZWFtTWVzc2FnZUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdENvbnRyb2xsZXIgfSBmcm9tICcuLi9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udHJvbGxlcic7XG5pbXBvcnQgeyBSVENVdGlscyB9IGZyb20gJy4uL1V0aWwvUlRDVXRpbHMnO1xuaW1wb3J0IHsgSVVSTFNlYXJjaFBhcmFtcyB9IGZyb20gJy4uL1V0aWwvSVVSTFNlYXJjaFBhcmFtcyc7XG4vKipcbiAqIFRoZSBrZXkgY2xhc3MgZm9yIHRoZSBicm93c2VyIHNpZGUgb2YgYSBQaXhlbCBTdHJlYW1pbmcgYXBwbGljYXRpb24sIGl0IGluY2x1ZGVzOlxuICogV2ViUlRDIGhhbmRsaW5nLCBYUiBzdXBwb3J0LCBpbnB1dCBoYW5kbGluZywgYW5kIGVtaXR0ZXJzIGZvciBsaWZldGltZSBhbmQgc3RhdGUgY2hhbmdlIGV2ZW50cy5cbiAqIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIGNsYXNzIGFzIGlzLCB0aHJvdWdoIGNvbXBvc2l0aW9uLCBvciBleHRlbmQgaXQuIEluIGFueSBjYXNlLFxuICogdGhpcyB3aWxsIGxpa2VseSBiZSB0aGUgY29yZSBvZiB5b3VyIFBpeGVsIFN0cmVhbWluZyBleHBlcmllbmNlIGluIHRlcm1zIG9mIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXhlbFN0cmVhbWluZyB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbmZpZyAtIEEgbmV3bHkgaW5zdGFudGlhdGVkIGNvbmZpZyBvYmplY3RcbiAgICAgKiBAcGFyYW0gb3ZlcnJpZGVzIC0gUGFyYW1ldGVycyB0byBvdmVycmlkZSBkZWZhdWx0IGJlaGF2aW91clxuICAgICAqIHJldHVybnMgdGhlIGJhc2UgUGl4ZWwgc3RyZWFtaW5nIG9iamVjdFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgb3ZlcnJpZGVzKSB7XG4gICAgICAgIHRoaXMuYWxsb3dDb25zb2xlQ29tbWFuZHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIGlmIChvdmVycmlkZXMgPT09IG51bGwgfHwgb3ZlcnJpZGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvdmVycmlkZXMudmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLl92aWRlb0VsZW1lbnRQYXJlbnQgPSBvdmVycmlkZXMudmlkZW9FbGVtZW50UGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlciA9IG5ldyBQaXhlbFN0cmVhbWluZ0V2ZW50RW1pdHRlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZVNldHRpbmdzKCk7XG4gICAgICAgIC8vIHNldHVwIFdlYlJUQ1xuICAgICAgICB0aGlzLnNldFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIobmV3IFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIodGhpcy5jb25maWcsIHRoaXMpKTtcbiAgICAgICAgdGhpcy5fd2ViWHJDb250cm9sbGVyID0gbmV3IFdlYlhSQ29udHJvbGxlcih0aGlzLl93ZWJSdGNDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5fc2V0dXBXZWJSdGNUQ1BSZWxheURldGVjdGlvbiA9IHRoaXMuX3NldHVwV2ViUnRjVENQUmVsYXlEZXRlY3Rpb24uYmluZCh0aGlzKTtcbiAgICAgICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgd2ViUnRjQ29ubmVjdGVkIGV2ZW50XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5hZGRFdmVudExpc3RlbmVyKCd3ZWJSdGNDb25uZWN0ZWQnLCAoXykgPT4ge1xuICAgICAgICAgICAgLy8gQmluZCB0byB0aGUgc3RhdHMgcmVjZWl2ZWQgZXZlbnRcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5hZGRFdmVudExpc3RlbmVyKCdzdGF0c1JlY2VpdmVkJywgdGhpcy5fc2V0dXBXZWJSdGNUQ1BSZWxheURldGVjdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHZpZGVvIHN0cmVhbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldCB2aWRlb0VsZW1lbnRQYXJlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLl92aWRlb0VsZW1lbnRQYXJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvRWxlbWVudFBhcmVudC5pZCA9ICd2aWRlb0VsZW1lbnRQYXJlbnQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl92aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGUgc2V0dGluZ3Mgd2l0aCBvbiBjaGFuZ2UgbGlzdGVuZXJzIGFuZCBhbnkgYWRkaXRpb25hbCBwZXIgZXhwZXJpZW5jZSBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBjb25maWd1cmVTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihGbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyLCAod2FudHNRdWFsaXR5Q29udHJvbGxlcikgPT4ge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHNldHRpbmcgaGFzIGJlZW4gc2V0IHRvIHRydWUgKGVpdGhlciBwcm9ncmFtbWF0aWNhbGx5IG9yIHRoZSB1c2VyIGhhcyBmbGlja2VkIHRoZSB0b2dnbGUpXG4gICAgICAgICAgICAvLyBhbmQgd2UgYXJlbid0IGN1cnJlbnRseSBxdWFsaXR5IGNvbnRyb2xsZXIsIHNlbmQgdGhlIHJlcXVlc3RcbiAgICAgICAgICAgIGlmICh3YW50c1F1YWxpdHlDb250cm9sbGVyID09PSB0cnVlICYmICF0aGlzLl93ZWJSdGNDb250cm9sbGVyLmlzUXVhbGl0eUNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRSZXF1ZXN0UXVhbGl0eUNvbnRyb2xPd25lcnNoaXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuQUZLRGV0ZWN0aW9uLCAoaXNBRktFbmFibGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldEFma0VuYWJsZWQoaXNBRktFbmFibGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb24sICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIudXBkYXRlVmlkZW9TdHJlYW1TaXplKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEZsYWdzLkhvdmVyaW5nTW91c2VNb2RlLCAoaXNIb3ZlcmluZ01vdXNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXRGbGFnTGFiZWwoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUsIGBDb250cm9sIFNjaGVtZTogJHtpc0hvdmVyaW5nTW91c2UgPyAnSG92ZXJpbmcnIDogJ0xvY2tlZCd9IE1vdXNlYCk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldE1vdXNlSW5wdXRFbmFibGVkKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuTW91c2VJbnB1dCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gdXNlciBpbnB1dFxuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEZsYWdzLktleWJvYXJkSW5wdXQsIChpc0VuYWJsZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0S2V5Ym9hcmRJbnB1dEVuYWJsZWQoaXNFbmFibGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuTW91c2VJbnB1dCwgKGlzRW5hYmxlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZXRNb3VzZUlucHV0RW5hYmxlZChpc0VuYWJsZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihGbGFncy5GYWtlTW91c2VXaXRoVG91Y2hlcywgKF9pc0Zha2VNb3VzZUVuYWJsZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0VG91Y2hJbnB1dEVuYWJsZWQodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Ub3VjaElucHV0KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEZsYWdzLlRvdWNoSW5wdXQsIChpc0VuYWJsZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0VG91Y2hJbnB1dEVuYWJsZWQoaXNFbmFibGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuR2FtZXBhZElucHV0LCAoaXNFbmFibGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldEdhbWVQYWRJbnB1dEVuYWJsZWQoaXNFbmFibGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGRpcmVjdCBxcCBzZXR0aW5nc1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5NaW5RUCwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0gIFNlbmRpbmcgTWluUVAgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRFbmNvZGVyTWluUVAobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIGNvbnN0IHF1YWxpdHkgPSBNYXRoLnRydW5jKDEwMCAqICgxIC0gbmV3VmFsdWUgLyA1MSkpO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCwgcXVhbGl0eSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5NYXhRUCwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0gIFNlbmRpbmcgTWF4UVAgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRFbmNvZGVyTWF4UVAobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIGNvbnN0IHF1YWxpdHkgPSBNYXRoLnRydW5jKDEwMCAqICgxIC0gbmV3VmFsdWUgLyA1MSkpO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbiwgcXVhbGl0eSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBkaXJlY3QgcXVhbGl0eSBmYWN0b3Igc2V0dGluZ3NcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uTnVtZXJpY1NldHRpbmdDaGFuZ2VkTGlzdGVuZXIoTnVtZXJpY1BhcmFtZXRlcnMuTWluUXVhbGl0eSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0gIFNlbmRpbmcgTWluUXVhbGl0eSAgLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZEVuY29kZXJNaW5RdWFsaXR5KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluLCBuZXdWYWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5LCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyBNYXhRdWFsaXR5ICAtLS0tLS0tLScpO1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kRW5jb2Rlck1heFF1YWxpdHkobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgsIG5ld1ZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIG5ldyBxdWFsaXR5IHZhbHVlIHRoYXQgZ2V0cyBzY2FsZWQgdG8gcXAgZm9yIGxlZ2FjeSByZWFzb25zXG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4sIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSA1MSAtIChuZXdWYWx1ZSAvIDEwMCkgKiA1MTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyBNaW5RUCBmcm9tIHF1YWxpdHkgdmFsdWUgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRFbmNvZGVyTWF4UVAobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSA1MSAtIChuZXdWYWx1ZSAvIDEwMCkgKiA1MTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyBNYXhRUCBmcm9tIHF1YWxpdHkgdmFsdWUgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRFbmNvZGVyTWluUVAobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFdlYlJUQyBzZXR0aW5nc1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyB3ZWIgcnRjIHNldHRpbmdzICAtLS0tLS0tLScpO1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kV2ViUlRDTWluQml0cmF0ZShuZXdWYWx1ZSAqIDEwMDAgLyoga2JwcyB0byBicHMgKi8pO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tICBTZW5kaW5nIHdlYiBydGMgc2V0dGluZ3MgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRXZWJSVENNYXhCaXRyYXRlKG5ld1ZhbHVlICogMTAwMCAvKiBrYnBzIHRvIGJwcyAqLyk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uTnVtZXJpY1NldHRpbmdDaGFuZ2VkTGlzdGVuZXIoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyB3ZWIgcnRjIHNldHRpbmdzICAtLS0tLS0tLScpO1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kV2ViUlRDRnBzKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25PcHRpb25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldFByZWZlcnJlZENvZGVjKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9yZWdpc3Rlck9uQ2hhbmdlRXZlbnRzKHRoaXMuX2V2ZW50RW1pdHRlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgaW5wdXQgY29udHJvbCBvd25lcnNoaXBcbiAgICAgKiBAcGFyYW0gaW5wdXRDb250cm9sT3duZXJzaGlwIC0gZG9lcyB0aGUgdXNlciBoYXZlIGlucHV0IGNvbnRyb2wgb3duZXJzaGlwXG4gICAgICovXG4gICAgX29uSW5wdXRDb250cm9sT3duZXJzaGlwKGlucHV0Q29udHJvbE93bmVyc2hpcCkge1xuICAgICAgICB0aGlzLl9pbnB1dENvbnRyb2xsZXIgPSBpbnB1dENvbnRyb2xPd25lcnNoaXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc3RhbnRpYXRlIHRoZSBXZWJSVENQbGF5ZXJDb250cm9sbGVyIGludGVyZmFjZSB0byBwcm92aWRlIFdlYlJUQ1BsYXllckNvbnRyb2xsZXIgZnVuY3Rpb25hbGl0eSB3aXRoaW4gdGhpcyBjbGFzcyBhbmQgc2V0IHVwIGFueXRoaW5nIHRoYXQgcmVxdWlyZXMgaXRcbiAgICAgKiBAcGFyYW0gd2ViUnRjUGxheWVyQ29udHJvbGxlciAtIGEgV2ViUnRjUGxheWVyQ29udHJvbGxlciBjb250cm9sbGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0V2ViUnRjUGxheWVyQ29udHJvbGxlcih3ZWJSdGNQbGF5ZXJDb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIgPSB3ZWJSdGNQbGF5ZXJDb250cm9sbGVyO1xuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldFByZWZlcnJlZENvZGVjKHRoaXMuY29uZmlnLmdldFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYykuc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgICAgIC8vIGNvbm5lY3QgaWYgYXV0byBjb25uZWN0IGZsYWcgaXMgZW5hYmxlZFxuICAgICAgICB0aGlzLmNoZWNrRm9yQXV0b0Nvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byBzaWduYWxpbmcgc2VydmVyLlxuICAgICAqL1xuICAgIGNvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTdHJlYW1QcmVDb25uZWN0RXZlbnQoKSk7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuY29ubmVjdFRvU2lnbmFsbGluZ1NlcnZlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWNvbm5lY3RzIHRvIHRoZSBzaWduYWxpbmcgc2VydmVyLiBJZiBjb25uZWN0aW9uIGlzIHVwLCBkaXNjb25uZWN0cyBmaXJzdFxuICAgICAqIGJlZm9yZSBlc3RhYmxpc2hpbmcgYSBuZXcgY29ubmVjdGlvblxuICAgICAqL1xuICAgIHJlY29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFN0cmVhbVJlY29ubmVjdEV2ZW50KCkpO1xuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnRyeVJlY29ubmVjdCgnUmVjb25uZWN0aW5nLi4uJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgc2lnbmFsaW5nIHNlcnZlciBhbmQgY2xvc2Ugb3BlbiBwZWVyIGNvbm5lY3Rpb25zLlxuICAgICAqL1xuICAgIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTdHJlYW1QcmVEaXNjb25uZWN0RXZlbnQoKSk7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxheSB0aGUgc3RyZWFtLiBDYW4gYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYSBwZWVyIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgcGxheSgpIHtcbiAgICAgICAgdGhpcy5fb25TdHJlYW1Mb2FkaW5nKCk7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIucGxheVN0cmVhbSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdXRvIGNvbm5lY3QgaWYgQXV0b0Nvbm5lY3QgZmxhZyBpcyBlbmFibGVkXG4gICAgICovXG4gICAgY2hlY2tGb3JBdXRvQ29ubmVjdCgpIHtcbiAgICAgICAgLy8gc2V0IHVwIGlmIHRoZSBhdXRvIHBsYXkgd2lsbCBiZSB1c2VkIG9yIHJlZ3VsYXIgY2xpY2sgdG8gc3RhcnRcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQXV0b0Nvbm5lY3QpKSB7XG4gICAgICAgICAgICAvLyBpZiBhdXRvcGxheWluZyBzaG93IGFuIGluZm8gb3ZlcmxheSB3aGlsZSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgY29ubmVjdGlvbiB0byBiZWdpblxuICAgICAgICAgICAgdGhpcy5fb25XZWJSdGNBdXRvQ29ubmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5jb25uZWN0VG9TaWduYWxsaW5nU2VydmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV2lsbCB1bm11dGUgdGhlIG1pY3JvcGhvbmUgdHJhY2sgd2hpY2ggaXMgc2VudCB0byBVbnJlYWwgRW5naW5lLlxuICAgICAqIEJ5IGRlZmF1bHQsIHdpbGwgb25seSB1bm11dGUgYW4gZXhpc3RpbmcgbWljIHRyYWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvcmNlRW5hYmxlIENhbiBiZSB1c2VkIGZvciBjYXNlcyB3aGVuIHRoaXMgb2JqZWN0IHdhc24ndCBpbml0aWFsaXplZCB3aXRoIGEgbWljIHRyYWNrLlxuICAgICAqIElmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgcmVzdGFydGVkIHdpdGggYSBtaWNyb3Bob25lLlxuICAgICAqIFdhcm5pbmc6IHRoaXMgdGFrZXMgc29tZSB0aW1lLCBhcyBhIGZ1bGwgcmVuZWdvdGlhdGlvbiBhbmQgcmVjb25uZWN0aW9uIHdpbGwgaGFwcGVuLlxuICAgICAqL1xuICAgIHVubXV0ZU1pY3JvcGhvbmUoZm9yY2VFbmFibGUgPSBmYWxzZSkge1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGV4aXN0aW5nIG1pYyB0cmFjaywgd2UganVzdCBzZXQgbXV0ZWQgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoJ1VzZU1pYycpKSB7XG4gICAgICAgICAgICB0aGlzLnNldE1pY3JvcGhvbmVNdXRlZChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBwcmUtZXhpc3RpbmcgbWljIHRyYWNrLCBhbmQgY2FsbGVyIGlzIG9rIHdpdGggZnVsbCByZXNldCwgd2UgZW5hYmxlIGFuZCByZXNldFxuICAgICAgICBpZiAoZm9yY2VFbmFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldEZsYWdFbmFibGVkKCdVc2VNaWMnLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgcHJlZmVyIG5vdCB0byBmb3JjZSBhIHJlY29ubmVjdGlvbiwganVzdCB3YXJuIHRoZSB1c2VyIHRoYXQgdGhpcyBvcGVyYXRpb24gZGlkbid0IGhhcHBlblxuICAgICAgICBMb2dnZXIuV2FybmluZygnVHJ5aW5nIHRvIHVubXV0ZSBtaWMsIGJ1dCBQaXhlbFN0cmVhbWluZyB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBubyBtaWNyb3Bob25lIHRyYWNrLiBDYWxsIHdpdGggZm9yY2VFbmFibGUgPT0gdHJ1ZSB0byByZS1jb25uZWN0IHdpdGggYSBtaWMgdHJhY2suJyk7XG4gICAgfVxuICAgIG11dGVNaWNyb3Bob25lKCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZCgnVXNlTWljJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TWljcm9waG9uZU11dGVkKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlIHdhc24ndCBhIG1pYyB0cmFjaywganVzdCBsZXQgdXNlciBrbm93IHRoZXJlJ3Mgbm90aGluZyB0byBtdXRlXG4gICAgICAgIExvZ2dlci5JbmZvKCdUcnlpbmcgdG8gbXV0ZSBtaWMsIGJ1dCBQaXhlbFN0cmVhbWluZyBoYXMgbm8gbWljcm9waG9uZSB0cmFjaywgc28gc2VuZGluZyBzb3VuZCBpcyBhbHJlYWR5IGRpc2FibGVkLicpO1xuICAgIH1cbiAgICBzZXRNaWNyb3Bob25lTXV0ZWQobXV0ZSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGZvciAoY29uc3QgdHJhbnNjZWl2ZXIgb2YgKF9kID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5fd2ViUnRjQ29udHJvbGxlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlcikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZ2V0VHJhbnNjZWl2ZXJzKCkpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IFtdKSB7XG4gICAgICAgICAgICBpZiAoUlRDVXRpbHMuY2FuVHJhbnNjZWl2ZXJTZW5kQXVkaW8odHJhbnNjZWl2ZXIpKSB7XG4gICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2VuZGVyLnRyYWNrLmVuYWJsZWQgPSAhbXV0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaWxsIHVubXV0ZSB0aGUgdmlkZW8gdHJhY2sgd2hpY2ggaXMgc2VudCB0byBVbnJlYWwgRW5naW5lLlxuICAgICAqIEJ5IGRlZmF1bHQsIHdpbGwgb25seSB1bm11dGUgYW4gZXhpc3RpbmcgdmlkZW8gdHJhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9yY2VFbmFibGUgQ2FuIGJlIHVzZWQgZm9yIGNhc2VzIHdoZW4gdGhpcyBvYmplY3Qgd2Fzbid0IGluaXRpYWxpemVkIHdpdGggYSB2aWRlbyB0cmFjay5cbiAgICAgKiBJZiB0aGlzIHBhcmFtZXRlciBpcyB0cnVlLCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIHJlc3RhcnRlZCB3aXRoIGEgY2FtZXJhLlxuICAgICAqIFdhcm5pbmc6IHRoaXMgdGFrZXMgc29tZSB0aW1lLCBhcyBhIGZ1bGwgcmVuZWdvdGlhdGlvbiBhbmQgcmVjb25uZWN0aW9uIHdpbGwgaGFwcGVuLlxuICAgICAqL1xuICAgIHVubXV0ZUNhbWVyYShmb3JjZUVuYWJsZSA9IGZhbHNlKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgdmlkZW8gdHJhY2ssIHdlIGp1c3Qgc2V0IG11dGVkIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKCdVc2VDYW1lcmEnKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDYW1lcmFNdXRlZChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBubyBwcmUtZXhpc3RpbmcgdmlkZW8gdHJhY2ssIGFuZCBjYWxsZXIgaXMgb2sgd2l0aCBmdWxsIHJlc2V0LCB3ZSBlbmFibGUgYW5kIHJlc2V0XG4gICAgICAgIGlmIChmb3JjZUVuYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0RmxhZ0VuYWJsZWQoJ1VzZUNhbWVyYScsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBwcmVmZXIgbm90IHRvIGZvcmNlIGEgcmVjb25uZWN0aW9uLCBqdXN0IHdhcm4gdGhlIHVzZXIgdGhhdCB0aGlzIG9wZXJhdGlvbiBkaWRuJ3QgaGFwcGVuXG4gICAgICAgIExvZ2dlci5XYXJuaW5nKCdUcnlpbmcgdG8gdW5tdXRlIHZpZGVvLCBidXQgUGl4ZWxTdHJlYW1pbmcgd2FzIGluaXRpYWxpemVkIHdpdGggbm8gdmlkZW8gdHJhY2suIENhbGwgd2l0aCBmb3JjZUVuYWJsZSA9PSB0cnVlIHRvIHJlLWNvbm5lY3Qgd2l0aCBhIHZpZGVvIHRyYWNrLicpO1xuICAgIH1cbiAgICBtdXRlQ2FtZXJhKCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZCgnVXNlQ2FtZXJhJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FtZXJhTXV0ZWQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2Fzbid0IGEgbWljIHRyYWNrLCBqdXN0IGxldCB1c2VyIGtub3cgdGhlcmUncyBub3RoaW5nIHRvIG11dGVcbiAgICAgICAgTG9nZ2VyLkluZm8oJ1RyeWluZyB0byBtdXRlIGNhbWVyYSwgYnV0IFBpeGVsU3RyZWFtaW5nIGhhcyBubyB2aWRlbyB0cmFjaywgc28gc2VuZGluZyB2aWRlbyBpcyBhbHJlYWR5IGRpc2FibGVkLicpO1xuICAgIH1cbiAgICBzZXRDYW1lcmFNdXRlZChtdXRlKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc2NlaXZlciBvZiAoX2QgPSAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLl93ZWJSdGNDb250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGVlckNvbm5lY3Rpb25Db250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5nZXRUcmFuc2NlaXZlcnMoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogW10pIHtcbiAgICAgICAgICAgIGlmIChSVENVdGlscy5jYW5UcmFuc2NlaXZlclNlbmRWaWRlbyh0cmFuc2NlaXZlcikpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIudHJhY2suZW5hYmxlZCA9ICFtdXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGVtaXQgYW4gZXZlbnQgd2hlbiBhdXRvIGNvbm5lY3Rpbmcgb2NjdXJzXG4gICAgICovXG4gICAgX29uV2ViUnRjQXV0b0Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNBdXRvQ29ubmVjdEV2ZW50KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBlbWl0IGFuIGV2ZW50IGZvciB3aGVuIFNEUCBuZWdvdGlhdGlvbiBpcyBmdWxseSBmaW5pc2hlZC5cbiAgICAgKi9cbiAgICBfb25XZWJSdGNTZHAoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNTZHBFdmVudCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZW1pdCBhbiBTRFAgb2ZmZXIgYWZ0ZXIgaXQgaGFzIGJlZW4gc2V0LlxuICAgICAqL1xuICAgIF9vbldlYlJ0Y1NkcE9mZmVyKG9mZmVyKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNTZHBPZmZlckV2ZW50KHsgc2RwOiBvZmZlciB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGVtaXQgYW4gU0RQIGFuc3dlciBhZnRlciBpdCBoYXMgYmVlbiBzZXQuXG4gICAgICovXG4gICAgX29uV2ViUnRjU2RwQW5zd2VyKGFuc3dlcikge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgV2ViUnRjU2RwQW5zd2VyRXZlbnQoeyBzZHA6IGFuc3dlciB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIGNhbGwgdG8gZW1pdCBhIGBsYXRlbmN5Q2FsY3VsYXRlZGAgZXZlbnQuXG4gICAgICovXG4gICAgX29uTGF0ZW5jeUNhbGN1bGF0ZWQobGF0ZW5jeUluZm8pIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IExhdGVuY3lDYWxjdWxhdGVkRXZlbnQoeyBsYXRlbmN5SW5mbyB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGVtaXRzIGEgU3RyZWFtTG9hZGluZyBldmVudFxuICAgICAqL1xuICAgIF9vblN0cmVhbUxvYWRpbmcoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTdHJlYW1Mb2FkaW5nRXZlbnQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIHZpZGVvIGlzIGRpc2Nvbm5lY3RlZCAtIGVtaXRzIGdpdmVuIGV2ZW50U3RyaW5nIG9yIGFuIG92ZXJyaWRlXG4gICAgICogbWVzc2FnZSBmcm9tIHdlYlJ0Y0NvbnRyb2xsZXIgaWYgb25lIGhhcyBiZWVuIHNldFxuICAgICAqIEBwYXJhbSBldmVudFN0cmluZyAtIGEgc3RyaW5nIGRlc2NyaWJpbmcgd2h5IHRoZSBjb25uZWN0aW9uIGNsb3NlZFxuICAgICAqIEBwYXJhbSBhbGxvd0NsaWNrVG9SZWNvbm5lY3QgLSB0cnVlIGlmIHdlIHdhbnQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gcmV0cnkgdGhlIGNvbm5lY3Rpb24gd2l0aCBhIGNsaWNrXG4gICAgICovXG4gICAgX29uRGlzY29ubmVjdChldmVudFN0cmluZywgYWxsb3dDbGlja1RvUmVjb25uZWN0KSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNEaXNjb25uZWN0ZWRFdmVudCh7XG4gICAgICAgICAgICBldmVudFN0cmluZzogZXZlbnRTdHJpbmcsXG4gICAgICAgICAgICBhbGxvd0NsaWNrVG9SZWNvbm5lY3Q6IGFsbG93Q2xpY2tUb1JlY29ubmVjdFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBXZWIgUnRjIGlzIGNvbm5lY3RpbmdcbiAgICAgKi9cbiAgICBfb25XZWJSdGNDb25uZWN0aW5nKCkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgV2ViUnRjQ29ubmVjdGluZ0V2ZW50KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gV2ViIFJ0YyBoYXMgY29ubmVjdGVkXG4gICAgICovXG4gICAgX29uV2ViUnRjQ29ubmVjdGVkKCkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgV2ViUnRjQ29ubmVjdGVkRXZlbnQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBXZWIgUnRjIGZhaWxzIHRvIGNvbm5lY3RcbiAgICAgKi9cbiAgICBfb25XZWJSdGNGYWlsZWQoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNGYWlsZWRFdmVudCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIHdoZW4gdGhlIFZpZGVvIGhhcyBiZWVuIEluaXRpYWxpemVkXG4gICAgICovXG4gICAgX29uVmlkZW9Jbml0aWFsaXplZCgpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFZpZGVvSW5pdGlhbGl6ZWRFdmVudCgpKTtcbiAgICAgICAgdGhpcy5fdmlkZW9TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiByZWNlaXZpbmcgbGF0ZW5jeSB0ZXN0IHJlc3VsdHNcbiAgICAgKiBAcGFyYW0gbGF0ZW5jeSAtIGxhdGVuY3kgdGVzdCByZXN1bHRzIG9iamVjdFxuICAgICAqL1xuICAgIF9vbkxhdGVuY3lUZXN0UmVzdWx0KGxhdGVuY3lUaW1pbmdzKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBMYXRlbmN5VGVzdFJlc3VsdEV2ZW50KHsgbGF0ZW5jeVRpbWluZ3MgfSkpO1xuICAgIH1cbiAgICBfb25EYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IERhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZUV2ZW50KHsgcmVzcG9uc2UgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiByZWNlaXZpbmcgdmlkZW8gc3RhdGlzdGljc1xuICAgICAqIEBwYXJhbSB2aWRlb1N0YXRzIC0gdmlkZW8gc3RhdGlzdGljcyBhcyBhIGFnZ3JlZ2F0ZSBzdGF0cyBvYmplY3RcbiAgICAgKi9cbiAgICBfb25WaWRlb1N0YXRzKHZpZGVvU3RhdHMpIHtcbiAgICAgICAgLy8gRHVyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLl92aWRlb1N0YXJ0VGltZSB8fCB0aGlzLl92aWRlb1N0YXJ0VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl92aWRlb1N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIH1cbiAgICAgICAgdmlkZW9TdGF0cy5oYW5kbGVTZXNzaW9uU3RhdGlzdGljcyh0aGlzLl92aWRlb1N0YXJ0VGltZSwgdGhpcy5faW5wdXRDb250cm9sbGVyLCB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnZpZGVvQXZnUXApO1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU3RhdHNSZWNlaXZlZEV2ZW50KHsgYWdncmVnYXRlZFN0YXRzOiB2aWRlb1N0YXRzIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHVwIGZ1bmN0aW9uYWxpdHkgdG8gaGFwcGVuIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGF2ZXJhZ2UgdmlkZW8gZW5jb2RlciBxcFxuICAgICAqIEBwYXJhbSBRUCAtIHRoZSBxdWFsaXR5IG51bWJlciBvZiB0aGUgc3RyZWFtXG4gICAgICovXG4gICAgX29uVmlkZW9FbmNvZGVyQXZnUVAoUVApIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFZpZGVvRW5jb2RlckF2Z1FQRXZlbnQoeyBhdmdRUDogUVAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiByZWNlaXZpbmcgYW5kIGhhbmRsaW5nIGluaXRpYWwgc2V0dGluZ3MgZm9yIHRoZSBVRSBhcHBcbiAgICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBpbml0aWFsIFVFIGFwcCBzZXR0aW5nc1xuICAgICAqL1xuICAgIF9vbkluaXRpYWxTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBJbml0aWFsU2V0dGluZ3NFdmVudCh7IHNldHRpbmdzIH0pKTtcbiAgICAgICAgaWYgKHNldHRpbmdzLlBpeGVsU3RyZWFtaW5nU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dDb25zb2xlQ29tbWFuZHMgPSAoX2EgPSBzZXR0aW5ncy5QaXhlbFN0cmVhbWluZ1NldHRpbmdzLkFsbG93UGl4ZWxTdHJlYW1pbmdDb21tYW5kcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd0NvbnNvbGVDb21tYW5kcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbygnLUFsbG93UGl4ZWxTdHJlYW1pbmdDb21tYW5kcz1mYWxzZSwgc2VuZGluZyBhcmJpdHJhcnkgY29uc29sZSBjb21tYW5kcyBmcm9tIGJyb3dzZXIgdG8gVUUgaXMgZGlzYWJsZWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlVXJsUGFyYW1zID0gdGhpcy5jb25maWcudXNlVXJsUGFyYW1zO1xuICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgSVVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgTG9nZ2VyLkluZm8oYHVzaW5nIFVSTCBwYXJhbWV0ZXJzICR7dXNlVXJsUGFyYW1zfWApO1xuICAgICAgICBpZiAoc2V0dGluZ3MuRW5jb2RlclNldHRpbmdzKSB7XG4gICAgICAgICAgICAvLyBoZXJlIHdlIHNob3VsZCBlaXRoZXIgZ2V0IE1pbi9NYXhRUCBmcm9tIFBTMVxuICAgICAgICAgICAgLy8gb3IgTWluL01heFF1YWxpdHkgZnJvbSBQUzJcbiAgICAgICAgICAgIC8vIHdlIG9ubHkgd2FudCB0byBzZXQgb25lIHNldCBvciB0aGUgb3RoZXIgYXMgdGhleSBjb252ZXJnZSBpbiBDb21wYXRRdWFsaXR5TWluL01heCBhbmRcbiAgICAgICAgICAgIC8vIHdlIGRvbnQgd2FudCB0byBoYXZlIHRoZW0gY29uZmxpY3Qgd2l0aCBkZWZhdWx0IHZhbHVlcy5cbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5FbmNvZGVyU2V0dGluZ3MuTWluUVApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5NaW5RUCwgXG4gICAgICAgICAgICAgICAgLy8gSWYgYSBzZXR0aW5nIGlzIHNldCBpbiB0aGUgVVJMLCBtYWtlIHN1cmUgd2UgcmVzcGVjdCB0aGF0IHZhbHVlIGFzIG9wcG9zZWQgdG8gd2hhdCB0aGUgYXBwbGljYXRpb24gc2VuZHMgdXNcbiAgICAgICAgICAgICAgICB1c2VVcmxQYXJhbXMgJiYgdXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5NaW5RUClcbiAgICAgICAgICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdCh1cmxQYXJhbXMuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLk1pblFQKSlcbiAgICAgICAgICAgICAgICAgICAgOiBzZXR0aW5ncy5FbmNvZGVyU2V0dGluZ3MuTWluUVAgfHwgMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVAsIHVzZVVybFBhcmFtcyAmJiB1cmxQYXJhbXMuaGFzKE51bWVyaWNQYXJhbWV0ZXJzLk1heFFQKVxuICAgICAgICAgICAgICAgICAgICA/IE51bWJlci5wYXJzZUZsb2F0KHVybFBhcmFtcy5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVApKVxuICAgICAgICAgICAgICAgICAgICA6IHNldHRpbmdzLkVuY29kZXJTZXR0aW5ncy5NYXhRUCB8fCA1MSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuRW5jb2RlclNldHRpbmdzLk1pblF1YWxpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5NaW5RdWFsaXR5LCBcbiAgICAgICAgICAgICAgICAvLyBJZiBhIHNldHRpbmcgaXMgc2V0IGluIHRoZSBVUkwsIG1ha2Ugc3VyZSB3ZSByZXNwZWN0IHRoYXQgdmFsdWUgYXMgb3Bwb3NlZCB0byB3aGF0IHRoZSBhcHBsaWNhdGlvbiBzZW5kcyB1c1xuICAgICAgICAgICAgICAgIHVzZVVybFBhcmFtcyAmJiB1cmxQYXJhbXMuaGFzKE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHkpXG4gICAgICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5NaW5RdWFsaXR5KSlcbiAgICAgICAgICAgICAgICAgICAgOiBzZXR0aW5ncy5FbmNvZGVyU2V0dGluZ3MuTWluUXVhbGl0eSB8fCAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5LCB1c2VVcmxQYXJhbXMgJiYgdXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5KVxuICAgICAgICAgICAgICAgICAgICA/IE51bWJlci5wYXJzZUZsb2F0KHVybFBhcmFtcy5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UXVhbGl0eSkpXG4gICAgICAgICAgICAgICAgICAgIDogc2V0dGluZ3MuRW5jb2RlclNldHRpbmdzLk1heFF1YWxpdHkgfHwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoZXNlIHR3byBhcmUganVzdCB1c2VkIHRvIGNvbnZlcmdlIHF1YWxpdHkgYW5kIHFwIGFuZCBiZWhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50bHkgc2luY2UgdGhleVxuICAgICAgICAgICAgLy8gc2hvdWxkbnQgZXhpc3QgaW4gRW5jb2RlclNldHRpbmdzXG4gICAgICAgICAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVybFBhcmFtcy5oYXMoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbiwgTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4LCBOdW1iZXIucGFyc2VGbG9hdCh1cmxQYXJhbXMuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5XZWJSVENTZXR0aW5ncykge1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSwgdXNlVXJsUGFyYW1zICYmIHVybFBhcmFtcy5oYXMoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSlcbiAgICAgICAgICAgICAgICA/IE51bWJlci5wYXJzZUZsb2F0KHVybFBhcmFtcy5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSkpXG4gICAgICAgICAgICAgICAgOiBzZXR0aW5ncy5XZWJSVENTZXR0aW5ncy5NaW5CaXRyYXRlIC8gMTAwMCAvKiBicHMgdG8ga2JwcyAqLyk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlLCB1c2VVcmxQYXJhbXMgJiYgdXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlKVxuICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlKSlcbiAgICAgICAgICAgICAgICA6IHNldHRpbmdzLldlYlJUQ1NldHRpbmdzLk1heEJpdHJhdGUgLyAxMDAwIC8qIGJwcyB0byBrYnBzICovKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ0ZQUywgdXNlVXJsUGFyYW1zICYmIHVybFBhcmFtcy5oYXMoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTKVxuICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFMpKVxuICAgICAgICAgICAgICAgIDogc2V0dGluZ3MuV2ViUlRDU2V0dGluZ3MuRlBTKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiBzZXR0aW5nIHF1YWxpdHkgY29udHJvbCBvd25lcnNoaXAgb2YgYSBzdHJlYW1cbiAgICAgKiBAcGFyYW0gaGFzUXVhbGl0eU93bmVyc2hpcCAtIGRvZXMgdGhpcyB1c2VyIGhhdmUgcXVhbGl0eSBvd25lcnNoaXAgb2YgdGhlIHN0cmVhbSB0cnVlIC8gZmFsc2VcbiAgICAgKi9cbiAgICBfb25RdWFsaXR5Q29udHJvbE93bmVyc2hpcChoYXNRdWFsaXR5T3duZXJzaGlwKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldEZsYWdFbmFibGVkKEZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXIsIGhhc1F1YWxpdHlPd25lcnNoaXApO1xuICAgIH1cbiAgICBfb25QbGF5ZXJDb3VudChwbGF5ZXJDb3VudCkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgUGxheWVyQ291bnRFdmVudCh7IGNvdW50OiBwbGF5ZXJDb3VudCB9KSk7XG4gICAgfVxuICAgIF9vblN1YnNjcmliZUZhaWxlZChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTdWJzY3JpYmVGYWlsZWRFdmVudCh7IG1lc3NhZ2U6IG1lc3NhZ2UgfSkpO1xuICAgIH1cbiAgICAvLyBTZXRzIHVwIHRvIGVtaXQgdGhlIHdlYnJ0YyB0Y3AgcmVsYXkgZGV0ZWN0IGV2ZW50XG4gICAgX3NldHVwV2ViUnRjVENQUmVsYXlEZXRlY3Rpb24oc3RhdHNSZWNlaXZlZEV2ZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgYWN0aXZlIGNhbmRpZGF0ZSBwYWlyXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZVBhaXIgPSBzdGF0c1JlY2VpdmVkRXZlbnQuZGF0YS5hZ2dyZWdhdGVkU3RhdHMuZ2V0QWN0aXZlQ2FuZGlkYXRlUGFpcigpO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aXZlIGNhbmRpZGF0ZSBwYWlyIGlzIG5vdCBudWxsXG4gICAgICAgIGlmIChhY3RpdmVDYW5kaWRhdGVQYWlyICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbG9jYWwgY2FuZGlkYXRlIGFzc2lnbmVkIHRvIHRoZSBhY3RpdmUgY2FuZGlkYXRlIHBhaXJcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsQ2FuZGlkYXRlID0gc3RhdHNSZWNlaXZlZEV2ZW50LmRhdGEuYWdncmVnYXRlZFN0YXRzLmxvY2FsQ2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBhY3RpdmVDYW5kaWRhdGVQYWlyLmxvY2FsQ2FuZGlkYXRlSWQsIG51bGwpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGxvY2FsIGNhbmRpZGF0ZSBpcyBub3QgbnVsbCwgY2FuZGlkYXRlIHR5cGUgaXMgcmVsYXkgYW5kIHRoZSByZWxheSBwcm90b2NvbCBpcyB0Y3BcbiAgICAgICAgICAgIGlmIChsb2NhbENhbmRpZGF0ZSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgbG9jYWxDYW5kaWRhdGUuY2FuZGlkYXRlVHlwZSA9PSAncmVsYXknICYmXG4gICAgICAgICAgICAgICAgbG9jYWxDYW5kaWRhdGUucmVsYXlQcm90b2NvbCA9PSAndGNwJykge1xuICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIHdlYiBydGMgdGNwIHJlbGF5IGRldGVjdGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFdlYlJ0Y1RDUFJlbGF5RGV0ZWN0ZWRFdmVudCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBjaGVjayBpcyBjb21wbGV0ZWQgYW5kIHRoZSBzdGF0cyBsaXN0ZW4gZXZlbnQgY2FuIGJlIHJlbW92ZWRcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGF0c1JlY2VpdmVkJywgdGhpcy5fc2V0dXBXZWJSdGNUQ1BSZWxheURldGVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBhIGNvbm5lY3Rpb24gbGF0ZW5jeSB0ZXN0LlxuICAgICAqIE5PVEU6IFRoZXJlIGFyZSBwbGFucyB0byByZWZhY3RvciBhbGwgcmVxdWVzdCogZnVuY3Rpb25zLiBFeHBlY3QgY2hhbmdlcyBpZiB5b3UgdXNlIHRoaXMhXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICByZXF1ZXN0TGF0ZW5jeVRlc3QoKSB7XG4gICAgICAgIGlmICghdGhpcy5fd2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZExhdGVuY3lUZXN0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGEgZGF0YSBjaGFubmVsIGxhdGVuY3kgdGVzdC5cbiAgICAgKiBOT1RFOiBUaGVyZSBhcmUgcGxhbnMgdG8gcmVmYWN0b3IgYWxsIHJlcXVlc3QqIGZ1bmN0aW9ucy4gRXhwZWN0IGNoYW5nZXMgaWYgeW91IHVzZSB0aGlzIVxuICAgICAqL1xuICAgIHJlcXVlc3REYXRhQ2hhbm5lbExhdGVuY3lUZXN0KGNvbmZpZykge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9kYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udHJvbGxlciA9IG5ldyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udHJvbGxlcih0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmREYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmJpbmQodGhpcy5fd2ViUnRjQ29udHJvbGxlciksIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdEV2ZW50KHsgcmVzdWx0IH0pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2UnLCAoeyBkYXRhOiB7IHJlc3BvbnNlIH0gfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyLnJlY2VpdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyLnN0YXJ0KGNvbmZpZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgZm9yIHRoZSBVRSBhcHBsaWNhdGlvbiB0byBzaG93IEZQUyBjb3VudGVyLlxuICAgICAqIE5PVEU6IFRoZXJlIGFyZSBwbGFucyB0byByZWZhY3RvciBhbGwgcmVxdWVzdCogZnVuY3Rpb25zLiBFeHBlY3QgY2hhbmdlcyBpZiB5b3UgdXNlIHRoaXMhXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICByZXF1ZXN0U2hvd0ZwcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWJSdGNDb250cm9sbGVyLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kU2hvd0ZwcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBmb3IgYSBuZXcgSUZyYW1lIGZyb20gdGhlIFVFIGFwcGxpY2F0aW9uLlxuICAgICAqIE5PVEU6IFRoZXJlIGFyZSBwbGFucyB0byByZWZhY3RvciBhbGwgcmVxdWVzdCogZnVuY3Rpb25zLiBFeHBlY3QgY2hhbmdlcyBpZiB5b3UgdXNlIHRoaXMhXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICByZXF1ZXN0SWZyYW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRJZnJhbWVSZXF1ZXN0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGRhdGEgdG8gVUUgYXBwbGljYXRpb24uIFRoZSBkYXRhIHdpbGwgYmUgcnVuIHRocm91Z2ggSlNPTi5zdHJpbmdpZnkoKSBzbyBlLmcuIHN0cmluZ3NcbiAgICAgKiBhbmQgYW55IHNlcmlhbGl6YWJsZSBwbGFpbiBKU09OIG9iamVjdHMgd2l0aCBubyByZWN1cnJlbmNlIGNhbiBiZSBzZW50LlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgc3VjY2VlZGVkLCBmYWxzZSBpZiByZWplY3RlZFxuICAgICAqL1xuICAgIGVtaXRVSUludGVyYWN0aW9uKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWJSdGNDb250cm9sbGVyLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5lbWl0VUlJbnRlcmFjdGlvbihkZXNjcmlwdG9yKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBjb21tYW5kIHRvIFVFIGFwcGxpY2F0aW9uLiBCbG9ja3MgQ29uc29sZUNvbW1hbmQgZGVzY3JpcHRvcnMgdW5sZXNzIFVFXG4gICAgICogaGFzIHNpZ25hbGVkIHRoYXQgaXQgYWxsb3dzIGNvbnNvbGUgY29tbWFuZHMuXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBzdWNjZWVkZWQsIGZhbHNlIGlmIHJlamVjdGVkXG4gICAgICovXG4gICAgZW1pdENvbW1hbmQoZGVzY3JpcHRvcikge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYWxsb3dDb25zb2xlQ29tbWFuZHMgJiYgJ0NvbnNvbGVDb21tYW5kJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5lbWl0Q29tbWFuZChkZXNjcmlwdG9yKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBjb25zb2xlIGNvbW1hbmQgdG8gVUUgYXBwbGljYXRpb24uIE9ubHkgYWxsb3dlZCBpZiBVRSBoYXMgc2lnbmFsZWQgdGhhdCBpdCBhbGxvd3NcbiAgICAgKiBjb25zb2xlIGNvbW1hbmRzLlxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgc3VjY2VlZGVkLCBmYWxzZSBpZiByZWplY3RlZFxuICAgICAqL1xuICAgIGVtaXRDb25zb2xlQ29tbWFuZChjb21tYW5kKSB7XG4gICAgICAgIGlmICghdGhpcy5hbGxvd0NvbnNvbGVDb21tYW5kcyB8fCAhdGhpcy5fd2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuZW1pdENvbnNvbGVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGV4dCBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgVUUgdGV4dCBib3ggd2lkZ2V0LlxuICAgICAqIEBwYXJhbSBjb250ZW50cyBUaGUgbmV3IGNvbnRlbnRzIG9mIHRoZSBVRSB0ZXh0IGJveC5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBtZXNzYWdlIGNvdWxkIGJlIHNlbnQuXG4gICAgICovXG4gICAgc2VuZFRleHRib3hFbnRyeShjb250ZW50cykge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRUZXh0Ym94RW50cnkoY29udGVudHMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgVUUgLT4gYnJvd3NlciByZXNwb25zZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc3BvbnNlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgLSBUaGUgbWV0aG9kIHRvIGJlIGFjdGl2YXRlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgICAqL1xuICAgIGFkZFJlc3BvbnNlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnJlc3BvbnNlQ29udHJvbGxlci5hZGRSZXNwb25zZUV2ZW50TGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBVRSAtPiBicm93c2VyIHJlc3BvbnNlIGV2ZW50IGxpc3RlbmVyXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzcG9uc2UgaGFuZGxlclxuICAgICAqL1xuICAgIHJlbW92ZVJlc3BvbnNlRXZlbnRMaXN0ZW5lcihuYW1lKSB7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIucmVzcG9uc2VDb250cm9sbGVyLnJlbW92ZVJlc3BvbnNlRXZlbnRMaXN0ZW5lcihuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBuZXcgZXZlbnQuXG4gICAgICogQHBhcmFtIGUgZXZlbnRcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGRpc3BhdGNoRXZlbnQoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQoZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIuXG4gICAgICogQHBhcmFtIHR5cGUgZXZlbnQgbmFtZVxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBldmVudCBoYW5kbGVyLlxuICAgICAqIEBwYXJhbSB0eXBlIGV2ZW50IG5hbWVcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqL1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmFibGUvZGlzYWJsZSBYUiBtb2RlLlxuICAgICAqL1xuICAgIHRvZ2dsZVhSKCkge1xuICAgICAgICB0aGlzLndlYlhyQ29udHJvbGxlci54ckNsaWNrZWQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFzcyBpbiBhIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGEgc2lnbmFsbGluZyBzZXJ2ZXIgVVJMLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGlmIHlvdSBuZWVkIHRvIHByb2dyYW1tYXRpY2FsbHkgY29uc3RydWN0IHlvdXIgc2lnbmFsbGluZyBzZXJ2ZXIgVVJMLlxuICAgICAqIEBwYXJhbSBzaWduYWxsaW5nVXJsQnVpbGRlckZ1bmMgQSBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhIHNpZ25hbGxpbmcgc2VydmVyIHVybC5cbiAgICAgKi9cbiAgICBzZXRTaWduYWxsaW5nVXJsQnVpbGRlcihzaWduYWxsaW5nVXJsQnVpbGRlckZ1bmMpIHtcbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zaWduYWxsaW5nVXJsQnVpbGRlciA9IHNpZ25hbGxpbmdVcmxCdWlsZGVyRnVuYztcbiAgICB9XG4gICAgZ2V0IHdlYlJ0Y0NvbnRyb2xsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWJSdGNDb250cm9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQdWJsaWMgZ2V0dGVyIGZvciB0aGUgd2Vic29ja2V0IGNvbnRyb2xsZXIuIEFjY2VzcyB0byB0aGlzIHByb3BlcnR5IGFsbG93cyB5b3UgdG8gc2VuZFxuICAgICAqIGN1c3RvbSB3ZWJzb2NrZXQgbWVzc2FnZXMuXG4gICAgICovXG4gICAgZ2V0IHNpZ25hbGxpbmdQcm90b2NvbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIucHJvdG9jb2w7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1YmxpYyBnZXR0ZXIgZm9yIHRoZSB3ZWJYckNvbnRyb2xsZXIgY29udHJvbGxlci4gVXNlZCBmb3IgYWxsIFhSIGZlYXR1cmVzLlxuICAgICAqL1xuICAgIGdldCB3ZWJYckNvbnRyb2xsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWJYckNvbnRyb2xsZXI7XG4gICAgfVxuICAgIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIobmFtZSwgZGlyZWN0aW9uLCBoYW5kbGVyKSB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyICYmIHR5cGVvZiBoYW5kbGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoYFVuYWJsZSB0byByZWdpc3RlciBhbiB1bmRlZmluZWQgaGFuZGxlciBmb3IgJHtuYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciAmJiB0eXBlb2YgaGFuZGxlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihkaXJlY3Rpb24sIG5hbWUsIChkYXRhKSA9PiB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIobmFtZSwgZGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGRpcmVjdGlvbiwgbmFtZSwgKGRhdGEpID0+IGhhbmRsZXIoZGF0YSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB0b1N0cmVhbWVySGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICB9XG4gICAgaXNSZWNvbm5lY3RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWJSdGNDb250cm9sbGVyLmlzUmVjb25uZWN0aW5nO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBpeGVsU3RyZWFtaW5nLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5leHBvcnQgY2xhc3MgUmVzcG9uc2VDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZUV2ZW50TGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSByZXNwb25zZSBldmVudCBsaXN0ZW5lciB0byB0aGUgcmVzcG9uc2UgbWFwXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgLSBUaGUgbWV0aG9kIHRvIGJlIGFjdGl2YXRlZCB3aGVuIHRoZSByZXNwb25zZSBpcyBzZWxlY3RlZFxuICAgICAqL1xuICAgIGFkZFJlc3BvbnNlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnJlc3BvbnNlRXZlbnRMaXN0ZW5lcnMuc2V0KG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgcmVzcG9uc2UgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIHJlc3BvbnNlIG1hcFxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlUmVzcG9uc2VFdmVudExpc3RlbmVyKG5hbWUpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZUV2ZW50TGlzdGVuZXJzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIGEgcmVzcG9uc2Ugd2hlbiByZWNlaXZpbmcgb25lIGZvcm0gdGhlIHN0cmVhbWVyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBEYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGEgY2hhbm5lbCB3aXRoIHRoZSBjb21tYW5kIGluIHF1ZXN0aW9uXG4gICAgICovXG4gICAgb25SZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5SZXNwb25zZScpO1xuICAgICAgICBjb25zdCByZXNwb25zZXMgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZShtZXNzYWdlLnNsaWNlKDEpKTtcbiAgICAgICAgTG9nZ2VyLkluZm8ocmVzcG9uc2VzKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZUV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihyZXNwb25zZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZXNwb25zZUNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmV4cG9ydCBjbGFzcyBTZW5kTWVzc2FnZUNvbnRyb2xsZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBkYXRhQ2hhbm5lbFNlbmRlciAtIERhdGEgY2hhbm5lbCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB0b1N0cmVhbWVyTWVzc2FnZXNNYXBQcm92aWRlciAtIFN0cmVhbSBNZXNzYWdlcyBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGRhdGFDaGFubmVsU2VuZGVyLCB0b1N0cmVhbWVyTWVzc2FnZXNNYXBQcm92aWRlcikge1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsU2VuZGVyID0gZGF0YUNoYW5uZWxTZW5kZXI7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzTWFwUHJvdmlkZXIgPSB0b1N0cmVhbWVyTWVzc2FnZXNNYXBQcm92aWRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHN0cmVhbWVyIHRocm91Z2ggdGhlIGRhdGEgY2hhbm5lbFxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSAtIHRoZSB0eXBlIG9mIG1lc3NhZ2Ugd2UgYXJlIHNlbmRpbmdcbiAgICAgKiBAcGFyYW0gbWVzc2FnZURhdGEgLSB0aGUgbWVzc2FnZSBkYXRhIHdlIGFyZSBzZW5kaW5nIG92ZXIgdGhlIGRhdGEgY2hhbm5lbFxuICAgICAqIEByZXR1cm5zIC0gbmlsXG4gICAgICovXG4gICAgc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKG1lc3NhZ2VUeXBlLCBtZXNzYWdlRGF0YSkge1xuICAgICAgICBpZiAobWVzc2FnZURhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWVzc2FnZURhdGEgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b1N0cmVhbWVyTWVzc2FnZXMgPSB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc01hcFByb3ZpZGVyLnRvU3RyZWFtZXJNZXNzYWdlcztcbiAgICAgICAgY29uc3QgbWVzc2FnZUZvcm1hdCA9IHRvU3RyZWFtZXJNZXNzYWdlcy5nZXQobWVzc2FnZVR5cGUpO1xuICAgICAgICBpZiAobWVzc2FnZUZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEF0dGVtcHRlZCB0byBzZW5kIGEgbWVzc2FnZSB0byB0aGUgc3RyZWFtZXIgd2l0aCBtZXNzYWdlIHR5cGU6ICR7bWVzc2FnZVR5cGV9LCBidXQgdGhlIGZyb250ZW5kIGhhc24ndCBiZWVuIGNvbmZpZ3VyZWQgdG8gc2VuZCBzdWNoIGEgbWVzc2FnZS4gQ2hlY2sgeW91J3ZlIGFkZGVkIHRoZSBtZXNzYWdlIHR5cGUgaW4geW91ciBjcHBgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZUZvcm1hdC5zdHJ1Y3R1cmUgJiYgbWVzc2FnZURhdGEgJiYgbWVzc2FnZUZvcm1hdC5zdHJ1Y3R1cmUubGVuZ3RoICE9PSBtZXNzYWdlRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgUHJvdmlkZWQgbWVzc2FnZSBkYXRhIGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQgbGF5b3V0LiBFeHBlY3RlZCBbICR7bWVzc2FnZUZvcm1hdC5zdHJ1Y3R1cmVcbiAgICAgICAgICAgICAgICAubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3VpbnQ4JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndWludDE2JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW50MTYnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdmbG9hdCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoKX0gXSBidXQgcmVjZWl2ZWQgWyAke21lc3NhZ2VEYXRhLm1hcCgoZWxlbWVudCkgPT4gdHlwZW9mIGVsZW1lbnQpLnRvU3RyaW5nKCl9IF1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYnl0ZUxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIC8vIE9uZSBsb29wIHRvIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIGFsbCBvZiB0aGUgcHJvdmlkZWQgZGF0YVxuICAgICAgICBtZXNzYWdlRGF0YS5mb3JFYWNoKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBtZXNzYWdlRm9ybWF0LnN0cnVjdHVyZVtpZHhdO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndWludDgnOlxuICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VpbnQxNic6XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaW50MTYnOlxuICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCArPSA0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGUnOlxuICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgIC8vIDIgYnl0ZXMgZm9yIHN0cmluZyBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCArPSAyO1xuICAgICAgICAgICAgICAgICAgICAvLyAyIGJ5dGVzIHBlciBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGggKz0gMiAqIHRleHRFbmNvZGVyLmVuY29kZShlbGVtZW50KS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aCArIDEpKTtcbiAgICAgICAgZGF0YS5zZXRVaW50OCgwLCBtZXNzYWdlRm9ybWF0LmlkKTtcbiAgICAgICAgbGV0IGJ5dGVPZmZzZXQgPSAxO1xuICAgICAgICBtZXNzYWdlRGF0YS5mb3JFYWNoKChlbGVtZW50LCBpZHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBtZXNzYWdlRm9ybWF0LnN0cnVjdHVyZVtpZHhdO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndWludDgnOlxuICAgICAgICAgICAgICAgICAgICBkYXRhLnNldFVpbnQ4KGJ5dGVPZmZzZXQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VpbnQxNic6XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0VWludDE2KGJ5dGVPZmZzZXQsIGVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ludDE2JzpcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRJbnQxNihieXRlT2Zmc2V0LCBlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZU9mZnNldCArPSAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdmbG9hdCc6XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0RmxvYXQzMihieXRlT2Zmc2V0LCBlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZU9mZnNldCArPSA0O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkb3VibGUnOlxuICAgICAgICAgICAgICAgICAgICBkYXRhLnNldEZsb2F0NjQoYnl0ZU9mZnNldCwgZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVPZmZzZXQgKz0gODtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRVaW50MTYoYnl0ZU9mZnNldCwgZWxlbWVudC5sZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRVaW50MTYoYnl0ZU9mZnNldCwgZWxlbWVudC5jaGFyQ29kZUF0KGkpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVPZmZzZXQgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5kYXRhQ2hhbm5lbFNlbmRlci5jYW5TZW5kKCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGBEYXRhIGNoYW5uZWwgY2Fubm90IHNlbmQgeWV0LCBza2lwcGluZyBzZW5kaW5nIG1lc3NhZ2U6ICR7bWVzc2FnZVR5cGV9IC0gJHtuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlcil9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbFNlbmRlci5zZW5kRGF0YShkYXRhLmJ1ZmZlcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2VuZE1lc3NhZ2VDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5leHBvcnQgY2xhc3MgVG9TdHJlYW1lck1lc3NhZ2Uge1xufVxuZXhwb3J0IGNsYXNzIFN0cmVhbU1lc3NhZ2VDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVySGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVySGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB0aGUgRGVmYXVsdCBtZXNzYWdlIHByb3RvY29sXG4gICAgICovXG4gICAgcG9wdWxhdGVEZWZhdWx0UHJvdG9jb2woKSB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIENvbnRyb2wgTWVzc2FnZXMuIFJhbmdlID0gMC4uNDkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0lGcmFtZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICBpZDogMCxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnUmVxdWVzdFF1YWxpdHlDb250cm9sJywge1xuICAgICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0Zwc1JlcXVlc3QnLCB7XG4gICAgICAgICAgICBpZDogMixcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnQXZlcmFnZUJpdHJhdGVSZXF1ZXN0Jywge1xuICAgICAgICAgICAgaWQ6IDMsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1N0YXJ0U3RyZWFtaW5nJywge1xuICAgICAgICAgICAgaWQ6IDQsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1N0b3BTdHJlYW1pbmcnLCB7XG4gICAgICAgICAgICBpZDogNSxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnTGF0ZW5jeVRlc3QnLCB7XG4gICAgICAgICAgICBpZDogNixcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWydzdHJpbmcnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdSZXF1ZXN0SW5pdGlhbFNldHRpbmdzJywge1xuICAgICAgICAgICAgaWQ6IDcsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1Rlc3RFY2hvJywge1xuICAgICAgICAgICAgaWQ6IDgsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0RhdGFDaGFubmVsTGF0ZW5jeVRlc3QnLCB7XG4gICAgICAgICAgICBpZDogOSxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIC8qXG4gICAgICAgICAqIElucHV0IE1lc3NhZ2VzLiBSYW5nZSA9IDUwLi44OS5cbiAgICAgICAgICovXG4gICAgICAgIC8vIEdlbmVyaWMgSW5wdXQgTWVzc2FnZXMuIFJhbmdlID0gNTAuLjU5LlxuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1VJSW50ZXJhY3Rpb24nLCB7XG4gICAgICAgICAgICBpZDogNTAsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsnc3RyaW5nJ11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnQ29tbWFuZCcsIHtcbiAgICAgICAgICAgIGlkOiA1MSxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWydzdHJpbmcnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdUZXh0Ym94RW50cnknLCB7XG4gICAgICAgICAgICBpZDogNTIsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsnc3RyaW5nJ11cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEtleWJvYXJkIElucHV0IE1lc3NhZ2UuIFJhbmdlID0gNjAuLjY5LlxuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0tleURvd24nLCB7XG4gICAgICAgICAgICBpZDogNjAsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgIGtleUNvZGUgIGlzUmVwZWF0XG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnLCAndWludDgnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdLZXlVcCcsIHtcbiAgICAgICAgICAgIGlkOiA2MSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAga2V5Q29kZVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnS2V5UHJlc3MnLCB7XG4gICAgICAgICAgICBpZDogNjIsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgIGNoYXJjb2RlXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDE2J11cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE1vdXNlIElucHV0IE1lc3NhZ2VzLiBSYW5nZSA9IDcwLi43OS5cbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZUVudGVyJywge1xuICAgICAgICAgICAgaWQ6IDcwLFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZUxlYXZlJywge1xuICAgICAgICAgICAgaWQ6IDcxLFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZURvd24nLCB7XG4gICAgICAgICAgICBpZDogNzIsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgYnV0dG9uICAgICB4ICAgICAgICAgeVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQxNicsICd1aW50MTYnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZVVwJywge1xuICAgICAgICAgICAgaWQ6IDczLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIGJ1dHRvbiAgICAgeCAgICAgICAgIHlcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50MTYnLCAndWludDE2J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnTW91c2VNb3ZlJywge1xuICAgICAgICAgICAgaWQ6IDc0LFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIHggICAgICAgICAgIHkgICAgICBkZWx0YVggICAgZGVsdGFZXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDE2JywgJ3VpbnQxNicsICdpbnQxNicsICdpbnQxNiddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ01vdXNlV2hlZWwnLCB7XG4gICAgICAgICAgICBpZDogNzUsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgZGVsdGEgICAgICAgeCAgICAgICAgeVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ2ludDE2JywgJ3VpbnQxNicsICd1aW50MTYnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZURvdWJsZScsIHtcbiAgICAgICAgICAgIGlkOiA3NixcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICBidXR0b24gICAgIHggICAgICAgICB5XG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnLCAndWludDE2JywgJ3VpbnQxNiddXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUb3VjaCBJbnB1dCBNZXNzYWdlcy4gUmFuZ2UgPSA4MC4uODkuXG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnVG91Y2hTdGFydCcsIHtcbiAgICAgICAgICAgIGlkOiA4MCxcbiAgICAgICAgICAgIC8vICAgICAgICAgIG51bXRvdWNoZXMoMSkgICB4ICAgICAgIHkgICAgICAgIGlkeCAgICAgZm9yY2UgICAgIHZhbGlkXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnLCAndWludDE2JywgJ3VpbnQxNicsICd1aW50OCcsICd1aW50OCcsICd1aW50OCddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1RvdWNoRW5kJywge1xuICAgICAgICAgICAgaWQ6IDgxLFxuICAgICAgICAgICAgLy8gICAgICAgICAgbnVtdG91Y2hlcygxKSAgIHggICAgICAgeSAgICAgICAgaWR4ICAgICBmb3JjZSAgICAgdmFsaWRcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50MTYnLCAndWludDE2JywgJ3VpbnQ4JywgJ3VpbnQ4JywgJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnVG91Y2hNb3ZlJywge1xuICAgICAgICAgICAgaWQ6IDgyLFxuICAgICAgICAgICAgLy8gICAgICAgICAgbnVtdG91Y2hlcygxKSAgIHggICAgICAgeSAgICAgICBpZHggICAgICBmb3JjZSAgICAgdmFsaWRcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50MTYnLCAndWludDE2JywgJ3VpbnQ4JywgJ3VpbnQ4JywgJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEdhbWVwYWQgSW5wdXQgTWVzc2FnZXMuIFJhbmdlID0gOTAuLjk5XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnR2FtZXBhZENvbm5lY3RlZCcsIHtcbiAgICAgICAgICAgIGlkOiA5MyxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnR2FtZXBhZEJ1dHRvblByZXNzZWQnLCB7XG4gICAgICAgICAgICBpZDogOTAsXG4gICAgICAgICAgICAvLyAgICAgICAgIGN0cmxlcklkICAgYnV0dG9uICBpc1JlcGVhdFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQ4JywgJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnR2FtZXBhZEJ1dHRvblJlbGVhc2VkJywge1xuICAgICAgICAgICAgaWQ6IDkxLFxuICAgICAgICAgICAgLy8gICAgICAgICBjdHJsZXJJZCAgIGJ1dHRvbiAgaXNSZXBlYXQoMClcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50OCcsICd1aW50OCddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0dhbWVwYWRBbmFsb2cnLCB7XG4gICAgICAgICAgICBpZDogOTIsXG4gICAgICAgICAgICAvLyAgICAgICAgIGN0cmxlcklkICAgYnV0dG9uICBhbmFsb2dWYWx1ZVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQ4JywgJ2RvdWJsZSddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0dhbWVwYWREaXNjb25uZWN0ZWQnLCB7XG4gICAgICAgICAgICBpZDogOTQsXG4gICAgICAgICAgICAvLyAgICAgICAgICBjdHJsZXJJZFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDAsICdRdWFsaXR5Q29udHJvbE93bmVyc2hpcCcpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCgxLCAnUmVzcG9uc2UnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMiwgJ0NvbW1hbmQnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMywgJ0ZyZWV6ZUZyYW1lJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDQsICdVbmZyZWV6ZUZyYW1lJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDUsICdWaWRlb0VuY29kZXJBdmdRUCcpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCg2LCAnTGF0ZW5jeVRlc3QnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoNywgJ0luaXRpYWxTZXR0aW5ncycpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCg4LCAnRmlsZUV4dGVuc2lvbicpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCg5LCAnRmlsZU1pbWVUeXBlJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDEwLCAnRmlsZUNvbnRlbnRzJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDExLCAnVGVzdEVjaG8nKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMTIsICdJbnB1dENvbnRyb2xPd25lcnNoaXAnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMTMsICdHYW1lcGFkUmVzcG9uc2UnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMTQsICdEYXRhQ2hhbm5lbExhdGVuY3lUZXN0Jyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDI1NSwgJ1Byb3RvY29sJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgbWVzc2FnZSBoYW5kbGVyXG4gICAgICogQHBhcmFtIG1lc3NhZ2VEaXJlY3Rpb24gLSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtZXNzYWdlOyB0b1N0cmVhbWVyIG9yIGZyb21TdHJlYW1lclxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSAtIHRoZSB0eXBlIG9mIHRoZSBtZXNzYWdlXG4gICAgICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyIC0gdGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCB0byBiZSBleGVjdXRlZCB3aGVuIHRoaXMgaGFuZGxlciBpcyBjYWxsZWRcbiAgICAgKi9cbiAgICByZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKG1lc3NhZ2VEaXJlY3Rpb24sIG1lc3NhZ2VUeXBlLCBtZXNzYWdlSGFuZGxlcikge1xuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyOlxuICAgICAgICAgICAgICAgIHRoaXMudG9TdHJlYW1lckhhbmRsZXJzLnNldChtZXNzYWdlVHlwZSwgbWVzc2FnZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lcjpcbiAgICAgICAgICAgICAgICB0aGlzLmZyb21TdHJlYW1lckhhbmRsZXJzLnNldChtZXNzYWdlVHlwZSwgbWVzc2FnZUhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbyhgVW5rbm93biBtZXNzYWdlIGRpcmVjdGlvbiAke21lc3NhZ2VEaXJlY3Rpb259YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBlbnVtIGZvciBtZXNzYWdlIGRpcmVjdGlvbnNcbiAqL1xuZXhwb3J0IHZhciBNZXNzYWdlRGlyZWN0aW9uO1xuKGZ1bmN0aW9uIChNZXNzYWdlRGlyZWN0aW9uKSB7XG4gICAgTWVzc2FnZURpcmVjdGlvbltNZXNzYWdlRGlyZWN0aW9uW1wiVG9TdHJlYW1lclwiXSA9IDBdID0gXCJUb1N0cmVhbWVyXCI7XG4gICAgTWVzc2FnZURpcmVjdGlvbltNZXNzYWdlRGlyZWN0aW9uW1wiRnJvbVN0cmVhbWVyXCJdID0gMV0gPSBcIkZyb21TdHJlYW1lclwiO1xufSkoTWVzc2FnZURpcmVjdGlvbiB8fCAoTWVzc2FnZURpcmVjdGlvbiA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJlYW1NZXNzYWdlQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IGNsYXNzIFRvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBzZW5kTWVzc2FnZUNvbnRyb2xsZXIgLSBTdHJlYW0gbWVzc2FnZSBjb250cm9sbGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2VuZE1lc3NhZ2VDb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyID0gc2VuZE1lc3NhZ2VDb250cm9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIFJlcXVlc3QgdG8gVGFrZSBRdWFsaXR5IENvbnRyb2wgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgU2VuZFJlcXVlc3RRdWFsaXR5Q29udHJvbCgpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdSZXF1ZXN0UXVhbGl0eUNvbnRyb2wnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBNYXggRlBTIFJlcXVlc3QgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgU2VuZE1heEZwc1JlcXVlc3QoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignRnBzUmVxdWVzdCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIEF2ZXJhZ2UgQml0cmF0ZSBSZXF1ZXN0IHRvIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqL1xuICAgIFNlbmRBdmVyYWdlQml0cmF0ZVJlcXVlc3QoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignQXZlcmFnZUJpdHJhdGVSZXF1ZXN0Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBTdGFydCBTdHJlYW1pbmcgTWVzc2FnZSB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBTZW5kU3RhcnRTdHJlYW1pbmcoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignU3RhcnRTdHJlYW1pbmcnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIFN0b3AgU3RyZWFtaW5nIE1lc3NhZ2UgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgU2VuZFN0b3BTdHJlYW1pbmcoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignU3RvcFN0cmVhbWluZycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgUmVxdWVzdCBJbml0aWFsIFNldHRpbmdzIHRvIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqL1xuICAgIFNlbmRSZXF1ZXN0SW5pdGlhbFNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1JlcXVlc3RJbml0aWFsU2V0dGluZ3MnKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub1N0cmVhbWVyTWVzc2FnZXNDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5leHBvcnQgY2xhc3MgQnJvd3NlclV0aWxzIHtcbiAgICBzdGF0aWMgZ2V0U3VwcG9ydGVkVmlkZW9Db2RlY3MoKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MgPSBbXTtcbiAgICAgICAgLy8gVHJ5IGdldCB0aGUgaW5mbyBuZWVkZWQgZnJvbSB0aGUgUlRDUnRwUmVjZWl2ZXIuIFRoaXMgaXMgb25seSBhdmFpbGFibGUgb24gY2hyb21lXG4gICAgICAgIGlmICghUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZygnUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzIEFQSSBpcyBub3QgYXZhaWxhYmxlIGluIHlvdXIgYnJvd3NlciwgZGVmYXVsdGluZyB0byBndWVzcyB0aGF0IHdlIHN1cHBvcnQgSC4yNjQuJyk7XG4gICAgICAgICAgICBicm93c2VyU3VwcG9ydGVkQ29kZWNzLnB1c2goJ0gyNjQgbGV2ZWwtYXN5bW1ldHJ5LWFsbG93ZWQ9MTtwYWNrZXRpemF0aW9uLW1vZGU9MTtwcm9maWxlLWxldmVsLWlkPTQyZTAxZicpO1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3M7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF0Y2hlciA9IC8oVlBcXGR8SDI2XFxkfEFWMSkuKi87XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IFJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcygndmlkZW8nKTtcbiAgICAgICAgaWYgKCFjYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgIGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MucHVzaCgnSDI2NCBsZXZlbC1hc3ltbWV0cnktYWxsb3dlZD0xO3BhY2tldGl6YXRpb24tbW9kZT0xO3Byb2ZpbGUtbGV2ZWwtaWQ9NDJlMDFmJyk7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlclN1cHBvcnRlZENvZGVjcztcbiAgICAgICAgfVxuICAgICAgICBjYXBhYmlsaXRpZXMuY29kZWNzLmZvckVhY2goKGNvZGVjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSBjb2RlYy5taW1lVHlwZS5zcGxpdCgnLycpWzFdICsgJyAnICsgKGNvZGVjLnNkcEZtdHBMaW5lIHx8ICcnKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlci5leGVjKHN0cik7XG4gICAgICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicm93c2VyU3VwcG9ydGVkQ29kZWNzLnB1c2goc3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBicm93c2VyU3VwcG9ydGVkQ29kZWNzO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJVdGlscy5qcy5tYXAiLCIvKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIEFGSyBkaXNjb25uZWN0IGlzIGFib3V0IHRvIGhhcHBlbi5cbiAqIENhbiBiZSBjYW5jZWxsZWQgYnkgY2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZmtXYXJuaW5nQWN0aXZhdGVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdhZmtXYXJuaW5nQWN0aXZhdGUnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHRoZSBBRksgZGlzY29ubmVjdCBjb3VudGRvd24gaXMgdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFma1dhcm5pbmdVcGRhdGVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdhZmtXYXJuaW5nVXBkYXRlJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBBRksgd2FybmluZyBpcyBkZWFjdGl2YXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFma1dhcm5pbmdEZWFjdGl2YXRlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdhZmtXYXJuaW5nRGVhY3RpdmF0ZScpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gQUZLIGNvdW50ZG93biByZWFjaGVzIDAgYW5kIHRoZSB1c2VyIGlzIGRpc2Nvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFma1RpbWVkT3V0RXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdhZmtUaW1lZE91dCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gd2UgcmVjZWl2ZSBuZXcgdmlkZW8gcXVhbGl0eSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFZpZGVvRW5jb2RlckF2Z1FQRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcigndmlkZW9FbmNvZGVyQXZnUVAnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBhZnRlciBhIFdlYlJ0YyBjb25uZWN0aW9uIGhhcyBiZWVuIG5lZ290aWF0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNTZHBFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y1NkcCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGFmdGVyIHRoZSBTRFAgYW5zd2VyIGlzIHNldC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJ0Y1NkcEFuc3dlckV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y1NkcEFuc3dlcicpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGFmdGVyIHRoZSBTRFAgb2ZmZXIgaXMgc2V0LlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjU2RwT2ZmZXJFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCd3ZWJSdGNTZHBPZmZlcicpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gYXV0byBjb25uZWN0aW5nLlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjQXV0b0Nvbm5lY3RFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y0F1dG9Db25uZWN0Jyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBzZW5kaW5nIGEgV2ViUnRjIG9mZmVyLlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjQ29ubmVjdGluZ0V2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignd2ViUnRjQ29ubmVjdGluZycpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gV2ViUnRjIGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNDb25uZWN0ZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y0Nvbm5lY3RlZCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGlmIFdlYlJ0YyBjb25uZWN0aW9uIGhhcyBmYWlsZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNGYWlsZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y0ZhaWxlZCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGlmIFdlYlJ0YyBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJ0Y0Rpc2Nvbm5lY3RlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y0Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gUlRDRGF0YUNoYW5uZWwgaXMgb3BlbmVkLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNoYW5uZWxPcGVuRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignZGF0YUNoYW5uZWxPcGVuJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBSVENEYXRhQ2hhbm5lbCBpcyBjbG9zZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbENsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignZGF0YUNoYW5uZWxDbG9zZScpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIG9uIFJUQ0RhdGFDaGFubmVsIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdkYXRhQ2hhbm5lbEVycm9yJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgdmlkZW8gc3RyZWFtIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICovXG5leHBvcnQgY2xhc3MgVmlkZW9Jbml0aWFsaXplZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigndmlkZW9Jbml0aWFsaXplZCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdmlkZW8gc3RyZWFtIGxvYWRpbmcgc3RhcnRzLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtTG9hZGluZ0V2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignc3RyZWFtTG9hZGluZycpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdmlkZW8gc3RyZWFtIGxvYWRpbmcgaGFzIGZpbmlzaGVkLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtUHJlQ29ubmVjdEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignc3RyZWFtQ29ubmVjdCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdmlkZW8gc3RyZWFtIGhhcyBzdG9wcGVkLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtUHJlRGlzY29ubmVjdEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignc3RyZWFtRGlzY29ubmVjdCcpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdmlkZW8gc3RyZWFtIGlzIHJlY29ubmVjdGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmVhbVJlY29ubmVjdEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignc3RyZWFtUmVjb25uZWN0Jyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgaWYgdGhlcmUgYXJlIGVycm9ycyBsb2FkaW5nIHRoZSB2aWRlbyBzdHJlYW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5U3RyZWFtRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdwbGF5U3RyZWFtRXJyb3InKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBiZWZvcmUgdHJ5aW5nIHRvIHN0YXJ0IHZpZGVvIHBsYXliYWNrLlxuICovXG5leHBvcnQgY2xhc3MgUGxheVN0cmVhbUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigncGxheVN0cmVhbScpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGlmIHRoZSBicm93c2VyIHJlamVjdHMgdmlkZW8gcGxheWJhY2suIENhbiBoYXBwZW4gZm9yIGV4YW1wbGUgaWZcbiAqIHZpZGVvIGF1dG8tcGxheSB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24gaXMgcmVmdXNlZCBieSB0aGUgYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYXlTdHJlYW1SZWplY3RlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3BsYXlTdHJlYW1SZWplY3RlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gcmVjZWl2aW5nIGEgZnVsbCBGcmVlemVGcmFtZSBpbWFnZSBmcm9tIFVFLlxuICovXG5leHBvcnQgY2xhc3MgTG9hZEZyZWV6ZUZyYW1lRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignbG9hZEZyZWV6ZUZyYW1lJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiByZWNlaXZpbmcgVW5mcmVlemVGcmFtZSBtZXNzYWdlIGZyb20gVUUgYW5kIHZpZGVvIHBsYXliYWNrIGlzIGFib3V0IHRvIGJlIHJlc3VtZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBIaWRlRnJlZXplRnJhbWVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ2hpZGVGcmVlemVGcmFtZScpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gcmVjZWl2aW5nIFdlYlJUQyBzdGF0aXN0aWNzLlxuICovXG5leHBvcnQgY2xhc3MgU3RhdHNSZWNlaXZlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3N0YXRzUmVjZWl2ZWQnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHN0cmVhbWVyIGxpc3QgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmVhbWVyTGlzdE1lc3NhZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdzdHJlYW1lckxpc3RNZXNzYWdlJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBhIHN1YnNjcmliZWQgdG8gc3RyZWFtZXIncyBpZCBjaGFuZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignU3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiByZWNlaXZpbmcgbGF0ZW5jeSB0ZXN0IHJlc3VsdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXRlbmN5VGVzdFJlc3VsdEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ2xhdGVuY3lUZXN0UmVzdWx0Jyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgZXZlcnl0aW1lIGxhdGVuY3kgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgV2ViUlRDIHN0YXRzIEFQSS5cbiAqL1xuZXhwb3J0IGNsYXNzIExhdGVuY3lDYWxjdWxhdGVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignbGF0ZW5jeUNhbGN1bGF0ZWQnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHdlIHJlY2VpdmUgdGhlIFwib25TY3JlZW5LZXlib2FyZFwiIGNvbW1hbmQgZnJvbSBVRS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNob3dPblNjcmVlbktleWJvYXJkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignc2hvd09uU2NyZWVuS2V5Ym9hcmQnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHJlY2VpdmluZyBkYXRhIGNoYW5uZWwgbGF0ZW5jeSB0ZXN0IHJlc3BvbnNlIGZyb20gc2VydmVyLlxuICogVGhpcyBldmVudCBpcyBoYW5kbGVkIGJ5IERhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2UnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIGRhdGEgY2hhbm5lbCBsYXRlbmN5IHRlc3QgcmVzdWx0cyBhcmUgcmVhZHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0RXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignZGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBTdWJzY3JpYmVGYWlsZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdzdWJzY3JpYmVGYWlsZWQnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHJlY2VpdmluZyBpbml0aWFsIHNldHRpbmdzIGZyb20gVUUuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbml0aWFsU2V0dGluZ3NFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdpbml0aWFsU2V0dGluZ3MnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIFBpeGVsU3RyZWFtaW5nIHNldHRpbmdzIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzQ2hhbmdlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3NldHRpbmdzQ2hhbmdlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogRXZlbnQgZW1pdHRlZCB3aGVuIGFuIFhSIFNlc3Npb24gc3RhcnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBYclNlc3Npb25TdGFydGVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCd4clNlc3Npb25TdGFydGVkJyk7XG4gICAgfVxufVxuLyoqXG4gKiBFdmVudCBlbWl0dGVkIHdoZW4gYW4gWFIgU2Vzc2lvbiBlbmRzXG4gKi9cbmV4cG9ydCBjbGFzcyBYclNlc3Npb25FbmRlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigneHJTZXNzaW9uRW5kZWQnKTtcbiAgICB9XG59XG4vKipcbiAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhbiBYUiBGcmFtZSBpcyBjb21wbGV0ZVxuICovXG5leHBvcnQgY2xhc3MgWHJGcmFtZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3hyRnJhbWUnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHJlY2VpdmluZyBhIHBsYXllciBjb3VudCBmcm9tIHRoZSBzaWduYWxsaW5nIHNlcnZlclxuICovXG5leHBvcnQgY2xhc3MgUGxheWVyQ291bnRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdwbGF5ZXJDb3VudCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdGhlIHdlYlJUQyBjb25uZWN0aW9ucyBpcyByZWxheWVkIG92ZXIgVENQLlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjVENQUmVsYXlEZXRlY3RlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignd2ViUnRjVENQUmVsYXlEZXRlY3RlZCcpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBQaXhlbFN0cmVhbWluZ0V2ZW50RW1pdHRlciBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIG5ldyBldmVudC5cbiAgICAgKiBAcGFyYW0gZSBldmVudFxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZGlzcGF0Y2hFdmVudChlKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEV2ZW50KGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBhbiBldmVudCBoYW5kbGVyLlxuICAgICAqIEBwYXJhbSB0eXBlIGV2ZW50IG5hbWVcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqL1xuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgc3VwZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBldmVudCBoYW5kbGVyLlxuICAgICAqIEBwYXJhbSB0eXBlIGV2ZW50IG5hbWVcbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqL1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgc3VwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRFbWl0dGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHBvcHVsYXRlIGZpbGUgaW5mb3JtYXRpb24gZnJvbSBieXRlIGJ1ZmZlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlVXRpbCB7XG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgZmlsZXMgZXh0ZW5zaW9uIHdoZW4gcmVjZWl2ZWQgb3ZlciBkYXRhIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gdmlldyAtIHRoZSBmaWxlIGV4dGVuc2lvbiBkYXRhXG4gICAgICovXG4gICAgc3RhdGljIHNldEV4dGVuc2lvbkZyb21CeXRlcyh2aWV3LCBmaWxlKSB7XG4gICAgICAgIC8vIFJlc2V0IGZpbGUgaWYgd2UgZ290IGEgZmlsZSBtZXNzYWdlIGFuZCB3ZSBhcmUgbm90IFwicmVjZWl2aW5nXCIgaXQgeWV0XG4gICAgICAgIGlmICghZmlsZS5yZWNlaXZpbmcpIHtcbiAgICAgICAgICAgIGZpbGUubWltZXR5cGUgPSAnJztcbiAgICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID0gJyc7XG4gICAgICAgICAgICBmaWxlLnJlY2VpdmluZyA9IHRydWU7XG4gICAgICAgICAgICBmaWxlLnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBmaWxlLmNodW5rcyA9IDA7XG4gICAgICAgICAgICBmaWxlLmRhdGEgPSBbXTtcbiAgICAgICAgICAgIGZpbGUudGltZXN0YW1wU3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdSZWNlaXZlZCBmaXJzdCBjaHVuayBvZiBmaWxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uQXNTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZSh2aWV3LnNsaWNlKDEpKTtcbiAgICAgICAgTG9nZ2VyLkluZm8oZXh0ZW5zaW9uQXNTdHJpbmcpO1xuICAgICAgICBmaWxlLmV4dGVuc2lvbiA9IGV4dGVuc2lvbkFzU3RyaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSBmaWxlcyBtaW1lIHR5cGUgd2hlbiByZWNlaXZlZCBvdmVyIGRhdGEgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB2aWV3IC0gdGhlIGZpbGUgbWltZSB0eXBlIGRhdGFcbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0TWltZVR5cGVGcm9tQnl0ZXModmlldywgZmlsZSkge1xuICAgICAgICAvLyBSZXNldCBmaWxlIGlmIHdlIGdvdCBhIGZpbGUgbWVzc2FnZSBhbmQgd2UgYXJlIG5vdCBcInJlY2VpdmluZ1wiIGl0IHlldFxuICAgICAgICBpZiAoIWZpbGUucmVjZWl2aW5nKSB7XG4gICAgICAgICAgICBmaWxlLm1pbWV0eXBlID0gJyc7XG4gICAgICAgICAgICBmaWxlLmV4dGVuc2lvbiA9ICcnO1xuICAgICAgICAgICAgZmlsZS5yZWNlaXZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgZmlsZS52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgZmlsZS5jaHVua3MgPSAwO1xuICAgICAgICAgICAgZmlsZS5kYXRhID0gW107XG4gICAgICAgICAgICBmaWxlLnRpbWVzdGFtcFN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnUmVjZWl2ZWQgZmlyc3QgY2h1bmsgb2YgZmlsZScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbWVBc1N0cmluZyA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKHZpZXcuc2xpY2UoMSkpO1xuICAgICAgICBMb2dnZXIuSW5mbyhtaW1lQXNTdHJpbmcpO1xuICAgICAgICBmaWxlLm1pbWV0eXBlID0gbWltZUFzU3RyaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSBmaWxlcyBjb250ZW50cyB3aGVuIHJlY2VpdmVkIG92ZXIgZGF0YSBjaGFubmVsXG4gICAgICogQHBhcmFtIHZpZXcgLSB0aGUgZmlsZSBjb250ZW50cyBkYXRhXG4gICAgICovXG4gICAgc3RhdGljIHNldENvbnRlbnRzRnJvbUJ5dGVzKHZpZXcsIGZpbGUpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCByZWNlaXZlZCB0aGUgaW5pdGlhbCBzZXR1cCBpbnN0cnVjdGlvbnMsIHJldHVyblxuICAgICAgICBpZiAoIWZpbGUucmVjZWl2aW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCB0eXBlU2l6ZSA9IDE7XG4gICAgICAgIGNvbnN0IGludFNpemUgPSA0O1xuICAgICAgICBjb25zdCBtYXhNZXNzYWdlU2l6ZSA9IDE2ICogMTAyNDtcbiAgICAgICAgY29uc3QgaGVhZGVyU2l6ZSA9IHR5cGVTaXplICsgaW50U2l6ZTtcbiAgICAgICAgY29uc3QgbWF4UGF5bG9hZFNpemUgPSBtYXhNZXNzYWdlU2l6ZSAtIGhlYWRlclNpemU7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBudW1iZXIgb2YgY2h1bmtzIGZyb20gdGhlIHRvdGFsIGZpbGUgc2l6ZVxuICAgICAgICBmaWxlLmNodW5rcyA9IE1hdGguY2VpbChuZXcgRGF0YVZpZXcodmlldy5zbGljZSh0eXBlU2l6ZSwgaGVhZGVyU2l6ZSkuYnVmZmVyKS5nZXRJbnQzMigwLCB0cnVlKSAvIG1heFBheWxvYWRTaXplKTtcbiAgICAgICAgLy8gR2V0IHRoZSBmaWxlIHBhcnQgb2YgdGhlIHBheWxvYWRcbiAgICAgICAgY29uc3QgZmlsZUJ5dGVzID0gdmlldy5zbGljZShoZWFkZXJTaXplKTtcbiAgICAgICAgLy8gQXBwZW5kIHRvIGV4aXN0aW5nIGRhdGEgdGhhdCBob2xkcyB0aGUgZmlsZVxuICAgICAgICBmaWxlLmRhdGEucHVzaChmaWxlQnl0ZXMpO1xuICAgICAgICAvLyBVbmNvbW1lbnQgZm9yIGRlYnVnXG4gICAgICAgIExvZ2dlci5JbmZvKGBSZWNlaXZlZCBmaWxlIGNodW5rOiAke2ZpbGUuZGF0YS5sZW5ndGh9LyR7ZmlsZS5jaHVua3N9YCk7XG4gICAgICAgIGlmIChmaWxlLmRhdGEubGVuZ3RoID09PSBmaWxlLmNodW5rcykge1xuICAgICAgICAgICAgZmlsZS5yZWNlaXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGZpbGUudmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1JlY2VpdmVkIGNvbXBsZXRlIGZpbGUnKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyRHVyYXRpb24gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGZpbGUudGltZXN0YW1wU3RhcnQ7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2ZlckJpdHJhdGUgPSBNYXRoLnJvdW5kKChmaWxlLmNodW5rcyAqIG1heE1lc3NhZ2VTaXplKSAvIHRyYW5zZmVyRHVyYXRpb24pO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYEF2ZXJhZ2UgdHJhbnNmZXIgYml0cmF0ZTogJHt0cmFuc2ZlckJpdHJhdGV9a2IvcyBvdmVyICR7dHJhbnNmZXJEdXJhdGlvbiAvIDEwMDB9IHNlY29uZHNgKTtcbiAgICAgICAgICAgIC8vIEZpbGUgcmVjb25zdHJ1Y3Rpb25cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRXhhbXBsZSBjb2RlIHRvIHJlY29uc3RydWN0IHRoZSBmaWxlXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogVGhpcyBjb2RlIHJlY29uc3RydWN0cyB0aGUgcmVjZWl2ZWQgZGF0YSBpbnRvIHRoZSBvcmlnaW5hbCBmaWxlIGJhc2VkIG9uIHRoZSBtaW1lIHR5cGUgYW5kIGV4dGVuc2lvbiBwcm92aWRlZCBhbmQgdGhlbiBkb3dubG9hZHMgdGhlIHJlY29uc3RydWN0ZWQgZmlsZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCByZWNlaXZlZCA9IG5ldyBCbG9iKGZpbGUuZGF0YSwgeyB0eXBlOiBmaWxlLm1pbWV0eXBlIH0pO1xuICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCdocmVmJywgVVJMLmNyZWF0ZU9iamVjdFVSTChyZWNlaXZlZCkpO1xuICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgYHRyYW5zZmVyLiR7ZmlsZS5leHRlbnNpb259YCk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChhKTtcbiAgICAgICAgICAgIC8vIGlmIHlvdSBhcmUgc28gaW5jbGluZWQgdG8gbWFrZSBpdCBhdXRvLWRvd25sb2FkLCBkbyBzb21ldGhpbmcgbGlrZTogYS5jbGljaygpO1xuICAgICAgICAgICAgYS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaWxlLmRhdGEubGVuZ3RoID4gZmlsZS5jaHVua3MpIHtcbiAgICAgICAgICAgIGZpbGUucmVjZWl2aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoYFJlY2VpdmVkIGJpZ2dlciBmaWxlIHRoYW4gYWR2ZXJ0aXNlZDogJHtmaWxlLmRhdGEubGVuZ3RofS8ke2ZpbGUuY2h1bmtzfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHRlbXBsYXRlIGZvciBhIGRvd25sb2FkZWQgZmlsZVxuICovXG5leHBvcnQgY2xhc3MgRmlsZVRlbXBsYXRlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5taW1ldHlwZSA9ICcnO1xuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9ICcnO1xuICAgICAgICB0aGlzLnJlY2VpdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNodW5rcyA9IDA7XG4gICAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLnZhbGlkID0gZmFsc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RmlsZVV0aWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQSBjYXNlIGluc2Vuc2l0aXZlLCBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIFVSTFNlYXJjaFBhcmFtc1xuICovXG5leHBvcnQgY2xhc3MgSVVSTFNlYXJjaFBhcmFtcyB7XG4gICAgY29uc3RydWN0b3Ioc2VhcmNoKSB7XG4gICAgICAgIHRoaXMuX3VybFBhcmFtcyA9IHt9O1xuICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCk7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiB1cmxQYXJhbXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3VybFBhcmFtc1tuYW1lLnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKSBpbiB0aGlzLl91cmxQYXJhbXM7XG4gICAgfVxuICAgIGdldChuYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VybFBhcmFtc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlVUkxTZWFyY2hQYXJhbXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQ29udmVydHMgY29vcmRpbmF0ZXMgZnJvbSBlbGVtZW50IHJlbGF0aXZlIGNvb3JkaW5hdGVzIHRvIHZhbHVlcyBub3JtYWxpemVkIHdpdGhpbiB0aGUgdmFsdWUgcmFuZ2Ugb2YgYSBzaG9ydCAoYW5kIGJhY2sgYWdhaW4pXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnB1dENvb3JkVHJhbnNsYXRvciB7XG4gICAgLy8gd2UgZG9udCB1c2UgYSBjb25zdHJ1Y3RvciBoZXJlIGJlY2F1c2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGFuZCBwYXNzZWQgYXJvdW5kIHRvIHZhcmlvdXMgbG9jYXRpb25zXG4gICAgLy8gcG9zc2libHkgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC5cbiAgICByZWNvbmZpZ3VyZShwbGF5ZXJTaXplLCB2aWRlb1NpemUpIHtcbiAgICAgICAgY29uc3QgcGxheWVyQXNwZWN0UmF0aW8gPSBwbGF5ZXJTaXplLmhlaWdodCAvIHBsYXllclNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHZpZGVvQXNwZWN0UmF0aW8gPSB2aWRlb1NpemUuaGVpZ2h0IC8gdmlkZW9TaXplLndpZHRoO1xuICAgICAgICB0aGlzLnBsYXllcklzTGFyZ2VyID0gcGxheWVyQXNwZWN0UmF0aW8gPiB2aWRlb0FzcGVjdFJhdGlvO1xuICAgICAgICB0aGlzLnBsYXllclNpemUgPSBwbGF5ZXJTaXplO1xuICAgICAgICB0aGlzLnJhdGlvID0gdGhpcy5wbGF5ZXJJc0xhcmdlclxuICAgICAgICAgICAgPyBwbGF5ZXJBc3BlY3RSYXRpbyAvIHZpZGVvQXNwZWN0UmF0aW9cbiAgICAgICAgICAgIDogdmlkZW9Bc3BlY3RSYXRpbyAvIHBsYXllckFzcGVjdFJhdGlvO1xuICAgIH1cbiAgICB0cmFuc2xhdGVVbnNpZ25lZCh4LCB5KSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRYID0gdGhpcy5wbGF5ZXJJc0xhcmdlclxuICAgICAgICAgICAgPyB4IC8gdGhpcy5wbGF5ZXJTaXplLndpZHRoXG4gICAgICAgICAgICA6IHRoaXMucmF0aW8gKiAoeCAvIHRoaXMucGxheWVyU2l6ZS53aWR0aCAtIDAuNSkgKyAwLjU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRZID0gdGhpcy5wbGF5ZXJJc0xhcmdlclxuICAgICAgICAgICAgPyB0aGlzLnJhdGlvICogKHkgLyB0aGlzLnBsYXllclNpemUuaGVpZ2h0IC0gMC41KSArIDAuNVxuICAgICAgICAgICAgOiB5IC8gdGhpcy5wbGF5ZXJTaXplLmhlaWdodDtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRYIDwgMC4wIHx8IG5vcm1hbGl6ZWRYID4gMS4wIHx8IG5vcm1hbGl6ZWRZIDwgMC4wIHx8IG5vcm1hbGl6ZWRZID4gMS4wKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpblJhbmdlOiBmYWxzZSwgeDogNjU1MzUsIHk6IDY1NTM1IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBpblJhbmdlOiB0cnVlLCB4OiBub3JtYWxpemVkWCAqIDY1NTM2LCB5OiBub3JtYWxpemVkWSAqIDY1NTM2IH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJhbnNsYXRlU2lnbmVkKHgsIHkpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFggPSB0aGlzLnBsYXllcklzTGFyZ2VyXG4gICAgICAgICAgICA/IHggLyAoMC41ICogdGhpcy5wbGF5ZXJTaXplLndpZHRoKVxuICAgICAgICAgICAgOiAodGhpcy5yYXRpbyAqIHgpIC8gKDAuNSAqIHRoaXMucGxheWVyU2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRZID0gdGhpcy5wbGF5ZXJJc0xhcmdlclxuICAgICAgICAgICAgPyAodGhpcy5yYXRpbyAqIHkpIC8gKDAuNSAqIHRoaXMucGxheWVyU2l6ZS5oZWlnaHQpXG4gICAgICAgICAgICA6IHkgLyAoMC41ICogdGhpcy5wbGF5ZXJTaXplLmhlaWdodCk7XG4gICAgICAgIHJldHVybiB7IHg6IG5vcm1hbGl6ZWRYICogMzI3NjcsIHk6IG5vcm1hbGl6ZWRZICogMzI3NjcgfTtcbiAgICB9XG4gICAgdW50cmFuc2xhdGVVbnNpZ25lZCh4LCB5KSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRYID0gdGhpcy5wbGF5ZXJJc0xhcmdlciA/IHggLyA2NTUzNiA6ICh4IC8gNjU1MzYgLSAwLjUpIC8gdGhpcy5yYXRpbyArIDAuNTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFkgPSB0aGlzLnBsYXllcklzTGFyZ2VyID8gKHkgLyA2NTUzNiAtIDAuNSkgLyB0aGlzLnJhdGlvICsgMC41IDogeSAvIDY1NTM2O1xuICAgICAgICByZXR1cm4geyB4OiBub3JtYWxpemVkWCAqIHRoaXMucGxheWVyU2l6ZS53aWR0aCwgeTogbm9ybWFsaXplZFkgKiB0aGlzLnBsYXllclNpemUuaGVpZ2h0IH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5wdXRDb29yZFRyYW5zbGF0b3IuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmV4cG9ydCBjbGFzcyBSVENVdGlscyB7XG4gICAgc3RhdGljIGlzVmlkZW9UcmFuc2NlaXZlcih0cmFuc2NlaXZlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5UcmFuc2NlaXZlclJlY2VpdmVWaWRlbyh0cmFuc2NlaXZlcikgfHwgdGhpcy5jYW5UcmFuc2NlaXZlclNlbmRWaWRlbyh0cmFuc2NlaXZlcik7XG4gICAgfVxuICAgIHN0YXRpYyBjYW5UcmFuc2NlaXZlclJlY2VpdmVWaWRlbyh0cmFuc2NlaXZlcikge1xuICAgICAgICByZXR1cm4gKCEhdHJhbnNjZWl2ZXIgJiZcbiAgICAgICAgICAgICh0cmFuc2NlaXZlci5kaXJlY3Rpb24gPT09ICdzZW5kcmVjdicgfHwgdHJhbnNjZWl2ZXIuZGlyZWN0aW9uID09PSAncmVjdm9ubHknKSAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlci50cmFjay5raW5kID09PSAndmlkZW8nKTtcbiAgICB9XG4gICAgc3RhdGljIGNhblRyYW5zY2VpdmVyU2VuZFZpZGVvKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiAoISF0cmFuc2NlaXZlciAmJlxuICAgICAgICAgICAgKHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCB0cmFuc2NlaXZlci5kaXJlY3Rpb24gPT09ICdzZW5kb25seScpICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlci50cmFjayAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2VuZGVyLnRyYWNrLmtpbmQgPT09ICd2aWRlbycpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNBdWRpb1RyYW5zY2VpdmVyKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhblRyYW5zY2VpdmVyUmVjZWl2ZUF1ZGlvKHRyYW5zY2VpdmVyKSB8fCB0aGlzLmNhblRyYW5zY2VpdmVyU2VuZEF1ZGlvKHRyYW5zY2VpdmVyKTtcbiAgICB9XG4gICAgc3RhdGljIGNhblRyYW5zY2VpdmVyUmVjZWl2ZUF1ZGlvKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiAoISF0cmFuc2NlaXZlciAmJlxuICAgICAgICAgICAgKHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCB0cmFuc2NlaXZlci5kaXJlY3Rpb24gPT09ICdyZWN2b25seScpICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlciAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrLmtpbmQgPT09ICdhdWRpbycpO1xuICAgIH1cbiAgICBzdGF0aWMgY2FuVHJhbnNjZWl2ZXJTZW5kQXVkaW8odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuICghIXRyYW5zY2VpdmVyICYmXG4gICAgICAgICAgICAodHJhbnNjZWl2ZXIuZGlyZWN0aW9uID09PSAnc2VuZHJlY3YnIHx8IHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9PT0gJ3NlbmRvbmx5JykgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlciAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2VuZGVyLnRyYWNrICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIudHJhY2sua2luZCA9PT0gJ2F1ZGlvJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UlRDVXRpbHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogVmlkZW8gUGxheWVyIENvbnRyb2xsZXIgaGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgdGhlIHZpZGVvIEhUTUwgZWxlbWVudCBhbmQgYWxsIGhhbmRsZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1Db250cm9sbGVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdmlkZW9FbGVtZW50UHJvdmlkZXIgVmlkZW8gUGxheWVyIGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmlkZW9FbGVtZW50UHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQcm92aWRlciA9IHZpZGVvRWxlbWVudFByb3ZpZGVyO1xuICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0F1ZGlvJyk7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIuc2V0QXVkaW9FbGVtZW50KHRoaXMuYXVkaW9FbGVtZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBQZWVyIGNvbm5lY3Rpb24gaGFzIGEgdHJhY2sgZXZlbnRcbiAgICAgKiBAcGFyYW0gcnRjVHJhY2tFdmVudCAtIFJUQyBUcmFjayBFdmVudFxuICAgICAqL1xuICAgIGhhbmRsZU9uVHJhY2socnRjVHJhY2tFdmVudCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnaGFuZGxlT25UcmFjayAnICsgSlNPTi5zdHJpbmdpZnkocnRjVHJhY2tFdmVudC5zdHJlYW1zKSk7XG4gICAgICAgIC8vIERvIG5vdCBhZGQgdGhlIHRyYWNrIGlmIHRoZSBJRCBpcyBgcHJvYmF0b3JgIGFzIHRoaXMgaXMgc3BlY2lhbCB0cmFjayBjcmVhdGVkIGJ5IG1lZGlhc291cCBmb3IgYml0cmF0ZSBwcm9iaW5nLlxuICAgICAgICAvLyBSZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vRXBpY0dhbWVzRXh0L1BpeGVsU3RyZWFtaW5nSW5mcmFzdHJ1Y3R1cmUvcHVsbC84NiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICBpZiAocnRjVHJhY2tFdmVudC5zdHJlYW1zLmxlbmd0aCA8IDEgfHwgcnRjVHJhY2tFdmVudC5zdHJlYW1zWzBdLmlkID09ICdwcm9iYXRvcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLmdldFZpZGVvRWxlbWVudCgpO1xuICAgICAgICBpZiAocnRjVHJhY2tFdmVudC50cmFjaykge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ0dvdCB0cmFjayAtICcgK1xuICAgICAgICAgICAgICAgIHJ0Y1RyYWNrRXZlbnQudHJhY2sua2luZCArXG4gICAgICAgICAgICAgICAgJyBpZD0nICtcbiAgICAgICAgICAgICAgICBydGNUcmFja0V2ZW50LnRyYWNrLmlkICtcbiAgICAgICAgICAgICAgICAnIHJlYWR5U3RhdGU9JyArXG4gICAgICAgICAgICAgICAgcnRjVHJhY2tFdmVudC50cmFjay5yZWFkeVN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocnRjVHJhY2tFdmVudC50cmFjay5raW5kID09ICdhdWRpbycpIHtcbiAgICAgICAgICAgIHRoaXMuQ3JlYXRlQXVkaW9UcmFjayhydGNUcmFja0V2ZW50LnN0cmVhbXNbMF0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJ0Y1RyYWNrRXZlbnQudHJhY2sua2luZCA9PSAndmlkZW8nICYmXG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQuc3JjT2JqZWN0ICE9PSBydGNUcmFja0V2ZW50LnN0cmVhbXNbMF0pIHtcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zcmNPYmplY3QgPSBydGNUcmFja0V2ZW50LnN0cmVhbXNbMF07XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnU2V0IHZpZGVvIHNvdXJjZSBmcm9tIHZpZGVvIHRyYWNrIG9udHJhY2suJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYXVkaW8gZGV2aWNlIHdoZW4gcmVjZWl2aW5nIGFuIFJUQ1RyYWNrRXZlbnQgd2l0aCB0aGUga2luZCBvZiBcImF1ZGlvXCJcbiAgICAgKiBAcGFyYW0gYXVkaW9NZWRpYVN0cmVhbSAtIEF1ZGlvIE1lZGlhIHN0cmVhbSB0cmFja1xuICAgICAqL1xuICAgIENyZWF0ZUF1ZGlvVHJhY2soYXVkaW9NZWRpYVN0cmVhbSkge1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyLmdldFZpZGVvRWxlbWVudCgpO1xuICAgICAgICAvLyBkbyBub3RoaW5nIHRoZSB2aWRlbyBoYXMgdGhlIHNhbWUgbWVkaWEgc3RyZWFtIGFzIHRoZSBhdWRpbyB0cmFjayB3ZSBoYXZlIGhlcmUgKHRoZXkgYXJlIGxpbmtlZClcbiAgICAgICAgaWYgKHZpZGVvRWxlbWVudC5zcmNPYmplY3QgPT0gYXVkaW9NZWRpYVN0cmVhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHZpZGVvIGVsZW1lbnQgaGFzIHNvbWUgb3RoZXIgbWVkaWEgc3RyZWFtIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF1ZGlvIHRyYWNrXG4gICAgICAgIGVsc2UgaWYgKHZpZGVvRWxlbWVudC5zcmNPYmplY3QgJiYgdmlkZW9FbGVtZW50LnNyY09iamVjdCAhPT0gYXVkaW9NZWRpYVN0cmVhbSkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGF1ZGlvIGVsZW1lbnRcbiAgICAgICAgICAgIHRoaXMuYXVkaW9FbGVtZW50LnNyY09iamVjdCA9IGF1ZGlvTWVkaWFTdHJlYW07XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnQ3JlYXRlZCBuZXcgYXVkaW8gZWxlbWVudCB0byBwbGF5IHNlcGFyYXRlIGF1ZGlvIHN0cmVhbS4nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmVhbUNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEZsYWdzIH0gZnJvbSAnLi4vQ29uZmlnL0NvbmZpZyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG4vKipcbiAqIFRoZSB2aWRlbyBwbGF5ZXIgaHRtbCBlbGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBWaWRlb1BsYXllciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHZpZGVvRWxlbWVudFBhcmVudCB0aGUgaHRtbCBkaXYgdGhlIHRoZSB2aWRlbyBwbGF5ZXIgd2lsbCBiZSBpbmplY3RlZCBpbnRvXG4gICAgICogQHBhcmFtIGNvbmZpZyB0aGUgYXBwbGljYXRpb25zIGNvbmZpZ3VyYXRpb24uIFdlJ3JlIGludGVyZXN0ZWQgaW4gdGhlIHN0YXJ0VmlkZW9NdXRlZCBmbGFnXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmlkZW9FbGVtZW50UGFyZW50LCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5sYXN0VGltZVJlc2l6ZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuaWQgPSAnc3RyZWFtaW5nVmlkZW8nO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5kaXNhYmxlUGljdHVyZUluUGljdHVyZSA9IHRydWU7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50LnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHZpZGVvRWxlbWVudFBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLnZpZGVvRWxlbWVudCk7XG4gICAgICAgIHRoaXMub25SZXNpemVQbGF5ZXJDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXNvbHV0aW9uIGNoYW5nZWQsIHJlc3R5bGluZyBwbGF5ZXIsIGRpZCB5b3UgZm9yZ2V0IHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24/Jyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbkNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1Jlc29sdXRpb24gY2hhbmdlZCBhbmQgbWF0Y2ggdmlld3BvcnQgcmVzb2x1dGlvbiBpcyB0dXJuZWQgb24sIGRpZCB5b3UgZm9yZ2V0IHRvIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24/Jyk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIHNldCBwbGF5IGZvciB2aWRlbyAoYW5kIGF1ZGlvKVxuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50ICE9IHVuZGVmaW5lZCAmJiB0aGlzLmF1ZGlvRWxlbWVudC5wYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC5wbGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52aWRlb0VsZW1lbnQucGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQucGxheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5vbmxvYWRlZG1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblZpZGVvSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gc2V0IHJlc2l6ZSBldmVudHMgdG8gdGhlIHdpbmRvd3MgaWYgaXQgaXMgcmVzaXplZCBvciBpdHMgb3JpZW50YXRpb24gaXMgY2hhbmdlZFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gdGhpcy5yZXNpemVQbGF5ZXJTdHlsZSgpLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgKCkgPT4gdGhpcy5vbk9yaWVudGF0aW9uQ2hhbmdlKCkpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuc3JjT2JqZWN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLmF1ZGlvRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQuc3JjID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0QXVkaW9FbGVtZW50KGF1ZGlvRWxlbWVudCkge1xuICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudCA9IGF1ZGlvRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB1cCB0aGUgdmlkZW8gZWxlbWVudCB3aXRoIGFueSBhcHBsaWNhdGlvbiBjb25maWcgYW5kIHBsYXlzIHRoZSB2aWRlbyBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBmb3IgaWYgcGxheWluZyB0aGUgdmlkZW8gd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LlxuICAgICAqL1xuICAgIHBsYXkoKSB7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm11dGVkID0gdGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5TdGFydFZpZGVvTXV0ZWQpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5hdXRvcGxheSA9IHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQXV0b1BsYXlWaWRlbyk7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvRWxlbWVudC5wbGF5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZpZGVvIGVsZW1lbnQgaXMgcGF1c2VkLlxuICAgICAqL1xuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlb0VsZW1lbnQucGF1c2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyAtIHdoZXRoZXIgdGhlIHZpZGVvIGVsZW1lbnQgaXMgcGxheWluZy5cbiAgICAgKi9cbiAgICBpc1ZpZGVvUmVhZHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvRWxlbWVudC5yZWFkeVN0YXRlICE9PSB1bmRlZmluZWQgJiYgdGhpcy52aWRlb0VsZW1lbnQucmVhZHlTdGF0ZSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHZpZGVvIGVsZW1lbnQgaGFzIGEgdmFsaWQgdmlkZW8gc291cmNlIChzcmNPYmplY3QpLlxuICAgICAqL1xuICAgIGhhc1ZpZGVvU291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlb0VsZW1lbnQuc3JjT2JqZWN0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy52aWRlb0VsZW1lbnQuc3JjT2JqZWN0ICE9PSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgaHRtbCB2aWRlbyBlbGVtZW50XG4gICAgICogQHJldHVybnMgLSB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSB2aWRlbyBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0VmlkZW9FbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWRlb0VsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSBodG1sIHZpZGVvIGVsZW1lbnRzIHBhcmVudFxuICAgICAqIEByZXR1cm5zIC0gdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgdmlkZW8gZWxlbWVudHMgcGFyZW50XG4gICAgICovXG4gICAgZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLnZpZGVvRWxlbWVudC5wYXJlbnRFbGVtZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgVmlkZW8gRWxlbWVudHMgc3JjIG9iamVjdCB0cmFja3MgdG8gZW5hYmxlXG4gICAgICogQHBhcmFtIGVuYWJsZWQgLSBFbmFibGUgVHJhY2tzIG9uIHRoZSBTcmMgT2JqZWN0XG4gICAgICovXG4gICAgc2V0VmlkZW9FbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgICAgLy8gdGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrIHVudGlsIHR5cGUgc2NyaXB0cyB2aWRlbyBlbGVtZW50IGlzIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgbmVlZCBmb3IgdHJhY2tzIG9uIGEgaHRtbCB2aWRlbyBlbGVtZW50XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHRoaXMudmlkZW9FbGVtZW50O1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3JjT2JqZWN0XG4gICAgICAgICAgICAuZ2V0VHJhY2tzKClcbiAgICAgICAgICAgIC5mb3JFYWNoKCh0cmFjaykgPT4gKHRyYWNrLmVuYWJsZWQgPSBlbmFibGVkKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG92ZXJyaWRlIGZvciB3aGVuIHRoZSB2aWRlbyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGEgc3JjT2JqZWN0XG4gICAgICovXG4gICAgb25WaWRlb0luaXRpYWxpemVkKCkge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogT24gdGhlIG9yaWVudGF0aW9uIGNoYW5nZSBvZiBhIHdpbmRvdyBjbGVhciB0aGUgdGltZW91dFxuICAgICAqL1xuICAgIG9uT3JpZW50YXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm9yaWVudGF0aW9uQ2hhbmdlVGltZW91dCk7XG4gICAgICAgIHRoaXMub3JpZW50YXRpb25DaGFuZ2VUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVQbGF5ZXJTdHlsZSgpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBwbGF5ZXIgc3R5bGUgYmFzZWQgb24gdGhlIHdpbmRvdyBoZWlnaHQgYW5kIHdpZHRoXG4gICAgICogQHJldHVybnMgLSBuaWwgaWYgcmVxdWlyZW1lbnRzIGFyZSBzYXRpc2ZpZWRcbiAgICAgKi9cbiAgICByZXNpemVQbGF5ZXJTdHlsZSgpIHtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKCF2aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvU3RyZWFtU2l6ZSgpO1xuICAgICAgICBpZiAodmlkZW9FbGVtZW50UGFyZW50LmNsYXNzTGlzdC5jb250YWlucygnZml4ZWQtc2l6ZScpKSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzaXplUGxheWVyQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb250cm9scyBmb3IgcmVzaXppbmcgdGhlIHBsYXllclxuICAgICAgICB0aGlzLnJlc2l6ZVBsYXllclN0eWxlVG9GaWxsUGFyZW50RWxlbWVudCgpO1xuICAgICAgICB0aGlzLm9uUmVzaXplUGxheWVyQ2FsbGJhY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgcGxheWVyIGVsZW1lbnQgdG8gZmlsbCB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKi9cbiAgICByZXNpemVQbGF5ZXJTdHlsZVRvRmlsbFBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIC8vVmlkZW8gaXMgbm90IGluaXRpYWxpemVkIHlldCBzbyBzZXQgdmlkZW9FbGVtZW50UGFyZW50IHRvIHNpemUgb2YgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgY29uc3Qgc3R5bGVXaWR0aCA9ICcxMDAlJztcbiAgICAgICAgY29uc3Qgc3R5bGVIZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgIGNvbnN0IHN0eWxlVG9wID0gMDtcbiAgICAgICAgY29uc3Qgc3R5bGVMZWZ0ID0gMDtcbiAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAndG9wOiAnICtcbiAgICAgICAgICAgIHN0eWxlVG9wICtcbiAgICAgICAgICAgICdweDsgbGVmdDogJyArXG4gICAgICAgICAgICBzdHlsZUxlZnQgK1xuICAgICAgICAgICAgJ3B4OyB3aWR0aDogJyArXG4gICAgICAgICAgICBzdHlsZVdpZHRoICtcbiAgICAgICAgICAgICc7IGhlaWdodDogJyArXG4gICAgICAgICAgICBzdHlsZUhlaWdodCArXG4gICAgICAgICAgICAnOyBjdXJzb3I6IGRlZmF1bHQ7Jyk7XG4gICAgfVxuICAgIHVwZGF0ZVZpZGVvU3RyZWFtU2l6ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAobm93IC0gdGhpcy5sYXN0VGltZVJlc2l6ZWQgPiAzMDApIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAoIXZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbkNhbGxiYWNrKHZpZGVvRWxlbWVudFBhcmVudC5jbGllbnRXaWR0aCwgdmlkZW9FbGVtZW50UGFyZW50LmNsaWVudEhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RUaW1lUmVzaXplZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1Jlc2l6aW5nIHRvbyBvZnRlbiAtIHNraXBwaW5nJyk7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0SGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplVGltZW91dEhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlVmlkZW9TdHJlYW1TaXplKCksIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWRlb1BsYXllci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgV2ViU29ja2V0VHJhbnNwb3J0LCBMb2dnZXIsIFNpZ25hbGxpbmdQcm90b2NvbCwgTWVzc2FnZXMsIE1lc3NhZ2VIZWxwZXJzLCBLZWVwYWxpdmVNb25pdG9yIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuaW1wb3J0IHsgU3RyZWFtQ29udHJvbGxlciB9IGZyb20gJy4uL1ZpZGVvUGxheWVyL1N0cmVhbUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgRnJlZXplRnJhbWVDb250cm9sbGVyIH0gZnJvbSAnLi4vRnJlZXplRnJhbWUvRnJlZXplRnJhbWVDb250cm9sbGVyJztcbmltcG9ydCB7IEFGS0NvbnRyb2xsZXIgfSBmcm9tICcuLi9BRksvQUZLQ29udHJvbGxlcic7XG5pbXBvcnQgeyBEYXRhQ2hhbm5lbENvbnRyb2xsZXIgfSBmcm9tICcuLi9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbENvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyIH0gZnJvbSAnLi4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGFncywgQ29udHJvbFNjaGVtZVR5cGUsIFRleHRQYXJhbWV0ZXJzLCBPcHRpb25QYXJhbWV0ZXJzLCBOdW1lcmljUGFyYW1ldGVycyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgSW5pdGlhbFNldHRpbmdzIH0gZnJvbSAnLi4vRGF0YUNoYW5uZWwvSW5pdGlhbFNldHRpbmdzJztcbmltcG9ydCB7IExhdGVuY3lUZXN0UmVzdWx0cyB9IGZyb20gJy4uL0RhdGFDaGFubmVsL0xhdGVuY3lUZXN0UmVzdWx0cyc7XG5pbXBvcnQgeyBGaWxlVGVtcGxhdGUsIEZpbGVVdGlsIH0gZnJvbSAnLi4vVXRpbC9GaWxlVXRpbCc7XG5pbXBvcnQgeyBJbnB1dENsYXNzZXNGYWN0b3J5IH0gZnJvbSAnLi4vSW5wdXRzL0lucHV0Q2xhc3Nlc0ZhY3RvcnknO1xuaW1wb3J0IHsgVmlkZW9QbGF5ZXIgfSBmcm9tICcuLi9WaWRlb1BsYXllci9WaWRlb1BsYXllcic7XG5pbXBvcnQgeyBTdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgTWVzc2FnZURpcmVjdGlvbiB9IGZyb20gJy4uL1VlSW5zdGFuY2VNZXNzYWdlL1N0cmVhbU1lc3NhZ2VDb250cm9sbGVyJztcbmltcG9ydCB7IFJlc3BvbnNlQ29udHJvbGxlciB9IGZyb20gJy4uL1VlSW5zdGFuY2VNZXNzYWdlL1Jlc3BvbnNlQ29udHJvbGxlcic7XG5pbXBvcnQgeyBTZW5kTWVzc2FnZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9VZUluc3RhbmNlTWVzc2FnZS9TZW5kTWVzc2FnZUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgVG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlciB9IGZyb20gJy4uL1VlSW5zdGFuY2VNZXNzYWdlL1RvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxTZW5kZXIgfSBmcm9tICcuLi9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbFNlbmRlcic7XG5pbXBvcnQgeyBJbnB1dENvb3JkVHJhbnNsYXRvciB9IGZyb20gJy4uL1V0aWwvSW5wdXRDb29yZFRyYW5zbGF0b3InO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxDbG9zZUV2ZW50LCBEYXRhQ2hhbm5lbEVycm9yRXZlbnQsIERhdGFDaGFubmVsT3BlbkV2ZW50LCBIaWRlRnJlZXplRnJhbWVFdmVudCwgTG9hZEZyZWV6ZUZyYW1lRXZlbnQsIFBsYXlTdHJlYW1FcnJvckV2ZW50LCBQbGF5U3RyZWFtRXZlbnQsIFBsYXlTdHJlYW1SZWplY3RlZEV2ZW50LCBTaG93T25TY3JlZW5LZXlib2FyZEV2ZW50LCBTdHJlYW1lckxpc3RNZXNzYWdlRXZlbnQsIFN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZUV2ZW50IH0gZnJvbSAnLi4vVXRpbC9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgSVVSTFNlYXJjaFBhcmFtcyB9IGZyb20gJy4uL1V0aWwvSVVSTFNlYXJjaFBhcmFtcyc7XG5pbXBvcnQgeyBCcm93c2VyVXRpbHMgfSBmcm9tICcuLi9VdGlsL0Jyb3dzZXJVdGlscyc7XG4vKipcbiAqIEVudHJ5IHBvaW50IGZvciB0aGUgV2ViUlRDIFBsYXllclxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjUGxheWVyQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gdGhlIGZyb250ZW5kIGNvbmZpZyBvYmplY3RcbiAgICAgKiBAcGFyYW0gcGl4ZWxTdHJlYW1pbmcgLSB0aGUgUGl4ZWxTdHJlYW1pbmcgb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBwaXhlbFN0cmVhbWluZykge1xuICAgICAgICB0aGlzLnNob3VsZFNob3dQbGF5T3ZlcmxheSA9IHRydWU7XG4gICAgICAgIHRoaXMuYXV0b0pvaW5UaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcgPSBwaXhlbFN0cmVhbWluZztcbiAgICAgICAgdGhpcy5yZXNwb25zZUNvbnRyb2xsZXIgPSBuZXcgUmVzcG9uc2VDb250cm9sbGVyKCk7XG4gICAgICAgIHRoaXMuZmlsZSA9IG5ldyBGaWxlVGVtcGxhdGUoKTtcbiAgICAgICAgdGhpcy5zZHBDb25zdHJhaW50cyA9IHtcbiAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlQXVkaW86IHRydWUsXG4gICAgICAgICAgICBvZmZlclRvUmVjZWl2ZVZpZGVvOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIC8vIHNldCB1cCB0aGUgYWZrIGxvZ2ljIGNsYXNzIGFuZCBjb25uZWN0IHVwIGl0cyBtZXRob2QgZm9yIGNsb3NpbmcgdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgICAgdGhpcy5hZmtDb250cm9sbGVyID0gbmV3IEFGS0NvbnRyb2xsZXIodGhpcy5jb25maWcsIHRoaXMucGl4ZWxTdHJlYW1pbmcsIHRoaXMub25BZmtUcmlnZ2VyZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuYWZrQ29udHJvbGxlci5vbkFGS1RpbWVkT3V0Q2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU2lnbmFsaW5nU2VydmVyKCdZb3UgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCBkdWUgdG8gaW5hY3Rpdml0eS4nLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyID0gbmV3IEZyZWV6ZUZyYW1lQ29udHJvbGxlcih0aGlzLnBpeGVsU3RyZWFtaW5nLnZpZGVvRWxlbWVudFBhcmVudCk7XG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIgPSBuZXcgVmlkZW9QbGF5ZXIodGhpcy5waXhlbFN0cmVhbWluZy52aWRlb0VsZW1lbnRQYXJlbnQsIHRoaXMuY29uZmlnKTtcbiAgICAgICAgdGhpcy52aWRlb1BsYXllci5vblZpZGVvSW5pdGlhbGl6ZWQgPSAoKSA9PiB0aGlzLmhhbmRsZVZpZGVvSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgLy8gV2hlbiBpbiBtYXRjaCB2aWV3cG9ydCByZXNvbHV0aW9uIG1vZGUsIHdoZW4gdGhlIGJyb3dzZXIgdmlld3BvcnQgaXMgcmVzaXplZCB3ZSBzZW5kIGEgcmVzaXplIGNvbW1hbmQgYmFjayB0byBVRS5cbiAgICAgICAgdGhpcy52aWRlb1BsYXllci5vbk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uQ2FsbGJhY2sgPSAod2lkdGgsIGhlaWdodCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgICAgICAnUmVzb2x1dGlvbi5XaWR0aCc6IHdpZHRoLFxuICAgICAgICAgICAgICAgICdSZXNvbHV0aW9uLkhlaWdodCc6IGhlaWdodFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtKU09OLnN0cmluZ2lmeShkZXNjcmlwdG9yKV0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyBFdmVyeSB0aW1lIHZpZGVvIHBsYXllciBpcyByZXNpemVkIGluIGJyb3dzZXIgd2UgbmVlZCB0byByZWluaXRpYWxpemUgdGhlIG1vdXNlIGNvb3JkaW5hdGUgY29udmVyc2lvbiBhbmQgZnJlZXplIGZyYW1lIHNpemluZyBsb2dpYy5cbiAgICAgICAgdGhpcy52aWRlb1BsYXllci5vblJlc2l6ZVBsYXllckNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRVcE1vdXNlQW5kRnJlZXplRnJhbWUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIodGhpcy52aWRlb1BsYXllcik7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlciA9IG5ldyBJbnB1dENvb3JkVHJhbnNsYXRvcigpO1xuICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyID0gbmV3IERhdGFDaGFubmVsQ29udHJvbGxlcigpO1xuICAgICAgICB0aGlzLnJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIgPSBuZXcgRGF0YUNoYW5uZWxDb250cm9sbGVyKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEYXRhQ2hhbm5lbEV2ZW50RW1pdHRlcnModGhpcy5zZW5kcmVjdkRhdGFDaGFubmVsQ29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEYXRhQ2hhbm5lbEV2ZW50RW1pdHRlcnModGhpcy5yZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbFNlbmRlciA9IG5ldyBEYXRhQ2hhbm5lbFNlbmRlcih0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbFNlbmRlci5yZXNldEFma1dhcm5pbmdUaW1lck9uRGF0YVNlbmQgPSAoKSA9PiB0aGlzLmFma0NvbnRyb2xsZXIucmVzZXRBZmtXYXJuaW5nVGltZXIoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1NZXNzYWdlQ29udHJvbGxlcigpO1xuICAgICAgICAvLyBzZXQgdXAgd2Vic29ja2V0IG1ldGhvZHNcbiAgICAgICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgV2ViU29ja2V0VHJhbnNwb3J0KGNvbmZpZy53ZWJTb2NrZXRQcm90b2NvbHMpO1xuICAgICAgICB0aGlzLnByb3RvY29sID0gbmV3IFNpZ25hbGxpbmdQcm90b2NvbCh0aGlzLnRyYW5zcG9ydCk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuYWRkTGlzdGVuZXIoTWVzc2FnZXMuY29uZmlnLnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZU9uQ29uZmlnTWVzc2FnZShtc2cpKTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5hZGRMaXN0ZW5lcihNZXNzYWdlcy5waW5nLnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZVBpbmdNZXNzYWdlKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnN0cmVhbWVyTGlzdC50eXBlTmFtZSwgKG1zZykgPT4gdGhpcy5oYW5kbGVTdHJlYW1lckxpc3RNZXNzYWdlKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnN1YnNjcmliZUZhaWxlZC50eXBlTmFtZSwgKG1zZykgPT4gdGhpcy5oYW5kbGVTdWJzY3JpYmVGYWlsZWRNZXNzYWdlKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnN0cmVhbWVySWRDaGFuZ2VkLnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZVN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZShtc2cpKTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5hZGRMaXN0ZW5lcihNZXNzYWdlcy5wbGF5ZXJDb3VudC50eXBlTmFtZSwgKG1zZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGxheWVyQ291bnRNZXNzYWdlID0gbXNnO1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25QbGF5ZXJDb3VudChwbGF5ZXJDb3VudE1lc3NhZ2UuY291bnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5hZGRMaXN0ZW5lcihNZXNzYWdlcy5hbnN3ZXIudHlwZU5hbWUsIChtc2cpID0+IHRoaXMuaGFuZGxlV2ViUnRjQW5zd2VyKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLm9mZmVyLnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZVdlYlJ0Y09mZmVyKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnBlZXJEYXRhQ2hhbm5lbHMudHlwZU5hbWUsIChtc2cpID0+IHRoaXMuaGFuZGxlV2ViUnRjU0ZVUGVlckRhdGFjaGFubmVscyhtc2cpKTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5hZGRMaXN0ZW5lcihNZXNzYWdlcy5pY2VDYW5kaWRhdGUudHlwZU5hbWUsIChtc2cpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGljZUNhbmRpZGF0ZU1lc3NhZ2UgPSBtc2c7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUljZUNhbmRpZGF0ZShpY2VDYW5kaWRhdGVNZXNzYWdlLmNhbmRpZGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb3RvY29sLnRyYW5zcG9ydC5hZGRMaXN0ZW5lcignb3BlbicsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLmxpc3RTdHJlYW1lcnMpO1xuICAgICAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDA7XG4gICAgICAgICAgICB0aGlzLmlzUmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb3RvY29sLnRyYW5zcG9ydC5hZGRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICAvLyBkb250IHJlYWxseSBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUgc2luY2UgdGhlIGNsb3NlIGV2ZW50IHNob3VsZCBmb2xsb3cuXG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEdvdCBhIHRyYW5zcG9ydCBlcnJvci5gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wudHJhbnNwb3J0LmFkZExpc3RlbmVyKCdjbG9zZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gd2hlbiB3ZSByZWZyZXNoIHRoZSBwYWdlIGR1cmluZyBhIHN0cmVhbSB3ZSBnZXQgdGhlIGdvaW5nIGF3YXkgY29kZS5cbiAgICAgICAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29ubmVjdCBzaW5jZSB3ZSdyZSBuYXZpZ2F0aW5nIGF3YXkuXG4gICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ2xvc2VFdmVudC9jb2RlXG4gICAgICAgICAgICAvLyBsaXN0cyBhbGwgdGhlIGNvZGVzLlxuICAgICAgICAgICAgY29uc3QgQ09ERV9HT0lOR19BV0FZID0gMTAwMTtcbiAgICAgICAgICAgIGNvbnN0IG1heFJlY29ubmVjdEF0dGVtcHRzID0gdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cyk7XG4gICAgICAgICAgICBjb25zdCBhdHRlbXB0c0xlZnQgPSB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPCBtYXhSZWNvbm5lY3RBdHRlbXB0cztcbiAgICAgICAgICAgIGNvbnN0IHJlY29ubmVjdEVuYWJsZWQgPSB0aGlzLmZvcmNlUmVjb25uZWN0IHx8ICh0aGlzLmVuYWJsZUF1dG9SZWNvbm5lY3QgJiYgbWF4UmVjb25uZWN0QXR0ZW1wdHMgPiAwICYmIGF0dGVtcHRzTGVmdCk7XG4gICAgICAgICAgICBjb25zdCB3aWxsVHJ5UmVjb25uZWN0ID0gcmVjb25uZWN0RW5hYmxlZCAmJiBldmVudC5jb2RlICE9IENPREVfR09JTkdfQVdBWTtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93Q2xpY2tUb1JlY29ubmVjdCA9ICF3aWxsVHJ5UmVjb25uZWN0O1xuICAgICAgICAgICAgY29uc3QgZGlzY29ubmVjdE1lc3NhZ2UgPSB0aGlzLmRpc2Nvbm5lY3RNZXNzYWdlID8gdGhpcy5kaXNjb25uZWN0TWVzc2FnZSA6IGV2ZW50LnJlYXNvbjtcbiAgICAgICAgICAgIHRoaXMuZm9yY2VSZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBjb2RlY3Mgb24gZGlzY29ubmVjdCBzbyB0aGF0IGlmIHRoZSBuZXh0IGNvbm5lY3Rpb24gaGFzIFwiTmVnb3RpYXRlQ29kZWNzXCIgb25cbiAgICAgICAgICAgIC8vIHRoZW4gYWxsIGNvZGVjcyBjYW4gYmUgbmVnb3RpYXRlZFxuICAgICAgICAgICAgdGhpcy5jb25maWcuZ2V0U2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjKS5vcHRpb25zID1cbiAgICAgICAgICAgICAgICBCcm93c2VyVXRpbHMuZ2V0U3VwcG9ydGVkVmlkZW9Db2RlY3MoKTtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uRGlzY29ubmVjdChkaXNjb25uZWN0TWVzc2FnZSwgYWxsb3dDbGlja1RvUmVjb25uZWN0KTtcbiAgICAgICAgICAgIHRoaXMuYWZrQ29udHJvbGxlci5zdG9wQWZrV2FybmluZ1RpbWVyKCk7XG4gICAgICAgICAgICAvLyBzdG9wIHNlbmRpbmcgc3RhdHMgb24gaW50ZXJ2YWwgaWYgd2UgaGF2ZSBjbG9zZWQgb3VyIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRzVGltZXJIYW5kbGUgJiYgdGhpcy5zdGF0c1RpbWVySGFuZGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXRzVGltZXJIYW5kbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHN0cmVhbSBxdWFsaXR5IGljb24uXG4gICAgICAgICAgICB0aGlzLnNldFZpZGVvRW5jb2RlckF2Z1FQKDApO1xuICAgICAgICAgICAgLy8gdW5yZWdpc3RlciBhbGwgaW5wdXQgZGV2aWNlIGV2ZW50IGhhbmRsZXJzIG9uIGRpc2Nvbm5lY3RcbiAgICAgICAgICAgIHRoaXMuc2V0VG91Y2hJbnB1dEVuYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zZXRNb3VzZUlucHV0RW5hYmxlZChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnNldEtleWJvYXJkSW5wdXRFbmFibGVkKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0R2FtZVBhZElucHV0RW5hYmxlZChmYWxzZSk7XG4gICAgICAgICAgICBpZiAod2lsbFRyeVJlY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIC8vIG5lZWQgYSBzbWFsbCBkZWxheSBoZXJlIHRvIHByZXZlbnQgcmVjb25uZWN0IHNwYW1taW5nXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvUmVjb25uZWN0KGV2ZW50LnJlYXNvbik7XG4gICAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBzZXQgdXAgdGhlIGZpbmFsIHdlYlJ0YyBwbGF5ZXIgY29udHJvbGxlciBtZXRob2RzIGZyb20gd2l0aGluIG91ciBhcHBsaWNhdGlvbiBzbyBhIGNvbm5lY3Rpb24gY2FuIGJlIGFjdGl2YXRlZFxuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTZW5kTWVzc2FnZUNvbnRyb2xsZXIodGhpcy5kYXRhQ2hhbm5lbFNlbmRlciwgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlcik7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlciA9IG5ldyBUb1N0cmVhbWVyTWVzc2FnZXNDb250cm9sbGVyKHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVycygpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnBvcHVsYXRlRGVmYXVsdFByb3RvY29sKCk7XG4gICAgICAgIHRoaXMuaW5wdXRDbGFzc2VzRmFjdG9yeSA9IG5ldyBJbnB1dENsYXNzZXNGYWN0b3J5KHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIsIHRoaXMudmlkZW9QbGF5ZXIsIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlcik7XG4gICAgICAgIHRoaXMuaXNVc2luZ1NGVSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzVXNpbmdTVkMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1F1YWxpdHlDb250cm9sbGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJlZmVycmVkQ29kZWMgPSAnJztcbiAgICAgICAgdGhpcy5lbmFibGVBdXRvUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb3JjZVJlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwO1xuICAgICAgICB0aGlzLmlzUmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk9wdGlvblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkLCAoc3RyZWFtZXJpZCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0cmVhbWVyaWQgPT09IHVuZGVmaW5lZCB8fCBzdHJlYW1lcmlkID09PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBjdXJyZW50IHBlZXIgY29ubmVjdGlvbiBhbmQgY3JlYXRlIGEgbmV3IG9uZVxuICAgICAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIucGVlckNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLmNyZWF0ZVBlZXJDb25uZWN0aW9uKHRoaXMucGVlckNvbmZpZywgdGhpcy5wcmVmZXJyZWRDb2RlYyk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZWRTdHJlYW0gPSBzdHJlYW1lcmlkO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMuc3Vic2NyaWJlLCB7IHN0cmVhbWVySWQ6IHN0cmVhbWVyaWQgfSk7XG4gICAgICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uT3B0aW9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHksIChwcmVmZXJyZWRRdWFsaXR5KSA9PiB7XG4gICAgICAgICAgICBpZiAocHJlZmVycmVkUXVhbGl0eSA9PT0gdW5kZWZpbmVkIHx8IHByZWZlcnJlZFF1YWxpdHkgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1VzaW5nU1ZDKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlciBpcyB1c2luZyBTVkMgc28gc2VsZWN0ZWQgcXVhbGl0eSB3aWxsIGJlIG9mIHRoZSBmb3JtIFN4VHkoaCkuIEp1c3QgZXh0cmFjdCB0aGUgeCBhbmQgeSBudW1iZXJzXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMubGF5ZXJQcmVmZXJlbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIHNwYXRpYWxMYXllcjogK3ByZWZlcnJlZFF1YWxpdHlbMV0gLSAxLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbExheWVyOiArcHJlZmVycmVkUXVhbGl0eVszXSAtIDFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZXIgaXMgbm90IHVzaW5nIFNWQyBzbyB0aGUgc2VsZWN0ZWQgcXVhbGl0eSB3aWxsIGJlIGVpdGhlciBMb3csIE1lZGl1bSBvciBIaWdoIHNvIHdlIGV4dHJhY3QgdGhlIGFwcHJvcHJpYXRlIHNwYXRpYWwgbGF5ZXIgaW5kZXhcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxRdWFsaXRpZXMgPSB0aGlzLmNvbmZpZy5nZXRTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSkub3B0aW9ucztcbiAgICAgICAgICAgICAgICBjb25zdCBxdWFsaXR5SW5kZXggPSBhbGxRdWFsaXRpZXMuaW5kZXhPZihwcmVmZXJyZWRRdWFsaXR5KTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5sYXllclByZWZlcmVuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhdGlhbExheWVyOiBxdWFsaXR5SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsTGF5ZXI6IDBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldFZpZGVvRW5jb2RlckF2Z1FQKC0xKTtcbiAgICAgICAgdGhpcy5zaWduYWxsaW5nVXJsQnVpbGRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNpZ25hbGxpbmdTZXJ2ZXJVcmwgPSB0aGlzLmNvbmZpZy5nZXRUZXh0U2V0dGluZ1ZhbHVlKFRleHRQYXJhbWV0ZXJzLlNpZ25hbGxpbmdTZXJ2ZXJVcmwpO1xuICAgICAgICAgICAgcmV0dXJuIHNpZ25hbGxpbmdTZXJ2ZXJVcmw7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSB2aWRlbyBwbGF5ZXIgYW5kIG1ha2VzIHN1cmUgcmVzb3VyY2VzIGFyZSBmcmVlZC4gVGhpcyBoZWxwcyB0byBwcmV2ZW50IHRoZSBpc3N1ZSBpbiBjaHJvbWVcbiAgICAgKiB3aGVyZSBpdCByZWZ1c2VzIHRvIG1ha2UgbmV3IHZpZGVvIHBsYXllcnMuXG4gICAgICovXG4gICAgZGVzdHJveVZpZGVvUGxheWVyKCkge1xuICAgICAgICB0aGlzLnZpZGVvUGxheWVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgICAqIEBwYXJhbSBldmVudCAtIE1lc3NhZ2UgRXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVPbk1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KGV2ZW50LmRhdGEpO1xuICAgICAgICBMb2dnZXIuSW5mbygnTWVzc2FnZSBpbmNvbWluZzonICsgbWVzc2FnZSk7XG4gICAgICAgIC8vdHJ5IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLmZyb21TdHJlYW1lck1lc3NhZ2VzLmdldChtZXNzYWdlWzBdKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5mcm9tU3RyZWFtZXJIYW5kbGVycy5nZXQobWVzc2FnZVR5cGUpKGV2ZW50LmRhdGEpO1xuICAgICAgICAvL30gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy9Mb2dnZXIuRXJyb3IoTG9nZ2VyLkdldFN0YWNrVHJhY2UoKSwgYEN1c3RvbSBkYXRhIGNoYW5uZWwgbWVzc2FnZSB3aXRoIG1lc3NhZ2UgdHlwZSB0aGF0IGlzIHVua25vd24gdG8gdGhlIFBpeGVsIFN0cmVhbWluZyBwcm90b2NvbC4gRG9lcyB5b3VyIFBpeGVsU3RyZWFtaW5nUHJvdG9jb2wgbmVlZCB1cGRhdGluZz8gVGhlIG1lc3NhZ2UgdHlwZSB3YXM6ICR7bWVzc2FnZVswXX1gKTtcbiAgICAgICAgLy99XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIG1lc3NhZ2UgYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcnMoKSB7XG4gICAgICAgIC8vIEZyb20gU3RyZWFtZXJcbiAgICAgICAgLy8gTWVzc2FnZSBldmVudHMgZnJvbSB0aGUgc3RyZWFtZXIgaGF2ZSBhIGRhdGEgdHlwZSBvZiBBcnJheUJ1ZmZlciBhcyB3ZSBmb3JjZSB0aGlzIHR5cGUgaW4gdGhlIERhdGFjaGFubmVsQ29udHJvbGxlclxuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdRdWFsaXR5Q29udHJvbE93bmVyc2hpcCcsIChkYXRhKSA9PiB0aGlzLm9uUXVhbGl0eUNvbnRyb2xPd25lcnNoaXAoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdSZXNwb25zZScsIChkYXRhKSA9PiB0aGlzLnJlc3BvbnNlQ29udHJvbGxlci5vblJlc3BvbnNlKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnQ29tbWFuZCcsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ29tbWFuZChkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ0ZyZWV6ZUZyYW1lJywgKGRhdGEpID0+IHRoaXMub25GcmVlemVGcmFtZU1lc3NhZ2UoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdVbmZyZWV6ZUZyYW1lJywgKCkgPT4gdGhpcy5pbnZhbGlkYXRlRnJlZXplRnJhbWVBbmRFbmFibGVWaWRlbygpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnVmlkZW9FbmNvZGVyQXZnUVAnLCAoZGF0YSkgPT4gdGhpcy5oYW5kbGVWaWRlb0VuY29kZXJBdmdRUChkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ0xhdGVuY3lUZXN0JywgKGRhdGEpID0+IHRoaXMuaGFuZGxlTGF0ZW5jeVRlc3RSZXN1bHQoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdEYXRhQ2hhbm5lbExhdGVuY3lUZXN0JywgKGRhdGEpID0+IHRoaXMuaGFuZGxlRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3BvbnNlKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnSW5pdGlhbFNldHRpbmdzJywgKGRhdGEpID0+IHRoaXMuaGFuZGxlSW5pdGlhbFNldHRpbmdzKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnRmlsZUV4dGVuc2lvbicsIChkYXRhKSA9PiB0aGlzLm9uRmlsZUV4dGVuc2lvbihkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ0ZpbGVNaW1lVHlwZScsIChkYXRhKSA9PiB0aGlzLm9uRmlsZU1pbWVUeXBlKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnRmlsZUNvbnRlbnRzJywgKGRhdGEpID0+IHRoaXMub25GaWxlQ29udGVudHMoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdUZXN0RWNobycsICgpID0+IHtcbiAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ0lucHV0Q29udHJvbE93bmVyc2hpcCcsIChkYXRhKSA9PiB0aGlzLm9uSW5wdXRDb250cm9sT3duZXJzaGlwKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnR2FtZXBhZFJlc3BvbnNlJywgKGRhdGEpID0+IHRoaXMub25HYW1lcGFkUmVzcG9uc2UoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdNdWx0aXBsZXhlZCcsICgpID0+IHtcbiAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgYXMgdGhpcyBtZXNzYWdlIHR5cGUgaXMgdXNlZCBvbmx5IGJ5IHRoZSBTRlUgKi9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ1Byb3RvY29sJywgKGRhdGEpID0+IHRoaXMub25Qcm90b2NvbE1lc3NhZ2UoZGF0YSkpO1xuICAgICAgICAvLyBUbyBTdHJlYW1lclxuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnSUZyYW1lUmVxdWVzdCcsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignSUZyYW1lUmVxdWVzdCcpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1JlcXVlc3RRdWFsaXR5Q29udHJvbCcsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignUmVxdWVzdFF1YWxpdHlDb250cm9sJykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnRnBzUmVxdWVzdCcsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignRnBzUmVxdWVzdCcpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0F2ZXJhZ2VCaXRyYXRlUmVxdWVzdCcsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignQXZlcmFnZUJpdHJhdGVSZXF1ZXN0JykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnU3RhcnRTdHJlYW1pbmcnLCAoKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1N0YXJ0U3RyZWFtaW5nJykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnU3RvcFN0cmVhbWluZycsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignU3RvcFN0cmVhbWluZycpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0xhdGVuY3lUZXN0JywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTGF0ZW5jeVRlc3QnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdSZXF1ZXN0SW5pdGlhbFNldHRpbmdzJywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdSZXF1ZXN0SW5pdGlhbFNldHRpbmdzJykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnVGVzdEVjaG8nLCAoKSA9PiB7XG4gICAgICAgICAgICAvKiBEbyBub3RoaW5nICovXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnVUlJbnRlcmFjdGlvbicsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1VJSW50ZXJhY3Rpb24nLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdDb21tYW5kJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignQ29tbWFuZCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1RleHRib3hFbnRyeScsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1RleHRib3hFbnRyeScsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0tleURvd24nLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdLZXlEb3duJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnS2V5VXAnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdLZXlVcCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0tleVByZXNzJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignS2V5UHJlc3MnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdNb3VzZUVudGVyJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTW91c2VFbnRlcicsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ01vdXNlTGVhdmUnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdNb3VzZUxlYXZlJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnTW91c2VEb3duJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTW91c2VEb3duJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnTW91c2VVcCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ01vdXNlVXAnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdNb3VzZU1vdmUnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdNb3VzZU1vdmUnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdNb3VzZVdoZWVsJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTW91c2VXaGVlbCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ01vdXNlRG91YmxlJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTW91c2VEb3VibGUnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdUb3VjaFN0YXJ0JywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignVG91Y2hTdGFydCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1RvdWNoRW5kJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignVG91Y2hFbmQnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdUb3VjaE1vdmUnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdUb3VjaE1vdmUnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdHYW1lcGFkQ29ubmVjdGVkJywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdHYW1lcGFkQ29ubmVjdGVkJykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnR2FtZXBhZEJ1dHRvblByZXNzZWQnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdHYW1lcGFkQnV0dG9uUHJlc3NlZCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0dhbWVwYWRCdXR0b25SZWxlYXNlZCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ0dhbWVwYWRCdXR0b25SZWxlYXNlZCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0dhbWVwYWRBbmFsb2cnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdHYW1lcGFkQW5hbG9nJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnR2FtZXBhZERpc2Nvbm5lY3RlZCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ0dhbWVwYWREaXNjb25uZWN0ZWQnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkV5ZVZpZXdzJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJFeWVWaWV3cycsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1hSSE1EVHJhbnNmb3JtJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJITURUcmFuc2Zvcm0nLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkNvbnRyb2xsZXJUcmFuc2Zvcm0nLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdYUkNvbnRyb2xsZXJUcmFuc2Zvcm0nLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUlN5c3RlbScsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1hSU3lzdGVtJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnWFJCdXR0b25Ub3VjaGVkJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJCdXR0b25Ub3VjaGVkJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnWFJCdXR0b25Ub3VjaFJlbGVhc2VkJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJCdXR0b25Ub3VjaFJlbGVhc2VkJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnWFJCdXR0b25QcmVzc2VkJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJCdXR0b25QcmVzc2VkJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnWFJCdXR0b25SZWxlYXNlZCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1hSQnV0dG9uUmVsZWFzZWQnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkFuYWxvZycsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1hSQW5hbG9nJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnQ2hhbm5lbFJlbGF5U3RhdHVzJywgKCkgPT4ge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZyBhcyB0aGlzIG1lc3NhZ2UgdHlwZSBpcyB1c2VkIG9ubHkgYnkgdGhlIFNGVSAqL1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ011bHRpcGxleGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZyBhcyB0aGlzIG1lc3NhZ2UgdHlwZSBpcyB1c2VkIG9ubHkgYnkgdGhlIFNGVSAqL1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWN0aXZhdGUgdGhlIGxvZ2ljIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1hbmQgZnJvbSBVRVxuICAgICAqIEBwYXJhbSBtZXNzYWdlXG4gICAgICovXG4gICAgb25Db21tYW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLkNvbW1hbmQnKTtcbiAgICAgICAgY29uc3QgY29tbWFuZEFzU3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCd1dGYtMTYnKS5kZWNvZGUobWVzc2FnZS5zbGljZSgxKSk7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhIENoYW5uZWwgQ29tbWFuZDogJyArIGNvbW1hbmRBc1N0cmluZyk7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBKU09OLnBhcnNlKGNvbW1hbmRBc1N0cmluZyk7XG4gICAgICAgIC8vIEhhbmRsZSBcIm9uU2NyZWVuS2V5Ym9hcmRcIiBldmVudFxuICAgICAgICBpZiAoY29tbWFuZC5jb21tYW5kID09PSAnb25TY3JlZW5LZXlib2FyZCcpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT25TY3JlZW5LZXlib2FyZENvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlT25TY3JlZW5LZXlib2FyZENvbW1hbmQoY29tbWFuZCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBzaG93T25TY3JlZW5LZXlib2FyZDogKF9hID0gY29tbWFuZC5zaG93T25TY3JlZW5LZXlib2FyZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdHJ1ZSxcbiAgICAgICAgICAgIHg6IChfYiA9IGNvbW1hbmQueCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCxcbiAgICAgICAgICAgIHk6IChfYyA9IGNvbW1hbmQueSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMCxcbiAgICAgICAgICAgIGNvbnRlbnRzOiAoX2QgPSBjb21tYW5kLmNvbnRlbnRzKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IFNob3dPblNjcmVlbktleWJvYXJkRXZlbnQoZGF0YSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGEgcHJvdG9jb2wgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBzdHJlYW1lclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIGRhdGEgZnJvbSB0aGUgc3RyZWFtZXJcbiAgICAgKi9cbiAgICBvblByb3RvY29sTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbFN0cmluZyA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKG1lc3NhZ2Uuc2xpY2UoMSkpO1xuICAgICAgICAgICAgY29uc3QgcHJvdG9jb2xKU09OID0gSlNPTi5wYXJzZShwcm90b2NvbFN0cmluZyk7XG4gICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90b2NvbEpTT04sICdEaXJlY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcignTWFsZm9ybWVkIHByb3RvY29sIHJlY2VpdmVkLiBFbnN1cmUgdGhlIHByb3RvY29sIG1lc3NhZ2UgY29udGFpbnMgYSBkaXJlY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHByb3RvY29sSlNPTi5EaXJlY3Rpb247XG4gICAgICAgICAgICBkZWxldGUgcHJvdG9jb2xKU09OLkRpcmVjdGlvbjtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGBSZWNlaXZlZCBuZXcgJHtkaXJlY3Rpb24gPT0gTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIgPyAnRnJvbVN0cmVhbWVyJyA6ICdUb1N0cmVhbWVyJ30gcHJvdG9jb2wuIFVwZGF0aW5nIGV4aXN0aW5nIHByb3RvY29sLi4uYCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwcm90b2NvbEpTT04pLmZvckVhY2goKG1lc3NhZ2VUeXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHByb3RvY29sSlNPTlttZXNzYWdlVHlwZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIGNvbnRhaW5zIGFsbCB0aGUgcmVsZXZhbnQgcGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtZXNzYWdlLCAnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgVG9TdHJlYW1lci0+JHttZXNzYWdlVHlwZX0gcHJvdG9jb2wgZGVmaW5pdGlvbiB3YXMgbWFsZm9ybWVkIGFzIGl0IGRpZG4ndCBjb250YWluIGF0IGxlYXN0IGFuIGlkXFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiB3YXM6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgMil9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGluIGEgZm9yRWFjaCBpcyBlcXVpdmFsZW50IHRvIGEgY29udGludWUgaW4gYSBub3JtYWwgZm9yIGxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVRTUuMSBhbmQgVUU1LjIgZG9uJ3Qgc2VuZCBhIHN0cnVjdHVyZSBmb3IgdGhlc2UgbWVzc2FnZSB0eXBlcywgYnV0IHRoZXkgYWN0dWFsbHkgZG8gaGF2ZSBhIHN0cnVjdHVyZSBzbyBpZ25vcmUgdXBkYXRpbmcgdGhlbVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSAnVUlJbnRlcmFjdGlvbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZSA9PT0gJ0NvbW1hbmQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGUgPT09ICdMYXRlbmN5VGVzdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KG1lc3NhZ2VUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3ZlIHJlZ2lzdGVyZWQgYSBoYW5kbGVyIGZvciB0aGlzIG1lc3NhZ2UgdHlwZSB3ZSBjYW4gYWRkIGl0IHRvIG91ciBzdXBwb3J0ZWQgbWVzc2FnZXMuIGllIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lck1lc3NhZ2VzLnNldChtZXNzYWdlVHlwZSwgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYFRoZXJlIHdhcyBubyByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIFwiJHttZXNzYWdlVHlwZX1cIiAtIHRyeSBhZGRpbmcgb25lIHVzaW5nIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCBcIiR7bWVzc2FnZVR5cGV9XCIsIG15SGFuZGxlcilgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgbWVzc2FnZSBjb250YWlucyBhbGwgdGhlIHJlbGV2YW50IHBhcmFtc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobWVzc2FnZSwgJ2lkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEZyb21TdHJlYW1lci0+JHttZXNzYWdlVHlwZX0gcHJvdG9jb2wgZGVmaW5pdGlvbiB3YXMgbWFsZm9ybWVkIGFzIGl0IGRpZG4ndCBjb250YWluIGF0IGxlYXN0IGFuIGlkXFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiB3YXM6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgMil9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGluIGEgZm9yRWFjaCBpcyBlcXVpdmFsZW50IHRvIGEgY29udGludWUgaW4gYSBub3JtYWwgZm9yIGxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5mcm9tU3RyZWFtZXJIYW5kbGVycy5nZXQobWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UndmUgcmVnaXN0ZXJlZCBhIGhhbmRsZXIgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLiBpZSByZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKC4uLilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldChtZXNzYWdlLmlkLCBtZXNzYWdlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYFRoZXJlIHdhcyBubyByZWdpc3RlcmVkIGhhbmRsZXIgZm9yIFwiJHttZXNzYWdlfVwiIC0gdHJ5IGFkZGluZyBvbmUgdXNpbmcgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgXCIke21lc3NhZ2VUeXBlfVwiLCBteUhhbmRsZXIpYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgVW5rbm93biBkaXJlY3Rpb246ICR7ZGlyZWN0aW9ufWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gT25jZSB0aGUgcHJvdG9jb2wgaGFzIGJlZW4gcmVjZWl2ZWQsIHdlIGNhbiBzZW5kIG91ciBjb250cm9sIG1lc3NhZ2VzXG4gICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXIuU2VuZFJlcXVlc3RJbml0aWFsU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlci5TZW5kUmVxdWVzdFF1YWxpdHlDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgYW4gaW5wdXQgY29udHJvbCBtZXNzYWdlIHdoZW4gaXQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc3RyZWFtZXJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgaW5wdXQgY29udHJvbCBtZXNzYWdlXG4gICAgICovXG4gICAgb25JbnB1dENvbnRyb2xPd25lcnNoaXAobWVzc2FnZSkge1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZSk7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5JbnB1dENvbnRyb2xPd25lcnNoaXAnKTtcbiAgICAgICAgY29uc3QgaW5wdXRDb250cm9sT3duZXJzaGlwID0gbmV3IEJvb2xlYW4odmlld1sxXSkudmFsdWVPZigpO1xuICAgICAgICBMb2dnZXIuSW5mbyhgUmVjZWl2ZWQgaW5wdXQgY29udHJvbGxlciBtZXNzYWdlIC0gd2lsbCB5b3VyIGlucHV0IGNvbnRyb2wgdGhlIHN0cmVhbTogJHtpbnB1dENvbnRyb2xPd25lcnNoaXB9YCk7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uSW5wdXRDb250cm9sT3duZXJzaGlwKGlucHV0Q29udHJvbE93bmVyc2hpcCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBvbkdhbWVwYWRSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCd1dGYtMTYnKS5kZWNvZGUobWVzc2FnZS5zbGljZSgxKSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSlNPTiA9IEpTT04ucGFyc2UocmVzcG9uc2VTdHJpbmcpO1xuICAgICAgICB0aGlzLmdhbWVQYWRDb250cm9sbGVyLm9uR2FtZXBhZFJlc3BvbnNlUmVjZWl2ZWQocmVzcG9uc2VKU09OLmNvbnRyb2xsZXJJZCk7XG4gICAgfVxuICAgIG9uQWZrVHJpZ2dlcmVkKCkge1xuICAgICAgICB0aGlzLmFma0NvbnRyb2xsZXIub25BZmtDbGljaygpO1xuICAgICAgICAvLyBpZiB0aGUgc3RyZWFtIGlzIHBhdXNlZCBwbGF5IGl0LCBpZiB3ZSBjYW5cbiAgICAgICAgaWYgKHRoaXMudmlkZW9QbGF5ZXIuaXNQYXVzZWQoKSAmJiB0aGlzLnZpZGVvUGxheWVyLmhhc1ZpZGVvU291cmNlKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGxheVN0cmVhbSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB3aGV0aGVyIHdlIHNob3VsZCB0aW1lb3V0IHdoZW4gYWZrLlxuICAgICAqIEBwYXJhbSBhZmtFbmFibGVkIElmIHRydWUgd2UgdGltZW91dCB3aGVuIGlkbGUgZm9yIHNvbWUgZ2l2ZW4gYW1vdW50IG9mIHRpbWUuXG4gICAgICovXG4gICAgc2V0QWZrRW5hYmxlZChhZmtFbmFibGVkKSB7XG4gICAgICAgIGlmIChhZmtFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLm9uQWZrVHJpZ2dlcmVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFma0NvbnRyb2xsZXIuc3RvcEFma1dhcm5pbmdUaW1lcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgYSByZWNvbm5lY3Rpb24gdG8gdGhlIHNpZ25hbGxpbmcgc2VydmVyLiBNYW51YWwgdHJpZ2dlclxuICAgICAqL1xuICAgIHRyeVJlY29ubmVjdChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuZm9yY2VSZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLmRvUmVjb25uZWN0KG1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEb2VzIHRoZSBhY3R1YWwgcmVjb25uZWN0IHdvcmsuIFVzZWQgYnkgdGhlIGF1dG8gcmVjb25uZWN0IGZlYXR1cmUgdG8gc2tpcCB0aGUgbWFudWFsIGZsYWcuXG4gICAgICovXG4gICAgZG9SZWNvbm5lY3QobWVzc2FnZSkge1xuICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyB3ZWJTb2NrZXRDb250cm9sbGVyIHJldHVybiBpbW1lZGlhdGVseSBvciB0aGlzIHdpbGwgbm90IHdvcmtcbiAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnVGhpcyBwbGF5ZXIgaGFzIG5vIHByb3RvY29sIGNvbm5lY3Rpb24uJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1JlY29ubmVjdGluZyA9IHRydWU7XG4gICAgICAgIC8vIGlmIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4sIGZpcnN0IGNsb3NlIGl0IGFuZCBmb3JjZSBhIHJlY29ubmVjdC5cbiAgICAgICAgaWYgKHRoaXMucHJvdG9jb2wuaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcmNlUmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0TWVzc2FnZSA9IGAke21lc3NhZ2V9IFJlY29ubmVjdGluZy5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jbG9zZVNpZ25hbGluZ1NlcnZlcihtZXNzYWdlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uV2ViUnRjQXV0b0Nvbm5lY3QoKTtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdFRvU2lnbmFsbGluZ1NlcnZlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgZnJlZXplIGZyYW1lIGlmIGl0IGlzIHJlcXVpcmVkIG90aGVyd2lzZSBzaG93cyB0aGUgcGxheSBvdmVybGF5XG4gICAgICovXG4gICAgbG9hZEZyZWV6ZUZyYW1lT3JTaG93UGxheU92ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgTG9hZEZyZWV6ZUZyYW1lRXZlbnQoe1xuICAgICAgICAgICAgc2hvdWxkU2hvd1BsYXlPdmVybGF5OiB0aGlzLnNob3VsZFNob3dQbGF5T3ZlcmxheSxcbiAgICAgICAgICAgIGlzVmFsaWQ6IHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyLnZhbGlkLFxuICAgICAgICAgICAganBlZ0RhdGE6IHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyLmpwZWdcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRTaG93UGxheU92ZXJsYXkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdzaG93aW5nIHBsYXkgb3ZlcmxheScpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVQbGF5ZXJTdHlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ3Nob3dpbmcgZnJlZXplIGZyYW1lJyk7XG4gICAgICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lQ29udHJvbGxlci5zaG93RnJlZXplRnJhbWUoKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9QbGF5ZXIuc2V0VmlkZW9FbmFibGVkKGZhbHNlKTtcbiAgICAgICAgfSwgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIuZnJlZXplRnJhbWVEZWxheSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIGZyZWV6ZSBmcmFtZSBhbmQgbG9hZCBpdFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBmcmVlemUgZnJhbWUgZGF0YSBpbiBieXRlc1xuICAgICAqL1xuICAgIG9uRnJlZXplRnJhbWVNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLkZyZWV6ZUZyYW1lJyk7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIucHJvY2Vzc0ZyZWV6ZUZyYW1lTWVzc2FnZSh2aWV3LCAoKSA9PiB0aGlzLmxvYWRGcmVlemVGcmFtZU9yU2hvd1BsYXlPdmVybGF5KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmFibGUgdGhlIHZpZGVvIGFmdGVyIGhpZGluZyBhIGZyZWV6ZSBmcmFtZVxuICAgICAqL1xuICAgIGludmFsaWRhdGVGcmVlemVGcmFtZUFuZEVuYWJsZVZpZGVvKCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnRGF0YUNoYW5uZWxSZWNlaXZlTWVzc2FnZVR5cGUuRnJlZXplRnJhbWUnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IEhpZGVGcmVlemVGcmFtZUV2ZW50KCkpO1xuICAgICAgICAgICAgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIuaGlkZUZyZWV6ZUZyYW1lKCk7XG4gICAgICAgIH0sIHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyLmZyZWV6ZUZyYW1lRGVsYXkpO1xuICAgICAgICBpZiAodGhpcy52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKSkge1xuICAgICAgICAgICAgdGhpcy52aWRlb1BsYXllci5zZXRWaWRlb0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJlcCBkYXRhY2hhbm5lbCBkYXRhIGZvciBwcm9jZXNzaW5nIGZpbGUgZXh0ZW5zaW9uXG4gICAgICogQHBhcmFtIGRhdGEgdGhlIGZpbGUgZXh0ZW5zaW9uIGRhdGFcbiAgICAgKi9cbiAgICBvbkZpbGVFeHRlbnNpb24oZGF0YSkge1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIEZpbGVVdGlsLnNldEV4dGVuc2lvbkZyb21CeXRlcyh2aWV3LCB0aGlzLmZpbGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVwIGRhdGFjaGFubmVsIGRhdGEgZm9yIHByb2Nlc3NpbmcgdGhlIGZpbGUgbWltZSB0eXBlXG4gICAgICogQHBhcmFtIGRhdGEgdGhlIGZpbGUgbWltZSB0eXBlIGRhdGFcbiAgICAgKi9cbiAgICBvbkZpbGVNaW1lVHlwZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgRmlsZVV0aWwuc2V0TWltZVR5cGVGcm9tQnl0ZXModmlldywgdGhpcy5maWxlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJlcCBkYXRhY2hhbm5lbCBkYXRhIGZvciBwcm9jZXNzaW5nIHRoZSBmaWxlIGNvbnRlbnRzXG4gICAgICogQHBhcmFtIGRhdGEgdGhlIGZpbGUgY29udGVudHMgZGF0YVxuICAgICAqL1xuICAgIG9uRmlsZUNvbnRlbnRzKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBGaWxlVXRpbC5zZXRDb250ZW50c0Zyb21CeXRlcyh2aWV3LCB0aGlzLmZpbGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQbGF5cyB0aGUgc3RyZWFtIGF1ZGlvIGFuZCB2aWRlbyBzb3VyY2UgYW5kIHNldHMgdXAgb3RoZXIgcGllY2VzIHdoaWxlIHRoZSBzdHJlYW0gc3RhcnRzXG4gICAgICovXG4gICAgcGxheVN0cmVhbSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0NvdWxkIG5vdCBwbGF5IHZpZGVvIHN0cmVhbSBiZWNhdXNlIHRoZSB2aWRlbyBwbGF5ZXIgd2FzIG5vdCBpbml0aWFsaXplZCBjb3JyZWN0bHkuJztcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgUGxheVN0cmVhbUVycm9yRXZlbnQoeyBtZXNzYWdlIH0pKTtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgICB0aGlzLmNsb3NlU2lnbmFsaW5nU2VydmVyKCdTdHJlYW0gbm90IGluaXRpYWxpemVkIGNvcnJlY3RseScsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaGFzVmlkZW9Tb3VyY2UoKSkge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoJ0Nhbm5vdCBwbGF5IHN0cmVhbSwgdGhlIHZpZGVvIGVsZW1lbnQgaGFzIG5vIHNyY09iamVjdCB0byBwbGF5LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VG91Y2hJbnB1dEVuYWJsZWQodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Ub3VjaElucHV0KSk7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgUGxheVN0cmVhbUV2ZW50KCkpO1xuICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyLmF1ZGlvRWxlbWVudC5zcmNPYmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0TXV0ZWQgPSB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlN0YXJ0VmlkZW9NdXRlZCk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuYXVkaW9FbGVtZW50Lm11dGVkID0gc3RhcnRNdXRlZDtcbiAgICAgICAgICAgIGlmIChzdGFydE11dGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5VmlkZW8oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlci5hdWRpb0VsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgLnBsYXkoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheVZpZGVvKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChvblJlamVjdGVkUmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbmZvKG9uUmVqZWN0ZWRSZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbygnQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGF1dG9wbGF5aW5nIHZpZGVvIHdpdGhvdXQgaW50ZXJhY3Rpb24gLSB0byByZXNvbHZlIHRoaXMgd2UgYXJlIGdvaW5nIHRvIHNob3cgdGhlIHBsYXkgYnV0dG9uIG92ZXJsYXkuJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgUGxheVN0cmVhbVJlamVjdGVkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBvblJlamVjdGVkUmVhc29uXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGxheVZpZGVvKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG91bGRTaG93UGxheU92ZXJsYXkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIuc2hvd0ZyZWV6ZUZyYW1lKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBsYXlzIHRoZSB2aWRlbyBzdHJlYW1cbiAgICAgKi9cbiAgICBwbGF5VmlkZW8oKSB7XG4gICAgICAgIC8vIGhhbmRsZSBwbGF5KCkgd2l0aCBwcm9taXNlIGFzIGl0IGlzIGFuIGFzeW5jaHJvbm91cyBjYWxsXG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIucGxheSgpLmNhdGNoKChvblJlamVjdGVkUmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJlYW1Db250cm9sbGVyLmF1ZGlvRWxlbWVudC5zcmNPYmplY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuYXVkaW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhvblJlamVjdGVkUmVhc29uKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYXV0b3BsYXlpbmcgdmlkZW8gd2l0aG91dCBpbnRlcmFjdGlvbiAtIHRvIHJlc29sdmUgdGhpcyB3ZSBhcmUgZ29pbmcgdG8gc2hvdyB0aGUgcGxheSBidXR0b24gb3ZlcmxheS4nKTtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgUGxheVN0cmVhbVJlamVjdGVkRXZlbnQoeyByZWFzb246IG9uUmVqZWN0ZWRSZWFzb24gfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5hYmxlIHRoZSB2aWRlbyB0byBwbGF5IGF1dG9tYXRpY2FsbHkgaWYgZW5hYmxlQXV0b3BsYXkgaXMgdHJ1ZVxuICAgICAqL1xuICAgIGF1dG9QbGF5VmlkZW9PclNldFVwUGxheU92ZXJsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkF1dG9QbGF5VmlkZW8pKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IHRvIHBsYXkgdGhlIHZpZGVvXG4gICAgICAgICAgICB0aGlzLnBsYXlTdHJlYW0oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbm5lY3QgdG8gdGhlIFNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKi9cbiAgICBjb25uZWN0VG9TaWduYWxsaW5nU2VydmVyKCkge1xuICAgICAgICB0aGlzLmxvY2FsbHlDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbmFibGVBdXRvUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0TWVzc2FnZSA9IG51bGw7XG4gICAgICAgIGNvbnN0IHNpZ25hbGxpbmdVcmwgPSB0aGlzLnNpZ25hbGxpbmdVcmxCdWlsZGVyKCk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuY29ubmVjdChzaWduYWxsaW5nVXJsKTtcbiAgICAgICAgY29uc3Qga2VlcGFsaXZlRGVsYXkgPSB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLktlZXBhbGl2ZURlbGF5KTtcbiAgICAgICAgaWYgKGtlZXBhbGl2ZURlbGF5ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBuZXcgS2VlcGFsaXZlTW9uaXRvcih0aGlzLnByb3RvY29sLCBrZWVwYWxpdmVEZWxheSk7XG4gICAgICAgICAgICB0aGlzLmtlZXBhbGl2ZS5vblRpbWVvdXQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBpbmcgZmFpbHMganVzdCBkaXNjb25uZWN0XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBQcm90b2NvbCB0aW1lb3V0YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbC5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBzdGFydCB0aGUgaGFuZHNoYWtlIHRvIHRoZSBzaWduYWxsaW5nIHNlcnZlclxuICAgICAqIEBwYXJhbSBwZWVyQ29uZmlnICAtIFJUQyBDb25maWd1cmF0aW9uIE9wdGlvbnMgZnJvbSB0aGUgU2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEByZW1hcmsgUlRDIFBlZXIgQ29ubmVjdGlvbiBvbiBJY2UgQ2FuZGlkYXRlIGV2ZW50IGhhdmUgaXQgaGFuZGxlZCBieSBoYW5kbGUgU2VuZCBJY2UgQ2FuZGlkYXRlXG4gICAgICovXG4gICAgc3RhcnRTZXNzaW9uKHBlZXJDb25maWcpIHtcbiAgICAgICAgdGhpcy5wZWVyQ29uZmlnID0gcGVlckNvbmZpZztcbiAgICAgICAgLy8gY2hlY2sgZm9yIGZvcmNpbmcgdHVyblxuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Gb3JjZVRVUk4pKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBmb3IgYSB0dXJuIHNlcnZlclxuICAgICAgICAgICAgY29uc3QgaGFzVHVyblNlcnZlciA9IHRoaXMuY2hlY2tUdXJuU2VydmVyQXZhaWxhYmlsaXR5KHBlZXJDb25maWcpO1xuICAgICAgICAgICAgLy8gY2xvc2UgYW5kIGVycm9yIGlmIHR1cm4gaXMgZm9yY2VkIGFuZCB0aGVyZSBpcyBubyB0dXJuIHNlcnZlclxuICAgICAgICAgICAgaWYgKCFoYXNUdXJuU2VydmVyKSB7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ05vIHR1cm4gc2VydmVyIHdhcyBmb3VuZCBpbiB0aGUgUGVlciBDb25uZWN0aW9uIE9wdGlvbnMuIFRVUk4gY2Fubm90IGJlIGZvcmNlZCwgY2xvc2luZyBjb25uZWN0aW9uLiBQbGVhc2UgdXNlIFNUVU4gaW5zdGVhZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VTaWduYWxpbmdTZXJ2ZXIoJ1RVUk4gY2Fubm90IGJlIGZvcmNlZCwgY2xvc2luZyBjb25uZWN0aW9uLiBQbGVhc2UgdXNlIFNUVU4gaW5zdGVhZC4nLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNldCB1cCB0aGUgcGVlciBjb25uZWN0aW9uIGNvbnRyb2xsZXJcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIgPSBuZXcgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyKHRoaXMucGVlckNvbmZpZywgdGhpcy5jb25maWcsIHRoaXMucHJlZmVycmVkQ29kZWMpO1xuICAgICAgICAvLyBzZXQgdXAgcGVlciBjb25uZWN0aW9uIGNvbnRyb2xsZXIgdmlkZW8gc3RhdHNcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25WaWRlb1N0YXRzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVZpZGVvU3RhdHMoZXZlbnQpO1xuICAgICAgICB9O1xuICAgICAgICAvKiBTZXQgZXZlbnQgaGFuZGxlciBmb3IgbGF0ZW5jeSBpbmZvcm1hdGlvbiBpcyBjYWxjdWxhdGVkLCBoYW5kbGUgdGhlIGV2ZW50IGJ5IHByb3BvZ2F0aW5nIHRvIHRoZSBQaXhlbFN0cmVhbWluZyBBUEkgKi9cbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25MYXRlbmN5Q2FsY3VsYXRlZCA9IChsYXRlbmN5SW5mbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25MYXRlbmN5Q2FsY3VsYXRlZChsYXRlbmN5SW5mbyk7XG4gICAgICAgIH07XG4gICAgICAgIC8qIFdoZW4gdGhlIFBlZXIgQ29ubmVjdGlvbiB3YW50cyB0byBzZW5kIGFuIG9mZmVyIGhhdmUgaXQgaGFuZGxlZCAqL1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5vblNlbmRXZWJSVENPZmZlciA9IChvZmZlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZW5kV2ViUlRDT2ZmZXIob2ZmZXIpO1xuICAgICAgICB9O1xuICAgICAgICAvKiBTZXQgZXZlbnQgaGFuZGxlciBmb3Igd2hlbiBsb2NhbCBhbnN3ZXIgZGVzY3JpcHRpb24gaXMgc2V0ICovXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLm9uU2V0TG9jYWxEZXNjcmlwdGlvbiA9IChhbnN3ZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VuZFdlYlJUQ0Fuc3dlcihhbnN3ZXIpO1xuICAgICAgICB9O1xuICAgICAgICAvKiBTZXQgZXZlbnQgaGFuZGxlciBmb3Igd2hlbiByZW1vdGUgb2ZmZXIgZGVzY3JpcHRpb24gaXMgc2V0ICovXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLm9uU2V0UmVtb3RlRGVzY3JpcHRpb24gPSAob2ZmZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uV2ViUnRjU2RwT2ZmZXIob2ZmZXIpO1xuICAgICAgICB9O1xuICAgICAgICAvKiBXaGVuIHRoZSBQZWVyIENvbm5lY3Rpb24gaWNlIGNhbmRpZGF0ZSBpcyBhZGRlZCBoYXZlIGl0IGhhbmRsZWQgKi9cbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25QZWVySWNlQ2FuZGlkYXRlID0gKHBlZXJDb25uZWN0aW9uSWNlRXZlbnQpID0+IHRoaXMuaGFuZGxlU2VuZEljZUNhbmRpZGF0ZShwZWVyQ29ubmVjdGlvbkljZUV2ZW50KTtcbiAgICAgICAgLyogV2hlbiB0aGUgUGVlciBDb25uZWN0aW9uIGhhcyBhIGRhdGEgY2hhbm5lbCBjcmVhdGVkIGZvciBpdCBieSB0aGUgYnJvd3NlciwgaGFuZGxlIGl0ICovXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLm9uRGF0YUNoYW5uZWwgPSAoZGF0YWNoYW5uZWxFdmVudCkgPT4gdGhpcy5oYW5kbGVEYXRhQ2hhbm5lbChkYXRhY2hhbm5lbEV2ZW50KTtcbiAgICAgICAgLy8gc2V0IHVwIHdlYlJ0YyB0ZXh0IG92ZXJsYXlzXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnNob3dUZXh0T3ZlcmxheUNvbm5lY3RpbmcgPSAoKSA9PiB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbldlYlJ0Y0Nvbm5lY3RpbmcoKTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIuc2hvd1RleHRPdmVybGF5U2V0dXBGYWlsdXJlID0gKCkgPT4gdGhpcy5waXhlbFN0cmVhbWluZy5fb25XZWJSdGNGYWlsZWQoKTtcbiAgICAgICAgbGV0IHdlYlJ0Y0Nvbm5lY3RlZFNlbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25JY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBCcm93c2VycyBlbWl0IFwiY29ubmVjdGVkXCIgd2hlbiBnZXR0aW5nIGZpcnN0IGNvbm5lY3Rpb24gYW5kIFwiY29tcGxldGVkXCIgd2hlbiBmaW5pc2hpbmdcbiAgICAgICAgICAgIC8vIGNhbmRpZGF0ZSBjaGVja2luZy4gSG93ZXZlciwgc29tZXRpbWVzIGJyb3dzZXJzIGNhbiBza2lwIFwiY29ubmVjdGVkXCIgYW5kIG9ubHkgZW1pdCBcImNvbXBsZXRlZFwiLlxuICAgICAgICAgICAgLy8gVGhlcmVmb3JlIG5lZWQgdG8gY2hlY2sgYm90aCBjYXNlcyBhbmQgZW1pdCBvbldlYlJ0Y0Nvbm5lY3RlZCBvbmx5IG9uY2Ugb24gdGhlIGZpcnN0IGhpdC5cbiAgICAgICAgICAgIGlmICghd2ViUnRjQ29ubmVjdGVkU2VudCAmJlxuICAgICAgICAgICAgICAgIFsnY29ubmVjdGVkJywgJ2NvbXBsZXRlZCddLmluY2x1ZGVzKHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnBlZXJDb25uZWN0aW9uLmljZUNvbm5lY3Rpb25TdGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbldlYlJ0Y0Nvbm5lY3RlZCgpO1xuICAgICAgICAgICAgICAgIHdlYlJ0Y0Nvbm5lY3RlZFNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiBSVEMgUGVlciBDb25uZWN0aW9uIG9uIFRyYWNrIGV2ZW50IC0+IGhhbmRsZSBvbiB0cmFjayAqL1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5vblRyYWNrID0gKHRyYWNrRXZlbnQpID0+IHRoaXMuc3RyZWFtQ29udHJvbGxlci5oYW5kbGVPblRyYWNrKHRyYWNrRXZlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgdGhlIHBlZXIgY29ubmVjdGlvbiBvcHRpb25zIGZvciBhIHR1cm4gc2VydmVyIGFuZCByZXR1cm5zIHRydWUgb3IgZmFsc2VcbiAgICAgKi9cbiAgICBjaGVja1R1cm5TZXJ2ZXJBdmFpbGFiaWxpdHkob3B0aW9ucykge1xuICAgICAgICAvLyBpZiBpY2VTZXJ2ZXJzIGlzIGVtcHR5IHJldHVybiBmYWxzZSB0aGlzIHNob3VsZCBub3QgYmUgdGhlIGdlbmVyYWwgdXNlIGNhc2UgYnV0IGlzIGhlcmUgaW5jYXNlXG4gICAgICAgIGlmICghb3B0aW9ucy5pY2VTZXJ2ZXJzKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnQSB0dXJuIHNldmVyIHdhcyBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIGljZSBzZXJ2ZXJzIHRvIGNoZWNrIGZvciBhIHR1cm4gdXJsXG4gICAgICAgIGZvciAoY29uc3QgaWNlU2VydmVyIG9mIG9wdGlvbnMuaWNlU2VydmVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCB1cmwgb2YgaWNlU2VydmVyLnVybHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCd0dXJuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluZm8oYEEgdHVybiBzZXZlciB3YXMgZm91bmQgYXQgJHt1cmx9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBMb2dnZXIuSW5mbygnQSB0dXJuIHNldmVyIHdhcyBub3QgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gYSBDb25maWcgTWVzc2FnZSBpcyByZWNlaXZlZCBjb250YWlucyB0aGUgUGVlciBDb25uZWN0aW9uIE9wdGlvbnMgcmVxdWlyZWQgKFNUVU4gYW5kIFRVUk4gU2VydmVyIEluZm8pXG4gICAgICogQHBhcmFtIG1lc3NhZ2VDb25maWcgLSBDb25maWcgTWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBzaWduYWxpbmcgc2VydmVyXG4gICAgICovXG4gICAgaGFuZGxlT25Db25maWdNZXNzYWdlKG1lc3NhZ2VDb25maWcpIHtcbiAgICAgICAgdGhpcy5yZXNpemVQbGF5ZXJTdHlsZSgpO1xuICAgICAgICAvLyBUZWxsIHRoZSBXZWJSdGNDb250cm9sbGVyIHRvIHN0YXJ0IGEgc2Vzc2lvbiB3aXRoIHRoZSBwZWVyIG9wdGlvbnMgc2VudCBmcm9tIHRoZSBzaWduYWxpbmcgc2VydmVyXG4gICAgICAgIHRoaXMuc3RhcnRTZXNzaW9uKG1lc3NhZ2VDb25maWcucGVlckNvbm5lY3Rpb25PcHRpb25zKTtcbiAgICB9XG4gICAgaGFuZGxlUGluZ01lc3NhZ2UocGluZ01lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLnBvbmcsIHsgdGltZTogcGluZ01lc3NhZ2UudGltZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIgZ2l2ZXMgdXMgdGhlIGxpc3Qgb2Ygc3RyZWFtZXIgaWRzLlxuICAgICAqL1xuICAgIGhhbmRsZVN0cmVhbWVyTGlzdE1lc3NhZ2UobWVzc2FnZVN0cmVhbWVyTGlzdCkge1xuICAgICAgICBMb2dnZXIuSW5mbyhgR290IHN0cmVhbWVyIGxpc3QgJHttZXNzYWdlU3RyZWFtZXJMaXN0Lmlkc31gKTtcbiAgICAgICAgbGV0IHdhbnRlZFN0cmVhbWVySWQgPSAnJztcbiAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHNlbGVjdGVkIHN0cmVhbWVyIGlkIG9wdGlvblxuICAgICAgICBjb25zdCBzdHJlYW1lcklET3B0aW9uID0gdGhpcy5jb25maWcuZ2V0U2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpO1xuICAgICAgICBjb25zdCBleGlzdGluZ1NlbGVjdGlvbiA9IHN0cmVhbWVySURPcHRpb24uc2VsZWN0ZWQudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgIGlmIChleGlzdGluZ1NlbGVjdGlvbikge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBzZWxlY3RlZCBvcHRpb24gaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICB3YW50ZWRTdHJlYW1lcklkID0gc3RyZWFtZXJJRE9wdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgdGhlIHN0cmVhbWVycyB0byB0aGUgVUlcbiAgICAgICAgY29uc3Qgc2V0dGluZ09wdGlvbnMgPSBbLi4ubWVzc2FnZVN0cmVhbWVyTGlzdC5pZHNdOyAvLyBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlU3RyZWFtZXJMaXN0Lmlkc1xuICAgICAgICBzZXR0aW5nT3B0aW9ucy51bnNoaWZ0KCcnKTsgLy8gYWRkIGFuIGVtcHR5IG9wdGlvbiBhdCB0aGUgdG9wXG4gICAgICAgIHRoaXMuY29uZmlnLnNldE9wdGlvblNldHRpbmdPcHRpb25zKE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCwgc2V0dGluZ09wdGlvbnMpO1xuICAgICAgICBsZXQgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCA9ICcnO1xuICAgICAgICBjb25zdCB3YWl0Rm9yU3RyZWFtZXIgPSB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLldhaXRGb3JTdHJlYW1lcik7XG4gICAgICAgIGNvbnN0IHJlY29ubmVjdExpbWl0ID0gdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cyk7XG4gICAgICAgIGNvbnN0IHJlY29ubmVjdERlbGF5ID0gdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwpO1xuICAgICAgICAvLyBmaXJzdCB3ZSBmaWd1cmUgb3V0IGEgd2FudGVkIHN0cmVhbWVyIGlkIHRocm91Z2ggdmFyaW91cyBtZWFuc1xuICAgICAgICBjb25zdCB1c2VVcmxQYXJhbXMgPSB0aGlzLmNvbmZpZy51c2VVcmxQYXJhbXM7XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBJVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICBpZiAodXNlVXJsUGFyYW1zICYmIHVybFBhcmFtcy5oYXMoT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkKSkge1xuICAgICAgICAgICAgLy8gaWYgd2UndmUgc2V0IHRoZSBzdHJlYW1lciBpZCBvbiB0aGUgdXJsIHdlIG9ubHkgd2FudCB0aGF0IHN0cmVhbWVyIGlkXG4gICAgICAgICAgICB3YW50ZWRTdHJlYW1lcklkID0gdXJsUGFyYW1zLmdldChPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc3Vic2NyaWJlZFN0cmVhbSkge1xuICAgICAgICAgICAgLy8gd2Ugd2VyZSBwcmV2aW91c2x5IHN1YnNjcmliZWQgdG8gYSBzdHJlYW1lciwgd2Ugd2FudCB0aGF0XG4gICAgICAgICAgICB3YW50ZWRTdHJlYW1lcklkID0gdGhpcy5zdWJzY3JpYmVkU3RyZWFtO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyBsZXRzIHNlZSBpZiB3ZSBjYW4gcGljayBpdC5cbiAgICAgICAgaWYgKHdhbnRlZFN0cmVhbWVySWQgJiYgbWVzc2FnZVN0cmVhbWVyTGlzdC5pZHMuaW5jbHVkZXMod2FudGVkU3RyZWFtZXJJZCkpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSB3YW50ZWQgc3RyZWFtIGlzIGluIHRoZSBsaXN0LiB3ZSBwaWNrIHRoYXRcbiAgICAgICAgICAgIGF1dG9TZWxlY3RlZFN0cmVhbWVySWQgPSB3YW50ZWRTdHJlYW1lcklkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCghd2FudGVkU3RyZWFtZXJJZCB8fCAhd2FpdEZvclN0cmVhbWVyKSAmJiBtZXNzYWdlU3RyZWFtZXJMaXN0Lmlkcy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpZiB3ZSdyZSBub3Qgd2FpdGluZyBmb3IgdGhlIHdhbnRlZCBzdHJlYW1lciBhbmQgdGhlcmUncyBvbmx5IG9uZSBzdHJlYW1lciwgY29ubmVjdCB0byBpdFxuICAgICAgICAgICAgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCA9IG1lc3NhZ2VTdHJlYW1lckxpc3QuaWRzWzBdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlIGZvdW5kIGEgc3RyZWFtZXIgaWQgdG8gYXV0byBzZWxlY3QsIHNlbGVjdCBpdFxuICAgICAgICBpZiAoYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMDtcbiAgICAgICAgICAgIHRoaXMuaXNSZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE9wdGlvblNldHRpbmdWYWx1ZShPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQsIGF1dG9TZWxlY3RlZFN0cmVhbWVySWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gbm8gYXV0byBzZWxlY3RlZCBzdHJlYW1lci5cbiAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHdhaXRpbmcgZm9yIGEgc3RyZWFtZXIgdGhlbiB0cnkgcmVjb25uZWN0aW5nXG4gICAgICAgICAgICBpZiAod2FpdEZvclN0cmVhbWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjb25uZWN0QXR0ZW1wdCA8IHJlY29ubmVjdExpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJlY29ubmVjdHMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCsrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUmVjb25uZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMubGlzdFN0cmVhbWVycykpO1xuICAgICAgICAgICAgICAgICAgICB9LCByZWNvbm5lY3REZWxheSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBleGhhdXN0ZWQgb3VyIHJlY29ubmVjdCBhdHRlbXB0cywgcmV0dXJuIHRvIG1haW4gc2NyZWVuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGVBdXRvUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGRpc3BhdGNoIHRoaXMgZXZlbnQgZmluYWxseVxuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IFN0cmVhbWVyTGlzdE1lc3NhZ2VFdmVudCh7XG4gICAgICAgICAgICBtZXNzYWdlU3RyZWFtZXJMaXN0LFxuICAgICAgICAgICAgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCxcbiAgICAgICAgICAgIHdhbnRlZFN0cmVhbWVySWRcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBoYW5kbGVTdWJzY3JpYmVGYWlsZWRNZXNzYWdlKHN1YnNjcmliZUZhaWxlZE1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMDtcbiAgICAgICAgdGhpcy5pc1JlY29ubmVjdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVuYWJsZUF1dG9SZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25TdWJzY3JpYmVGYWlsZWQoc3Vic2NyaWJlRmFpbGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgaGFuZGxlU3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlKHN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZSkge1xuICAgICAgICBjb25zdCBuZXdJRCA9IHN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZS5uZXdJRDtcbiAgICAgICAgLy8gbmVlZCB0byBlZGl0IHRoZSBzZWxlY3RlZCBzdHJlYW1lciBpbiB0aGUgc2V0dGluZ3MgbGlzdFxuICAgICAgICBjb25zdCBzdHJlYW1lckxpc3RPcHRpb25zID0gdGhpcy5jb25maWcuZ2V0U2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpO1xuICAgICAgICAvLyB0ZW1wb3JhcmlseSBwcmV2ZW50IG9uQ2hhbmdlIGZyb20gZmlyaW5nIChpdCB3b3VsZCB0cnkgdG8gc3Vic2NyaWJlIHRvIHRoZSBzdHJlYW1lciBhZ2FpbilcbiAgICAgICAgY29uc3Qgb2xkT25DaGFuZ2UgPSBzdHJlYW1lckxpc3RPcHRpb25zLm9uQ2hhbmdlO1xuICAgICAgICBzdHJlYW1lckxpc3RPcHRpb25zLm9uQ2hhbmdlID0gKCkgPT4geyB9O1xuICAgICAgICAvLyBjaGFuZ2UgdGhlIHNlbGVjdGVkIGVudHJ5LlxuICAgICAgICBjb25zdCBzdHJlYW1lckxpc3QgPSBzdHJlYW1lckxpc3RPcHRpb25zLm9wdGlvbnM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyZWFtZXJMaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoc3RyZWFtZXJMaXN0W2ldID09IHRoaXMuc3Vic2NyaWJlZFN0cmVhbSkge1xuICAgICAgICAgICAgICAgIHN0cmVhbWVyTGlzdFtpXSA9IG5ld0lEO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgbGlzdFxuICAgICAgICBzdHJlYW1lckxpc3RPcHRpb25zLm9wdGlvbnMgPSBzdHJlYW1lckxpc3Q7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgZW50cnlcbiAgICAgICAgc3RyZWFtZXJMaXN0T3B0aW9ucy5zZWxlY3RlZCA9IG5ld0lEO1xuICAgICAgICAvLyByZXN0b3JlIHRoZSBvbGQgY2hhbmdlIG5vdGlmaWVyLlxuICAgICAgICBzdHJlYW1lckxpc3RPcHRpb25zLm9uQ2hhbmdlID0gb2xkT25DaGFuZ2U7XG4gICAgICAgIC8vIHJlbWVtYmVyIHdoaWNoIHN0cmVhbSB3ZSdyZSBzdWJzY3JpYmUgdG9cbiAgICAgICAgdGhpcy5zdWJzY3JpYmVkU3RyZWFtID0gc3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlLm5ld0lEO1xuICAgICAgICAvLyBub3RpZnkgYW55IGxpc3RlbmVyc1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IFN0cmVhbWVySURDaGFuZ2VkTWVzc2FnZUV2ZW50KHtcbiAgICAgICAgICAgIG5ld0lEXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRoZSBSVEMgQW5zd2VyIGZyb20gdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKiBAcGFyYW0gQW5zd2VyIC0gQW5zd2VyIFNEUCBmcm9tIHRoZSBwZWVyLlxuICAgICAqL1xuICAgIGhhbmRsZVdlYlJ0Y0Fuc3dlcihBbnN3ZXIpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYEdvdCBhbnN3ZXIgc2RwICR7QW5zd2VyLnNkcH1gKTtcbiAgICAgICAgY29uc3Qgc2RwQW5zd2VyID0ge1xuICAgICAgICAgICAgc2RwOiBBbnN3ZXIuc2RwLFxuICAgICAgICAgICAgdHlwZTogJ2Fuc3dlcidcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIucmVjZWl2ZUFuc3dlcihzZHBBbnN3ZXIpO1xuICAgICAgICB0aGlzLmhhbmRsZVBvc3RXZWJydGNOZWdvdGlhdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIFJUQyBvZmZlciBmcm9tIGEgV2ViUlRDIHBlZXIgKHJlY2VpdmVkIHRocm91Z2ggdGhlIHNpZ25hbGxpbmcgc2VydmVyKS5cbiAgICAgKiBAcGFyYW0gT2ZmZXIgLSBPZmZlciBTRFAgZnJvbSB0aGUgcGVlci5cbiAgICAgKi9cbiAgICBoYW5kbGVXZWJSdGNPZmZlcihPZmZlcikge1xuICAgICAgICBMb2dnZXIuSW5mbyhgR290IG9mZmVyIHNkcCAke09mZmVyLnNkcH1gKTtcbiAgICAgICAgdGhpcy5pc1VzaW5nU0ZVID0gT2ZmZXIuc2Z1ID8gT2ZmZXIuc2Z1IDogZmFsc2U7XG4gICAgICAgIHRoaXMuaXNVc2luZ1NWQyA9IE9mZmVyLnNjYWxhYmlsaXR5TW9kZSA/IE9mZmVyLnNjYWxhYmlsaXR5TW9kZSAhPSAnTDFUMScgOiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaXNVc2luZ1NGVSB8fCB0aGlzLmlzVXNpbmdTVkMpIHtcbiAgICAgICAgICAgIC8vIERpc2FibGUgbmVnb3RpYXRpbmcgd2l0aCB0aGUgc2Z1IGFzIHRoZSBzZnUgb25seSBzdXBwb3J0cyBvbmUgY29kZWMgYXQgYSB0aW1lXG4gICAgICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5wcmVmZXJyZWRDb2RlYyA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5PVEU6IFRoZXNlIHR3byBzZXR0aW5ncyBjb25maWd1cmF0aW9ucyBhcmUgZG9uZSBvdXRzaWRlIG9mIGFuIGlmKHRoaXMuaXNVc2luZ1NGVSkgc28gdGhhdCB1c2Vyc1xuICAgICAgICAvLyBjYW4gc3dpdGNoIGJldHdlZW4gYSBkZWZhdWx0IGFuZCBTRlUgc3RyZWFtIGFuZCBoYXZlIHRoZSBzZXR0aW5ncyByZWNvbmZpZ3VyZSBhcHByb3ByaWF0ZWx5XG4gICAgICAgIGNvbnN0IHNjYWxhYmlsaXR5TW9kZSA9IE9mZmVyLnNjYWxhYmlsaXR5TW9kZSA/IE9mZmVyLnNjYWxhYmlsaXR5TW9kZSA6ICdMMVQxJztcbiAgICAgICAgbGV0IGF2YWlsYWJsZVF1YWxpdGllcyA9IFsnRGVmYXVsdCddO1xuICAgICAgICBpZiAodGhpcy5pc1VzaW5nU0ZVKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNVc2luZ1NWQykge1xuICAgICAgICAgICAgICAgIC8vIFVzZXIgaXMgdXNpbmcgYW4gU0ZVIHdpdGhvdXQgYW55IHRlbXBvcmFsIHNjYWxhYmlsaXR5LiBKdXN0IG9mZmVyIGVhc2lseSByZWFkYWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVF1YWxpdGllcyA9IFsnTG93JywgJ01lZGl1bScsICdIaWdoJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2VyIGlzIHVzaW5nIFNWQy4gR2VuZXJhdGUgYWxsIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZVF1YWxpdGllcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heFNwYXRpYWxMYXllcnMgPSArc2NhbGFiaWxpdHlNb2RlWzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heFRlbXBvcmFsTGF5ZXJzID0gK3NjYWxhYmlsaXR5TW9kZVszXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzID0gMTsgcyA8PSBtYXhTcGF0aWFsTGF5ZXJzOyBzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdCA9IDE7IHQgPD0gbWF4VGVtcG9yYWxMYXllcnM7IHQrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlUXVhbGl0aWVzLnB1c2goYFMke3N9VCR7dH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgdGhlIHBvc3NpYmxlIHZpZGVvIHF1YWxpdHkgb3B0aW9uc1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcHRpb25TZXR0aW5nT3B0aW9ucyhPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHksIGF2YWlsYWJsZVF1YWxpdGllcyk7XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgdmlkZW8gcXVhbGl0eSB3aXRoIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHJlc29sdXRpb25cbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ1ZhbHVlKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSwgYXZhaWxhYmxlUXVhbGl0aWVzLnNsaWNlKC0xKVswXSk7XG4gICAgICAgIGNvbnN0IHNkcE9mZmVyID0ge1xuICAgICAgICAgICAgc2RwOiBPZmZlci5zZHAsXG4gICAgICAgICAgICB0eXBlOiAnb2ZmZXInXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnJlY2VpdmVPZmZlcihzZHBPZmZlciwgdGhpcy5jb25maWcpO1xuICAgICAgICB0aGlzLmhhbmRsZVBvc3RXZWJydGNOZWdvdGlhdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgd2hlbiB0aGUgU0ZVIHByb3ZpZGVzIHRoZSBwZWVyIHdpdGggaXRzIGRhdGEgY2hhbm5lbHNcbiAgICAgKiBAcGFyYW0gRGF0YUNoYW5uZWxzIC0gVGhlIG1lc3NhZ2UgZnJvbSB0aGUgU0ZVIGNvbnRhaW5pbmcgdGhlIGRhdGEgY2hhbm5lbHMgaWRzXG4gICAgICovXG4gICAgaGFuZGxlV2ViUnRjU0ZVUGVlckRhdGFjaGFubmVscyhEYXRhQ2hhbm5lbHMpIHtcbiAgICAgICAgY29uc3QgU2VuZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmVnb3RpYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGlkOiBEYXRhQ2hhbm5lbHMuc2VuZFN0cmVhbUlkXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHVuaWRpcmVjdGlvbmFsID0gRGF0YUNoYW5uZWxzLnNlbmRTdHJlYW1JZCAhPSBEYXRhQ2hhbm5lbHMucmVjdlN0cmVhbUlkO1xuICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmNyZWF0ZURhdGFDaGFubmVsKHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnBlZXJDb25uZWN0aW9uLCB1bmlkaXJlY3Rpb25hbCA/ICdzZW5kLWRhdGFjaGFubmVsJyA6ICdkYXRhY2hhbm5lbCcsIFNlbmRPcHRpb25zKTtcbiAgICAgICAgaWYgKHVuaWRpcmVjdGlvbmFsKSB7XG4gICAgICAgICAgICBjb25zdCBSZWN2T3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBvcmRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG5lZ290aWF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaWQ6IERhdGFDaGFubmVscy5yZWN2U3RyZWFtSWRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIuY3JlYXRlRGF0YUNoYW5uZWwodGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIucGVlckNvbm5lY3Rpb24sICdyZWN2LWRhdGFjaGFubmVsJywgUmVjdk9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5yZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmhhbmRsZU9uT3BlbiA9ICgpID0+IHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UoTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5wZWVyRGF0YUNoYW5uZWxzUmVhZHkpKTtcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIHVuaS1kaXJlY3Rpb25hbCwgb25seSB0aGUgcmVjdiBkYXRhIGNoYW5uZWwgc2hvdWxkIGhhbmRsZSBpbmNvbWluZyBtZXNzYWdlc1xuICAgICAgICAgICAgdGhpcy5yZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmhhbmRsZU9uTWVzc2FnZSA9IChldikgPT4gdGhpcy5oYW5kbGVPbk1lc3NhZ2UoZXYpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZWxzZSBvdXIgcHJpbWFyeSBkYXRhY2hhbm5lbCBpcyBzZW5kL3JlY3Ygc28gaXQgY2FuIGhhbmRsZSBpbmNvbWluZyBtZXNzYWdlc1xuICAgICAgICAgICAgdGhpcy5zZW5kcmVjdkRhdGFDaGFubmVsQ29udHJvbGxlci5oYW5kbGVPbk1lc3NhZ2UgPSAoZXYpID0+IHRoaXMuaGFuZGxlT25NZXNzYWdlKGV2KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVQb3N0V2VicnRjTmVnb3RpYXRpb24oKSB7XG4gICAgICAgIC8vIHN0YXJ0IHRoZSBhZmsgd2FybmluZyB0aW1lciBhcyBQUyBpcyBub3cgcnVubmluZ1xuICAgICAgICB0aGlzLmFma0NvbnRyb2xsZXIuc3RhcnRBZmtXYXJuaW5nVGltZXIoKTtcbiAgICAgICAgLy8gc2hvdyB0aGUgb3ZlcmxheSB0aGF0IHdlIGhhdmUgbmVnb3RpYXRlZCBhIGNvbm5lY3Rpb25cbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25XZWJSdGNTZHAoKTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHNUaW1lckhhbmRsZSAmJiB0aGlzLnN0YXRzVGltZXJIYW5kbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zdGF0c1RpbWVySGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRzVGltZXJIYW5kbGUgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5nZXRTdGF0cygpLCAxMDAwKTtcbiAgICAgICAgLyogICovXG4gICAgICAgIHRoaXMuc2V0TW91c2VJbnB1dEVuYWJsZWQodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Nb3VzZUlucHV0KSk7XG4gICAgICAgIHRoaXMuc2V0S2V5Ym9hcmRJbnB1dEVuYWJsZWQodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5LZXlib2FyZElucHV0KSk7XG4gICAgICAgIHRoaXMuc2V0R2FtZVBhZElucHV0RW5hYmxlZCh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkdhbWVwYWRJbnB1dCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIGFuIGljZSBDYW5kaWRhdGUgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgU2lnbmFsaW5nIHNlcnZlciBhZGQgaXQgdG8gdGhlIFBlZXIgQ29ubmVjdGlvbiBDbGllbnRcbiAgICAgKiBAcGFyYW0gaWNlQ2FuZGlkYXRlIC0gSWNlIENhbmRpZGF0ZSBmcm9tIFNlcnZlclxuICAgICAqL1xuICAgIGhhbmRsZUljZUNhbmRpZGF0ZShpY2VDYW5kaWRhdGUpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ1dlYiBSVEMgQ29udHJvbGxlcjogb25XZWJSdGNJY2UnKTtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbmV3IFJUQ0ljZUNhbmRpZGF0ZShpY2VDYW5kaWRhdGUpO1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5oYW5kbGVPbkljZShjYW5kaWRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBpY2UgQ2FuZGlkYXRlIHRvIHRoZSBzaWduYWxpbmcgc2VydmVyIHZpYSB3ZWJzb2NrZXRcbiAgICAgKiBAcGFyYW0gaWNlRXZlbnQgLSBSVEMgUGVlciBDb25uZWN0aW9uSWNlRXZlbnQpIHtcbiAgICAgKi9cbiAgICBoYW5kbGVTZW5kSWNlQ2FuZGlkYXRlKGljZUV2ZW50KSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdPbkljZUNhbmRpZGF0ZScpO1xuICAgICAgICBpZiAoaWNlRXZlbnQuY2FuZGlkYXRlICYmIGljZUV2ZW50LmNhbmRpZGF0ZS5jYW5kaWRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UoTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5pY2VDYW5kaWRhdGUsIHsgY2FuZGlkYXRlOiBpY2VFdmVudC5jYW5kaWRhdGUgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIGljZSBDYW5kaWRhdGUgdG8gdGhlIHNpZ25hbGluZyBzZXJ2ZXIgdmlhIHdlYnNvY2tldFxuICAgICAqIEBwYXJhbSBpY2VFdmVudCAtIFJUQyBQZWVyIENvbm5lY3Rpb25JY2VFdmVudCkge1xuICAgICAqL1xuICAgIGhhbmRsZURhdGFDaGFubmVsKGRhdGFjaGFubmVsRXZlbnQpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGEgY2hhbm5lbCBjcmVhdGVkIGZvciB1cyBieSBicm93c2VyIGFzIHdlIGFyZSBhIHJlY2VpdmluZyBwZWVyLicpO1xuICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmRhdGFDaGFubmVsID0gZGF0YWNoYW5uZWxFdmVudC5jaGFubmVsO1xuICAgICAgICAvLyBEYXRhIGNoYW5uZWwgd2FzIGNyZWF0ZWQgZm9yIHVzLCBzbyB3ZSBqdXN0IG5lZWQgdG8gc2V0dXAgaXRzIGNhbGxiYWNrcyBhbmQgYXJyYXkgdHlwZVxuICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLnNldHVwRGF0YUNoYW5uZWwoKTtcbiAgICAgICAgdGhpcy5zZW5kcmVjdkRhdGFDaGFubmVsQ29udHJvbGxlci5oYW5kbGVPbk1lc3NhZ2UgPSAoZXYpID0+IHRoaXMuaGFuZGxlT25NZXNzYWdlKGV2KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgUlRDIE9mZmVyIFNlc3Npb24gdG8gdGhlIFNpZ25hbGluZyBzZXJ2ZXIgdmlhIHdlYnNvY2tldFxuICAgICAqIEBwYXJhbSBvZmZlciAtIFJUQyBTZXNzaW9uIERlc2NyaXB0aW9uXG4gICAgICovXG4gICAgaGFuZGxlU2VuZFdlYlJUQ09mZmVyKG9mZmVyKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdTZW5kaW5nIHRoZSBvZmZlciB0byB0aGUgU2VydmVyJyk7XG4gICAgICAgIGNvbnN0IGV4dHJhUGFyYW1zID0ge1xuICAgICAgICAgICAgc2RwOiBvZmZlci5zZHAsXG4gICAgICAgICAgICBtaW5CaXRyYXRlQnBzOiAxMDAwICogdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlKSxcbiAgICAgICAgICAgIG1heEJpdHJhdGVCcHM6IDEwMDAgKiB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UoTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5vZmZlciwgZXh0cmFQYXJhbXMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgUlRDIE9mZmVyIFNlc3Npb24gdG8gdGhlIFNpZ25hbGluZyBzZXJ2ZXIgdmlhIHdlYnNvY2tldFxuICAgICAqIEBwYXJhbSBhbnN3ZXIgLSBSVEMgU2Vzc2lvbiBEZXNjcmlwdGlvblxuICAgICAqL1xuICAgIGhhbmRsZVNlbmRXZWJSVENBbnN3ZXIoYW5zd2VyKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdTZW5kaW5nIHRoZSBhbnN3ZXIgdG8gdGhlIFNlcnZlcicpO1xuICAgICAgICBjb25zdCBleHRyYVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHNkcDogYW5zd2VyLnNkcCxcbiAgICAgICAgICAgIG1pbkJpdHJhdGVCcHM6IDEwMDAgKiB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUpLFxuICAgICAgICAgICAgbWF4Qml0cmF0ZUJwczogMTAwMCAqIHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWF4Qml0cmF0ZSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLmFuc3dlciwgZXh0cmFQYXJhbXMpKTtcbiAgICAgICAgaWYgKHRoaXMuaXNVc2luZ1NGVSkge1xuICAgICAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLmRhdGFDaGFubmVsUmVxdWVzdCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlbmQgYW5zd2VyIGJhY2sgdG8gUGl4ZWwgU3RyZWFtaW5nIG1haW4gY2xhc3MgZm9yIGV2ZW50IGRpc3BhdGNoXG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uV2ViUnRjU2RwQW5zd2VyKGFuc3dlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZnJlZXplIGZyYW1lIG92ZXJsYXkgdG8gdGhlIHBsYXllciBkaXZcbiAgICAgKi9cbiAgICBzZXRVcE1vdXNlQW5kRnJlZXplRnJhbWUoKSB7XG4gICAgICAgIC8vIENhbGN1bGF0aW5nIGFuZCBub3JtYWxpemluZyBwb3NpdGlvbnMgZGVwZW5kcyBvbiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGxheWVyLlxuICAgICAgICBjb25zdCBwbGF5ZXJFbGVtZW50ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnJlY29uZmlndXJlKHsgd2lkdGg6IHBsYXllckVsZW1lbnQuY2xpZW50V2lkdGgsIGhlaWdodDogcGxheWVyRWxlbWVudC5jbGllbnRIZWlnaHQgfSwgeyB3aWR0aDogdmlkZW9FbGVtZW50LnZpZGVvV2lkdGgsIGhlaWdodDogdmlkZW9FbGVtZW50LnZpZGVvSGVpZ2h0IH0pO1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lQ29udHJvbGxlci5mcmVlemVGcmFtZS5yZXNpemUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIENvbm5lY3Rpb24gdG8gdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKi9cbiAgICBjbG9zZVNpZ25hbGluZ1NlcnZlcihtZXNzYWdlLCBhbGxvd1JlY29ubmVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMubG9jYWxseUNsb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZW5hYmxlQXV0b1JlY29ubmVjdCA9IGFsbG93UmVjb25uZWN0O1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RNZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgKF9hID0gdGhpcy5wcm90b2NvbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRpc2Nvbm5lY3QoMTAwMCwgbWVzc2FnZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBwZWVyIGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBjbG9zZVBlZXJDb25uZWN0aW9uKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgYWxsIGNvbm5lY3Rpb25zXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VTaWduYWxpbmdTZXJ2ZXIoJycsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5jbG9zZVBlZXJDb25uZWN0aW9uKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpcmVzIGEgVmlkZW8gU3RhdHMgRXZlbnQgaW4gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBnZXRTdGF0cygpIHtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIuZ2VuZXJhdGVTdGF0cygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgTGF0ZW5jeSBUZXN0IFJlcXVlc3QgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgc2VuZExhdGVuY3lUZXN0KCkge1xuICAgICAgICB0aGlzLmxhdGVuY3lTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0xhdGVuY3lUZXN0JykoW1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIFN0YXJ0VGltZTogdGhpcy5sYXRlbmN5U3RhcnRUaW1lXG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIERhdGEgQ2hhbm5lbCBMYXRlbmN5IFRlc3QgUmVxdWVzdCB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZW5kRGF0YUNoYW5uZWxMYXRlbmN5VGVzdChkZXNjcmlwdG9yKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCcpKFtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGRlc2NyaXB0b3IpXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBNaW5RUCBlbmNvZGVyIHNldHRpbmcgdG8gdGhlIFVFIEluc3RhbmNlLlxuICAgICAqIEBwYXJhbSBtaW5RUCAtIFRoZSBsb3dlciBib3VuZCBmb3IgUVAgd2hlbiBlbmNvZGluZ1xuICAgICAqIHZhbGlkIHZhbHVlcyBhcmUgKDEtNTEpIHdoZXJlOlxuICAgICAqIDEgPSBCZXN0IHF1YWxpdHkgYnV0IGhpZ2hlc3QgYml0cmF0ZS5cbiAgICAgKiA1MSA9IFdvcnN0IHF1YWxpdHkgYnV0IGxvd2VzdCBiaXRyYXRlLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIG1pblFQIGlzIDEgbWVhbmluZyB0aGUgZW5jb2RlciBpcyBmcmVlXG4gICAgICogdG8gYWltIGZvciB0aGUgYmVzdCBxdWFsaXR5IGl0IGNhbiBvbiB0aGUgZ2l2ZW4gbmV0d29yayBsaW5rLlxuICAgICAqL1xuICAgIHNlbmRFbmNvZGVyTWluUVAobWluUVApIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYE1pblFQPSR7bWluUVB9XFxuYCk7XG4gICAgICAgIGlmIChtaW5RUCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnRW5jb2Rlci5NaW5RUCc6IG1pblFQXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIE1heFFQIGVuY29kZXIgc2V0dGluZyB0byB0aGUgVUUgSW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1heFFQIC0gVGhlIHVwcGVyIGJvdW5kIGZvciBRUCB3aGVuIGVuY29kaW5nXG4gICAgICogdmFsaWQgdmFsdWVzIGFyZSAoMS01MSkgd2hlcmU6XG4gICAgICogMSA9IEJlc3QgcXVhbGl0eSBidXQgaGlnaGVzdCBiaXRyYXRlLlxuICAgICAqIDUxID0gV29yc3QgcXVhbGl0eSBidXQgbG93ZXN0IGJpdHJhdGUuXG4gICAgICogQnkgZGVmYXVsdCB0aGUgbWF4UVAgaXMgNTEgbWVhbmluZyB0aGUgZW5jb2RlciBpcyBmcmVlXG4gICAgICogdG8gZHJvcCBxdWFsaXR5IGFzIGxvdyBhcyBuZWVkZWQgb24gdGhlIGdpdmVuIG5ldHdvcmsgbGluay5cbiAgICAgKi9cbiAgICBzZW5kRW5jb2Rlck1heFFQKG1heFFQKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBNYXhRUD0ke21heFFQfVxcbmApO1xuICAgICAgICBpZiAobWF4UVAgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdDb21tYW5kJykoW1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgJ0VuY29kZXIuTWF4UVAnOiBtYXhRUFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBNaW5RdWFsaXR5IGVuY29kZXIgc2V0dGluZyB0byB0aGUgVUUgSW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1pblF1YWxpdHkgLSBUaGUgbG93ZXIgYm91bmQgZm9yIHF1YWxpdHkgd2hlbiBlbmNvZGluZ1xuICAgICAqIHZhbGlkIHZhbHVlcyBhcmUgKDAtMTAwKSB3aGVyZTpcbiAgICAgKiAwID0gV29yc3QgcXVhbGl0eS5cbiAgICAgKiAxMDAgPSBCZXN0IHF1YWxpdHkuXG4gICAgICovXG4gICAgc2VuZEVuY29kZXJNaW5RdWFsaXR5KG1pblF1YWxpdHkpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYE1pblF1YWxpdHk9JHttaW5RdWFsaXR5fVxcbmApO1xuICAgICAgICBpZiAobWluUXVhbGl0eSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnRW5jb2Rlci5NaW5RdWFsaXR5JzogbWluUXVhbGl0eVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBNYXhRdWFsaXR5IGVuY29kZXIgc2V0dGluZyB0byB0aGUgVUUgSW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1heFF1YWxpdHkgLSBUaGUgdXBwZXIgYm91bmQgZm9yIHF1YWxpdHkgd2hlbiBlbmNvZGluZ1xuICAgICAqIHZhbGlkIHZhbHVlcyBhcmUgKDAtMTAwKSB3aGVyZTpcbiAgICAgKiAwID0gV29yc3QgcXVhbGl0eS5cbiAgICAgKiAxMDAgPSBCZXN0IHF1YWxpdHkuXG4gICAgICovXG4gICAgc2VuZEVuY29kZXJNYXhRdWFsaXR5KG1heFF1YWxpdHkpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYE1heFF1YWxpdHk9JHttYXhRdWFsaXR5fVxcbmApO1xuICAgICAgICBpZiAobWF4UXVhbGl0eSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnRW5jb2Rlci5NYXhRdWFsaXR5JzogbWF4UXVhbGl0eVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSB7IFdlYlJUQy5NaW5CaXRyYXRlOiBTb21lTnVtYmVyIH19IGNvbW1hbmQgdG8gVUUgdG8gc2V0XG4gICAgICogdGhlIG1pbmltdW0gYml0cmF0ZSB0aGF0IHdlIGFsbG93IFdlYlJUQyB0byB1c2VcbiAgICAgKiAobm90ZSBzZXR0aW5nIHRoaXMgdG9vIGhpZ2ggaW4gcG9vciBuZXR3b3JrcyBjYW4gYmUgcHJvYmxlbWF0aWMpLlxuICAgICAqIEBwYXJhbSBtaW5CaXRyYXRlIC0gVGhlIG1pbmltdW0gYml0cmF0ZSB3ZSB3b3VsZCBsaWtlIFdlYlJUQyB0byBub3QgZmFsbCBiZWxvdy5cbiAgICAgKi9cbiAgICBzZW5kV2ViUlRDTWluQml0cmF0ZShtaW5CaXRyYXRlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBXZWJSVEMgTWluIEJpdHJhdGU9JHttaW5CaXRyYXRlfWApO1xuICAgICAgICBpZiAobWluQml0cmF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnV2ViUlRDLk1pbkJpdHJhdGUnOiBtaW5CaXRyYXRlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIHsgV2ViUlRDLk1heEJpdHJhdGU6IFNvbWVOdW1iZXIgfX0gY29tbWFuZCB0byBVRSB0byBzZXRcbiAgICAgKiB0aGUgbWluaW11bSBiaXRyYXRlIHRoYXQgd2UgYWxsb3cgV2ViUlRDIHRvIHVzZVxuICAgICAqIChub3RlIHNldHRpbmcgdGhpcyB0b28gbG93IGNvdWxkIHJlc3VsdCBpbiBibG9ja3kgdmlkZW8pLlxuICAgICAqIEBwYXJhbSBtaW5CaXRyYXRlIC0gVGhlIG1pbmltdW0gYml0cmF0ZSB3ZSB3b3VsZCBsaWtlIFdlYlJUQyB0byBub3QgZmFsbCBiZWxvdy5cbiAgICAgKi9cbiAgICBzZW5kV2ViUlRDTWF4Qml0cmF0ZShtYXhCaXRyYXRlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBXZWJSVEMgTWF4IEJpdHJhdGU9JHttYXhCaXRyYXRlfWApO1xuICAgICAgICBpZiAobWF4Qml0cmF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnV2ViUlRDLk1heEJpdHJhdGUnOiBtYXhCaXRyYXRlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIHsgV2ViUlRDLkZwczogU29tZU51bWJlciB9fSBVRSA1LjArXG4gICAgICogYW5kIHsgV2ViUlRDLk1heEZwcyB9IFVFIDQuMjcgY29tbWFuZCB0byBzZXRcbiAgICAgKiB0aGUgbWF4aW11bSBmcHMgd2Ugd291bGQgbGlrZSBXZWJSVEMgdG8gc3RyZWFtIGF0LlxuICAgICAqIEBwYXJhbSBmcHMgLSBUaGUgbWF4aW11bSBzdHJlYW0gZnBzLlxuICAgICAqL1xuICAgIHNlbmRXZWJSVENGcHMoZnBzKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBXZWJSVEMgRlBTPSR7ZnBzfWApO1xuICAgICAgICBpZiAoZnBzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7ICdXZWJSVEMuRnBzJzogZnBzIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIC8qIFRPRE86IFJlbW92ZSB3aGVuIFVFIDQuMjcgdW5zdXBwb3J0ZWQuICovXG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyAnV2ViUlRDLk1heEZwcyc6IGZwcyB9KVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgdGhlIFVJIERlc2NyaXB0b3IgYHN0YXQgZnBzYCB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZW5kU2hvd0ZwcygpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0gICBTZW5kaW5nIHNob3cgc3RhdCB0byBVRSAgIC0tLS0nKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdDb21tYW5kJykoW0pTT04uc3RyaW5naWZ5KHsgJ3N0YXQuZnBzJzogJycgfSldKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBJZnJhbWUgcmVxdWVzdCB0byB0aGUgc3RyZWFtZXJcbiAgICAgKi9cbiAgICBzZW5kSWZyYW1lUmVxdWVzdCgpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0gICBTZW5kaW5nIFJlcXVlc3QgZm9yIGFuIElGcmFtZSAgLS0tLScpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0lGcmFtZVJlcXVlc3QnKSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgVUlJbnRlcmFjdGlvbiBtZXNzYWdlXG4gICAgICovXG4gICAgZW1pdFVJSW50ZXJhY3Rpb24oZGVzY3JpcHRvcikge1xuICAgICAgICBMb2dnZXIuSW5mbygnLS0tLSAgIFNlbmRpbmcgY3VzdG9tIFVJSW50ZXJhY3Rpb24gbWVzc2FnZSAgIC0tLS0nKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdVSUludGVyYWN0aW9uJykoW0pTT04uc3RyaW5naWZ5KGRlc2NyaXB0b3IpXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBDb21tYW5kIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBlbWl0Q29tbWFuZChkZXNjcmlwdG9yKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCctLS0tICAgU2VuZGluZyBjdXN0b20gQ29tbWFuZCBtZXNzYWdlICAgLS0tLScpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbSlNPTi5zdHJpbmdpZnkoZGVzY3JpcHRvcildKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIGNvbnNvbGUgY29tbWFuZCBtZXNzYWdlXG4gICAgICovXG4gICAgZW1pdENvbnNvbGVDb21tYW5kKGNvbW1hbmQpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0gICBTZW5kaW5nIGN1c3RvbSBDb21tYW5kOkNvbnNvbGVDb21tYW5kIG1lc3NhZ2UgICAtLS0tJyk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBDb25zb2xlQ29tbWFuZDogY29tbWFuZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byB0aGUgVUUgSW5zdGFuY2UgdG8gaGF2ZSBvd25lcnNoaXAgb2YgUXVhbGl0eVxuICAgICAqL1xuICAgIHNlbmRSZXF1ZXN0UXVhbGl0eUNvbnRyb2xPd25lcnNoaXAoKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCctLS0tICAgU2VuZGluZyBSZXF1ZXN0IHRvIENvbnRyb2wgUXVhbGl0eSAgLS0tLScpO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXIuU2VuZFJlcXVlc3RRdWFsaXR5Q29udHJvbCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgYFRleHRCb3hFbnRyeWAgbWVzc2FnZSBiYWNrIHRvIFVFLlxuICAgICAqIEBwYXJhbSBjb250ZW50cyBUaGUgbmV3IGNvbnRlbnRzIG9mIHRoZSBVRSBzaWRlIHRleHQgYm94LlxuICAgICAqL1xuICAgIHNlbmRUZXh0Ym94RW50cnkoY29udGVudHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBMb2dnZXIuSW5mbygnLS0tLSAgIFNlbmRpbmcgVGV4dGJveEVudHJ5IG1lc3NhZ2UgIC0tLS0nKTtcbiAgICAgICAgKF9hID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdUZXh0Ym94RW50cnknKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKFtjb250ZW50c10pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gYSBMYXRlbmN5IFRlc3QgUmVzdWx0IGFyZSByZWNlaXZlZCBmcm9tIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gTGF0ZW5jeSBUZXN0IFRpbWluZ3NcbiAgICAgKi9cbiAgICBoYW5kbGVMYXRlbmN5VGVzdFJlc3VsdChtZXNzYWdlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5sYXRlbmN5VGVzdCcpO1xuICAgICAgICBjb25zdCBsYXRlbmN5QXNTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZShtZXNzYWdlLnNsaWNlKDEpKTtcbiAgICAgICAgY29uc3QgbGF0ZW5jeVRlc3RSZXN1bHRzID0gbmV3IExhdGVuY3lUZXN0UmVzdWx0cygpO1xuICAgICAgICBPYmplY3QuYXNzaWduKGxhdGVuY3lUZXN0UmVzdWx0cywgSlNPTi5wYXJzZShsYXRlbmN5QXNTdHJpbmcpKTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLnByb2Nlc3NGaWVsZHMoKTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLnRlc3RTdGFydFRpbWVNcyA9IHRoaXMubGF0ZW5jeVN0YXJ0VGltZTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLmJyb3dzZXJSZWNlaXB0VGltZU1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLmxhdGVuY3lFeGNsdWRpbmdEZWNvZGUgPSB+fihsYXRlbmN5VGVzdFJlc3VsdHMuYnJvd3NlclJlY2VpcHRUaW1lTXMgLSBsYXRlbmN5VGVzdFJlc3VsdHMudGVzdFN0YXJ0VGltZU1zKTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLnRlc3REdXJhdGlvbiA9IH5+KGxhdGVuY3lUZXN0UmVzdWx0cy5UcmFuc21pc3Npb25UaW1lTXMgLSBsYXRlbmN5VGVzdFJlc3VsdHMuUmVjZWlwdFRpbWVNcyk7XG4gICAgICAgIGxhdGVuY3lUZXN0UmVzdWx0cy5uZXR3b3JrTGF0ZW5jeSA9IH5+KGxhdGVuY3lUZXN0UmVzdWx0cy5sYXRlbmN5RXhjbHVkaW5nRGVjb2RlIC0gbGF0ZW5jeVRlc3RSZXN1bHRzLnRlc3REdXJhdGlvbik7XG4gICAgICAgIGlmIChsYXRlbmN5VGVzdFJlc3VsdHMuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgJiYgbGF0ZW5jeVRlc3RSZXN1bHRzLmJyb3dzZXJSZWNlaXB0VGltZU1zKSB7XG4gICAgICAgICAgICBsYXRlbmN5VGVzdFJlc3VsdHMuZW5kVG9FbmRMYXRlbmN5ID0gfn4obGF0ZW5jeVRlc3RSZXN1bHRzLmZyYW1lRGlzcGxheURlbHRhVGltZU1zICtcbiAgICAgICAgICAgICAgICBsYXRlbmN5VGVzdFJlc3VsdHMubmV0d29ya0xhdGVuY3ksXG4gICAgICAgICAgICAgICAgK2xhdGVuY3lUZXN0UmVzdWx0cy5DYXB0dXJlVG9TZW5kTXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uTGF0ZW5jeVRlc3RSZXN1bHQobGF0ZW5jeVRlc3RSZXN1bHRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIGEgRGF0YSBDaGFubmVsIExhdGVuY3kgVGVzdCBSZXNwb25zZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gRGF0YSBDaGFubmVsIExhdGVuY3kgVGVzdCBSZXNwb25zZVxuICAgICAqL1xuICAgIGhhbmRsZURhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5kYXRhQ2hhbm5lbExhdGVuY3lSZXNwb25zZScpO1xuICAgICAgICBjb25zdCByZXNwb25zZUFzU3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCd1dGYtMTYnKS5kZWNvZGUobWVzc2FnZS5zbGljZSgxKSk7XG4gICAgICAgIGNvbnN0IGxhdGVuY3lUZXN0UmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlQXNTdHJpbmcpO1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbkRhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZShsYXRlbmN5VGVzdFJlc3BvbnNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBFbmNvZGVyIGFuZCBXZWIgUlRDIFNldHRpbmdzIGFyZSByZWNlaXZlZCBmcm9tIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gSW5pdGlhbCBFbmNvZGVyIGFuZCBXZWIgUlRDIFNldHRpbmdzXG4gICAgICovXG4gICAgaGFuZGxlSW5pdGlhbFNldHRpbmdzKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLkluaXRpYWxTZXR0aW5ncycpO1xuICAgICAgICBjb25zdCBwYXlsb2FkQXNTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZShtZXNzYWdlLnNsaWNlKDEpKTtcbiAgICAgICAgY29uc3QgcGFyc2VkSW5pdGlhbFNldHRpbmdzID0gSlNPTi5wYXJzZShwYXlsb2FkQXNTdHJpbmcpO1xuICAgICAgICBjb25zdCBpbml0aWFsU2V0dGluZ3MgPSBuZXcgSW5pdGlhbFNldHRpbmdzKCk7XG4gICAgICAgIGlmIChwYXJzZWRJbml0aWFsU2V0dGluZ3MuRW5jb2Rlcikge1xuICAgICAgICAgICAgaW5pdGlhbFNldHRpbmdzLkVuY29kZXJTZXR0aW5ncyA9IHBhcnNlZEluaXRpYWxTZXR0aW5ncy5FbmNvZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWRJbml0aWFsU2V0dGluZ3MuV2ViUlRDKSB7XG4gICAgICAgICAgICBpbml0aWFsU2V0dGluZ3MuV2ViUlRDU2V0dGluZ3MgPSBwYXJzZWRJbml0aWFsU2V0dGluZ3MuV2ViUlRDO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWRJbml0aWFsU2V0dGluZ3MuUGl4ZWxTdHJlYW1pbmcpIHtcbiAgICAgICAgICAgIGluaXRpYWxTZXR0aW5ncy5QaXhlbFN0cmVhbWluZ1NldHRpbmdzID0gcGFyc2VkSW5pdGlhbFNldHRpbmdzLlBpeGVsU3RyZWFtaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWRJbml0aWFsU2V0dGluZ3MuQ29uZmlnT3B0aW9ucyAmJlxuICAgICAgICAgICAgcGFyc2VkSW5pdGlhbFNldHRpbmdzLkNvbmZpZ09wdGlvbnMuRGVmYXVsdFRvSG92ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUsICEhcGFyc2VkSW5pdGlhbFNldHRpbmdzLkNvbmZpZ09wdGlvbnMuRGVmYXVsdFRvSG92ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxTZXR0aW5ncy51ZUNvbXBhdGlibGUoKTtcbiAgICAgICAgTG9nZ2VyLkluZm8ocGF5bG9hZEFzU3RyaW5nKTtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25Jbml0aWFsU2V0dGluZ3MoaW5pdGlhbFNldHRpbmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBRdWFudGl6YXRpb24gUGFyYW1ldGVyIGFyZSByZWNlaXZlZCBmcm9tIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gRW5jb2RlcnMgUXVhbnRpemF0aW9uIFBhcmFtZXRlclxuICAgICAqL1xuICAgIGhhbmRsZVZpZGVvRW5jb2RlckF2Z1FQKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLlZpZGVvRW5jb2RlckF2Z1FQJyk7XG4gICAgICAgIGNvbnN0IEF2Z1FQID0gTnVtYmVyKG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKG1lc3NhZ2Uuc2xpY2UoMSkpKTtcbiAgICAgICAgdGhpcy5zZXRWaWRlb0VuY29kZXJBdmdRUChBdmdRUCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBoYXMgYmVlbiBsb2FkZWQgd2l0aCBhIHNyY09iamVjdFxuICAgICAqL1xuICAgIGhhbmRsZVZpZGVvSW5pdGlhbGl6ZWQoKSB7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uVmlkZW9Jbml0aWFsaXplZCgpO1xuICAgICAgICAvLyBlaXRoZXIgYXV0b3BsYXkgdGhlIHZpZGVvIG9yIHNldCB1cCB0aGUgcGxheSBvdmVybGF5XG4gICAgICAgIHRoaXMuYXV0b1BsYXlWaWRlb09yU2V0VXBQbGF5T3ZlcmxheSgpO1xuICAgICAgICB0aGlzLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIudXBkYXRlVmlkZW9TdHJlYW1TaXplKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZsYWcgc2V0IGlmIHRoZSB1c2VyIGhhcyBRdWFsaXR5IE93bmVyc2hpcFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gRG9lcyB0aGUgY3VycmVudCBjbGllbnQgaGF2ZSBRdWFsaXR5IE93bmVyc2hpcFxuICAgICAqL1xuICAgIG9uUXVhbGl0eUNvbnRyb2xPd25lcnNoaXAobWVzc2FnZSkge1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZSk7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5RdWFsaXR5Q29udHJvbE93bmVyc2hpcCcpO1xuICAgICAgICB0aGlzLmlzUXVhbGl0eUNvbnRyb2xsZXIgPSBuZXcgQm9vbGVhbih2aWV3WzFdKS52YWx1ZU9mKCk7XG4gICAgICAgIExvZ2dlci5JbmZvKGBSZWNlaXZlZCBxdWFsaXR5IGNvbnRyb2xsZXIgbWVzc2FnZSwgd2lsbCBjb250cm9sIHF1YWxpdHk6ICR7dGhpcy5pc1F1YWxpdHlDb250cm9sbGVyfWApO1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vblF1YWxpdHlDb250cm9sT3duZXJzaGlwKHRoaXMuaXNRdWFsaXR5Q29udHJvbGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgQWdncmVnYXRlZCBzdGF0cyBhcmUgQ29sbGVjdGVkXG4gICAgICogQHBhcmFtIHN0YXRzIC0gQWdncmVnYXRlZCBTdGF0c1xuICAgICAqL1xuICAgIGhhbmRsZVZpZGVvU3RhdHMoc3RhdHMpIHtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25WaWRlb1N0YXRzKHN0YXRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gUmVzaXplIHRoZSBWaWRlbyBQbGF5ZXIgZWxlbWVudFxuICAgICAqL1xuICAgIHJlc2l6ZVBsYXllclN0eWxlKCkge1xuICAgICAgICB0aGlzLnZpZGVvUGxheWVyLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgfVxuICAgIHNldFByZWZlcnJlZENvZGVjKGNvZGVjKSB7XG4gICAgICAgIHRoaXMucHJlZmVycmVkQ29kZWMgPSBjb2RlYztcbiAgICAgICAgaWYgKHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5wcmVmZXJyZWRDb2RlYyA9IGNvZGVjO1xuICAgICAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIudXBkYXRlQ29kZWNTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRWaWRlb0VuY29kZXJBdmdRUChhdmdRUCkge1xuICAgICAgICB0aGlzLnZpZGVvQXZnUXAgPSBhdmdRUDtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25WaWRlb0VuY29kZXJBdmdRUCh0aGlzLnZpZGVvQXZnUXApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBlbmFibGVzL2Rpc2FibGVzIGtleWJvYXJkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIHNldEtleWJvYXJkSW5wdXRFbmFibGVkKGlzRW5hYmxlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMua2V5Ym9hcmRDb250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudW5yZWdpc3RlcigpO1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkQ29udHJvbGxlciA9IHRoaXMuaW5wdXRDbGFzc2VzRmFjdG9yeS5yZWdpc3RlcktleUJvYXJkKHRoaXMuY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBlbmFibGVzL2Rpc2FibGVzIG1vdXNlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIHNldE1vdXNlSW5wdXRFbmFibGVkKGlzRW5hYmxlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMubW91c2VDb250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudW5yZWdpc3RlcigpO1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBtb3VzZU1vZGUgPSB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkhvdmVyaW5nTW91c2VNb2RlKVxuICAgICAgICAgICAgICAgID8gQ29udHJvbFNjaGVtZVR5cGUuSG92ZXJpbmdNb3VzZVxuICAgICAgICAgICAgICAgIDogQ29udHJvbFNjaGVtZVR5cGUuTG9ja2VkTW91c2U7XG4gICAgICAgICAgICB0aGlzLm1vdXNlQ29udHJvbGxlciA9IHRoaXMuaW5wdXRDbGFzc2VzRmFjdG9yeS5yZWdpc3Rlck1vdXNlKG1vdXNlTW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogZW5hYmxlcy9kaXNhYmxlcyB0b3VjaCBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBzZXRUb3VjaElucHV0RW5hYmxlZChpc0VuYWJsZWQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnRvdWNoQ29udHJvbGxlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnVucmVnaXN0ZXIoKTtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy50b3VjaENvbnRyb2xsZXIgPSB0aGlzLmlucHV0Q2xhc3Nlc0ZhY3RvcnkucmVnaXN0ZXJUb3VjaCh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkZha2VNb3VzZVdpdGhUb3VjaGVzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogZW5hYmxlcy9kaXNhYmxlcyBnYW1lIHBhZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgKi9cbiAgICBzZXRHYW1lUGFkSW5wdXRFbmFibGVkKGlzRW5hYmxlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuZ2FtZVBhZENvbnRyb2xsZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS51bnJlZ2lzdGVyKCk7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2FtZVBhZENvbnRyb2xsZXIgPSB0aGlzLmlucHV0Q2xhc3Nlc0ZhY3RvcnkucmVnaXN0ZXJHYW1lUGFkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVnaXN0ZXJEYXRhQ2hhbm5lbEV2ZW50RW1pdHRlcnMoZGF0YUNoYW5uZWwpIHtcbiAgICAgICAgZGF0YUNoYW5uZWwub25PcGVuID0gKGxhYmVsLCBldmVudCkgPT4gdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBEYXRhQ2hhbm5lbE9wZW5FdmVudCh7IGxhYmVsLCBldmVudCB9KSk7XG4gICAgICAgIGRhdGFDaGFubmVsLm9uQ2xvc2UgPSAobGFiZWwsIGV2ZW50KSA9PiB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IERhdGFDaGFubmVsQ2xvc2VFdmVudCh7IGxhYmVsLCBldmVudCB9KSk7XG4gICAgICAgIGRhdGFDaGFubmVsLm9uRXJyb3IgPSAobGFiZWwsIGV2ZW50KSA9PiB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IERhdGFDaGFubmVsRXJyb3JFdmVudCh7IGxhYmVsLCBldmVudCB9KSk7XG4gICAgfVxuICAgIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIobmFtZSwgZGlyZWN0aW9uLCBoYW5kbGVyKSB7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyICYmIHR5cGVvZiBoYW5kbGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoYFVuYWJsZSB0byByZWdpc3RlciBoYW5kbGVyIGZvciAke25hbWV9IGFzIG5vIGhhbmRsZXIgd2FzIHBhc3NlZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihkaXJlY3Rpb24sIG5hbWUsIChkYXRhKSA9PiB0eXBlb2YgaGFuZGxlciA9PT0gJ3VuZGVmaW5lZCcgJiYgZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXJcbiAgICAgICAgICAgID8gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKG5hbWUsIGRhdGEpXG4gICAgICAgICAgICA6IGhhbmRsZXIoZGF0YSkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYlJ0Y1BsYXllckNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IFhSR2FtZXBhZENvbnRyb2xsZXIgfSBmcm9tICcuLi9JbnB1dHMvWFJHYW1lcGFkQ29udHJvbGxlcic7XG5pbXBvcnQgeyBYckZyYW1lRXZlbnQgfSBmcm9tICcuLi9VdGlsL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBGbGFncyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuZXhwb3J0IGNsYXNzIFdlYlhSQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Iod2ViUnRjUGxheWVyQ29udHJvbGxlcikge1xuICAgICAgICB0aGlzLnhyVmlld2VyUG9zZSA9IG51bGw7XG4gICAgICAgIC8vIFVzZWQgZm9yIGNvbXBhcmlzb25zIHRvIGVuc3VyZSB0d28gbnVtYmVycyBhcmUgY2xvc2UgZW5vdWdoLlxuICAgICAgICB0aGlzLkVQU0lMT04gPSAwLjAwMDAwMDE7XG4gICAgICAgIHRoaXMudmlkZW9UZXh0dXJlID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcmV2VmlkZW9XaWR0aCA9IDA7XG4gICAgICAgIHRoaXMucHJldlZpZGVvSGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5sZWZ0VmlldyA9IG51bGw7XG4gICAgICAgIHRoaXMucmlnaHRWaWV3ID0gbnVsbDtcbiAgICAgICAgLy8gU3RvcmUgdGhlIEhNRCBkYXRhIHdlIGhhdmUgbGFzdCBzZW50IChub3QgYWxsIG9mIGl0IGlzIG5lZWRlZCBldmVyeSBmcmFtZSB1bmxlc3MgaXQgY2hhbmdlcylcbiAgICAgICAgdGhpcy5sYXN0U2VudExlZnRFeWVQcm9qID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0U2VudFJpZ2h0RXllUHJvaiA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZUxlZnRFeWVQb3MgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RTZW50UmVsYXRpdmVSaWdodEV5ZVBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMueHJTZXNzaW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy53ZWJSdGNDb250cm9sbGVyID0gd2ViUnRjUGxheWVyQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy54ckdhbWVwYWRDb250cm9sbGVyID0gbmV3IFhSR2FtZXBhZENvbnRyb2xsZXIodGhpcy53ZWJSdGNDb250cm9sbGVyLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5vblNlc3Npb25FbmRlZCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgICAgICB0aGlzLm9uU2Vzc2lvblN0YXJ0ZWQgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICAgICAgdGhpcy5vbkZyYW1lID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgfVxuICAgIHhyQ2xpY2tlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnhyU2Vzc2lvbikge1xuICAgICAgICAgICAgaWYgKCFuYXZpZ2F0b3IueHIpIHtcbiAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoJ1RoaXMgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFhSLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5hdmlnYXRvci54clxuICAgICAgICAgICAgICAgIC8qIFJlcXVlc3QgaW1tZXJzaXZlLXZyIHNlc3Npb24gd2l0aG91dCBhbnkgb3B0aW9uYWwgZmVhdHVyZXMuICovXG4gICAgICAgICAgICAgICAgLnJlcXVlc3RTZXNzaW9uKCdpbW1lcnNpdmUtdnInLCB7IG9wdGlvbmFsRmVhdHVyZXM6IFtdIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHNlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uWHJTZXNzaW9uU3RhcnRlZChzZXNzaW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy54clNlc3Npb24uZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25YclNlc3Npb25FbmRlZCgpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ1hSIFNlc3Npb24gZW5kZWQnKTtcbiAgICAgICAgdGhpcy54clNlc3Npb24gPSBudWxsO1xuICAgICAgICB0aGlzLm9uU2Vzc2lvbkVuZGVkLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd4clNlc3Npb25FbmRlZCcpKTtcbiAgICB9XG4gICAgaW5pdEdMKCkge1xuICAgICAgICBpZiAodGhpcy5nbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB0aGlzLmdsID0gY2FudmFzLmdldENvbnRleHQoJ3dlYmdsMicsIHtcbiAgICAgICAgICAgIHhyQ29tcGF0aWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gU2V0IG91ciBjbGVhciBjb2xvclxuICAgICAgICB0aGlzLmdsLmNsZWFyQ29sb3IoMC4wLCAwLjAsIDAuMCwgMSk7XG4gICAgfVxuICAgIGluaXRTaGFkZXJzKCkge1xuICAgICAgICAvLyBzaGFkZXIgc291cmNlIGNvZGVcbiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyU291cmNlID0gYFxuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uO1xuICAgICAgICBhdHRyaWJ1dGUgdmVjMiBhX3RleENvb3JkO1xuXG4gICAgICAgIC8vIHZhcnlpbmdzXG4gICAgICAgIHZhcnlpbmcgdmVjMiB2X3RleENvb3JkO1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGFfcG9zaXRpb24ueCwgYV9wb3NpdGlvbi55LCAwLCAxKTtcbiAgICAgICAgICAgLy8gcGFzcyB0aGUgdGV4Q29vcmQgdG8gdGhlIGZyYWdtZW50IHNoYWRlclxuICAgICAgICAgICAvLyBUaGUgR1BVIHdpbGwgaW50ZXJwb2xhdGUgdGhpcyB2YWx1ZSBiZXR3ZWVuIHBvaW50cy5cbiAgICAgICAgICAgdl90ZXhDb29yZCA9IGFfdGV4Q29vcmQ7XG4gICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXJTb3VyY2UgPSBgXG4gICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG4gICAgICAgIC8vIG91ciB0ZXh0dXJlXG4gICAgICAgIHVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7XG5cbiAgICAgICAgLy8gdGhlIHRleENvb3JkcyBwYXNzZWQgaW4gZnJvbSB0aGUgdmVydGV4IHNoYWRlci5cbiAgICAgICAgdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodV9pbWFnZSwgdl90ZXhDb29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgLy8gc2V0dXAgdmVydGV4IHNoYWRlclxuICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSB0aGlzLmdsLmNyZWF0ZVNoYWRlcih0aGlzLmdsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICB0aGlzLmdsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNoYWRlclNvdXJjZSk7XG4gICAgICAgIHRoaXMuZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICAvLyBzZXR1cCBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmdsLmNyZWF0ZVNoYWRlcih0aGlzLmdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgICAgIHRoaXMuZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNoYWRlclNvdXJjZSk7XG4gICAgICAgIHRoaXMuZ2wuY29tcGlsZVNoYWRlcihmcmFnbWVudFNoYWRlcik7XG4gICAgICAgIC8vIHNldHVwIEdMU0wgcHJvZ3JhbVxuICAgICAgICBjb25zdCBzaGFkZXJQcm9ncmFtID0gdGhpcy5nbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHNoYWRlclByb2dyYW0sIHZlcnRleFNoYWRlcik7XG4gICAgICAgIHRoaXMuZ2wuYXR0YWNoU2hhZGVyKHNoYWRlclByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgdGhpcy5nbC5saW5rUHJvZ3JhbShzaGFkZXJQcm9ncmFtKTtcbiAgICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHNoYWRlclByb2dyYW0pO1xuICAgICAgICAvLyBsb29rIHVwIHdoZXJlIHZlcnRleCBkYXRhIG5lZWRzIHRvIGdvXG4gICAgICAgIHRoaXMucG9zaXRpb25Mb2NhdGlvbiA9IHRoaXMuZ2wuZ2V0QXR0cmliTG9jYXRpb24oc2hhZGVyUHJvZ3JhbSwgJ2FfcG9zaXRpb24nKTtcbiAgICAgICAgdGhpcy50ZXhjb29yZExvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbihzaGFkZXJQcm9ncmFtLCAnYV90ZXhDb29yZCcpO1xuICAgIH1cbiAgICB1cGRhdGVWaWRlb1RleHR1cmUoKSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1RleHR1cmUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBvdXIgdGV4dHVyZSB0aGF0IHdlIHVzZSBpbiBvdXIgc2hhZGVyXG4gICAgICAgICAgICAvLyBhbmQgYmluZCBpdCBvbmNlIGJlY2F1c2Ugd2UgbmV2ZXIgdXNlIGFueSBvdGhlciB0ZXh0dXJlLlxuICAgICAgICAgICAgdGhpcy52aWRlb1RleHR1cmUgPSB0aGlzLmdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLnZpZGVvVGV4dHVyZSk7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHBhcmFtZXRlcnMgc28gd2UgY2FuIHJlbmRlciBhbnkgc2l6ZSBpbWFnZS5cbiAgICAgICAgICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9XUkFQX1MsIHRoaXMuZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICB0aGlzLmdsLnRleFBhcmFtZXRlcmkodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLmdsLlRFWFRVUkVfV1JBUF9ULCB0aGlzLmdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy5nbC5URVhUVVJFX01JTl9GSUxURVIsIHRoaXMuZ2wuTElORUFSKTtcbiAgICAgICAgICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCB0aGlzLmdsLkxJTkVBUik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmlkZW9IZWlnaHQgPSB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkudmlkZW9IZWlnaHQ7XG4gICAgICAgIGNvbnN0IHZpZGVvV2lkdGggPSB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkudmlkZW9XaWR0aDtcbiAgICAgICAgaWYgKHRoaXMucHJldlZpZGVvSGVpZ2h0ICE9IHZpZGVvSGVpZ2h0IHx8IHRoaXMucHJldlZpZGVvV2lkdGggIT0gdmlkZW9XaWR0aCkge1xuICAgICAgICAgICAgLy8gRG8gZnVsbCB1cGRhdGUgb2YgdGV4dHVyZSBpZiBkaW1lbnNpb25zIGRvIG5vdCBtYXRjaFxuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMud2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBkaW1lbnNpb25zIG1hdGNoIGp1c3QgdXBkYXRlIHRoZSBzdWIgcmVnaW9uXG4gICAgICAgICAgICB0aGlzLmdsLnRleFN1YkltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCAwLCAwLCB2aWRlb1dpZHRoLCB2aWRlb0hlaWdodCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlVOU0lHTkVEX0JZVEUsIHRoaXMud2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHByZXYgdmlkZW8gd2lkdGgvaGVpZ2h0XG4gICAgICAgIHRoaXMucHJldlZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7XG4gICAgICAgIHRoaXMucHJldlZpZGVvV2lkdGggPSB2aWRlb1dpZHRoO1xuICAgIH1cbiAgICBpbml0QnVmZmVycygpIHtcbiAgICAgICAgLy8gQ3JlYXRlIG91dCBwb3NpdGlvbiBidWZmZXIgYW5kIGl0cyB2ZXJ0ZXggc2hhZGVyIGF0dHJpYnV0ZVxuICAgICAgICB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBidWZmZXIgdG8gcHV0IHRoZSB0aGUgdmVydGljZXMgb2YgdGhlIHBsYW5lIHdlIHdpbGwgZHJhdyB0aGUgdmlkZW8gc3RyZWFtIG9udG9cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25CdWZmZXIgPSB0aGlzLmdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgLy8gQmluZCB0aGUgcG9zaXRpb24gYnVmZmVyXG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMucG9zaXRpb25CdWZmZXIpO1xuICAgICAgICAgICAgLy8gRW5hYmxlIGBwb3NpdGlvbkxvY2F0aW9uYCB0byBiZSB1c2VkIGFzIHZlcnRleCBzaGFkZXIgYXR0cmlidXRlXG4gICAgICAgICAgICB0aGlzLmdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHRoaXMucG9zaXRpb25Mb2NhdGlvbik7XG4gICAgICAgICAgICAvLyBOb3RlOiBwb3NpdGlvbnMgYXJlIHBhc3NlZCBpbiBjbGlwLXNwYWNlIGNvb3JkaW5hdGVzIFstMS4uMV0gc28gbm8gbmVlZCB0byBjb252ZXJ0IGluLXNoYWRlclxuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5BUlJBWV9CVUZGRVIsIG5ldyBGbG9hdDMyQXJyYXkoW1xuICAgICAgICAgICAgICAgIC0xLjAsIDEuMCxcbiAgICAgICAgICAgICAgICAxLjAsIDEuMCxcbiAgICAgICAgICAgICAgICAtMS4wLCAtMS4wLFxuICAgICAgICAgICAgICAgIC0xLjAsIC0xLjAsXG4gICAgICAgICAgICAgICAgMS4wLCAxLjAsXG4gICAgICAgICAgICAgICAgMS4wLCAtMS4wXG4gICAgICAgICAgICBdKSwgdGhpcy5nbC5TVEFUSUNfRFJBVyk7XG4gICAgICAgICAgICAvLyBUZWxsIHBvc2l0aW9uIGF0dHJpYnV0ZSBvZiB0aGUgdmVydGV4IHNoYWRlciBob3cgdG8gZ2V0IGRhdGEgb3V0IG9mIHRoZSBib3VuZCBidWZmZXIgKHRoZSBwb3NpdGlvbkJ1ZmZlcilcbiAgICAgICAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnBvc2l0aW9uTG9jYXRpb24sIDIgLypzaXplKi8sIHRoaXMuZ2wuRkxPQVQgLyp0eXBlKi8sIGZhbHNlIC8qbm9ybWFsaXplKi8sIDAgLypzdHJpZGUqLywgMCAvKm9mZnNldCovKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgb3VyIHRleHR1cmUgY29vcmRpbmF0ZSBidWZmZXJzIGZvciBhY2Nlc3Npbmcgb3VyIHRleHR1cmVcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy50ZXhjb29yZEJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgICAgICAvLyBCaW5kIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGUgYnVmZmVyXG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5BUlJBWV9CVUZGRVIsIHRoaXMudGV4Y29vcmRCdWZmZXIpO1xuICAgICAgICAgICAgLy8gRW5hYmxlIGB0ZXhjb29yZExvY2F0aW9uYCB0byBiZSB1c2VkIGFzIGEgdmVydGV4IHNoYWRlciBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHRoaXMuZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy50ZXhjb29yZExvY2F0aW9uKTtcbiAgICAgICAgICAgIC8vIFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzIHRvIGFwcGx5IGZvciByZWN0YW5nbGUgd2UgYXJlIGRyYXdpbmdcbiAgICAgICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjAsIDEuMCwgMC4wLCAxLjAsIDEuMCwgMC4wLCAxLjAsIDEuMF0pLCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcbiAgICAgICAgICAgIC8vIFRlbGwgdGV4dHVyZSBjb29yZGluYXRlIGF0dHJpYnV0ZSBvZiB0aGUgdmVydGV4IHNoYWRlciBob3cgdG8gZ2V0IGRhdGEgb3V0IG9mIHRoZSBib3VuZCBidWZmZXIgKHRoZSB0ZXhjb29yZEJ1ZmZlcilcbiAgICAgICAgICAgIHRoaXMuZ2wudmVydGV4QXR0cmliUG9pbnRlcih0aGlzLnRleGNvb3JkTG9jYXRpb24sIDIgLypzaXplKi8sIHRoaXMuZ2wuRkxPQVQgLyp0eXBlKi8sIGZhbHNlIC8qbm9ybWFsaXplKi8sIDAgLypzdHJpZGUqLywgMCAvKm9mZnNldCovKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblhyU2Vzc2lvblN0YXJ0ZWQoc2Vzc2lvbikge1xuICAgICAgICBMb2dnZXIuSW5mbygnWFIgU2Vzc2lvbiBzdGFydGVkJyk7XG4gICAgICAgIHRoaXMueHJTZXNzaW9uID0gc2Vzc2lvbjtcbiAgICAgICAgdGhpcy54clNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblhyU2Vzc2lvbkVuZGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJbml0aWFsaXphdGlvblxuICAgICAgICB0aGlzLmluaXRHTCgpO1xuICAgICAgICB0aGlzLmluaXRTaGFkZXJzKCk7XG4gICAgICAgIHRoaXMuaW5pdEJ1ZmZlcnMoKTtcbiAgICAgICAgc2Vzc2lvbi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoJ2xvY2FsJykudGhlbigocmVmU3BhY2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMueHJSZWZTcGFjZSA9IHJlZlNwYWNlO1xuICAgICAgICAgICAgLy8gU2V0IHVwIG91ciBiYXNlIGxheWVyIChpLmUuIGEgcHJvamVjdGlvbiBsYXllciB0aGF0IGZpbGxzIHRoZSBlbnRpcmUgWFIgdmlld3BvcnQpLlxuICAgICAgICAgICAgdGhpcy54clNlc3Npb24udXBkYXRlUmVuZGVyU3RhdGUoe1xuICAgICAgICAgICAgICAgIGJhc2VMYXllcjogbmV3IFhSV2ViR0xMYXllcih0aGlzLnhyU2Vzc2lvbiwgdGhpcy5nbClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRhcmdldCBmcmFtZXJhdGUgdG8gOTAgZnBzIGlmIDkwIGZwcyBpcyBzdXBwb3J0ZWQgaW4gdGhpcyBYUiBkZXZpY2VcbiAgICAgICAgICAgIGlmICh0aGlzLnhyU2Vzc2lvbi5zdXBwb3J0ZWRGcmFtZVJhdGVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmcmFtZVJhdGUgb2YgdGhpcy54clNlc3Npb24uc3VwcG9ydGVkRnJhbWVSYXRlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVSYXRlID09IDkwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnVwZGF0ZVRhcmdldEZyYW1lUmF0ZSg5MCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCaW5kaW5nIHRvIGVhY2ggbmV3IGZyYW1lIHRvIGdldCBsYXRlc3QgWFIgdXBkYXRlc1xuICAgICAgICAgICAgdGhpcy54clNlc3Npb24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMub25YckZyYW1lLmJpbmQodGhpcykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vblNlc3Npb25TdGFydGVkLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd4clNlc3Npb25TdGFydGVkJykpO1xuICAgIH1cbiAgICBhcmVBcnJheXNFcXVhbChhLCBiKSB7XG4gICAgICAgIHJldHVybiAoYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKGVsZW1lbnQsIGluZGV4KSA9PiBNYXRoLmFicyhlbGVtZW50IC0gYltpbmRleF0pIDw9IHRoaXMuRVBTSUxPTikpO1xuICAgIH1cbiAgICBhcmVQb2ludHNFcXVhbChhLCBiKSB7XG4gICAgICAgIHJldHVybiAoTWF0aC5hYnMoYS54IC0gYi54KSA+PSB0aGlzLkVQU0lMT04gJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEueSAtIGIueSkgPj0gdGhpcy5FUFNJTE9OICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhLnogLSBiLnopID49IHRoaXMuRVBTSUxPTik7XG4gICAgfVxuICAgIHNlbmRYUkRhdGFUb1VFKCkge1xuICAgICAgICBpZiAodGhpcy5sZWZ0VmlldyA9PSBudWxsIHx8IHRoaXMucmlnaHRWaWV3ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBzZWxlY3RpdmVseSBzZW5kIGVpdGhlciB0aGUgYFhSRXllVmlld3NgIG9yIGBYUkhNRFRyYW5zZm9ybWBcbiAgICAgICAgLy8gbWVzc2FnZXMgb3ZlciB0aGUgZGF0YWNoYW5uZWwuIFRoZSByZWFzb24gZm9yIHRoaXMgc2VsZWN0aXZlIHNlbmRpbmcgaXMgdGhhdFxuICAgICAgICAvLyB0aGUgYFhSRXllVmlld3NgIGlzIGEgbXVjaCBsYXJnZXIgbWVzc2FnZSBhbmQgY2hhbmdlcyBpbmZyZXF1ZW50bHkgKGUuZy4gb25seSB3aGVuIHVzZXIgY2hhbmdlcyBoZWFkc2V0IElQRCkuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgd2Ugb25seSBuZWVkIHRvIHNlbmQgaXQgb25jZSBvbiBzdGFydHVwIGFuZCB0aGVuIGFueSB0aW1lIGl0IGNoYW5nZXMuXG4gICAgICAgIC8vIFRoZSByZXN0IG9mIHRoZSB0aW1lIHdlIGNhbiBzZW5kIHRoZSBgWFJITURUcmFuc2Zvcm1gIG1lc3NhZ2UuXG4gICAgICAgIGxldCBzaG91bGRTZW5kRXllVmlld3MgPSB0aGlzLmxhc3RTZW50TGVmdEV5ZVByb2ogPT0gbnVsbCB8fFxuICAgICAgICAgICAgdGhpcy5sYXN0U2VudFJpZ2h0RXllUHJvaiA9PSBudWxsIHx8XG4gICAgICAgICAgICB0aGlzLmxhc3RTZW50UmVsYXRpdmVMZWZ0RXllUG9zID09IG51bGwgfHxcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZVJpZ2h0RXllUG9zID09IG51bGw7XG4gICAgICAgIGNvbnN0IGxlZnRFeWVUcmFucyA9IHRoaXMubGVmdFZpZXcudHJhbnNmb3JtLm1hdHJpeDtcbiAgICAgICAgY29uc3QgbGVmdEV5ZVByb2ogPSB0aGlzLmxlZnRWaWV3LnByb2plY3Rpb25NYXRyaXg7XG4gICAgICAgIGNvbnN0IHJpZ2h0RXllVHJhbnMgPSB0aGlzLnJpZ2h0Vmlldy50cmFuc2Zvcm0ubWF0cml4O1xuICAgICAgICBjb25zdCByaWdodEV5ZVByb2ogPSB0aGlzLnJpZ2h0Vmlldy5wcm9qZWN0aW9uTWF0cml4O1xuICAgICAgICBjb25zdCBobWRUcmFucyA9IHRoaXMueHJWaWV3ZXJQb3NlLnRyYW5zZm9ybS5tYXRyaXg7XG4gICAgICAgIC8vIENoZWNrIGlmIHByb2plY3Rpb24gbWF0cmljZXMgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIGlmICghc2hvdWxkU2VuZEV5ZVZpZXdzICYmIHRoaXMubGFzdFNlbnRMZWZ0RXllUHJvaiAhPSBudWxsICYmIHRoaXMubGFzdFNlbnRSaWdodEV5ZVByb2ogIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbGVmdEV5ZVByb2pVbmNoYW5nZWQgPSB0aGlzLmFyZUFycmF5c0VxdWFsKGxlZnRFeWVQcm9qLCB0aGlzLmxhc3RTZW50TGVmdEV5ZVByb2opO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRFeWVQcm9qVW5jaGFuZ2VkID0gdGhpcy5hcmVBcnJheXNFcXVhbChyaWdodEV5ZVByb2osIHRoaXMubGFzdFNlbnRSaWdodEV5ZVByb2opO1xuICAgICAgICAgICAgc2hvdWxkU2VuZEV5ZVZpZXdzID0gbGVmdEV5ZVByb2pVbmNoYW5nZWQgPT0gZmFsc2UgfHwgcmlnaHRFeWVQcm9qVW5jaGFuZ2VkID09IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlZnRFeWVSZWxhdGl2ZVBvcyA9IG5ldyBET01Qb2ludFJlYWRPbmx5KHRoaXMubGVmdFZpZXcudHJhbnNmb3JtLnBvc2l0aW9uLnggLSB0aGlzLnhyVmlld2VyUG9zZS50cmFuc2Zvcm0ucG9zaXRpb24ueCwgdGhpcy5sZWZ0Vmlldy50cmFuc2Zvcm0ucG9zaXRpb24ueSAtIHRoaXMueHJWaWV3ZXJQb3NlLnRyYW5zZm9ybS5wb3NpdGlvbi55LCB0aGlzLmxlZnRWaWV3LnRyYW5zZm9ybS5wb3NpdGlvbi56IC0gdGhpcy54clZpZXdlclBvc2UudHJhbnNmb3JtLnBvc2l0aW9uLnosIDEuMCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0RXllUmVsYXRpdmVQb3MgPSBuZXcgRE9NUG9pbnRSZWFkT25seSh0aGlzLmxlZnRWaWV3LnRyYW5zZm9ybS5wb3NpdGlvbi54IC0gdGhpcy54clZpZXdlclBvc2UudHJhbnNmb3JtLnBvc2l0aW9uLngsIHRoaXMubGVmdFZpZXcudHJhbnNmb3JtLnBvc2l0aW9uLnkgLSB0aGlzLnhyVmlld2VyUG9zZS50cmFuc2Zvcm0ucG9zaXRpb24ueSwgdGhpcy5sZWZ0Vmlldy50cmFuc2Zvcm0ucG9zaXRpb24ueiAtIHRoaXMueHJWaWV3ZXJQb3NlLnRyYW5zZm9ybS5wb3NpdGlvbi56LCAxLjApO1xuICAgICAgICAvLyBDaGVjayBpZiByZWxhdGl2ZSBleWUgcG9zIGhhcyBjaGFuZ2VkIChlLmcgSVBEIGNoYW5nZWQpXG4gICAgICAgIGlmICghc2hvdWxkU2VuZEV5ZVZpZXdzICYmXG4gICAgICAgICAgICB0aGlzLmxhc3RTZW50UmVsYXRpdmVMZWZ0RXllUG9zICE9IG51bGwgJiZcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZVJpZ2h0RXllUG9zICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRFeWVQb3NVbmNoYW5nZWQgPSB0aGlzLmFyZVBvaW50c0VxdWFsKGxlZnRFeWVSZWxhdGl2ZVBvcywgdGhpcy5sYXN0U2VudFJlbGF0aXZlTGVmdEV5ZVBvcyk7XG4gICAgICAgICAgICBjb25zdCByaWdodEV5ZVBvc1VuY2hhbmdlZCA9IHRoaXMuYXJlUG9pbnRzRXF1YWwocmlnaHRFeWVSZWxhdGl2ZVBvcywgdGhpcy5sYXN0U2VudFJlbGF0aXZlUmlnaHRFeWVQb3MpO1xuICAgICAgICAgICAgc2hvdWxkU2VuZEV5ZVZpZXdzID0gbGVmdEV5ZVBvc1VuY2hhbmdlZCA9PSBmYWxzZSB8fCByaWdodEV5ZVBvc1VuY2hhbmdlZCA9PSBmYWxzZTtcbiAgICAgICAgICAgIC8vIE5vdGU6IFdlIGFyZSBub3QgY2hlY2tpbmcgaWYgRXllVmlldyByb3RhdGlvbiBjaGFuZ2VzIChhcyBmYXIgYXMgSSBrbm93IG5vIEhNRCBzdXBwb3J0cyBjaGFuZ2luZyB0aGlzIHZhbHVlIGF0IHJ1bnRpbWUpLlxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRTZW5kRXllVmlld3MpIHtcbiAgICAgICAgICAgIC8vIHNlbmQgdHJhbnNmb3JtICg0eDQpIGFuZCBwcm9qZWN0aW9uIG1hdHJpeCAoNHg0KSBkYXRhIGZvciBlYWNoIGV5ZSAobGVmdCBmaXJzdCwgdGhlbiByaWdodClcbiAgICAgICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy53ZWJSdGNDb250cm9sbGVyLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSRXllVmlld3MnKShbXG4gICAgICAgICAgICAgICAgLy8gTGVmdCBleWUgNHg0IHRyYW5zZm9ybSBtYXRyaXhcbiAgICAgICAgICAgICAgICBsZWZ0RXllVHJhbnNbMF0sIGxlZnRFeWVUcmFuc1s0XSwgbGVmdEV5ZVRyYW5zWzhdLCBsZWZ0RXllVHJhbnNbMTJdLFxuICAgICAgICAgICAgICAgIGxlZnRFeWVUcmFuc1sxXSwgbGVmdEV5ZVRyYW5zWzVdLCBsZWZ0RXllVHJhbnNbOV0sIGxlZnRFeWVUcmFuc1sxM10sXG4gICAgICAgICAgICAgICAgbGVmdEV5ZVRyYW5zWzJdLCBsZWZ0RXllVHJhbnNbNl0sIGxlZnRFeWVUcmFuc1sxMF0sIGxlZnRFeWVUcmFuc1sxNF0sXG4gICAgICAgICAgICAgICAgbGVmdEV5ZVRyYW5zWzNdLCBsZWZ0RXllVHJhbnNbN10sIGxlZnRFeWVUcmFuc1sxMV0sIGxlZnRFeWVUcmFuc1sxNV0sXG4gICAgICAgICAgICAgICAgLy8gTGVmdCBleWUgNHg0IHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgICAgICAgICAgbGVmdEV5ZVByb2pbMF0sIGxlZnRFeWVQcm9qWzRdLCBsZWZ0RXllUHJvals4XSwgbGVmdEV5ZVByb2pbMTJdLFxuICAgICAgICAgICAgICAgIGxlZnRFeWVQcm9qWzFdLCBsZWZ0RXllUHJvals1XSwgbGVmdEV5ZVByb2pbOV0sIGxlZnRFeWVQcm9qWzEzXSxcbiAgICAgICAgICAgICAgICBsZWZ0RXllUHJvalsyXSwgbGVmdEV5ZVByb2pbNl0sIGxlZnRFeWVQcm9qWzEwXSwgbGVmdEV5ZVByb2pbMTRdLFxuICAgICAgICAgICAgICAgIGxlZnRFeWVQcm9qWzNdLCBsZWZ0RXllUHJvals3XSwgbGVmdEV5ZVByb2pbMTFdLCBsZWZ0RXllUHJvalsxNV0sXG4gICAgICAgICAgICAgICAgLy8gUmlnaHQgZXllIDR4NCB0cmFuc2Zvcm0gbWF0cml4XG4gICAgICAgICAgICAgICAgcmlnaHRFeWVUcmFuc1swXSwgcmlnaHRFeWVUcmFuc1s0XSwgcmlnaHRFeWVUcmFuc1s4XSwgcmlnaHRFeWVUcmFuc1sxMl0sXG4gICAgICAgICAgICAgICAgcmlnaHRFeWVUcmFuc1sxXSwgcmlnaHRFeWVUcmFuc1s1XSwgcmlnaHRFeWVUcmFuc1s5XSwgcmlnaHRFeWVUcmFuc1sxM10sXG4gICAgICAgICAgICAgICAgcmlnaHRFeWVUcmFuc1syXSwgcmlnaHRFeWVUcmFuc1s2XSwgcmlnaHRFeWVUcmFuc1sxMF0sIHJpZ2h0RXllVHJhbnNbMTRdLFxuICAgICAgICAgICAgICAgIHJpZ2h0RXllVHJhbnNbM10sIHJpZ2h0RXllVHJhbnNbN10sIHJpZ2h0RXllVHJhbnNbMTFdLCByaWdodEV5ZVRyYW5zWzE1XSxcbiAgICAgICAgICAgICAgICAvLyByaWdodCBleWUgNHg0IHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgICAgICAgICAgcmlnaHRFeWVQcm9qWzBdLCByaWdodEV5ZVByb2pbNF0sIHJpZ2h0RXllUHJvals4XSwgcmlnaHRFeWVQcm9qWzEyXSxcbiAgICAgICAgICAgICAgICByaWdodEV5ZVByb2pbMV0sIHJpZ2h0RXllUHJvals1XSwgcmlnaHRFeWVQcm9qWzldLCByaWdodEV5ZVByb2pbMTNdLFxuICAgICAgICAgICAgICAgIHJpZ2h0RXllUHJvalsyXSwgcmlnaHRFeWVQcm9qWzZdLCByaWdodEV5ZVByb2pbMTBdLCByaWdodEV5ZVByb2pbMTRdLFxuICAgICAgICAgICAgICAgIHJpZ2h0RXllUHJvalszXSwgcmlnaHRFeWVQcm9qWzddLCByaWdodEV5ZVByb2pbMTFdLCByaWdodEV5ZVByb2pbMTVdLFxuICAgICAgICAgICAgICAgIC8vIEhNRCA0eDQgdHJhbnNmb3JtXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMF0sIGhtZFRyYW5zWzRdLCBobWRUcmFuc1s4XSwgaG1kVHJhbnNbMTJdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzFdLCBobWRUcmFuc1s1XSwgaG1kVHJhbnNbOV0sIGhtZFRyYW5zWzEzXSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1syXSwgaG1kVHJhbnNbNl0sIGhtZFRyYW5zWzEwXSwgaG1kVHJhbnNbMTRdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzNdLCBobWRUcmFuc1s3XSwgaG1kVHJhbnNbMTFdLCBobWRUcmFuc1sxNV0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRMZWZ0RXllUHJvaiA9IGxlZnRFeWVQcm9qO1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VudFJpZ2h0RXllUHJvaiA9IHJpZ2h0RXllUHJvajtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZUxlZnRFeWVQb3MgPSBsZWZ0RXllUmVsYXRpdmVQb3M7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZW50UmVsYXRpdmVSaWdodEV5ZVBvcyA9IHJpZ2h0RXllUmVsYXRpdmVQb3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBuZWVkIHRvIHRoZSBlbnRpcmUgZXllIHZpZXdzIGJlaW5nIHNlbnQganVzdCBzZW5kIHRoZSBITUQgdHJhbnNmb3JtXG4gICAgICAgICAgICB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnWFJITURUcmFuc2Zvcm0nKShbXG4gICAgICAgICAgICAgICAgLy8gSE1EIDR4NCB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICBobWRUcmFuc1swXSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1s0XSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1s4XSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1sxMl0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMV0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbNV0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbOV0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMTNdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzJdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzZdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzEwXSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1sxNF0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbM10sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbN10sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMTFdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzE1XVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25YckZyYW1lKHRpbWUsIGZyYW1lKSB7XG4gICAgICAgIHRoaXMueHJWaWV3ZXJQb3NlID0gZnJhbWUuZ2V0Vmlld2VyUG9zZSh0aGlzLnhyUmVmU3BhY2UpO1xuICAgICAgICBpZiAodGhpcy54clZpZXdlclBvc2UpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3MoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnRWaWV3ID09IG51bGwgfHwgdGhpcy5yaWdodFZpZXcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VuZFhSRGF0YVRvVUUoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9UZXh0dXJlKCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndlYlJ0Y0NvbnRyb2xsZXIuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuWFJDb250cm9sbGVySW5wdXQpKSB7XG4gICAgICAgICAgICB0aGlzLnhyU2Vzc2lvbi5pbnB1dFNvdXJjZXMuZm9yRWFjaCgoc291cmNlLCBfaW5kZXgsIF9hcnJheSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMueHJHYW1lcGFkQ29udHJvbGxlci51cGRhdGVTdGF0dXMoc291cmNlLCBmcmFtZSwgdGhpcy54clJlZlNwYWNlKTtcbiAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueHJTZXNzaW9uLnJlcXVlc3RBbmltYXRpb25GcmFtZSgodGltZSwgZnJhbWUpID0+IHRoaXMub25YckZyYW1lKHRpbWUsIGZyYW1lKSk7XG4gICAgICAgIHRoaXMub25GcmFtZS5kaXNwYXRjaEV2ZW50KG5ldyBYckZyYW1lRXZlbnQoeyB0aW1lLCBmcmFtZSB9KSk7XG4gICAgfVxuICAgIHVwZGF0ZVZpZXdzKCkge1xuICAgICAgICBpZiAoIXRoaXMueHJWaWV3ZXJQb3NlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2aWV3IG9mIHRoaXMueHJWaWV3ZXJQb3NlLnZpZXdzKSB7XG4gICAgICAgICAgICBpZiAodmlldy5leWUgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMubGVmdFZpZXcgPSB2aWV3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmlldy5leWUgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0VmlldyA9IHZpZXc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuZ2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBCaW5kIHRoZSBmcmFtZWJ1ZmZlciB0byB0aGUgYmFzZSBsYXllcidzIGZyYW1lYnVmZmVyXG4gICAgICAgIGNvbnN0IGdsTGF5ZXIgPSB0aGlzLnhyU2Vzc2lvbi5yZW5kZXJTdGF0ZS5iYXNlTGF5ZXI7XG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIGdsTGF5ZXIuZnJhbWVidWZmZXIpO1xuICAgICAgICAvLyBTZXQgdGhlIHJlbGV2YW50IHBvcnRpb24gb2YgY2xpcCBzcGFjZVxuICAgICAgICB0aGlzLmdsLnZpZXdwb3J0KDAsIDAsIGdsTGF5ZXIuZnJhbWVidWZmZXJXaWR0aCwgZ2xMYXllci5mcmFtZWJ1ZmZlckhlaWdodCk7XG4gICAgICAgIC8vIERyYXcgdGhlIHJlY3RhbmdsZSB3ZSB3aWxsIHNob3cgdGhlIHZpZGVvIHN0cmVhbSB0ZXh0dXJlIG9uXG4gICAgICAgIHRoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmdsLlRSSUFOR0xFUyAvKnByaW1pdGl2ZVR5cGUqLywgMCAvKm9mZnNldCovLCA2IC8qY291bnQqLyk7XG4gICAgfVxuICAgIHN0YXRpYyBpc1Nlc3Npb25TdXBwb3J0ZWQobW9kZSkge1xuICAgICAgICBpZiAobG9jYXRpb24ucHJvdG9jb2wgIT09ICdodHRwczonKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnV2ViWFIgcmVxdWlyZXMgaHR0cHMsIGlmIHlvdSB3YW50IFdlYlhSIHVzZSBodHRwcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2aWdhdG9yLnhyKSB7XG4gICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnhyLmlzU2Vzc2lvblN1cHBvcnRlZChtb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XZWJYUkNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmV4cG9ydCB7IFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIgfSBmcm9tICcuL1dlYlJ0Y1BsYXllci9XZWJSdGNQbGF5ZXJDb250cm9sbGVyJztcbmV4cG9ydCB7IFdlYlhSQ29udHJvbGxlciB9IGZyb20gJy4vV2ViWFIvV2ViWFJDb250cm9sbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29uZmlnL0NvbmZpZyc7XG5leHBvcnQgeyBTZXR0aW5nQmFzZSB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdCYXNlJztcbmV4cG9ydCB7IFNldHRpbmdGbGFnIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ0ZsYWcnO1xuZXhwb3J0IHsgU2V0dGluZ051bWJlciB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdOdW1iZXInO1xuZXhwb3J0IHsgU2V0dGluZ09wdGlvbiB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdPcHRpb24nO1xuZXhwb3J0IHsgU2V0dGluZ1RleHQgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5nVGV4dCc7XG5leHBvcnQgeyBQaXhlbFN0cmVhbWluZyB9IGZyb20gJy4vUGl4ZWxTdHJlYW1pbmcvUGl4ZWxTdHJlYW1pbmcnO1xuZXhwb3J0IHsgQUZLQ29udHJvbGxlciBhcyBBZmtMb2dpYyB9IGZyb20gJy4vQUZLL0FGS0NvbnRyb2xsZXInO1xuZXhwb3J0IHsgTGF0ZW5jeVRlc3RSZXN1bHRzIH0gZnJvbSAnLi9EYXRhQ2hhbm5lbC9MYXRlbmN5VGVzdFJlc3VsdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9EYXRhQ2hhbm5lbC9Jbml0aWFsU2V0dGluZ3MnO1xuZXhwb3J0IHsgQWdncmVnYXRlZFN0YXRzIH0gZnJvbSAnLi9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvQWdncmVnYXRlZFN0YXRzJztcbmV4cG9ydCAqIGZyb20gJy4vVXRpbC9JbnB1dENvb3JkVHJhbnNsYXRvcic7XG5leHBvcnQgeyBNZXNzYWdlRGlyZWN0aW9uIH0gZnJvbSAnLi9VZUluc3RhbmNlTWVzc2FnZS9TdHJlYW1NZXNzYWdlQ29udHJvbGxlcic7XG5leHBvcnQgeyBDYW5kaWRhdGVQYWlyU3RhdHMgfSBmcm9tICcuL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9DYW5kaWRhdGVQYWlyU3RhdHMnO1xuZXhwb3J0IHsgQ2FuZGlkYXRlU3RhdCB9IGZyb20gJy4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0NhbmRpZGF0ZVN0YXQnO1xuZXhwb3J0IHsgRGF0YUNoYW5uZWxTdGF0cyB9IGZyb20gJy4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0RhdGFDaGFubmVsU3RhdHMnO1xuZXhwb3J0IHsgSW5ib3VuZEF1ZGlvU3RhdHMsIEluYm91bmRWaWRlb1N0YXRzIH0gZnJvbSAnLi9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvSW5ib3VuZFJUUFN0YXRzJztcbmV4cG9ydCB7IE91dGJvdW5kUlRQU3RhdHMsIFJlbW90ZU91dGJvdW5kUlRQU3RhdHMgfSBmcm9tICcuL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9PdXRCb3VuZFJUUFN0YXRzJztcbmV4cG9ydCAqIGZyb20gJy4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0xhdGVuY3lDYWxjdWxhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vRGF0YUNoYW5uZWwvRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9VdGlsL0V2ZW50RW1pdHRlcic7XG5leHBvcnQgKiBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBGbGFncywgTG9nZ2VyLCBPcHRpb25QYXJhbWV0ZXJzIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNSc7XG5pbXBvcnQgeyBDb25uZWN0T3ZlcmxheSB9IGZyb20gJy4uL092ZXJsYXkvQ29ubmVjdE92ZXJsYXknO1xuaW1wb3J0IHsgRGlzY29ubmVjdE92ZXJsYXkgfSBmcm9tICcuLi9PdmVybGF5L0Rpc2Nvbm5lY3RPdmVybGF5JztcbmltcG9ydCB7IFBsYXlPdmVybGF5IH0gZnJvbSAnLi4vT3ZlcmxheS9QbGF5T3ZlcmxheSc7XG5pbXBvcnQgeyBJbmZvT3ZlcmxheSB9IGZyb20gJy4uL092ZXJsYXkvSW5mb092ZXJsYXknO1xuaW1wb3J0IHsgRXJyb3JPdmVybGF5IH0gZnJvbSAnLi4vT3ZlcmxheS9FcnJvck92ZXJsYXknO1xuaW1wb3J0IHsgQUZLT3ZlcmxheSB9IGZyb20gJy4uL092ZXJsYXkvQUZLT3ZlcmxheSc7XG5pbXBvcnQgeyBDb250cm9scyB9IGZyb20gJy4uL1VJL0NvbnRyb2xzJztcbmltcG9ydCB7IExhYmVsbGVkQnV0dG9uIH0gZnJvbSAnLi4vVUkvTGFiZWxsZWRCdXR0b24nO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gJy4uL1VJL1NldHRpbmdzUGFuZWwnO1xuaW1wb3J0IHsgU3RhdHNQYW5lbCB9IGZyb20gJy4uL1VJL1N0YXRzUGFuZWwnO1xuaW1wb3J0IHsgVmlkZW9RcEluZGljYXRvciB9IGZyb20gJy4uL1VJL1ZpZGVvUXBJbmRpY2F0b3InO1xuaW1wb3J0IHsgQ29uZmlnVUkgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnVUknO1xuaW1wb3J0IHsgRWRpdFRleHRNb2RhbCB9IGZyb20gJy4uL1VJL0VkaXRUZXh0TW9kYWwnO1xuaW1wb3J0IHsgVUlFbGVtZW50Q3JlYXRpb25Nb2RlLCBpc1BhbmVsRW5hYmxlZCwgRXh0cmFGbGFncyB9IGZyb20gJy4uL1VJL1VJQ29uZmlndXJhdGlvblR5cGVzJztcbmltcG9ydCB7IEZ1bGxTY3JlZW5JY29uRXh0ZXJuYWwgfSBmcm9tICcuLi9VSS9GdWxsc2NyZWVuSWNvbic7XG4vKipcbiAqIEFuIEFwcGxpY2F0aW9uIGlzIGEgY29tYmluYXRpb24gb2YgVUkgZWxlbWVudHMgdG8gZGlzcGxheSBhbmQgbWFuYWdlIGEgV2ViUlRDIFBpeGVsIFN0cmVhbWluZ1xuICogY29ubmVjdGlvbi4gSXQgaW5jbHVkZXMgZmVhdHVyZXMgZm9yIGNvbnRyb2xsaW5nIGEgc3RyZWFtIHdpdGggbW91c2UgYW5kIGtleWJvYXJkLFxuICogbWFuYWdpbmcgY29ubmVjdGlvbiBlbmRwb2ludHMsIGFzIHdlbGwgYXMgZGlzcGxheWluZyBzdGF0cyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBJbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLmVkaXRUZXh0TW9kYWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBvcHRpb25zLnN0cmVhbTtcbiAgICAgICAgLy8gRXhwbGljaXRseSBjcmVhdGUgdWkgZmVhdHVyZXMgbm93IHNvIGNyZWF0aW9uIHRpbWUgaXMga25vd25cbiAgICAgICAgdGhpcy5fdWlGZWF0dXJlRWxlbWVudCA9IHRoaXMuY3JlYXRlVUlGZWF0dXJlc0VsZW1lbnQoKTtcbiAgICAgICAgLy8gRXhwbGljaXRseSBjcmVhdGUgcm9vdCBlbGVtZW50IG5vdyBzbyBjcmVhdGlvbiB0aW1lIGlzIGtub3duXG4gICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gdGhpcy5jcmVhdGVSb290RWxlbWVudCh0aGlzLnN0cmVhbSwgdGhpcy5fdWlGZWF0dXJlRWxlbWVudCk7XG4gICAgICAgIHRoaXMub25Db2xvck1vZGVDaGFuZ2VkID0gb3B0aW9ucy5vbkNvbG9yTW9kZUNoYW5nZWQ7XG4gICAgICAgIHRoaXMuY29uZmlnVUkgPSBuZXcgQ29uZmlnVUkodGhpcy5zdHJlYW0uY29uZmlnKTtcbiAgICAgICAgdGhpcy5jcmVhdGVPdmVybGF5cygpO1xuICAgICAgICBpZiAoaXNQYW5lbEVuYWJsZWQob3B0aW9ucy5zdGF0c1BhbmVsQ29uZmlnKSkge1xuICAgICAgICAgICAgLy8gQWRkIHN0YXRzIHBhbmVsXG4gICAgICAgICAgICB0aGlzLnN0YXRzUGFuZWwgPSBuZXcgU3RhdHNQYW5lbChvcHRpb25zLnN0YXRzUGFuZWxDb25maWcpO1xuICAgICAgICAgICAgdGhpcy51aUZlYXR1cmVzRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzUGFuZWwucm9vdEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1BhbmVsRW5hYmxlZChvcHRpb25zLnNldHRpbmdzUGFuZWxDb25maWcpKSB7XG4gICAgICAgICAgICAvLyBBZGQgc2V0dGluZ3MgcGFuZWxcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbCA9IG5ldyBTZXR0aW5nc1BhbmVsKCk7XG4gICAgICAgICAgICB0aGlzLnVpRmVhdHVyZXNFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NQYW5lbC5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyZVNldHRpbmdzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zLnZpZGVvUXBJbmRpY2F0b3JDb25maWcgfHwgIW9wdGlvbnMudmlkZW9RcEluZGljYXRvckNvbmZpZy5kaXNhYmxlSW5kaWNhdG9yKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGhlIHZpZGVvIHN0cmVhbSBRUCBpbmRpY2F0b3JcbiAgICAgICAgICAgIHRoaXMudmlkZW9RcEluZGljYXRvciA9IG5ldyBWaWRlb1FwSW5kaWNhdG9yKG9wdGlvbnMudmlkZW9RcEluZGljYXRvckNvbmZpZyk7XG4gICAgICAgICAgICB0aGlzLnVpRmVhdHVyZXNFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmlkZW9RcEluZGljYXRvci5yb290RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcmVhdGVCdXR0b25zKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFja3MoKTtcbiAgICAgICAgdGhpcy5zaG93Q29ubmVjdE9yQXV0b0Nvbm5lY3RPdmVybGF5cygpO1xuICAgICAgICB0aGlzLnNldENvbG9yTW9kZSh0aGlzLmNvbmZpZ1VJLmlzQ3VzdG9tRmxhZ0VuYWJsZWQoRXh0cmFGbGFncy5MaWdodE1vZGUpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuSGlkZVVJLCAoaXNFbmFibGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl91aUZlYXR1cmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBpc0VuYWJsZWQgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnN0cmVhbS5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5IaWRlVUkpKSB7XG4gICAgICAgICAgICB0aGlzLl91aUZlYXR1cmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVPdmVybGF5cygpIHtcbiAgICAgICAgLy8gYnVpbGQgYWxsIG9mIHRoZSBvdmVybGF5c1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPdmVybGF5ID0gbmV3IERpc2Nvbm5lY3RPdmVybGF5KHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudCk7XG4gICAgICAgIHRoaXMuY29ubmVjdE92ZXJsYXkgPSBuZXcgQ29ubmVjdE92ZXJsYXkodGhpcy5zdHJlYW0udmlkZW9FbGVtZW50UGFyZW50KTtcbiAgICAgICAgdGhpcy5wbGF5T3ZlcmxheSA9IG5ldyBQbGF5T3ZlcmxheSh0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQpO1xuICAgICAgICB0aGlzLmluZm9PdmVybGF5ID0gbmV3IEluZm9PdmVybGF5KHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudCk7XG4gICAgICAgIHRoaXMuZXJyb3JPdmVybGF5ID0gbmV3IEVycm9yT3ZlcmxheSh0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQpO1xuICAgICAgICB0aGlzLmFma092ZXJsYXkgPSBuZXcgQUZLT3ZlcmxheSh0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQpO1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPdmVybGF5Lm9uQWN0aW9uKCgpID0+IHRoaXMuc3RyZWFtLnJlY29ubmVjdCgpKTtcbiAgICAgICAgLy8gQnVpbGQgdGhlIHdlYlJ0YyBjb25uZWN0IG92ZXJsYXkgRXZlbnQgTGlzdGVuZXIgYW5kIHNob3cgdGhlIGNvbm5lY3Qgb3ZlcmxheVxuICAgICAgICB0aGlzLmNvbm5lY3RPdmVybGF5Lm9uQWN0aW9uKCgpID0+IHRoaXMuc3RyZWFtLmNvbm5lY3QoKSk7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgcGxheSBvdmVybGF5cyBhY3Rpb25cbiAgICAgICAgdGhpcy5wbGF5T3ZlcmxheS5vbkFjdGlvbigoKSA9PiB0aGlzLnN0cmVhbS5wbGF5KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgYnV0dG9uIGNsaWNrIGZ1bmN0aW9ucyBhbmQgYnV0dG9uIGZ1bmN0aW9uYWxpdHlcbiAgICAgKi9cbiAgICBjcmVhdGVCdXR0b25zKCkge1xuICAgICAgICBjb25zdCBpc0lwaG9uZSA9IC9pUGhvbmUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICAgIGNvbnN0IGlzSXBhZCA9IC9pUGFkLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8XG4gICAgICAgICAgICAoL01hY2ludG9zaC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAnb250b3VjaGVuZCcgaW4gZG9jdW1lbnQpO1xuICAgICAgICBjb25zdCBpc1NhZmFyaSA9IG5hdmlnYXRvci52ZW5kb3IgJiZcbiAgICAgICAgICAgIG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZignQXBwbGUnKSA+IC0xICYmXG4gICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50ICYmXG4gICAgICAgICAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0NyaU9TJykgPT0gLTEgJiZcbiAgICAgICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRnhpT1MnKSA9PSAtMTtcbiAgICAgICAgLy8gSW4gc29tZSBjYXNlcyB3ZSB3YW50IHRvIGRpc2FibGUgZnVsbHNjcmVlbiBidXR0b24gaWYgaXQgaXMgbm90IGV4cGxpY2l0bHkgcmVxdWVzdGVkOlxuICAgICAgICAvLyBJUGhvbmUgZG9lcyBub3Qgc3VwcG9ydCBmdWxsc2NyZWVuIEFQSSBhcyBhdCAyOHRoIEp1bHkgMjAyNCAoc2VlOiBodHRwczovL2Nhbml1c2UuY29tL2Z1bGxzY3JlZW4pIHNvIGlmXG4gICAgICAgIC8vIHdlIGFyZSBvbiBJUGhvbmUgYW5kIHVzZXIgaGFzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSBjb25maWd1cmVkIFVJIGNvbmZpZyBmb3JcbiAgICAgICAgLy8gZnVsbHNjcmVlbiBidXR0b24gdGhlbiB3ZSBzaG91bGQgZGlzYWJsZSB0aGlzIGJ1dHRvbiBhcyBpdCBkb2Vzbid0IHdvcmsuXG4gICAgICAgIC8vIEFkZGl0aW9uYWxseSBpUGFkIG9uIG5vbi1TYWZhcmkgYnJvd3NlcnMgZG9lc24ndCByZWFsbHkgYWxsb3cgdG91Y2ggaW5wdXRzIGFuZCBmdWxsc2NyZWVuIHZpZGVvIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICAgIC8vIElmIHlvdSBkbyB0aGlzIHRoZSB2aWRlbyBnZXRzIGRyYWdnZWQgb2ZmIGJhY2sgdG8gbm9ybWFsIG5vbi1mdWxsc2NyZWVuIHZpZGVvIGFuZCB0aGVuIHRoZSB2aWRlbyBpcyBwYXVzZWQuXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL0VwaWNHYW1lc0V4dC9QaXhlbFN0cmVhbWluZ0luZnJhc3RydWN0dXJlL2lzc3Vlcy8yMTlcbiAgICAgICAgY29uc3QgZGlzYWJsZUZ1bGxzY3JlZW5CdXR0b24gPSBpc0lwaG9uZSB8fCAoIWlzU2FmYXJpICYmIGlzSXBhZCk7XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLmZ1bGxTY3JlZW5Db250cm9sc0NvbmZpZyA9PT0gdW5kZWZpbmVkICYmIGRpc2FibGVGdWxsc2NyZWVuQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmZ1bGxTY3JlZW5Db250cm9sc0NvbmZpZyA9IHsgY3JlYXRpb25Nb2RlOiBVSUVsZW1lbnRDcmVhdGlvbk1vZGUuRGlzYWJsZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzVUlDb25maWcgPSB7XG4gICAgICAgICAgICBzdGF0c0J1dHRvblR5cGU6IHRoaXMuX29wdGlvbnMuc3RhdHNQYW5lbENvbmZpZ1xuICAgICAgICAgICAgICAgID8gdGhpcy5fb3B0aW9ucy5zdGF0c1BhbmVsQ29uZmlnLnZpc2liaWxpdHlCdXR0b25Db25maWdcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNldHRpbmdzQnV0dG9uVHlwZTogdGhpcy5fb3B0aW9ucy5zZXR0aW5nc1BhbmVsQ29uZmlnXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9vcHRpb25zLnNldHRpbmdzUGFuZWxDb25maWcudmlzaWJpbGl0eUJ1dHRvbkNvbmZpZ1xuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZnVsbHNjcmVlbkJ1dHRvblR5cGU6IHRoaXMuX29wdGlvbnMuZnVsbFNjcmVlbkNvbnRyb2xzQ29uZmlnLFxuICAgICAgICAgICAgeHJJY29uVHlwZTogdGhpcy5fb3B0aW9ucy54ckNvbnRyb2xzQ29uZmlnLFxuICAgICAgICAgICAgaGlkZUNvbnRyb2xzSW5GdWxsc2NyZWVuOiB0aGlzLl9vcHRpb25zLmhpZGVDb250cm9sc0luRnVsbHNjcmVlblxuICAgICAgICB9O1xuICAgICAgICAvLyBTZXR1cCBjb250cm9sc1xuICAgICAgICBjb25zdCBjb250cm9scyA9IG5ldyBDb250cm9scyhjb250cm9sc1VJQ29uZmlnKTtcbiAgICAgICAgdGhpcy51aUZlYXR1cmVzRWxlbWVudC5hcHBlbmRDaGlsZChjb250cm9scy5yb290RWxlbWVudCk7XG4gICAgICAgIC8vIFdoZW4gd2UgZnVsbHNjcmVlbiB3ZSB3YW50IHRoaXMgZWxlbWVudCB0byBiZSB0aGUgcm9vdFxuICAgICAgICBjb25zdCBmdWxsU2NyZWVuQnV0dG9uID0gXG4gICAgICAgIC8vIERlcGVuZGluZyBvbiBpZiB3ZSdyZSBjcmVhdGluZyBhbiBpbnRlcm5hbCBidXR0b24sIG9yIHVzaW5nIGFuIGV4dGVybmFsIG9uZVxuICAgICAgICAhIXRoaXMuX29wdGlvbnMuZnVsbFNjcmVlbkNvbnRyb2xzQ29uZmlnICYmXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmZ1bGxTY3JlZW5Db250cm9sc0NvbmZpZy5jcmVhdGlvbk1vZGUgPT09IFVJRWxlbWVudENyZWF0aW9uTW9kZS5Vc2VDdXN0b21FbGVtZW50XG4gICAgICAgICAgICA/IC8vIEVpdGhlciBjcmVhdGUgYSBmdWxsc2NyZWVuIGNsYXNzIGJhc2VkIG9uIHRoZSBleHRlcm5hbCBidXR0b25cbiAgICAgICAgICAgICAgICBuZXcgRnVsbFNjcmVlbkljb25FeHRlcm5hbCh0aGlzLl9vcHRpb25zLmZ1bGxTY3JlZW5Db250cm9sc0NvbmZpZy5jdXN0b21FbGVtZW50KVxuICAgICAgICAgICAgOiAvLyBPciB1c2UgdGhlIG9uZSBjcmVhdGVkIGJ5IHRoZSBDb250cm9scyBpbml0aWFsaXplciBlYXJsaWVyXG4gICAgICAgICAgICAgICAgY29udHJvbHMuZnVsbHNjcmVlbkljb247XG4gICAgICAgIGlmIChmdWxsU2NyZWVuQnV0dG9uKSB7XG4gICAgICAgICAgICBmdWxsU2NyZWVuQnV0dG9uLmZ1bGxzY3JlZW5FbGVtZW50ID0gL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudClcbiAgICAgICAgICAgICAgICA/IHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKVswXVxuICAgICAgICAgICAgICAgIDogdGhpcy5yb290RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGQgc2V0dGluZ3MgYnV0dG9uIHRvIGNvbnRyb2xzXG4gICAgICAgIGNvbnN0IHNldHRpbmdzQnV0dG9uID0gY29udHJvbHMuc2V0dGluZ3NJY29uXG4gICAgICAgICAgICA/IGNvbnRyb2xzLnNldHRpbmdzSWNvbi5yb290RWxlbWVudFxuICAgICAgICAgICAgOiB0aGlzLl9vcHRpb25zLnNldHRpbmdzUGFuZWxDb25maWcudmlzaWJpbGl0eUJ1dHRvbkNvbmZpZy5jdXN0b21FbGVtZW50O1xuICAgICAgICBpZiAoc2V0dGluZ3NCdXR0b24pXG4gICAgICAgICAgICBzZXR0aW5nc0J1dHRvbi5vbmNsaWNrID0gKCkgPT4gdGhpcy5zZXR0aW5nc0NsaWNrZWQoKTtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NQYW5lbClcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NQYW5lbC5zZXR0aW5nc0Nsb3NlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB0aGlzLnNldHRpbmdzQ2xpY2tlZCgpO1xuICAgICAgICAvLyBBZGQgV2ViWFIgYnV0dG9uIHRvIGNvbnRyb2xzXG4gICAgICAgIGNvbnN0IHhyQnV0dG9uID0gY29udHJvbHMueHJJY29uXG4gICAgICAgICAgICA/IGNvbnRyb2xzLnhySWNvbi5yb290RWxlbWVudFxuICAgICAgICAgICAgOiB0aGlzLl9vcHRpb25zLnhyQ29udHJvbHNDb25maWcuY3JlYXRpb25Nb2RlID09PSBVSUVsZW1lbnRDcmVhdGlvbk1vZGUuVXNlQ3VzdG9tRWxlbWVudFxuICAgICAgICAgICAgICAgID8gdGhpcy5fb3B0aW9ucy54ckNvbnRyb2xzQ29uZmlnLmN1c3RvbUVsZW1lbnRcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHhyQnV0dG9uKVxuICAgICAgICAgICAgeHJCdXR0b24ub25jbGljayA9ICgpID0+IHRoaXMuc3RyZWFtLnRvZ2dsZVhSKCk7XG4gICAgICAgIC8vIHNldHVwIHRoZSBzdGF0cy9pbmZvIGJ1dHRvblxuICAgICAgICBjb25zdCBzdGF0c0J1dHRvbiA9IGNvbnRyb2xzLnN0YXRzSWNvblxuICAgICAgICAgICAgPyBjb250cm9scy5zdGF0c0ljb24ucm9vdEVsZW1lbnRcbiAgICAgICAgICAgIDogdGhpcy5fb3B0aW9ucy5zdGF0c1BhbmVsQ29uZmlnLnZpc2liaWxpdHlCdXR0b25Db25maWcuY3VzdG9tRWxlbWVudDtcbiAgICAgICAgaWYgKHN0YXRzQnV0dG9uKVxuICAgICAgICAgICAgc3RhdHNCdXR0b24ub25jbGljayA9ICgpID0+IHRoaXMuc3RhdHNDbGlja2VkKCk7XG4gICAgICAgIGlmICh0aGlzLnN0YXRzUGFuZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHNQYW5lbC5zdGF0c0Nsb3NlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB0aGlzLnN0YXRzQ2xpY2tlZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCBjb21tYW5kIGJ1dHRvbnMgKGlmIHdlIGhhdmUgc29tZXdoZXJlIHRvIGFkZCB0aGVtIHRvKVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nc1BhbmVsKSB7XG4gICAgICAgICAgICAvLyBBZGQgYnV0dG9uIGZvciB0b2dnbGUgZnBzXG4gICAgICAgICAgICBjb25zdCBzaG93RlBTQnV0dG9uID0gbmV3IExhYmVsbGVkQnV0dG9uKCdTaG93IEZQUycsICdUb2dnbGUnKTtcbiAgICAgICAgICAgIHNob3dGUFNCdXR0b24uYWRkT25DbGlja0xpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbS5yZXF1ZXN0U2hvd0ZwcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBZGQgYnV0dG9uIGZvciByZXN0YXJ0IHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgcmVzdGFydFN0cmVhbUJ1dHRvbiA9IG5ldyBMYWJlbGxlZEJ1dHRvbignUmVzdGFydCBTdHJlYW0nLCAnUmVzdGFydCcpO1xuICAgICAgICAgICAgcmVzdGFydFN0cmVhbUJ1dHRvbi5hZGRPbkNsaWNrTGlzdGVuZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtLnJlY29ubmVjdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBZGQgYnV0dG9uIGZvciByZXF1ZXN0IGtleWZyYW1lXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0S2V5ZnJhbWVCdXR0b24gPSBuZXcgTGFiZWxsZWRCdXR0b24oJ1JlcXVlc3Qga2V5ZnJhbWUnLCAnUmVxdWVzdCcpO1xuICAgICAgICAgICAgcmVxdWVzdEtleWZyYW1lQnV0dG9uLmFkZE9uQ2xpY2tMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0ucmVxdWVzdElmcmFtZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBjb21tYW5kc1NlY3Rpb25FbGVtID0gdGhpcy5jb25maWdVSS5idWlsZFNlY3Rpb25XaXRoSGVhZGluZyh0aGlzLnNldHRpbmdzUGFuZWwuc2V0dGluZ3NDb250ZW50RWxlbWVudCwgJ0NvbW1hbmRzJyk7XG4gICAgICAgICAgICBjb21tYW5kc1NlY3Rpb25FbGVtLmFwcGVuZENoaWxkKHNob3dGUFNCdXR0b24ucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgY29tbWFuZHNTZWN0aW9uRWxlbS5hcHBlbmRDaGlsZChyZXF1ZXN0S2V5ZnJhbWVCdXR0b24ucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgY29tbWFuZHNTZWN0aW9uRWxlbS5hcHBlbmRDaGlsZChyZXN0YXJ0U3RyZWFtQnV0dG9uLnJvb3RFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhlIHNldHRpbmdzIHdpdGggb24gY2hhbmdlIGxpc3RlbmVycyBhbmQgYW55IGFkZGl0aW9uYWwgcGVyIGV4cGVyaWVuY2Ugc2V0dGluZ3MuXG4gICAgICovXG4gICAgY29uZmlndXJlU2V0dGluZ3MoKSB7XG4gICAgICAgIC8vIFRoaXMgYnVpbGRzIGFsbCB0aGUgc2V0dGluZ3Mgc2VjdGlvbnMgYW5kIGZsYWdzIHVuZGVyIHRoaXMgYHNldHRpbmdzQ29udGVudGAgZWxlbWVudC5cbiAgICAgICAgdGhpcy5jb25maWdVSS5wb3B1bGF0ZVNldHRpbmdzRWxlbWVudCh0aGlzLnNldHRpbmdzUGFuZWwuc2V0dGluZ3NDb250ZW50RWxlbWVudCwgdGhpcy5fb3B0aW9ucy5zZXR0aW5nc1BhbmVsQ29uZmlnKTtcbiAgICAgICAgdGhpcy5jb25maWdVSS5hZGRDdXN0b21GbGFnT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEV4dHJhRmxhZ3MuTGlnaHRNb2RlLCAoaXNMaWdodE1vZGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnVUkuc2V0Q3VzdG9tRmxhZ0xhYmVsKEV4dHJhRmxhZ3MuTGlnaHRNb2RlLCBgQ29sb3IgU2NoZW1lOiAke2lzTGlnaHRNb2RlID8gJ0xpZ2h0JyA6ICdEYXJrJ30gTW9kZWApO1xuICAgICAgICAgICAgdGhpcy5zZXRDb2xvck1vZGUoaXNMaWdodE1vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVnaXN0ZXJDYWxsYmFja3MoKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ2Fma1dhcm5pbmdBY3RpdmF0ZScsICh7IGRhdGE6IHsgY291bnREb3duLCBkaXNtaXNzQWZrIH0gfSkgPT4gdGhpcy5zaG93QWZrT3ZlcmxheShjb3VudERvd24sIGRpc21pc3NBZmspKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignYWZrV2FybmluZ1VwZGF0ZScsICh7IGRhdGE6IHsgY291bnREb3duIH0gfSkgPT4gdGhpcy5hZmtPdmVybGF5LnVwZGF0ZUNvdW50ZG93bihjb3VudERvd24pKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignYWZrV2FybmluZ0RlYWN0aXZhdGUnLCAoKSA9PiB0aGlzLmFma092ZXJsYXkuaGlkZSgpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignYWZrVGltZWRPdXQnLCAoKSA9PiB0aGlzLmFma092ZXJsYXkuaGlkZSgpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcigndmlkZW9FbmNvZGVyQXZnUVAnLCAoeyBkYXRhOiB7IGF2Z1FQIH0gfSkgPT4gdGhpcy5vblZpZGVvRW5jb2RlckF2Z1FQKGF2Z1FQKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y1NkcCcsICgpID0+IHRoaXMub25XZWJSdGNTZHAoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0F1dG9Db25uZWN0JywgKCkgPT4gdGhpcy5vbldlYlJ0Y0F1dG9Db25uZWN0KCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCd3ZWJSdGNDb25uZWN0aW5nJywgKCkgPT4gdGhpcy5vbldlYlJ0Y0Nvbm5lY3RpbmcoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0Nvbm5lY3RlZCcsICgpID0+IHRoaXMub25XZWJSdGNDb25uZWN0ZWQoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0ZhaWxlZCcsICgpID0+IHRoaXMub25XZWJSdGNGYWlsZWQoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0Rpc2Nvbm5lY3RlZCcsICh7IGRhdGE6IHsgZXZlbnRTdHJpbmcsIGFsbG93Q2xpY2tUb1JlY29ubmVjdCB9IH0pID0+IHRoaXMub25EaXNjb25uZWN0KGV2ZW50U3RyaW5nLCBhbGxvd0NsaWNrVG9SZWNvbm5lY3QpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcigndmlkZW9Jbml0aWFsaXplZCcsICgpID0+IHRoaXMub25WaWRlb0luaXRpYWxpemVkKCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzdHJlYW1Mb2FkaW5nJywgKCkgPT4gdGhpcy5vblN0cmVhbUxvYWRpbmcoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlTdHJlYW1FcnJvcicsICh7IGRhdGE6IHsgbWVzc2FnZSB9IH0pID0+IHRoaXMub25QbGF5U3RyZWFtRXJyb3IobWVzc2FnZSkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdwbGF5U3RyZWFtJywgKCkgPT4gdGhpcy5vblBsYXlTdHJlYW0oKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlTdHJlYW1SZWplY3RlZCcsICh7IGRhdGE6IHsgcmVhc29uIH0gfSkgPT4gdGhpcy5vblBsYXlTdHJlYW1SZWplY3RlZChyZWFzb24pKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignbG9hZEZyZWV6ZUZyYW1lJywgKHsgZGF0YTogeyBzaG91bGRTaG93UGxheU92ZXJsYXkgfSB9KSA9PiB0aGlzLm9uTG9hZEZyZWV6ZUZyYW1lKHNob3VsZFNob3dQbGF5T3ZlcmxheSkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzdGF0c1JlY2VpdmVkJywgKHsgZGF0YTogeyBhZ2dyZWdhdGVkU3RhdHMgfSB9KSA9PiB0aGlzLm9uU3RhdHNSZWNlaXZlZChhZ2dyZWdhdGVkU3RhdHMpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignbGF0ZW5jeUNhbGN1bGF0ZWQnLCAoeyBkYXRhOiB7IGxhdGVuY3lJbmZvIH0gfSkgPT4gdGhpcy5vbkxhdGVuY3lVcGRhdGUobGF0ZW5jeUluZm8pKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignbGF0ZW5jeVRlc3RSZXN1bHQnLCAoeyBkYXRhOiB7IGxhdGVuY3lUaW1pbmdzIH0gfSkgPT4gdGhpcy5vbkxhdGVuY3lUZXN0UmVzdWx0cyhsYXRlbmN5VGltaW5ncykpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0JywgKHsgZGF0YTogeyByZXN1bHQgfSB9KSA9PiB0aGlzLm9uRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdHMocmVzdWx0KSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3N0cmVhbWVyTGlzdE1lc3NhZ2UnLCAoeyBkYXRhOiB7IG1lc3NhZ2VTdHJlYW1lckxpc3QsIGF1dG9TZWxlY3RlZFN0cmVhbWVySWQsIHdhbnRlZFN0cmVhbWVySWQgfSB9KSA9PiB0aGlzLmhhbmRsZVN0cmVhbWVyTGlzdE1lc3NhZ2UobWVzc2FnZVN0cmVhbWVyTGlzdCwgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCwgd2FudGVkU3RyZWFtZXJJZCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzdWJzY3JpYmVGYWlsZWQnLCAoeyBkYXRhOiB7IG1lc3NhZ2UgfSB9KSA9PiB0aGlzLmhhbmRsZVN1YnNjcmliZUZhaWxlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzZXR0aW5nc0NoYW5nZWQnLCAoZXZlbnQpID0+IHRoaXMub25TZXR0aW5nc0NoYW5nZWQoZXZlbnQpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcigncGxheWVyQ291bnQnLCAoeyBkYXRhOiB7IGNvdW50IH0gfSkgPT4gdGhpcy5vblBsYXllckNvdW50KGNvdW50KSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y1RDUFJlbGF5RGV0ZWN0ZWQnLCAoKSA9PiBMb2dnZXIuV2FybmluZyhgU3RyZWFtIHF1YWlsdHkgZGVncmFkZWQgZHVlIHRvIG5ldHdvcmsgZW52aXJvbWVudCwgc3RyZWFtIGlzIHJlbGF5ZWQgb3ZlciBUQ1AuYCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdzaG93T25TY3JlZW5LZXlib2FyZCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gT25seSBzaG93IHRoZSBlZGl0IHRleHQgbW9kYWwgaWYgdGhlIGZsYWcgaXMgZW5hYmxlZFxuICAgICAgICAgICAgaWYgKCF0aGlzLnN0cmVhbS5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Vc2VNb2RhbEZvclRleHRJbnB1dCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBldnREYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGlmIChldnREYXRhLnNob3dPblNjcmVlbktleWJvYXJkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RWRpdFRleHRNb2RhbChldnREYXRhLmNvbnRlbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvb3RFbGVtZW50IG9mIHRoZSBhcHBsaWNhdGlvbiwgdmlkZW8gc3RyZWFtIGFuZCBhbGwgVUkgYXJlIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gdGhpcy5jcmVhdGVSb290RWxlbWVudCh0aGlzLnN0cmVhbSwgdGhpcy51aUZlYXR1cmVzRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSBQaXhlbCBTdHJlYW1pbmcgVUkuXG4gICAgICogTm90ZTogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgUGl4ZWwgU3RyZWFtaW5nIG9iamVjdCBpcyBjcmVhdGVkLlxuICAgICAqIEBwYXJhbSBwaXhlbHN0cmVhbWluZyAtIFRoZSBQaXhlbCBTdHJlYW1pbmcgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB1aUZlYXR1cmVzRWxlbSAtIFRoZSBlbGVtZW50IGhvbGRpbmcgYWxsIHRoZSBjdXN0b20gVUkgZmVhdHVyZXMuXG4gICAgICogQHJldHVybnMgQSBkaXYgd2l0aCB0aGUgaWQgI3BsYXllclVJIHBvcHVsYXRlZCB3aXRoIHZpZGVvRWxlbWVudFBhcmVudCBhbmQgdWlGZWF0dXJlRWxlbWVudC5cbiAgICAgKi9cbiAgICBjcmVhdGVSb290RWxlbWVudChwaXhlbHN0cmVhbWluZywgdWlGZWF0dXJlc0VsZW0pIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbGVtLmlkID0gJ3BsYXllclVJJztcbiAgICAgICAgZWxlbS5jbGFzc0xpc3QuYWRkKCdub3NlbGVjdCcpO1xuICAgICAgICBpZiAocGl4ZWxzdHJlYW1pbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgY3JlYXRlIHJvb3QgZWxlbWVudCBwcm9wZXJseSAtIHBpeGVsc3RyZWFtaW5nIG9iamVjdCB3YXMgdW5kZWZpbmVkLiBBcmUgeW91IGNhbGxpbmcgdGhpcyB0b28gZWFybHk/Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBpeGVsc3RyZWFtaW5nLnZpZGVvRWxlbWVudFBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBjcmVhdGUgcm9vdCBlbGVtZW50IHByb3Blcmx5IC0gdmlkZW9FbGVtZW50UGFyZW50IG9iamVjdCB3YXMgdW5kZWZpbmVkLiBBcmUgeW91IGNhbGxpbmcgdGhpcyB0b28gZWFybHk/Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVpRmVhdHVyZXNFbGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGNyZWF0ZSByb290IGVsZW1lbnQgcHJvcGVybHkgLSB1aUZlYXR1cmVzRWxlbWVudCBvYmplY3Qgd2FzIHVuZGVmaW5lZC4gQXJlIHlvdSBjYWxsaW5nIHRoaXMgdG9vIGVhcmx5PycpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQocGl4ZWxzdHJlYW1pbmcudmlkZW9FbGVtZW50UGFyZW50KTtcbiAgICAgICAgZWxlbS5hcHBlbmRDaGlsZCh1aUZlYXR1cmVzRWxlbSk7XG4gICAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgYWxsIHRoZSBVSSBmZWF0dXJlcywgbGlrZSB0aGUgc3RhdHMgYW5kIHNldHRpbmdzIHBhbmVscy5cbiAgICAgKi9cbiAgICBnZXQgdWlGZWF0dXJlc0VsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdWlGZWF0dXJlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fdWlGZWF0dXJlRWxlbWVudCA9IHRoaXMuY3JlYXRlVUlGZWF0dXJlc0VsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdWlGZWF0dXJlRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgVUkgZmVhdHVyZXMgZWxlbWVudCBmb3IgaG9sZGluZyBhbGwgdGhlIGN1c3RvbSBVSSBmZWF0dXJlcy5cbiAgICAgKiBAcmV0dXJucyBBIGRpdiB3aXRoIHRoZSBpZCAjdWlGZWF0dXJlcy5cbiAgICAgKi9cbiAgICBjcmVhdGVVSUZlYXR1cmVzRWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlbGVtLmlkID0gJ3VpRmVhdHVyZXMnO1xuICAgICAgICByZXR1cm4gZWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIGRpc2Nvbm5lY3Qgb3ZlcmxheVxuICAgICAqIEBwYXJhbSB1cGRhdGVUZXh0IC0gdGhlIHRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIHNob3dEaXNjb25uZWN0T3ZlcmxheSh1cGRhdGVUZXh0KSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgICAgIHRoaXMudXBkYXRlRGlzY29ubmVjdE92ZXJsYXkodXBkYXRlVGV4dCk7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdE92ZXJsYXkuc2hvdygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5ID0gdGhpcy5kaXNjb25uZWN0T3ZlcmxheTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBkaXNjb25uZWN0IG92ZXJsYXlzIHNwYW4gdGV4dFxuICAgICAqIEBwYXJhbSB1cGRhdGVUZXh0IC0gdGhlIG5ldyBjb3VudGRvd24gbnVtYmVyXG4gICAgICovXG4gICAgdXBkYXRlRGlzY29ubmVjdE92ZXJsYXkodXBkYXRlVGV4dCkge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPdmVybGF5LnVwZGF0ZSh1cGRhdGVUZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBkaXNjb25uZWN0IG92ZXJsYXlzIGFjdGlvblxuICAgICAqL1xuICAgIG9uRGlzY29ubmVjdGlvbkFjdGlvbigpIHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0T3ZlcmxheS5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWRlcyB0aGUgY3VycmVudCBvdmVybGF5XG4gICAgICovXG4gICAgaGlkZUN1cnJlbnRPdmVybGF5KCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50T3ZlcmxheSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5LmhpZGUoKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3dzIHRoZSBjb25uZWN0IG92ZXJsYXlcbiAgICAgKi9cbiAgICBzaG93Q29ubmVjdE92ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgICAgIHRoaXMuY29ubmVjdE92ZXJsYXkuc2hvdygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5ID0gdGhpcy5jb25uZWN0T3ZlcmxheTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIHBsYXkgb3ZlcmxheVxuICAgICAqL1xuICAgIHNob3dQbGF5T3ZlcmxheSgpIHtcbiAgICAgICAgdGhpcy5oaWRlQ3VycmVudE92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5wbGF5T3ZlcmxheS5zaG93KCk7XG4gICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSB0aGlzLnBsYXlPdmVybGF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgdGV4dCBvdmVybGF5XG4gICAgICogQHBhcmFtIHRleHQgLSB0aGUgdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIG92ZXJsYXlcbiAgICAgKi9cbiAgICBzaG93VGV4dE92ZXJsYXkodGV4dCkge1xuICAgICAgICB0aGlzLmhpZGVDdXJyZW50T3ZlcmxheSgpO1xuICAgICAgICB0aGlzLmluZm9PdmVybGF5LnVwZGF0ZSh0ZXh0KTtcbiAgICAgICAgdGhpcy5pbmZvT3ZlcmxheS5zaG93KCk7XG4gICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSB0aGlzLmluZm9PdmVybGF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgZXJyb3Igb3ZlcmxheVxuICAgICAqIEBwYXJhbSB0ZXh0IC0gdGhlIHRleHQgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBvdmVybGF5XG4gICAgICovXG4gICAgc2hvd0Vycm9yT3ZlcmxheSh0ZXh0KSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgICAgIHRoaXMuZXJyb3JPdmVybGF5LnVwZGF0ZSh0ZXh0KTtcbiAgICAgICAgdGhpcy5lcnJvck92ZXJsYXkuc2hvdygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5ID0gdGhpcy5lcnJvck92ZXJsYXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSBzZXR0aW5ncyBwYW5lbCBpZiBjbGlja2VkXG4gICAgICovXG4gICAgc2V0dGluZ3NDbGlja2VkKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuc3RhdHNQYW5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsLnRvZ2dsZVZpc2liaWxpdHkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3Mgb3IgaGlkZXMgdGhlIHN0YXRzIHBhbmVsIGlmIGNsaWNrZWRcbiAgICAgKi9cbiAgICBzdGF0c0NsaWNrZWQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5zZXR0aW5nc1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZSgpO1xuICAgICAgICB0aGlzLnN0YXRzUGFuZWwudG9nZ2xlVmlzaWJpbGl0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZXMgdGhlIGNvbm5lY3Qgb3ZlcmxheXMgYWN0aW9uXG4gICAgICovXG4gICAgb25Db25uZWN0QWN0aW9uKCkge1xuICAgICAgICB0aGlzLmNvbm5lY3RPdmVybGF5LmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgcGxheSBvdmVybGF5cyBhY3Rpb25cbiAgICAgKi9cbiAgICBvblBsYXlBY3Rpb24oKSB7XG4gICAgICAgIHRoaXMucGxheU92ZXJsYXkuYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIGFmayBvdmVybGF5XG4gICAgICogQHBhcmFtIGNvdW50RG93biAtIHRoZSBjb3VudGRvd24gbnVtYmVyIGZvciB0aGUgYWZrIGNvdW50ZG93blxuICAgICAqL1xuICAgIHNob3dBZmtPdmVybGF5KGNvdW50RG93biwgZGlzbWlzc0Fmaykge1xuICAgICAgICB0aGlzLmhpZGVDdXJyZW50T3ZlcmxheSgpO1xuICAgICAgICB0aGlzLmFma092ZXJsYXkudXBkYXRlQ291bnRkb3duKGNvdW50RG93bik7XG4gICAgICAgIHRoaXMuYWZrT3ZlcmxheS5vbkFjdGlvbigoKSA9PiBkaXNtaXNzQWZrKCkpO1xuICAgICAgICB0aGlzLmFma092ZXJsYXkuc2hvdygpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPdmVybGF5ID0gdGhpcy5hZmtPdmVybGF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93IHRoZSBDb25uZWN0IE92ZXJsYXkgb3IgYXV0byBjb25uZWN0XG4gICAgICovXG4gICAgc2hvd0Nvbm5lY3RPckF1dG9Db25uZWN0T3ZlcmxheXMoKSB7XG4gICAgICAgIC8vIHNldCB1cCBpZiB0aGUgYXV0byBwbGF5IHdpbGwgYmUgdXNlZCBvciByZWd1bGFyIGNsaWNrIHRvIHN0YXJ0XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW0uY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQXV0b0Nvbm5lY3QpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dDb25uZWN0T3ZlcmxheSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgdGhlIHdlYlJ0Y0F1dG9Db25uZWN0IE92ZXJsYXkgYW5kIGNvbm5lY3RcbiAgICAgKi9cbiAgICBvbldlYlJ0Y0F1dG9Db25uZWN0KCkge1xuICAgICAgICB0aGlzLnNob3dUZXh0T3ZlcmxheSgnQXV0byBDb25uZWN0aW5nIE5vdycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiByZWNlaXZpbmcgYSB3ZWJSVEMgYW5zd2VyXG4gICAgICovXG4gICAgb25XZWJSdGNTZHAoKSB7XG4gICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5KCdXZWJSVEMgQ29ubmVjdGlvbiBOZWdvdGlhdGVkJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3dzIGEgdGV4dCBvdmVybGF5IHRvIGFsZXJ0IHRoZSB1c2VyIHRoZSBzdHJlYW0gaXMgY3VycmVudGx5IGxvYWRpbmdcbiAgICAgKi9cbiAgICBvblN0cmVhbUxvYWRpbmcoKSB7XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBzcGlubmVyIHNwYW5cbiAgICAgICAgY29uc3Qgc3Bpbm5lclNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHNwaW5uZXJTcGFuLmNsYXNzTmFtZSA9ICd2aXN1YWxseS1oaWRkZW4nO1xuICAgICAgICBzcGlubmVyU3Bhbi5pbm5lckhUTUwgPSAnTG9hZGluZy4uLic7XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBzcGlubmVyIGRpdlxuICAgICAgICBjb25zdCBzcGlubmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHNwaW5uZXJEaXYuaWQgPSAnbG9hZGluZy1zcGlubmVyJztcbiAgICAgICAgc3Bpbm5lckRpdi5jbGFzc05hbWUgPSAnc3Bpbm5lci1ib3JkZXIgbXMtMic7XG4gICAgICAgIHNwaW5uZXJEaXYuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3N0YXR1cycpO1xuICAgICAgICAvLyBhcHBlbmQgdGhlIHNwaW5uZXIgdG8gdGhlIGVsZW1lbnRcbiAgICAgICAgc3Bpbm5lckRpdi5hcHBlbmRDaGlsZChzcGlubmVyU3Bhbik7XG4gICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5KCdMb2FkaW5nIFN0cmVhbSAnICsgc3Bpbm5lckRpdi5vdXRlckhUTUwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmVudCBmaXJlZCB3aGVuIHRoZSB2aWRlbyBpcyBkaXNjb25uZWN0ZWQgLSBkaXNwbGF5cyB0aGUgZXJyb3Igb3ZlcmxheSBhbmQgcmVzZXRzIHRoZSBidXR0b25zIHN0cmVhbSB0b29scyB1cG9uIGRpc2Nvbm5lY3RcbiAgICAgKiBAcGFyYW0gZXZlbnRTdHJpbmcgLSB0aGUgZXZlbnQgdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gYWxsb3dDbGlja1RvUmVjb25uZWN0IC0gdHJ1ZSBpZiB3ZSB3YW50IHRvIGFsbG93IHRoZSB1c2VyIHRvIGNsaWNrIHRvIHJlY29ubmVjdC4gT3RoZXJ3aXNlIGl0J3MganVzdCBhIG1lc3NhZ2UuXG4gICAgICovXG4gICAgb25EaXNjb25uZWN0KGV2ZW50U3RyaW5nLCBhbGxvd0NsaWNrVG9SZWNvbm5lY3QpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBvdmVybGF5TWVzc2FnZSA9ICdEaXNjb25uZWN0ZWQnICsgKGV2ZW50U3RyaW5nID8gYDogJHtldmVudFN0cmluZ31gIDogJy4nKTtcbiAgICAgICAgaWYgKGFsbG93Q2xpY2tUb1JlY29ubmVjdCkge1xuICAgICAgICAgICAgdGhpcy5zaG93RGlzY29ubmVjdE92ZXJsYXkoYCR7b3ZlcmxheU1lc3NhZ2V9IENsaWNrIFRvIFJlc3RhcnQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvck92ZXJsYXkob3ZlcmxheU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRpc2FibGUgc3RhcnRpbmcgYSBsYXRlbmN5IGNoZWNrc1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vbkRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIFdlYiBSdGMgaXMgY29ubmVjdGluZ1xuICAgICAqL1xuICAgIG9uV2ViUnRjQ29ubmVjdGluZygpIHtcbiAgICAgICAgdGhpcy5zaG93VGV4dE92ZXJsYXkoJ1N0YXJ0aW5nIGNvbm5lY3Rpb24gdG8gc2VydmVyLCBwbGVhc2Ugd2FpdCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gV2ViIFJ0YyBoYXMgY29ubmVjdGVkXG4gICAgICovXG4gICAgb25XZWJSdGNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5KCdXZWJSVEMgY29ubmVjdGVkLCB3YWl0aW5nIGZvciB2aWRlbycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gV2ViIFJ0YyBmYWlscyB0byBjb25uZWN0XG4gICAgICovXG4gICAgb25XZWJSdGNGYWlsZWQoKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yT3ZlcmxheSgnVW5hYmxlIHRvIHNldHVwIHZpZGVvJyk7XG4gICAgfVxuICAgIG9uTG9hZEZyZWV6ZUZyYW1lKHNob3VsZFNob3dQbGF5T3ZlcmxheSkge1xuICAgICAgICBpZiAoc2hvdWxkU2hvd1BsYXlPdmVybGF5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnc2hvd2luZyBwbGF5IG92ZXJsYXknKTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BsYXlPdmVybGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25QbGF5U3RyZWFtKCkge1xuICAgICAgICB0aGlzLmhpZGVDdXJyZW50T3ZlcmxheSgpO1xuICAgIH1cbiAgICBvblBsYXlTdHJlYW1FcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yT3ZlcmxheShtZXNzYWdlKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICAgIG9uUGxheVN0cmVhbVJlamVjdGVkKG9uUmVqZWN0ZWRSZWFzb24pIHtcbiAgICAgICAgdGhpcy5zaG93UGxheU92ZXJsYXkoKTtcbiAgICB9XG4gICAgb25WaWRlb0luaXRpYWxpemVkKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW0uY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQXV0b1BsYXlWaWRlbykpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BsYXlPdmVybGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgKF9hID0gdGhpcy5zdGF0c1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub25WaWRlb0luaXRpYWxpemVkKHRoaXMuc3RyZWFtKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHVwIGZ1bmN0aW9uYWxpdHkgdG8gaGFwcGVuIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGF2ZXJhZ2UgdmlkZW8gZW5jb2RlciBxcFxuICAgICAqIEBwYXJhbSBRUCAtIHRoZSBxdWFsaXR5IG51bWJlciBvZiB0aGUgc3RyZWFtXG4gICAgICovXG4gICAgb25WaWRlb0VuY29kZXJBdmdRUChRUCkge1xuICAgICAgICAvLyBVcGRhdGUgaW50ZXJuYWwgUVAgaW5kaWNhdG9yIGlmIG9uZSBpcyBwcmVzZW50XG4gICAgICAgIGlmICh0aGlzLnZpZGVvUXBJbmRpY2F0b3IpIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9RcEluZGljYXRvci51cGRhdGVRcFRvb2x0aXAoUVApO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uSW5pdGlhbFNldHRpbmdzKHNldHRpbmdzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHNldHRpbmdzLlBpeGVsU3RyZWFtaW5nU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMuc3RhdHNQYW5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbmZpZ3VyZShzZXR0aW5ncy5QaXhlbFN0cmVhbWluZ1NldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblN0YXRzUmVjZWl2ZWQoYWdncmVnYXRlZFN0YXRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgLy8gR3JhYiBhbGwgc3RhdHMgd2UgY2FuIG9mZiB0aGUgYWdncmVnYXRlZCBzdGF0c1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYW5kbGVTdGF0cyhhZ2dyZWdhdGVkU3RhdHMpO1xuICAgIH1cbiAgICBvbkxhdGVuY3lVcGRhdGUobGF0ZW5jeUluZm8pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYW5kbGVMYXRlbmN5SW5mbyhsYXRlbmN5SW5mbyk7XG4gICAgfVxuICAgIG9uTGF0ZW5jeVRlc3RSZXN1bHRzKGxhdGVuY3lUaW1pbmdzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5zdGF0c1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGF0ZW5jeVRlc3QuaGFuZGxlVGVzdFJlc3VsdChsYXRlbmN5VGltaW5ncyk7XG4gICAgfVxuICAgIG9uRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdHMocmVzdWx0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5zdGF0c1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5oYW5kbGVUZXN0UmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuICAgIG9uUGxheWVyQ291bnQocGxheWVyQ291bnQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oYW5kbGVQbGF5ZXJDb3VudChwbGF5ZXJDb3VudCk7XG4gICAgfVxuICAgIGhhbmRsZVN0cmVhbWVyTGlzdE1lc3NhZ2UobWVzc2FnZVN0cmVhbWluZ0xpc3QsIGF1dG9TZWxlY3RlZFN0cmVhbWVySWQsIHdhbnRlZFN0cmVhbWVySWQpIHtcbiAgICAgICAgY29uc3Qgd2FpdEZvclN0cmVhbWVyID0gdGhpcy5zdHJlYW0uY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuV2FpdEZvclN0cmVhbWVyKTtcbiAgICAgICAgY29uc3QgaXNSZWNvbm5lY3RpbmcgPSB0aGlzLnN0cmVhbS5pc1JlY29ubmVjdGluZygpO1xuICAgICAgICBsZXQgbWVzc2FnZSA9IG51bGw7XG4gICAgICAgIGxldCBhbGxvd1Jlc3RhcnQgPSB0cnVlO1xuICAgICAgICBpZiAoIWF1dG9TZWxlY3RlZFN0cmVhbWVySWQpIHtcbiAgICAgICAgICAgIGlmICh3YWl0Rm9yU3RyZWFtZXIgJiYgd2FudGVkU3RyZWFtZXJJZCkge1xuICAgICAgICAgICAgICAgIGlmIChpc1JlY29ubmVjdGluZykge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFdhaXRpbmcgZm9yICR7d2FudGVkU3RyZWFtZXJJZH0gdG8gYmVjb21lIGF2YWlsYWJsZS5gO1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgR2F2ZSB1cCB3YWl0aW5nIGZvciAke3dhbnRlZFN0cmVhbWVySWR9IHRvIGJlY29tZSBhdmFpbGFibGUuIENsaWNrIHRvIHRyeSBhZ2FpbmA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlU3RyZWFtaW5nTGlzdC5pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSArPSBgIG9yIHNlbGVjdCBhIHN0cmVhbWVyIGZyb20gdGhlIHNldHRpbmdzIG1lbnUuYDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2VTdHJlYW1pbmdMaXN0Lmlkcy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpc1JlY29ubmVjdGluZykge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFdhaXRpbmcgZm9yIGEgc3RyZWFtZXIgdG8gYmVjb21lIGF2YWlsYWJsZS5gO1xuICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgTm8gc3RyZWFtZXJzIGF2YWlsYWJsZS4gQ2xpY2sgdG8gdHJ5IGFnYWluLmA7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93UmVzdGFydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBNdWx0aXBsZSBzdHJlYW1lcnMgYXZhaWxhYmxlLiBTZWxlY3Qgb25lIGZyb20gdGhlIHNldHRpbmdzIG1lbnUuYDtcbiAgICAgICAgICAgICAgICBhbGxvd1Jlc3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbGxvd1Jlc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dEaXNjb25uZWN0T3ZlcmxheShtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5KG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVN1YnNjcmliZUZhaWxlZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICB0aGlzLnNob3dEaXNjb25uZWN0T3ZlcmxheShgU3Vic2NyaWJlIGZhaWxlZDogXCIke21lc3NhZ2V9XCIgQ2xpY2sgdG8gdHJ5IGFnYWluYCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBsaWdodC9kYXJrIGNvbG9yIG1vZGVcbiAgICAgKiBAcGFyYW0gaXNMaWdodE1vZGUgLSBzaG91bGQgd2UgdXNlIGEgbGlnaHQgb3IgZGFyayBjb2xvciBzY2hlbWVcbiAgICAgKi9cbiAgICBzZXRDb2xvck1vZGUoaXNMaWdodE1vZGUpIHtcbiAgICAgICAgaWYgKHRoaXMub25Db2xvck1vZGVDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ29sb3JNb2RlQ2hhbmdlZChpc0xpZ2h0TW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2hvd0VkaXRUZXh0TW9kYWwodWVUZXh0Ym94Q29udGVudHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBSZW1vdmUgYW55IGV4aXN0aW5nIG1vZGFsXG4gICAgICAgIChfYSA9IHRoaXMuZWRpdFRleHRNb2RhbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJvb3RFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAvLyBNYWtlIGEgbmV3IG1vZGFsIGZvciBlZGl0aW5nIHRoZSBVRSB0ZXh0Ym94IG9uIHRoZSBicm93c2VyIHNpZGVcbiAgICAgICAgdGhpcy5lZGl0VGV4dE1vZGFsID0gbmV3IEVkaXRUZXh0TW9kYWwoKTtcbiAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSByb290IG9mIHRoZSBQaXhlbCBTdHJlYW1pbmcgYXBwbGljYXRpb25cbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5hcHBlbmQodGhpcy5lZGl0VGV4dE1vZGFsLnJvb3RFbGVtZW50KTtcbiAgICAgICAgLy8gQWRkIHRoZSB0ZXh0IGNvbnRlbnQgZnJvbSBVRSBzaWRlIGFuZCBzdW1tb24gb24tc2NyZWVuIGtleWJvYXJkXG4gICAgICAgIHRoaXMuZWRpdFRleHRNb2RhbC5zaG93TW9kYWwodWVUZXh0Ym94Q29udGVudHMpO1xuICAgICAgICAvLyBCaW5kIHRvIHRoZSBjb25maXJtIGV2ZW50XG4gICAgICAgIHRoaXMuZWRpdFRleHRNb2RhbC5ldmVudHMuYWRkRXZlbnRMaXN0ZW5lcignZWRpdENvbmZpcm1lZCcsIChldnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRUZXh0RXZlbnQgPSBldnQ7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbS5zZW5kVGV4dGJveEVudHJ5KGVkaXRUZXh0RXZlbnQuY29uZmlybWVkVGV4dCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvblNldHRpbmdzQ2hhbmdlZChldmVudCkge1xuICAgICAgICAvLyBQYXNzIHRoZSBldmVudCBkaXJlY3RseSBvbnRvIHRoZSBjb25maWdVSS4gVGhpcyB3aWxsIGRvIHRoaW5ncyBsaWtlIHVwZGF0aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgICAgLy8gYXMgd2VsbCBhcyB0aGUgc2VsZWN0ZWQgdmFsdWVcbiAgICAgICAgdGhpcy5jb25maWdVSS5vblNldHRpbmdzQ2hhbmdlZChldmVudCk7XG4gICAgICAgIGNvbnN0IHsgXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgICAgICAgZGF0YTogeyBpZCwgdGFyZ2V0LCB0eXBlIH0gfSA9IGV2ZW50O1xuICAgICAgICAvLyBFeHBsaWNpdGx5IGhhbmRsZSBzcGVjaWZpYyBzZXR0aW5nIGJlaGF2aW91clxuICAgICAgICBpZiAoaWQgPT0gT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5KSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmZXJyZWRRdWFsaXR5T3B0aW9uID0gdGhpcy5zdHJlYW0uY29uZmlnLmdldFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5KTtcbiAgICAgICAgICAgIGlmIChbLi4ucHJlZmVycmVkUXVhbGl0eU9wdGlvbi5vcHRpb25zXS5pbmNsdWRlcygnRGVmYXVsdCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdVSS5kaXNhYmxlU2V0dGluZyhPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWdVSS5lbmFibGVTZXR0aW5nKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1BcHBsaWNhdGlvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgVGV4dFBhcmFtZXRlcnMsIE9wdGlvblBhcmFtZXRlcnMsIEZsYWdzLCBOdW1lcmljUGFyYW1ldGVycywgU2V0dGluZ0ZsYWcsIExvZ2dlciwgaXNGbGFnSWQsIGlzTnVtZXJpY0lkLCBpc1RleHRJZCwgaXNPcHRpb25JZCB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgU2V0dGluZ1VJRmxhZyB9IGZyb20gJy4vU2V0dGluZ1VJRmxhZyc7XG5pbXBvcnQgeyBTZXR0aW5nVUlOdW1iZXIgfSBmcm9tICcuL1NldHRpbmdVSU51bWJlcic7XG5pbXBvcnQgeyBTZXR0aW5nVUlUZXh0IH0gZnJvbSAnLi9TZXR0aW5nVUlUZXh0JztcbmltcG9ydCB7IFNldHRpbmdVSU9wdGlvbiB9IGZyb20gJy4vU2V0dGluZ1VJT3B0aW9uJztcbmltcG9ydCB7IEV4dHJhRmxhZ3MsIGlzU2VjdGlvbkVuYWJsZWQsIGlzU2V0dGluZ0VuYWJsZWQsIFNldHRpbmdzU2VjdGlvbnMgfSBmcm9tICcuLi9VSS9VSUNvbmZpZ3VyYXRpb25UeXBlcyc7XG5leHBvcnQgY2xhc3MgQ29uZmlnVUkge1xuICAgIC8vIC0tLS0tLS0tLS0tLSBTZXR0aW5ncyAtLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICB0aGlzLmN1c3RvbUZsYWdzID0gbmV3IE1hcCgpO1xuICAgICAgICAvKiBBIG1hcCBvZiBmbGFncyB0aGF0IGNhbiBiZSB0b2dnbGVkIC0gb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4gdGhlIGFwcGxpY2F0aW9uIC0gZS5nLiBVc2UgTWljPyAqL1xuICAgICAgICB0aGlzLmZsYWdzVWkgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8qIEEgbWFwIG9mIG51bWVyaWNhbCBzZXR0aW5ncyAtIG9wdGlvbnMgdGhhdCBjYW4gYmUgaW4gdGhlIGFwcGxpY2F0aW9uIC0gZS5nLiBNaW5CaXRyYXRlICovXG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaSA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgdGV4dCBzZXR0aW5ncyAtIGUuZy4gc2lnbmFsbGluZyBzZXJ2ZXIgdXJsICovXG4gICAgICAgIHRoaXMudGV4dFBhcmFtZXRlcnNVaSA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgZW51bSBiYXNlZCBzZXR0aW5ncyAtIGUuZy4gcHJlZmVycmVkIGNvZGVjICovXG4gICAgICAgIHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZUN1c3RvbVVJU2V0dGluZ3MoY29uZmlnLnVzZVVybFBhcmFtcyk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJTZXR0aW5nc1VJQ29tcG9uZW50cyhjb25maWcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgY3VzdG9tIFVJIHNldHRpbmdzIHRoYXQgYXJlIG5vdCBwcm92aWRlZCBieSB0aGUgUGl4ZWwgU3RyZWFtaW5nIGxpYnJhcnkuXG4gICAgICovXG4gICAgY3JlYXRlQ3VzdG9tVUlTZXR0aW5ncyh1c2VVcmxQYXJhbXMpIHtcbiAgICAgICAgdGhpcy5jdXN0b21GbGFncy5zZXQoRXh0cmFGbGFncy5MaWdodE1vZGUsIG5ldyBTZXR0aW5nRmxhZyhFeHRyYUZsYWdzLkxpZ2h0TW9kZSwgJ0NvbG9yIFNjaGVtZTogRGFyayBNb2RlJywgJ1BhZ2Ugc3R5bGluZyB3aWxsIGJlIGVpdGhlciBsaWdodCBvciBkYXJrJywgZmFsc2UgLyppZiB3YW50IHRvIHVzZSBzeXN0ZW0gcHJlZjogKHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KScpLm1hdGNoZXMpKi8sIHVzZVVybFBhcmFtcywgKGlzTGlnaHRNb2RlLCBzZXR0aW5nKSA9PiB7XG4gICAgICAgICAgICBzZXR0aW5nLmxhYmVsID0gYENvbG9yIFNjaGVtZTogJHtpc0xpZ2h0TW9kZSA/ICdMaWdodCcgOiAnRGFyayd9IE1vZGVgO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgVUkgd3JhcHBlciBjb21wb25lbnRzIGZvciBlYWNoIHNldHRpbmcgZWxlbWVudCBpbiBjb25maWcuXG4gICAgICogQHBhcmFtIGNvbmZpZyAtXG4gICAgICovXG4gICAgcmVnaXN0ZXJTZXR0aW5nc1VJQ29tcG9uZW50cyhjb25maWcpIHtcbiAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGNvbmZpZy5nZXRGbGFncygpKSB7XG4gICAgICAgICAgICB0aGlzLmZsYWdzVWkuc2V0KHNldHRpbmcuaWQsIG5ldyBTZXR0aW5nVUlGbGFnKHNldHRpbmcpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgQXJyYXkuZnJvbSh0aGlzLmN1c3RvbUZsYWdzLnZhbHVlcygpKSkge1xuICAgICAgICAgICAgdGhpcy5mbGFnc1VpLnNldChzZXR0aW5nLmlkLCBuZXcgU2V0dGluZ1VJRmxhZyhzZXR0aW5nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGNvbmZpZy5nZXRUZXh0U2V0dGluZ3MoKSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0UGFyYW1ldGVyc1VpLnNldChzZXR0aW5nLmlkLCBuZXcgU2V0dGluZ1VJVGV4dChzZXR0aW5nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGNvbmZpZy5nZXROdW1lcmljU2V0dGluZ3MoKSkge1xuICAgICAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLnNldChzZXR0aW5nLmlkLCBuZXcgU2V0dGluZ1VJTnVtYmVyKHNldHRpbmcpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgY29uZmlnLmdldE9wdGlvblNldHRpbmdzKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLnNldChzZXR0aW5nLmlkLCBuZXcgU2V0dGluZ1VJT3B0aW9uKHNldHRpbmcpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlIERPTSBlbGVtZW50cyBmb3IgYSBzZXR0aW5ncyBzZWN0aW9uIHdpdGggYSBoZWFkaW5nLlxuICAgICAqIEBwYXJhbSBzZXR0aW5nc0VsZW0gLSBUaGUgcGFyZW50IGNvbnRhaW5lciBmb3Igb3VyIERPTSBlbGVtZW50cy5cbiAgICAgKiBAcGFyYW0gc2VjdGlvbkhlYWRpbmcgLSBUaGUgaGVhZGluZyBlbGVtZW50IHRvIGdvIGludG8gdGhlIHNlY3Rpb24uXG4gICAgICogQHJldHVybnMgVGhlIGNvbnN0cnVjdGVkIERPTSBlbGVtZW50IGZvciB0aGUgc2VjdGlvbi5cbiAgICAgKi9cbiAgICBidWlsZFNlY3Rpb25XaXRoSGVhZGluZyhzZXR0aW5nc0VsZW0sIHNlY3Rpb25IZWFkaW5nKSB7XG4gICAgICAgIC8vIG1ha2Ugc2VjdGlvbiBlbGVtZW50XG4gICAgICAgIGNvbnN0IHNlY3Rpb25FbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xuICAgICAgICBzZWN0aW9uRWxlbS5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nc0NvbnRhaW5lcicpO1xuICAgICAgICAvLyBtYWtlIHNlY3Rpb24gaGVhZGluZ1xuICAgICAgICBjb25zdCBwc1NldHRpbmdzSGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHBzU2V0dGluZ3NIZWFkZXIuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NIZWFkZXInKTtcbiAgICAgICAgcHNTZXR0aW5nc0hlYWRlci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy10ZXh0Jyk7XG4gICAgICAgIHBzU2V0dGluZ3NIZWFkZXIudGV4dENvbnRlbnQgPSBzZWN0aW9uSGVhZGluZztcbiAgICAgICAgLy8gYWRkIHNlY3Rpb24gYW5kIGhlYWRpbmcgdG8gcGFyZW50IHNldHRpbmdzIGVsZW1lbnRcbiAgICAgICAgc2VjdGlvbkVsZW0uYXBwZW5kQ2hpbGQocHNTZXR0aW5nc0hlYWRlcik7XG4gICAgICAgIHNldHRpbmdzRWxlbS5hcHBlbmRDaGlsZChzZWN0aW9uRWxlbSk7XG4gICAgICAgIHJldHVybiBzZWN0aW9uRWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0dXAgZmxhZ3Mgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGBDb25maWcuZmxhZ3NgIG1hcC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3NFbGVtIC0gLSBUaGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5kaXZpZHVhbCBzZXR0aW5ncyBzZWN0aW9ucywgZmxhZ3MsIGFuZCBzbyBvbi5cbiAgICAgKi9cbiAgICBwb3B1bGF0ZVNldHRpbmdzRWxlbWVudChzZXR0aW5nc0VsZW0sIHNldHRpbmdzQ29uZmlnKSB7XG4gICAgICAgIGlmIChpc1NlY3Rpb25FbmFibGVkKHNldHRpbmdzQ29uZmlnLCBTZXR0aW5nc1NlY3Rpb25zLlBpeGVsU3RyZWFtaW5nKSkge1xuICAgICAgICAgICAgLyogU2V0dXAgYWxsIFBpeGVsIFN0cmVhbWluZyBzcGVjaWZpYyBzZXR0aW5ncyAqL1xuICAgICAgICAgICAgY29uc3QgcHNTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5QaXhlbFN0cmVhbWluZyk7XG4gICAgICAgICAgICAvLyBtYWtlIHNldHRpbmdzIHNob3cgdXAgaW4gRE9NXG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgVGV4dFBhcmFtZXRlcnMuU2lnbmFsbGluZ1NlcnZlclVybCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nVGV4dChwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy50ZXh0UGFyYW1ldGVyc1VpLmdldChUZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdPcHRpb24ocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLmdldChPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5BdXRvQ29ubmVjdCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5BdXRvQ29ubmVjdCkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkF1dG9QbGF5VmlkZW8pKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuQXV0b1BsYXlWaWRlbykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLlVzZU1pYykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5Vc2VNaWMpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5Vc2VDYW1lcmEpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuVXNlQ2FtZXJhKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuU3RhcnRWaWRlb011dGVkKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLlN0YXJ0VmlkZW9NdXRlZCkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXIpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuSXNRdWFsaXR5Q29udHJvbGxlcikpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkZvcmNlTW9ub0F1ZGlvKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLkZvcmNlTW9ub0F1ZGlvKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuRm9yY2VUVVJOKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLkZvcmNlVFVSTikpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLlN1cHByZXNzQnJvd3NlcktleXMpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuU3VwcHJlc3NCcm93c2VyS2V5cykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkFGS0RldGVjdGlvbikpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5BRktEZXRlY3Rpb24pKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5XYWl0Rm9yU3RyZWFtZXIpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuV2FpdEZvclN0cmVhbWVyKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ051bWVyaWMocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5BRktDb3VudGRvd25TZWNzKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdOdW1lcmljKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLkFGS0NvdW50ZG93blNlY3MpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLlN0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1NlY3Rpb25FbmFibGVkKHNldHRpbmdzQ29uZmlnLCBTZXR0aW5nc1NlY3Rpb25zLlVJKSkge1xuICAgICAgICAgICAgLyogU2V0dXAgYWxsIHZpZXcvdWkgcmVsYXRlZCBzZXR0aW5ncyB1bmRlciB0aGlzIHNlY3Rpb24gKi9cbiAgICAgICAgICAgIGNvbnN0IHZpZXdTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5VSSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb24pKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcodmlld1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbikpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkhvdmVyaW5nTW91c2VNb2RlKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHZpZXdTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBFeHRyYUZsYWdzLkxpZ2h0TW9kZSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyh2aWV3U2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEV4dHJhRmxhZ3MuTGlnaHRNb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU2VjdGlvbkVuYWJsZWQoc2V0dGluZ3NDb25maWcsIFNldHRpbmdzU2VjdGlvbnMuSW5wdXQpKSB7XG4gICAgICAgICAgICAvKiBTZXR1cCBhbGwgZW5jb2RlciByZWxhdGVkIHNldHRpbmdzIHVuZGVyIHRoaXMgc2VjdGlvbiAqL1xuICAgICAgICAgICAgY29uc3QgaW5wdXRTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5JbnB1dCk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuS2V5Ym9hcmRJbnB1dCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhpbnB1dFNldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5LZXlib2FyZElucHV0KSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuTW91c2VJbnB1dCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhpbnB1dFNldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5Nb3VzZUlucHV0KSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcoaW5wdXRTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5Ub3VjaElucHV0KSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKGlucHV0U2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLlRvdWNoSW5wdXQpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5HYW1lcGFkSW5wdXQpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcoaW5wdXRTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuR2FtZXBhZElucHV0KSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuWFJDb250cm9sbGVySW5wdXQpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcoaW5wdXRTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuWFJDb250cm9sbGVySW5wdXQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgU2V0dGluZ3NTZWN0aW9ucy5FbmNvZGVyKSkge1xuICAgICAgICAgICAgLyogU2V0dXAgYWxsIGVuY29kZXIgcmVsYXRlZCBzZXR0aW5ncyB1bmRlciB0aGlzIHNlY3Rpb24gKi9cbiAgICAgICAgICAgIGNvbnN0IGVuY29kZXJTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5FbmNvZGVyKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdOdW1lcmljKGVuY29kZXJTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbikpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ051bWVyaWMoZW5jb2RlclNldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4KSk7XG4gICAgICAgICAgICBjb25zdCBwcmVmZXJyZWRDb2RlY09wdGlvbiA9IHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLmdldChPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdPcHRpb24oZW5jb2RlclNldHRpbmdzU2VjdGlvbiwgdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuZ2V0KE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMpKTtcbiAgICAgICAgICAgIGlmIChwcmVmZXJyZWRDb2RlY09wdGlvbiAmJlxuICAgICAgICAgICAgICAgIFsuLi5wcmVmZXJyZWRDb2RlY09wdGlvbi5zZWxlY3Rvci5vcHRpb25zXVxuICAgICAgICAgICAgICAgICAgICAubWFwKChvKSA9PiBvLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAuaW5jbHVkZXMoJ09ubHkgYXZhaWxhYmxlIG9uIENocm9tZScpKSB7XG4gICAgICAgICAgICAgICAgcHJlZmVycmVkQ29kZWNPcHRpb24uZGlzYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nT3B0aW9uKGVuY29kZXJTZXR0aW5nc1NlY3Rpb24sIHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLmdldChPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgU2V0dGluZ3NTZWN0aW9ucy5XZWJSVEMpKSB7XG4gICAgICAgICAgICAvKiBTZXR1cCBhbGwgd2VicnRjIHJlbGF0ZWQgc2V0dGluZ3MgdW5kZXIgdGhpcyBzZWN0aW9uICovXG4gICAgICAgICAgICBjb25zdCB3ZWJydGNTZXR0aW5nc1NlY3Rpb24gPSB0aGlzLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgU2V0dGluZ3NTZWN0aW9ucy5XZWJSVEMpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ0ZQUykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyh3ZWJydGNTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyh3ZWJydGNTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ051bWVyaWMod2VicnRjU2V0dGluZ3NTZWN0aW9uLCB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBTZXR0aW5nVGV4dCBlbGVtZW50IHRvIGEgcGFydGljdWxhciBzZXR0aW5ncyBzZWN0aW9uIGluIHRoZSBET00gYW5kIHJlZ2lzdGVycyB0aGF0IHRleHQgaW4gdGhlIHRleHQgc2V0dGluZ3MgbWFwLlxuICAgICAqIEBwYXJhbSBzZXR0aW5nc1NlY3Rpb24gLSBUaGUgc2V0dGluZ3Mgc2VjdGlvbiBIVE1MIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHNldHRpbmdUZXh0IC0gVGhlIHRleHR1YWwgc2V0dGluZ3Mgb2JqZWN0LlxuICAgICAqL1xuICAgIGFkZFNldHRpbmdUZXh0KHNldHRpbmdzU2VjdGlvbiwgc2V0dGluZ1RleHQpIHtcbiAgICAgICAgaWYgKHNldHRpbmdUZXh0KSB7XG4gICAgICAgICAgICBzZXR0aW5nc1NlY3Rpb24uYXBwZW5kQ2hpbGQoc2V0dGluZ1RleHQucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy50ZXh0UGFyYW1ldGVyc1VpLnNldChzZXR0aW5nVGV4dC5zZXR0aW5nLmlkLCBzZXR0aW5nVGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgU2V0dGluZ0ZsYWcgZWxlbWVudCB0byBhIHBhcnRpY3VsYXIgc2V0dGluZ3Mgc2VjdGlvbiBpbiB0aGUgRE9NIGFuZCByZWdpc3RlcnMgdGhhdCBmbGFnIGluIHRoZSBDb25maWcuZmxhZyBtYXAuXG4gICAgICogQHBhcmFtIHNldHRpbmdzU2VjdGlvbiAtIFRoZSBzZXR0aW5ncyBzZWN0aW9uIEhUTUwgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ0ZsYWcgLSBUaGUgc2V0dGluZ3MgZmxhZyBvYmplY3QuXG4gICAgICovXG4gICAgYWRkU2V0dGluZ0ZsYWcoc2V0dGluZ3NTZWN0aW9uLCBzZXR0aW5nRmxhZykge1xuICAgICAgICBpZiAoc2V0dGluZ0ZsYWcpIHtcbiAgICAgICAgICAgIHNldHRpbmdzU2VjdGlvbi5hcHBlbmRDaGlsZChzZXR0aW5nRmxhZy5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLmZsYWdzVWkuc2V0KHNldHRpbmdGbGFnLnNldHRpbmcuaWQsIHNldHRpbmdGbGFnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBudW1lcmljIHNldHRpbmcgZWxlbWVudCB0byBhIHBhcnRpY3VsYXIgc2V0dGluZ3Mgc2VjdGlvbiBpbiB0aGUgRE9NIGFuZCByZWdpc3RlcnMgdGhhdCBmbGFnIGluIHRoZSBDb25maWcubnVtZXJpY1BhcmFtZXRlcnMgbWFwLlxuICAgICAqIEBwYXJhbSBzZXR0aW5nc1NlY3Rpb24gLSBUaGUgc2V0dGluZ3Mgc2VjdGlvbiBIVE1MIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHNldHRpbmdGbGFnIC0gVGhlIHNldHRpbmdzIGZsYWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGFkZFNldHRpbmdOdW1lcmljKHNldHRpbmdzU2VjdGlvbiwgc2V0dGluZykge1xuICAgICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICAgICAgc2V0dGluZ3NTZWN0aW9uLmFwcGVuZENoaWxkKHNldHRpbmcucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLnNldChzZXR0aW5nLnNldHRpbmcuaWQsIHNldHRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhbiBlbnVtIGJhc2VkIHNldHRpbmdzIGVsZW1lbnQgdG8gYSBwYXJ0aWN1bGFyIHNldHRpbmdzIHNlY3Rpb24gaW4gdGhlIERPTSBhbmQgcmVnaXN0ZXJzIHRoYXQgZmxhZyBpbiB0aGUgQ29uZmlnLmVudW1QYXJhbWV0ZXJzIG1hcC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3NTZWN0aW9uIC0gVGhlIHNldHRpbmdzIHNlY3Rpb24gSFRNTCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSBzZXR0aW5nRmxhZyAtIFRoZSBzZXR0aW5ncyBmbGFnIG9iamVjdC5cbiAgICAgKi9cbiAgICBhZGRTZXR0aW5nT3B0aW9uKHNldHRpbmdzU2VjdGlvbiwgc2V0dGluZykge1xuICAgICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICAgICAgc2V0dGluZ3NTZWN0aW9uLmFwcGVuZENoaWxkKHNldHRpbmcucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuc2V0KHNldHRpbmcuc2V0dGluZy5pZCwgc2V0dGluZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25TZXR0aW5nc0NoYW5nZWQoeyBkYXRhOiB7IGlkLCB0YXJnZXQsIHR5cGUgfSB9KSB7XG4gICAgICAgIGlmICh0eXBlID09PSAnZmxhZycpIHtcbiAgICAgICAgICAgIGNvbnN0IF9pZCA9IGlkO1xuICAgICAgICAgICAgY29uc3QgX3RhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSB0aGlzLmZsYWdzVWkuZ2V0KF9pZCk7XG4gICAgICAgICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLmZsYWcgIT09IF90YXJnZXQuZmxhZykge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLmZsYWcgPSBfdGFyZ2V0LmZsYWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLmxhYmVsICE9PSBfdGFyZ2V0LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmcubGFiZWwgPSBfdGFyZ2V0LmxhYmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uc3QgX2lkID0gaWQ7XG4gICAgICAgICAgICBjb25zdCBfdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoX2lkKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmcubnVtYmVyICE9PSBfdGFyZ2V0Lm51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLm51bWJlciA9IF90YXJnZXQubnVtYmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5sYWJlbCAhPT0gX3RhcmdldC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLmxhYmVsID0gX3RhcmdldC5sYWJlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBjb25zdCBfaWQgPSBpZDtcbiAgICAgICAgICAgIGNvbnN0IF90YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gdGhpcy50ZXh0UGFyYW1ldGVyc1VpLmdldChfaWQpO1xuICAgICAgICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy50ZXh0ICE9PSBfdGFyZ2V0LnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0gX3RhcmdldC50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5sYWJlbCAhPT0gX3RhcmdldC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLmxhYmVsID0gX3RhcmdldC5sYWJlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ29wdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IF9pZCA9IGlkO1xuICAgICAgICAgICAgY29uc3QgX3RhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSB0aGlzLm9wdGlvblBhcmFtZXRlcnNVaS5nZXQoX2lkKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdWlPcHRpb25zID0gc2V0dGluZy5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldE9wdGlvbnMgPSBfdGFyZ2V0Lm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKHVpT3B0aW9ucy5sZW5ndGggIT09IHRhcmdldE9wdGlvbnMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgICF1aU9wdGlvbnMuZXZlcnkoKHZhbHVlKSA9PiB0YXJnZXRPcHRpb25zLmluY2x1ZGVzKHZhbHVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5vcHRpb25zID0gX3RhcmdldC5vcHRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5zZWxlY3RlZCAhPT0gX3RhcmdldC5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLnNlbGVjdGVkID0gX3RhcmdldC5zZWxlY3RlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmcubGFiZWwgIT09IF90YXJnZXQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5sYWJlbCA9IF90YXJnZXQubGFiZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgZmxhZyBpcyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2VMaXN0ZW5lciAtIFRoZSBjYWxsYmFjayB0byBmaXJlIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICovXG4gICAgYWRkQ3VzdG9tRmxhZ09uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihpZCwgb25DaGFuZ2VMaXN0ZW5lcikge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21GbGFncy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUZsYWdzLmdldChpZCkub25DaGFuZ2UgPSBvbkNoYW5nZUxpc3RlbmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgZm9yIHRoZSBmbGFnLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gbGFiZWwgLSBUaGUgbmV3IGxhYmVsIHRvIHVzZSBmb3IgdGhlIGZsYWcuXG4gICAgICovXG4gICAgc2V0Q3VzdG9tRmxhZ0xhYmVsKGlkLCBsYWJlbCkge1xuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tRmxhZ3MuaGFzKGlkKSkge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoYENhbm5vdCBzZXQgbGFiZWwgZm9yIGZsYWcgY2FsbGVkICR7aWR9IC0gaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIENvbmZpZy5mbGFncyBtYXAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUZsYWdzLmdldChpZCkubGFiZWwgPSBsYWJlbDtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3NVaS5nZXQoaWQpLmxhYmVsID0gbGFiZWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmbGFnIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gaWQuXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHVuaXF1ZSBpZCBmb3IgdGhlIGZsYWcuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZmxhZyBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIGlzQ3VzdG9tRmxhZ0VuYWJsZWQoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tRmxhZ3MuZ2V0KGlkKS5mbGFnO1xuICAgIH1cbiAgICBkaXNhYmxlU2V0dGluZyhpZCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGlmIChpc0ZsYWdJZChpZCkpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMuZmxhZ3NVaS5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTnVtZXJpY0lkKGlkKSkge1xuICAgICAgICAgICAgKF9iID0gdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChpZCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNUZXh0SWQoaWQpKSB7XG4gICAgICAgICAgICAoX2MgPSB0aGlzLnRleHRQYXJhbWV0ZXJzVWkuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmRpc2FibGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09wdGlvbklkKGlkKSkge1xuICAgICAgICAgICAgKF9kID0gdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmRpc2FibGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbmFibGVTZXR0aW5nKGlkKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgaWYgKGlzRmxhZ0lkKGlkKSkge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5mbGFnc1VpLmdldChpZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc051bWVyaWNJZChpZCkpIHtcbiAgICAgICAgICAgIChfYiA9IHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNUZXh0SWQoaWQpKSB7XG4gICAgICAgICAgICAoX2MgPSB0aGlzLnRleHRQYXJhbWV0ZXJzVWkuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT3B0aW9uSWQoaWQpKSB7XG4gICAgICAgICAgICAoX2QgPSB0aGlzLm9wdGlvblBhcmFtZXRlcnNVaS5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25maWdVSS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhIHNldHRpbmcgdGhhdCBoYXMgYSB0ZXh0IGxhYmVsLCBhbiBhcmJpdHJhcnkgc2V0dGluZyB2YWx1ZSBpdCBzdG9yZXMsIGFuIGEgSFRNTCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGlzIHNldHRpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nVUlCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5nKSB7XG4gICAgICAgIHRoaXMuX3NldHRpbmcgPSBzZXR0aW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBjb21wb25lbnQuXG4gICAgICovXG4gICAgZ2V0IHNldHRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gb3IgY3JlYXRlcyBhIEhUTUwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhpcyBzZXR0aW5nIGluIHRoZSBET00uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nVUlCYXNlLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBTZXR0aW5nVUlCYXNlIH0gZnJvbSAnLi9TZXR0aW5nVUlCYXNlJztcbmV4cG9ydCBjbGFzcyBTZXR0aW5nVUlGbGFnIGV4dGVuZHMgU2V0dGluZ1VJQmFzZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZykge1xuICAgICAgICBzdXBlcihzZXR0aW5nKTtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHNldHRpbmcubGFiZWw7XG4gICAgICAgIHRoaXMuZmxhZyA9IHNldHRpbmcuZmxhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIHNldHRpbmcgY29tcG9uZW50LlxuICAgICAqL1xuICAgIGdldCBzZXR0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZztcbiAgICB9XG4gICAgZ2V0IHNldHRpbmdzVGV4dEVsZW0oKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3NUZXh0RWxlbSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbS5pbm5lclRleHQgPSB0aGlzLnNldHRpbmcuX2xhYmVsO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbS50aXRsZSA9IHRoaXMuc2V0dGluZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NUZXh0RWxlbTtcbiAgICB9XG4gICAgZ2V0IGNoZWNrYm94KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2NoZWNrYm94KSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICAgICAgICAgIC8vIEJsb2NrIGtleXByZXNzL3VwL2Rvd24gcHJvcG9nYXRpb24gZnJvbSB0ZXh0IGZpZWxkIHR5cGluZyBnb2luZyB0byBVRVxuICAgICAgICAgICAgdGhpcy5fY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrYm94O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gb3IgY3JlYXRlcyBhIEhUTUwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhpcyBzZXR0aW5nIGluIHRoZSBET00uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgcm9vdCBkaXYgd2l0aCBcInNldHRpbmdcIiBjc3MgY2xhc3NcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9IHRoaXMuc2V0dGluZy5pZDtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NldHRpbmcnKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBkaXYgZWxlbWVudCB0byBjb250YWluIG91ciBzZXR0aW5nJ3MgdGV4dFxuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1RleHRFbGVtKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBsYWJlbCBlbGVtZW50IHRvIHdyYXAgb3V0IGlucHV0IHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICAgICAgICB3cmFwcGVyTGFiZWwuY2xhc3NMaXN0LmFkZCgndGdsLXN3aXRjaCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQod3JhcHBlckxhYmVsKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBpbnB1dCB0eXBlPWNoZWNrYm94XG4gICAgICAgICAgICB0aGlzLmNoZWNrYm94LnRpdGxlID0gdGhpcy5zZXR0aW5nLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgdGhpcy5jaGVja2JveC5jbGFzc0xpc3QuYWRkKCd0Z2wnKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tib3guY2xhc3NMaXN0LmFkZCgndGdsLWZsYXQnKTtcbiAgICAgICAgICAgIGNvbnN0IHNsaWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgc2xpZGVyLmNsYXNzTGlzdC5hZGQoJ3RnbC1zbGlkZXInKTtcbiAgICAgICAgICAgIHdyYXBwZXJMYWJlbC5hcHBlbmRDaGlsZCh0aGlzLmNoZWNrYm94KTtcbiAgICAgICAgICAgIHdyYXBwZXJMYWJlbC5hcHBlbmRDaGlsZChzbGlkZXIpO1xuICAgICAgICAgICAgLy8gc2V0dXAgb24gY2hhbmdlIGZyb20gY2hlY2tib3hcbiAgICAgICAgICAgIHRoaXMuY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuZmxhZyAhPT0gdGhpcy5jaGVja2JveC5jaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5mbGFnID0gdGhpcy5jaGVja2JveC5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcudXBkYXRlVVJMUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHNldHRpbmcncyBzdG9yZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIGluVmFsdWUgLSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgc2V0dGluZy5cbiAgICAgKi9cbiAgICBzZXQgZmxhZyhpblZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hlY2tib3guY2hlY2tlZCA9IGluVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB2YWx1ZVxuICAgICAqL1xuICAgIGdldCBmbGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja2JveC5jaGVja2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBsYWJlbCAtIHNldHRpbmcgbGFiZWwuXG4gICAgICovXG4gICAgc2V0IGxhYmVsKGluTGFiZWwpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IGluTGFiZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBsYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NUZXh0RWxlbS5pbm5lclRleHQ7XG4gICAgfVxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tib3guZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nVUlGbGFnLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41JztcbmltcG9ydCB7IFNldHRpbmdVSUJhc2UgfSBmcm9tICcuL1NldHRpbmdVSUJhc2UnO1xuLyoqXG4gKiBBIG51bWJlciBzcGlubmVyIHdpdGggYSB0ZXh0IGxhYmVsIGJlc2lkZSBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdVSU51bWJlciBleHRlbmRzIFNldHRpbmdVSUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmcpIHtcbiAgICAgICAgc3VwZXIoc2V0dGluZyk7XG4gICAgICAgIHRoaXMubGFiZWwgPSB0aGlzLnNldHRpbmcubGFiZWw7XG4gICAgICAgIHRoaXMubnVtYmVyID0gdGhpcy5zZXR0aW5nLm51bWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIHNldHRpbmcgY29tcG9uZW50LlxuICAgICAqL1xuICAgIGdldCBzZXR0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZztcbiAgICB9XG4gICAgZ2V0IHNldHRpbmdzVGV4dEVsZW0oKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3NUZXh0RWxlbSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0udGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzVGV4dEVsZW07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgSFRNTElucHV0RWxlbWVudCBmb3IgdGhlIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBnZXQgc3Bpbm5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zcGlubmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zcGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIudHlwZSA9ICdudW1iZXInO1xuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5taW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIubWluID0gdGhpcy5zZXR0aW5nLm1pbi50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5tYXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIubWF4ID0gdGhpcy5zZXR0aW5nLm1heC50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc3Bpbm5lci52YWx1ZSA9IHRoaXMuc2V0dGluZy5udW1iZXIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIudGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgICAgICB0aGlzLl9zcGlubmVyLmNsYXNzTGlzdC5hZGQoJ2Zvcm0tY29udHJvbCcpO1xuICAgICAgICAgICAgLy8gQmxvY2sga2V5cHJlc3MvdXAvZG93biBwcm9wb2dhdGlvbiBmcm9tIHRleHQgZmllbGQgdHlwaW5nIGdvaW5nIHRvIFVFXG4gICAgICAgICAgICB0aGlzLnNwaW5uZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zcGlubmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc3Bpbm5lci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3Bpbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHJvb3QgZGl2IHdpdGggXCJzZXR0aW5nXCIgY3NzIGNsYXNzXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2V0dGluZycpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZm9ybS1ncm91cCcpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGRpdiBlbGVtZW50IHRvIGNvbnRhaW4gb3VyIHNldHRpbmcncyB0ZXh0XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzVGV4dEVsZW0pO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGxhYmVsIGVsZW1lbnQgdG8gd3JhcCBvdXQgaW5wdXQgdHlwZVxuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zcGlubmVyKTtcbiAgICAgICAgICAgIC8vIHNldHVwIG9uY2hhbmdlXG4gICAgICAgICAgICB0aGlzLnNwaW5uZXIub25jaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dEVsZW0gPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdChpbnB1dEVsZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBDb3VsZCBub3QgcGFyc2UgdmFsdWUgY2hhbmdlIGludG8gYSB2YWxpZCBudW1iZXIgLSB2YWx1ZSB3YXMgJHtpbnB1dEVsZW0udmFsdWV9LCByZXNldHRpbmcgdmFsdWUgdG8gJHt0aGlzLnNldHRpbmcubWlufWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLm51bWJlciAhPT0gdGhpcy5zZXR0aW5nLm1pbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLm51bWJlciA9IHRoaXMuc2V0dGluZy5taW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcubnVtYmVyICE9PSBwYXJzZWRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLm51bWJlciA9IHBhcnNlZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnVwZGF0ZVVSTFBhcmFtcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbnVtYmVyIGluIHRoZSBzcGlubmVyICh3aWxsIGJlIGNsYW1wZWQgd2l0aGluIHJhbmdlKS5cbiAgICAgKi9cbiAgICBzZXQgbnVtYmVyKG5ld051bWJlcikge1xuICAgICAgICB0aGlzLnNwaW5uZXIudmFsdWUgPSB0aGlzLnNldHRpbmcuY2xhbXAobmV3TnVtYmVyKS50b1N0cmluZygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdmFsdWVcbiAgICAgKi9cbiAgICBnZXQgbnVtYmVyKCkge1xuICAgICAgICByZXR1cm4gK3RoaXMuc3Bpbm5lci52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0gbGFiZWwgLSBzZXR0aW5nIGxhYmVsLlxuICAgICAqL1xuICAgIHNldCBsYWJlbChpbkxhYmVsKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NUZXh0RWxlbS5pbm5lclRleHQgPSBpbkxhYmVsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0O1xuICAgIH1cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLnNwaW5uZXIuZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuc3Bpbm5lci5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdVSU51bWJlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgU2V0dGluZ1VJQmFzZSB9IGZyb20gJy4vU2V0dGluZ1VJQmFzZSc7XG5leHBvcnQgY2xhc3MgU2V0dGluZ1VJT3B0aW9uIGV4dGVuZHMgU2V0dGluZ1VJQmFzZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZykge1xuICAgICAgICBzdXBlcihzZXR0aW5nKTtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdGhpcy5zZXR0aW5nLm9wdGlvbnM7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNldHRpbmcuc2VsZWN0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBnZXQgc2V0dGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmc7XG4gICAgfVxuICAgIGdldCBzZWxlY3RvcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yLmNsYXNzTGlzdC5hZGQoJ2Zvcm0tY29udHJvbCcpO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3Mtb3B0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdG9yO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NUZXh0RWxlbSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc1RleHRFbGVtKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0udGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzVGV4dEVsZW07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGxhYmVsIC0gc2V0dGluZyBsYWJlbC5cbiAgICAgKi9cbiAgICBzZXQgbGFiZWwoaW5MYWJlbCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0ID0gaW5MYWJlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGxhYmVsXG4gICAgICovXG4gICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHJvb3QgZGl2IHdpdGggXCJzZXR0aW5nXCIgY3NzIGNsYXNzXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSB0aGlzLnNldHRpbmcuaWQ7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmb3JtLWdyb3VwJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgdG8gY29udGFpbiBvdXIgc2V0dGluZydzIHRleHRcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NUZXh0RWxlbSk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbGFiZWwgZWxlbWVudCB0byB3cmFwIG91dCBpbnB1dCB0eXBlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQod3JhcHBlckxhYmVsKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBzZWxlY3QgZWxlbWVudFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rvci50aXRsZSA9IHRoaXMuc2V0dGluZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHdyYXBwZXJMYWJlbC5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdG9yKTtcbiAgICAgICAgICAgIC8vIHNldHVwIG9uIGNoYW5nZSBmcm9tIHNlbGVjdG9yXG4gICAgICAgICAgICB0aGlzLnNlbGVjdG9yLm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcuc2VsZWN0ZWQgIT09IHRoaXMuc2VsZWN0b3IudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnNlbGVjdGVkID0gdGhpcy5zZWxlY3Rvci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnVwZGF0ZVVSTFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBCbG9jayBrZXlwcmVzcy91cC9kb3duIHByb3BvZ2F0aW9uIGZyb20gdGV4dCBmaWVsZCB0eXBpbmcgZ29pbmcgdG8gVUVcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rvci5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgc2V0IG9wdGlvbnModmFsdWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnNlbGVjdG9yLm9wdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IucmVtb3ZlKGkpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgICAgICBvcHQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIG9wdC5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuc2VsZWN0b3Iub3B0aW9uc10ubWFwKChvKSA9PiBvLnZhbHVlKTtcbiAgICB9XG4gICAgc2V0IHNlbGVjdGVkKHZhbHVlKSB7XG4gICAgICAgIC8vIEEgdXNlciBtYXkgbm90IHNwZWNpZnkgdGhlIGZ1bGwgcG9zc2libGUgdmFsdWUgc28gd2UgaW5zdGVhZCB1c2UgdGhlIGNsb3Nlc3QgbWF0Y2guXG4gICAgICAgIC8vIGVnID94eHg9SDI2NCB3b3VsZCBzZWxlY3QgJ0gyNjQgbGV2ZWwtYXN5bW1ldHJ5LWFsbG93ZWQ9MTtwYWNrZXRpemF0aW9uLW1vZGU9MTtwcm9maWxlLWxldmVsLWlkPTQyMDAxZidcbiAgICAgICAgY29uc3QgZmlsdGVyZWRMaXN0ID0gdGhpcy5vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uaW5kZXhPZih2YWx1ZSkgIT09IC0xKTtcbiAgICAgICAgaWYgKGZpbHRlcmVkTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IudmFsdWUgPSBmaWx0ZXJlZExpc3RbMF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHNlbGVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rvci52YWx1ZTtcbiAgICB9XG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdVSU9wdGlvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgU2V0dGluZ1VJQmFzZSB9IGZyb20gJy4vU2V0dGluZ1VJQmFzZSc7XG5leHBvcnQgY2xhc3MgU2V0dGluZ1VJVGV4dCBleHRlbmRzIFNldHRpbmdVSUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmcpIHtcbiAgICAgICAgc3VwZXIoc2V0dGluZyk7XG4gICAgICAgIHRoaXMubGFiZWwgPSB0aGlzLnNldHRpbmcubGFiZWw7XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMuc2V0dGluZy50ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBjb21wb25lbnQuXG4gICAgICovXG4gICAgZ2V0IHNldHRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NUZXh0RWxlbSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc1RleHRFbGVtKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0udGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzVGV4dEVsZW07XG4gICAgfVxuICAgIGdldCB0ZXh0Ym94KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3RleHRib3gpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHRib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgICAgdGhpcy5fdGV4dGJveC5jbGFzc0xpc3QuYWRkKCdmb3JtLWNvbnRyb2wnKTtcbiAgICAgICAgICAgIHRoaXMuX3RleHRib3gudHlwZSA9ICd0ZXh0Ym94JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dGJveDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHJvb3QgZGl2IHdpdGggXCJzZXR0aW5nXCIgY3NzIGNsYXNzXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSB0aGlzLnNldHRpbmcuaWQ7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgdG8gY29udGFpbiBvdXIgc2V0dGluZydzIHRleHRcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NUZXh0RWxlbSk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbGFiZWwgZWxlbWVudCB0byB3cmFwIG91dCBpbnB1dCB0eXBlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQod3JhcHBlckxhYmVsKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBpbnB1dCB0eXBlPWNoZWNrYm94XG4gICAgICAgICAgICB0aGlzLnRleHRib3gudGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgICAgICB3cmFwcGVyTGFiZWwuYXBwZW5kQ2hpbGQodGhpcy50ZXh0Ym94KTtcbiAgICAgICAgICAgIC8vIHNldHVwIG9uIGNoYW5nZSBmcm9tIGNoZWNrYm94XG4gICAgICAgICAgICB0aGlzLnRleHRib3guYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnRleHQgIT09IHRoaXMudGV4dGJveC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcudGV4dCA9IHRoaXMudGV4dGJveC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnVwZGF0ZVVSTFBhcmFtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQmxvY2sga2V5cHJlc3MvdXAvZG93biBwcm9wb2dhdGlvbiBmcm9tIHRleHQgZmllbGQgdHlwaW5nIGdvaW5nIHRvIFVFXG4gICAgICAgICAgICB0aGlzLnRleHRib3guYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0Ym94LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dGJveC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc2V0dGluZydzIHN0b3JlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gaW5WYWx1ZSAtIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqL1xuICAgIHNldCB0ZXh0KGluVmFsdWUpIHtcbiAgICAgICAgdGhpcy50ZXh0Ym94LnZhbHVlID0gaW5WYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHZhbHVlXG4gICAgICovXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHRib3gudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGxhYmVsIC0gc2V0dGluZyBsYWJlbC5cbiAgICAgKi9cbiAgICBzZXQgbGFiZWwoaW5MYWJlbCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0ID0gaW5MYWJlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGxhYmVsXG4gICAgICovXG4gICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dDtcbiAgICB9XG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy50ZXh0Ym94LmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLnRleHRib3guZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nVUlUZXh0LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBBY3Rpb25PdmVybGF5IH0gZnJvbSAnLi9BY3Rpb25PdmVybGF5Jztcbi8qKlxuICogU2hvdyBhbiBvdmVybGF5IGZvciB3aGVuIHRoZSBzZXNzaW9uIGlzIHVuYXR0ZW5kZWQsIGl0IGJlZ2lucyBhIGNvdW50ZG93biB0aW1lciwgd2hpY2ggd2hlbiBlbGFwc2VkIHdpbGwgZGlzY29ubmVjdCB0aGUgc3RyZWFtLlxuICovXG5leHBvcnQgY2xhc3MgQUZLT3ZlcmxheSBleHRlbmRzIEFjdGlvbk92ZXJsYXkge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvb3QgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXkuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBhZmtPdmVybGF5SHRtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBhZmtPdmVybGF5SHRtbC5pZCA9ICdhZmtPdmVybGF5JztcbiAgICAgICAgYWZrT3ZlcmxheUh0bWwuY2xhc3NOYW1lID0gJ2NsaWNrYWJsZVN0YXRlJztcbiAgICAgICAgcmV0dXJuIGFma092ZXJsYXlIdG1sO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZW50IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LCB3aGljaCBjb250YWluIHNvbWUgdGV4dCBmb3IgYW4gYWZrIGNvdW50IGRvd24uXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBhZmtPdmVybGF5SHRtbElubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGFma092ZXJsYXlIdG1sSW5uZXIuaWQgPSAnYWZrT3ZlcmxheUlubmVyJztcbiAgICAgICAgYWZrT3ZlcmxheUh0bWxJbm5lci5pbm5lckhUTUwgPVxuICAgICAgICAgICAgJzxjZW50ZXI+Tm8gYWN0aXZpdHkgZGV0ZWN0ZWQ8YnI+RGlzY29ubmVjdGluZyBpbiA8c3BhbiBpZD1cImFma0NvdW50RG93bk51bWJlclwiPjwvc3Bhbj4gc2Vjb25kczxicj5DbGljayB0byBjb250aW51ZTxicj48L2NlbnRlcj4nO1xuICAgICAgICByZXR1cm4gYWZrT3ZlcmxheUh0bWxJbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGFuIEFmayBvdmVybGF5XG4gICAgICogQHBhcmFtIHBhcmVudEVsZW1lbnQgLSB0aGUgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdERpdikge1xuICAgICAgICBzdXBlcihyb290RGl2LCBBRktPdmVybGF5LmNyZWF0ZVJvb3RFbGVtZW50KCksIEFGS092ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGNvdW50IGRvd24gc3BhbnMgbnVtYmVyIGZvciB0aGUgb3ZlcmxheVxuICAgICAqIEBwYXJhbSBjb3VudGRvd24gLSB0aGUgY291bnQgZG93biBudW1iZXIgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BhbiBmb3IgdXBkYXRpbmdcbiAgICAgKi9cbiAgICB1cGRhdGVDb3VudGRvd24oY291bnRkb3duKSB7XG4gICAgICAgIHRoaXMudGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gYDxjZW50ZXI+Tm8gYWN0aXZpdHkgZGV0ZWN0ZWQ8YnI+RGlzY29ubmVjdGluZyBpbiA8c3BhbiBpZD1cImFma0NvdW50RG93bk51bWJlclwiPiR7Y291bnRkb3dufTwvc3Bhbj4gc2Vjb25kczxicj5DbGljayB0byBjb250aW51ZTxicj48L2NlbnRlcj5gO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFGS092ZXJsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgT3ZlcmxheUJhc2UgfSBmcm9tICcuL0Jhc2VPdmVybGF5Jztcbi8qKlxuICogQ2xhc3MgZm9yIHRoZSBiYXNlIGFjdGlvbiBvdmVybGF5IHN0cnVjdHVyZVxuICovXG5leHBvcnQgY2xhc3MgQWN0aW9uT3ZlcmxheSBleHRlbmRzIE92ZXJsYXlCYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYW4gYWN0aW9uIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gcm9vdERpdiAtIHRoZSByb290IGVsZW1lbnQgdGhpcyBvdmVybGF5IHdpbGwgYmUgaW5zZXJ0ZWQgaW50b1xuICAgICAqIEBwYXJhbSByb290RWxlbWVudCAtIHRoZSByb290IGVsZW1lbnQgdGhhdCBpcyB0aGUgb3ZlcmxheVxuICAgICAqIEBwYXJhbSBjb250ZW50RWxlbWVudCAtIGFuIGVsZW1lbnQgdGhhdCBjb250YWlucyB0ZXh0IGZvciB0aGUgYWN0aW9uIG92ZXJsYXlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihyb290RGl2LCByb290RWxlbWVudCwgY29udGVudEVsZW1lbnQpIHtcbiAgICAgICAgc3VwZXIocm9vdERpdiwgcm9vdEVsZW1lbnQsIGNvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5vbkFjdGlvbkNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLyBMb2dnZXIuSW5mbygnRGlkIHlvdSBmb3JnZXQgdG8gc2V0IHRoZSBvbkFjdGlvbiBjYWxsYmFjayBpbiB5b3VyIG92ZXJsYXk/Jyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgdGV4dCBvdmVybGF5cyBpbm5lciB0ZXh0XG4gICAgICogQHBhcmFtIHRleHQgLSB0aGUgdXBkYXRlIHRleHQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIHVwZGF0ZSh0ZXh0KSB7XG4gICAgICAgIGlmICh0ZXh0ICE9IG51bGwgfHwgdGV4dCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgYSBtZXRob2QgYXMgYW4gZXZlbnQgZW1pdHRlciBjYWxsYmFja1xuICAgICAqIEBwYXJhbSBjYWxsQmFjayAtIHRoZSBtZXRob2QgdGhhdCBpcyB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZW1pdHRlZFxuICAgICAqL1xuICAgIG9uQWN0aW9uKGNhbGxCYWNrKSB7XG4gICAgICAgIHRoaXMub25BY3Rpb25DYWxsYmFjayA9IGNhbGxCYWNrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZSBhbiBldmVudCB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBldmVudCBlbWl0dGVyXG4gICAgICovXG4gICAgYWN0aXZhdGUoKSB7XG4gICAgICAgIHRoaXMub25BY3Rpb25DYWxsYmFjaygpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFjdGlvbk92ZXJsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQ2xhc3MgZm9yIHRoZSBiYXNlIG92ZXJsYXkgc3RydWN0dXJlXG4gKi9cbmV4cG9ydCBjbGFzcyBPdmVybGF5QmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGFuIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gcm9vdERpdiAtIHRoZSByb290IGVsZW1lbnQgdGhpcyBvdmVybGF5IHdpbGwgYmUgaW5zZXJ0ZWQgaW50b1xuICAgICAqIEBwYXJhbSByb290RWxlbWVudCAtIHRoZSByb290IGVsZW1lbnQgdGhhdCBpcyB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvb3REaXYsIHJvb3RFbGVtZW50LCB0ZXh0RWxlbWVudCkge1xuICAgICAgICB0aGlzLnJvb3REaXYgPSByb290RGl2O1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50ID0gcm9vdEVsZW1lbnQ7XG4gICAgICAgIHRoaXMudGV4dEVsZW1lbnQgPSB0ZXh0RWxlbWVudDtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRleHRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHRoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLnJvb3RFbGVtZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuU3RhdGUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGlkZSB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGlkZGVuU3RhdGUnKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXNlT3ZlcmxheS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgQWN0aW9uT3ZlcmxheSB9IGZyb20gJy4vQWN0aW9uT3ZlcmxheSc7XG4vKipcbiAqIE92ZXJsYXkgc2hvd24gZHVyaW5nIGNvbm5lY3Rpb24sIGhhcyBhIGJ1dHRvbiB0aGF0IGNhbiBiZSBjbGlja2VkIHRvIGluaXRpYXRlIGEgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbm5lY3RPdmVybGF5IGV4dGVuZHMgQWN0aW9uT3ZlcmxheSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgcm9vdCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbm5lY3RFbGVtLmlkID0gJ2Nvbm5lY3RPdmVybGF5JztcbiAgICAgICAgY29ubmVjdEVsZW0uY2xhc3NOYW1lID0gJ2NsaWNrYWJsZVN0YXRlJztcbiAgICAgICAgcmV0dXJuIGNvbm5lY3RFbGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZW50IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LCB3aGljaCBjb250YWluIHdoYXRldmVyIGNvbnRlbnQgdGhpcyBlbGVtZW50IGNvbnRhaW5zLCBsaWtlIHRleHQgb3IgYSBidXR0b24uXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBjb25uZWN0Q29udGVudEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29ubmVjdENvbnRlbnRFbGVtLmlkID0gJ2Nvbm5lY3RCdXR0b24nO1xuICAgICAgICBjb25uZWN0Q29udGVudEVsZW0uaW5uZXJIVE1MID0gJ0NsaWNrIHRvIHN0YXJ0JztcbiAgICAgICAgcmV0dXJuIGNvbm5lY3RDb250ZW50RWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgY29ubmVjdCBvdmVybGF5IHdpdGggYSBjb25uZWN0aW9uIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbSAtIHRoZSBwYXJlbnQgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudEVsZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50RWxlbSwgQ29ubmVjdE92ZXJsYXkuY3JlYXRlUm9vdEVsZW1lbnQoKSwgQ29ubmVjdE92ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgICAgIC8vIGFkZCB0aGUgbmV3IGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbm5lY3RPdmVybGF5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBBY3Rpb25PdmVybGF5IH0gZnJvbSAnLi9BY3Rpb25PdmVybGF5Jztcbi8qKlxuICogT3ZlcmxheSBzaG93biBkdXJpbmcgZGlzY29ubmVjdGlvbiwgaGFzIGEgcmVjb25uZWN0aW9uIGVsZW1lbnQgdGhhdCBjYW4gYmUgY2xpY2tlZCB0byByZWNvbm5lY3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNjb25uZWN0T3ZlcmxheSBleHRlbmRzIEFjdGlvbk92ZXJsYXkge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvb3QgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXkuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBkaXNjb25uZWN0T3ZlcmxheUh0bWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGlzY29ubmVjdE92ZXJsYXlIdG1sLmlkID0gJ2Rpc2Nvbm5lY3RPdmVybGF5JztcbiAgICAgICAgZGlzY29ubmVjdE92ZXJsYXlIdG1sLmNsYXNzTmFtZSA9ICdjbGlja2FibGVTdGF0ZSc7XG4gICAgICAgIHJldHVybiBkaXNjb25uZWN0T3ZlcmxheUh0bWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRlbnQgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXksIHdoaWNoIGNvbnRhaW4gd2hhdGV2ZXIgY29udGVudCB0aGlzIGVsZW1lbnQgY29udGFpbnMsIGxpa2UgdGV4dCBvciBhIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlQ29udGVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBpbm5lciBodG1sIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBkaXNjb25uZWN0T3ZlcmxheUh0bWxDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGlzY29ubmVjdE92ZXJsYXlIdG1sQ29udGFpbmVyLmlkID0gJ2Rpc2Nvbm5lY3RCdXR0b24nO1xuICAgICAgICBkaXNjb25uZWN0T3ZlcmxheUh0bWxDb250YWluZXIuaW5uZXJIVE1MID0gJ0NsaWNrIFRvIFJlc3RhcnQnO1xuICAgICAgICByZXR1cm4gZGlzY29ubmVjdE92ZXJsYXlIdG1sQ29udGFpbmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBkaXNjb25uZWN0IG92ZXJsYXkgd2l0aCBhIHJldHJ5IGNvbm5lY3Rpb24gaWNvbi5cbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbSAtIHRoZSBwYXJlbnQgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudEVsZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50RWxlbSwgRGlzY29ubmVjdE92ZXJsYXkuY3JlYXRlUm9vdEVsZW1lbnQoKSwgRGlzY29ubmVjdE92ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgICAgIC8vIGFkZCB0aGUgbmV3IGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpc2Nvbm5lY3RPdmVybGF5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBUZXh0T3ZlcmxheSB9IGZyb20gJy4vVGV4dE92ZXJsYXknO1xuLyoqXG4gKiBHZW5lcmljIG92ZXJsYXkgdXNlZCB0byBzaG93IHRleHR1YWwgZXJyb3IgaW5mbyB0byB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEVycm9yT3ZlcmxheSBleHRlbmRzIFRleHRPdmVybGF5IHtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCByb290IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVSb290RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZXJyb3JPdmVybGF5SHRtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBlcnJvck92ZXJsYXlIdG1sLmlkID0gJ2Vycm9yT3ZlcmxheSc7XG4gICAgICAgIGVycm9yT3ZlcmxheUh0bWwuY2xhc3NOYW1lID0gJ3RleHREaXNwbGF5U3RhdGUnO1xuICAgICAgICByZXR1cm4gZXJyb3JPdmVybGF5SHRtbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGVudCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheSwgd2hpY2ggY29udGFpbiB3aGF0ZXZlciBjb250ZW50IHRoaXMgZWxlbWVudCBjb250YWlucywgbGlrZSB0ZXh0IG9yIGEgYnV0dG9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgZXJyb3JPdmVybGF5SHRtbElubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVycm9yT3ZlcmxheUh0bWxJbm5lci5pZCA9ICdlcnJvck92ZXJsYXlJbm5lcic7XG4gICAgICAgIHJldHVybiBlcnJvck92ZXJsYXlIdG1sSW5uZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGNvbm5lY3Qgb3ZlcmxheSB3aXRoIGEgY29ubmVjdGlvbiBidXR0b24uXG4gICAgICogQHBhcmFtIHBhcmVudEVsZW0gLSB0aGUgcGFyZW50IGVsZW1lbnQgdGhpcyBvdmVybGF5IHdpbGwgYmUgaW5zZXJ0ZWQgaW50by5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRFbGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudEVsZW0sIEVycm9yT3ZlcmxheS5jcmVhdGVSb290RWxlbWVudCgpLCBFcnJvck92ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJyb3JPdmVybGF5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBUZXh0T3ZlcmxheSB9IGZyb20gJy4vVGV4dE92ZXJsYXknO1xuLyoqXG4gKiBHZW5lcmljIG92ZXJsYXkgdXNlZCB0byBzaG93IHRleHR1YWwgaW5mbyB0byB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEluZm9PdmVybGF5IGV4dGVuZHMgVGV4dE92ZXJsYXkge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvb3QgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXkuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBpbmZvT3ZlcmxheUh0bWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaW5mb092ZXJsYXlIdG1sLmlkID0gJ2luZm9PdmVybGF5JztcbiAgICAgICAgaW5mb092ZXJsYXlIdG1sLmNsYXNzTmFtZSA9ICd0ZXh0RGlzcGxheVN0YXRlJztcbiAgICAgICAgcmV0dXJuIGluZm9PdmVybGF5SHRtbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGVudCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheSwgd2hpY2ggY29udGFpbiB3aGF0ZXZlciBjb250ZW50IHRoaXMgZWxlbWVudCBjb250YWlucywgbGlrZSB0ZXh0IG9yIGEgYnV0dG9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgaW5mb092ZXJsYXlIdG1sSW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaW5mb092ZXJsYXlIdG1sSW5uZXIuaWQgPSAnbWVzc2FnZU92ZXJsYXlJbm5lcic7XG4gICAgICAgIHJldHVybiBpbmZvT3ZlcmxheUh0bWxJbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgY29ubmVjdCBvdmVybGF5IHdpdGggYSBjb25uZWN0aW9uIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbSAtIHRoZSBwYXJlbnQgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudEVsZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50RWxlbSwgSW5mb092ZXJsYXkuY3JlYXRlUm9vdEVsZW1lbnQoKSwgSW5mb092ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5mb092ZXJsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEFjdGlvbk92ZXJsYXkgfSBmcm9tICcuL0FjdGlvbk92ZXJsYXknO1xuLyoqXG4gKiBPdmVybGF5IHNob3duIHdoZW4gc3RyZWFtIGlzIHJlYWR5IHRvIHBsYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5T3ZlcmxheSBleHRlbmRzIEFjdGlvbk92ZXJsYXkge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvb3QgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXkuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBwbGF5RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBwbGF5RWxlbS5pZCA9ICdwbGF5T3ZlcmxheSc7XG4gICAgICAgIHBsYXlFbGVtLmNsYXNzTmFtZSA9ICdjbGlja2FibGVTdGF0ZSc7XG4gICAgICAgIHJldHVybiBwbGF5RWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGVudCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheSwgd2hpY2ggY29udGFpbiB3aGF0ZXZlciBjb250ZW50IHRoaXMgZWxlbWVudCBjb250YWlucywgbGlrZSB0ZXh0IG9yIGEgYnV0dG9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgLy8gdG9kbzogY2hhbmdlIHRoaXMgdG8gYW4gc3ZnXG4gICAgICAgIGNvbnN0IHBsYXlPdmVybGF5SHRtbElubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgIHBsYXlPdmVybGF5SHRtbElubmVyLmlkID0gJ3BsYXlCdXR0b24nO1xuICAgICAgICBwbGF5T3ZlcmxheUh0bWxJbm5lci5zcmMgPVxuICAgICAgICAgICAgJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBUEVBQUFENUNBWUFBQUQybU5Oa0FBQUFBWE5TUjBJQXJzNGM2UUFBQUFSblFVMUJBQUN4and2OFlRVUFBQUFKY0VoWmN3QUFEc01BQUE3REFjZHZxR1FBQUFBWmRFVllkRk52Wm5SM1lYSmxBSEJoYVc1MExtNWxkQ0EwTGpBdU1qSHhJR21WQUFBU2drbEVRVlI0WHUyZEM3QmRWWDJIcVVDQ0lSQVNDUGpBRklRUkVCUkJCU1JZYkZPdDhsSXJGVVdSRnFYV3NUNXdiSXRVcUZXczBLcUlNUEtvWUVXcFJTMDZLRGpTMUJlVkZrVlFiQ3crd0NmaUF3R2hDS1dQOVB1WnRVMjR1VGU1OXp6MjJZL3ZtL25Ha1h0ejdqbHJyOStzZGZaZWEvMDNXYjE2OVF0eEdXNjJpWWkwRDhMN05id1lqOEVkY2RQeUl4RnBBNFQyUC9GLzhVYThDSS9HaFBuWHlxK0lTSk1ockFseHhYOWhSdVlMOFNoOFNQazFFV2txQkhYZEVGZmNnNnZ3M2ZoczNLYjh1b2cwRFFJNlhZZ3I4ck92WXNKOE9NNHYvMHhFbWtJSjZvYjRQOHpJZkFOZWdDdlFNSXMwQlFLNXNSQlhKTXkvd0l6TTUrQnlYRkJlUmtRbUJVR2NiWWpYNVM1TW1NL0FBM0NMOG5JaVVqY0VjSkFRVjl5Qlg4YS93U2VpejVoRjZvYmdEUlBpa0dmTUNmT1g4RFRjdTd5MGlOUUJvUnMyeEJYL2czZGl3dndtM0tuOENSRVpKNFJ0VkNHdXFNS2N1OWtuNHhKMDlaZkl1Q0Jnb3c1eHlKM3NUTE56QXl3cndGNkoyNk5oRmhrMUJHc2NJVjZYaFBsdXZBNlB4eDNLbnhhUlVVQ294aDNpaW9RNXo1bi9CWS9GSmVVdGlNZ3dFS2E2UWx5Uk1OK0huOEhuNFpibHJZaklJQkNpdWtNYzhwMjVXczZaTUQrenZCMFJtU3NFYUJJaG5rcmV3NVY0RUhyQ2lNaGNLQUZxQ3YrTmwrSit1QkM5bXkyeU1RaEtrMEpja2UvTTc4R3N5MDZZSDFUZXJvaE1oWUEwTWNRVlA4Tno4VURjQ2wyYkxUSVZndEhrRUZkOEQ4L0UvWEZyZEdRV3FTQVFiUWh4eUtPcG0vQjAzQWM5TWtna0VJYTJoTGdpTjc4UzVsUHgwYmdJdlFFbS9ZVUF0QzNFRlFuenpmZ251RGM2elpaK1FzZHZhNGpYNVN2NGF0d1hIWm1sWDlEaHV4RGlrQzJRbjhkWFlVYm1SZVVqaW5RYk9udFhRbHlSVFJhZndsZGd3cnhWK2FnaTNZUk8zclVRVi93Y1YrTEw4REhveVp6U1RlamNYUTF4UmM3L3VoeXpsM2t2M0x4OGRKRnVRS2Z1ZW9oRG5qRm5aUDRvL2o3bTBaUUg0RXMzb0RQM0ljUVYyZjZZTUYrQ09aamdVZWlaMmRKdTZNUjlDdkc2M0lMdng0ek1DZk84MGlRaTdZTE8yOWNRVjN3YjM0c3BzcjRydW1CRTJnV2R0dThoRGxuOTlTMU1YZVlYNE02bGVVU2FEeDNXRUs4bFJkWVQ1bFIvelBsZm5zd3B6WWVPYW9qWEo0Y1NmQjNQdytmZ3R1ZzBXNW9KbmRNUVQwL3VaR2VhWFpWeWZUWnVWNXBOcERuUU1RM3h4c2swTzlVZno4WkRjZHZTZkNLVGh3NXBpR2RQMmlvRjQ5NkpUMGMzV2Nqa0tSMVQ1a1lXakNUTTc4RGZRaGVNeU9TZ0F4cml3Y2gzNWxSL3ZBYlB3T1hvelMrcEh6cWVJUjZPYWwxMnd2eDJmQnk2eVVMcWd3NW5pRWREd3B5UitWcE1rZlhzbUhJcHA0d2ZPcG9oSGoyMzRSZndGTndEbldiTCtLQ0RHZUx4a0pINXAzZzF2ZzUzSzAwdU1scm9YSVo0dkdUQlNNSjhGZVprem1XbDZVVkdBNTNLRU5mRC9aaXlOQ215bnZPL0ZwZExJREljZENaRFhDOFptZk9kK2Qvd0plalpYekljZENKRFhEOTV4cHdqZG5QK1Y3NHpINFd1L3BMQm9QTVk0c21TTU4rRktiSitCQnBtbVJ0MEdrUGNEQkxtdS9GamVBaTZsRk5tQjUzRkVEZUhUTFB6YUNvajgwZHdCZnFNV1RZTW5jUVFONWVzQVBzdzdsY3VsOGo2MEVFTWNmUEpEYkQzWVU3bDNLeGNPcEUxMENrTWNUdklWRHZmbWMvRTNYRUx0UHFqR09LV2toVmdwK0dlbUREN3ZiblAwQUVNY1h0SmtmVTM0R054QVRveTl4RXV2Q0Z1UDZ2d0pNeU9xWVhsMGtwZjRLSWI0bTVRbmN5WlRSYXBaR0dZK3dJWDJ4QjNpM3Z4T3N3bWkxM1FhWGJYNFFJYjRtNlNZM2EvaU1kaDdtWWI1cTdDaFRYRTNhWGFhTEVTcTdyTVc1WkxMMTJCaTJxSSs4RTllRGttekx1aFllNEtYRXhEM0I4eU10K09sK0tMMENMclhZQ0xhSWo3UjhKOEsxNkNSNlBMT2RzTUY4OFE5NWZzbVBvUlhvelB4ZHpOZHZWWDIrQ2lHV0xKemErRU9YV1pqOFNkMEFQdzJ3SVh5eEJMcVBZeTM0TG5ZOEs4REExejArRWlHV0taU2dKOUk3NExVMlI5UjNTYTNWUzRPSVpZWnFKYXlua1dwc2o2dzB1M2tTYkJoVEhFc2pIdXd4c3dwVndQdzZXbCswZ1Q0SUlZWXBrTm1XS25yMXlQcWY1NEtHNVZ1cEZNa25KaFJHWkx3cHpWWDZuKytEWjhHcnBqYXBKd0FReXhERUxDbkIxVHFXVHgxL2dVZEdTZUJEUzhJWlpCU1pCanp2NzZQUDRWSG9TR3VVNW9jRU1zb3lCaFRzRzRWSDk4SXg2QTgwczNrM0ZDUXh0aUdTVlpNUElUL0N3bXpQdWh6NWpIQ1Exc2lHVWNaQ2xud3Z4cFBBWDNMRjFPUmcyTmE0aGxYR1NLblFVakNmTm44UFg0Q055MGREOFpCVFNvSVpaeGt6QlhJL1BuOEFUTXVtekRQQXBvU0VNc2RaRXc1enZ6RHpIVDdKZGp3dXpaWDhOQUF4cGltUVNaWmlmTW44VGo4YUdsUzhwY29mRU1zVXlLak13NWxUT25qSHdjYzJUUWt0STFaYmJRYUlaWUprM0NuRTBXR1ptdndPZWgrNWhuQzQxbGlLVXBWQ056d3Z3SlBCeTkrYlV4YUNSRExFMGpZYjRmVS8weDAreUQ4Y0dseThwVWFCeERMRTBrUWE3Q2ZDZm1NTDhEMFNOMnAwS2pHR0pwT2dsenRXZ2toL2s5Q1QxaXQ0TEdNTVRTRmhMbUxCckozZXh6Y0ovU2pmc05EV0dJcFkwazBEL0FNL0dScFR2M0V4ckFFRXVicVZhQW5ZNUxzWDkzcy9uUWhsaTZRTFVGOG5XWUkzYm5ZVCtXYy9KQkRiRjBoZXFPOWpmd2xmaEluSS9kRGpNZjBCQkxGMG1ZcjhOc3NraU5xUzJ3bTJIbWd4bGk2VEo1enB3amcvNFFkOGJ1TFJyaFF4bGk2UU01WmpkSEJoMkgrYzdjblVVamZCaERMSDBoVSt5N2NDVStIN09YZVY2SlFudmhReGhpNlJzSmMwYm15L0JaK01zYllDVVM3WU0zYjRpbHJ5VE0yUUw1UVV6QnVIeG5idDgwbXpkdGlFVldyNzROTDhLVWNrMlI5ZmFNekx4WlF5eXlob3pNV2NwNUlmNHVKc3pOUDV5QU4ybUlSUjVJVm4vZGpPZmhFZGpzdy94NGM0WllaSHJ5alBrbVBCc1B3WWVWMkRRTDNwZ2hGcG1aVExGelpGRENuTHJNejhEdHNUa2JMWGd6aGxoazR5VE0yY3U4Q3JOaktpTnp3ano1T2xPOENVTXNNamNTNXF6TGZndW15UHIySlU2VGdUZGdpRVVHb3lxeW5yck12NDJUT1RPYlAyeUlSUVluMCt3czVid2FVOHIxTjNIckVxOTY0QThhWXBIaFNaanZ3QlNNUzVnUHducldaZk9IRExISTZNZ3o1aHl4bTRKeGY0a0g0SGpEekI4d3hDS2pKMkhPTlB1ZjhjOXhIeHpQWG1aZTJCQ0xqSWRNc1dNcVdmd1Rub2lQd2RHT3pMeWdJUllaUHdselZXUHF0YmdYam1iQkNDOWtpRVhxSTgrWXM4bmljbndON2xhaU9EaThpQ0VXcVplTXlsbVhuVENuWUZ4TzV0eXhSSEx1OEk4TnNjaGtTSml6THZ2N21KSDVwYmdZNTdaamluOWdpRVVtU3pVeWZ3OVRaUDFZM0xaRWRPUHd5NFpZcEJra3pLbisrQjM4S0I2RjI1V296Z3kvWkloRm1rWENuTE8vdm9zZndwd3lzcWhFZG4zNG9TRVdhU1lKOHk4dzArd1A0R0c0L29JUi9xTWhGbWsyVlpnenpVNllzMk5xN1Q1bS9vOGhGbWtIQ1hPMlB5Yk1GK08rK0NCRExOSXVFdVNzeTg1MzVsdnhaRU1zMGo2cVdzelpKYlhVRUl1MGkxdndyWmhxRlp2NW5WaWtQV1RxZkE1bUY5UUREK2ZqUHhoaWtlYVI3Nzd4ZHJ3QW4xQWl1ejc4MEJDTE5JdnNkTXFCQXFrTnRSdzNYQmVLWHpERUlwTW5vMjdDZXpkZWlrL0dCU1dtRzRaZk5NUWlreVBoelhycFZHWE02UjhyY0c3bFZma0hobGlrZmhMZTdGektvNktWK0h1NDVtN3pYT0VmR21LUmVza2U0b1QzazNnTWJsbmlPQmk4Z0NFV3FZZU12RC9HSy9GNDNLSEVjRGg0SVVNc01sNXl3K3BIbUxPb1g0YURIOFV6SGJ5Z0lSWVpEL25lbTVIM0tqd0JkOExSVjFIa1JRMnh5R2pKM2VhY05aMWlheWZocitQNDZobno0b1pZWkRSazJwendwaDdUWCtDdU9QNzZ4ZndSUXl3eUhObFZWSVgzVkh4OGlWYzk4QWNOc2NqZ1pKRkd5cHErR2ZmSHdaNzFEZ04vMUJDTHpKMmY0Ny9pV3pCbFRJZDcxanNNL0hGRExESTdjcmY1SHJ3RzM0WUhZNzBGeGFlRE4yR0lSVFpNd3B2amNLN0ZkK0JUY2ZMaHJlRE5HR0tSbWNuSWV6MitFdy9GaFRpM01pdmpoamRraUVYV0owZkVmaFhQd21maTRoS1o1c0diTThRaWE4bjY1bFg0TGt6bGhZZVZxRFFYM3FRaEZsbnpyUGMvOEZ6TXRzQmwyS3hwODB6d1JnMng5SjBjeG40ZXBvQlpsa2pXLzZ4M0dIakRobGo2U0paSTVnVEo5K0R6TWVIZHZNU2lYZkRHRGJIMGlXcGJZTXFnSkx5N1lMdEczcW53QVF5eDlJVnNDN3dFWDRDNzQvaDJGdFVKSDhRUVM5ZkpVVGc1UWZJNDNBUG5sZTdmRGZoQWhsaTZTbzUvL1JpK0dCUGV5YTF2SGlkOE1FTXNYU01IMFgwQ1g0Sjc0Y0xTM2JzSkg5QVFTMWZJVGF2czZmMVZlTEVkejNxSGdROXBpS1h0WkhOQzFqZm5FTHBmVHB1eCsrR3Q0TU1hWW1rcm1UWi9HVitMQ1crM3A4MHp3UWMzeE5JMnNrVHlCc3doZEh0aWM3WUZUZ0lhd0JCTG03Z1JUOEhINGRiWW4ybnpUTkFJaGxqYVFDcmt2d2tUM3R5d0d2OHBrbTJCeGpERTBsUnlva2JPc2pvRFV5RS9ONndNNzFSb0ZFTXNUU1BodlJQZmpZL0dCZWkwZVNab0hFTXNUZUoyL0FEdWcrM2NWVlEzTkpRaGxpYVFrZmNmOFNub3FEc1hhREJETEpNaWo0cnV4Y3Z3YWVqSU93ZzBuQ0dXdXNueXlJVDNDandNKzdsSVkxVFFnSVpZNmlBM3F6THlabWRSU24wZWljMDlRYkpOMEpDR1dNWkp3cHVSOXc3OEVyNFF1N2tsY0ZMUW9JWll4a1hxOU9adWMyb1daWE5DdjVkSGpnc2ExaERMcUtuQ20ycUIyWnp3ME5MZFpCelF3SVpZUmtXbXpUL0RoUGRFM0tWME14a25OTFFobG1ISjk5NkVOd1hIc2praHE2eGNIbGtYTkxZaGxrRkplSFBES2h2eXN6a2g0VzMzOGE5dGhFWTN4REpYOHFnb0d4TVMzdFRwZlN6T0wxMUs2b2JHTjhReVd4TGVMSS9NdERtbFB2ZEhwODJUaG90Z2lHVTJaT1N0d3JzQ1hTTFpGTGdZaGxnMnhGMlljNnpPeHFlakN6V2FCaGZGRU10MHBNajJWekIxZWcvQkphWExTTlBnNGhoaXFjamQ1aXpVU0lYOGxQcDhGaTR0WFVXYUNoZkpFRXRJaGZ3VTJiNFFVMlI3TzNSZmJ4dmdRaG5pZnBPRDE3K0pDVzlLZlM1Rjd6aTNDUzZZSWU0bk9YajlXL2gzZUF3K3ZIUUphUnRjUEVQY0wvS3M5MmE4Q0kvRlhkRnBjNXZoQWhyaS92QjkvSHY4QTN3VXVrU3lDM0FoRFhIMytTbitBeDZQcVpEdkVza3V3UVUxeE4ya09nb25KMGltMUdjMkoyeFJMcnQwQ1M2c0llNFcxYzZpajJORzNsUk9tRmN1dDNRUkxyQWg3ZzRKNzVYNFI3ZzNHdDQrd0lVMnhPMG4wK1pQNGFzd0JjZGMzOXdudU9DR3VMM2tXZS9uOERXNEx5NHFsMVg2QkJmZUVMZVRMK0FKK0FUY0JuM1cyMWU0K0lhNFBlU084OWZ3VC9HSnVBaGRJdGwzNkFTR3VQbGtaOUczOGZXWW8zQXk4aHBlV1FPZHdSQTNseHdCZXhPK0dWUHEwN0luc2o1MERFUGNUTEsrK2UyWWM2d1dvOTk1Wlhyb0hJYTRXZHlLT1Fwbk9XYmF2R201VkNMVFF5Y3h4TTBncDBpZWowL0czTEF5dkRJNzZDeUdlSEpVeCtHOEh3OUV3eXR6aDA1amlDZEREcUs3SEEvQWhlaDNYaGtNT284aHJwZTA5NmZ4ZDlEOXZESThwVlBKK0xrWFA0dlBRYWZNTWpyb1VJWjRmT1E3YjlZM1g0VTV4OG9pMnpKNjZGaUdlUFJrZVdST2tmd2lIb2VlM1N6amd3NW1pRWREUnQxNEQrYnc5WmZqRHFXWlJjWUhIYzBRRDA5MUZFNk9nUDB6OU9CMXFRODZteUVlbkt4dFRuZ3o4cjRCSFhtbGZ1aDRobmp1Skx3cDlabHFnYWZoN3FVNVJlcUhEbWlJWjArbXpWa2VlUU8rRlI5Zm1sRmtjdEFSRGZIc1NKM2VmOGRxWjVHSDBFa3pvRE1hNHBuSjNlYTBUMDdUT0FlenZubEJhVHFSWmxBNnFUeVFoRGRybTFmaEJYZ3dHbDVwSm5ST1E3eVc2amx2d3Z0ZWZBWnVYcHBLcEptVVRpdHJwODBwOVpuMXpROHVUU1RTYk9pc2ZROXhwczJwa0ovd1BoZTNLMDBqMGc3b3RIME44ZjM0ZFh3ZkhvMFcyWloyUXVmdFk0aXpQREtuYWJ3SUg0RWUveXJ0aFE3Y2x4Qm5sZFVQOEJKOE1TYTg3dXVWOWtOSDducUljNFpWd3ZzaGZDa3VROE1yM1lFTzNkVVFaNG5rRC9IRG1GS2ZlNVNQTE5JdDZOeGRESEhDK3hGOEJhYnNpU092ZEJjNmVKZENmQnRlaGdsdmltejdyRmU2RHgyOUN5SE9RbzByOE5XWU9yMFcyWmIrUUlkdmE0aXpSRExQZWxkaTZ2U20xT2ZDOHJGRStnTWR2NDBoem51K0dsTWhmei9jRWowT1Ivb0puYjlOSWM1N3ZRWlB4Q2VoSTY5SUNVYlR5ZG5OMStMSm1QQXVLVzlmUkFoRWswT2NaNzNYWXc2aE93Zzl2MWxrS2dTanFTSE81b1JUOFRkd0ticStXV1E2Q0VlVFFwdzd6bG1vY1RxbVRtL09iN2JvbU1pR0lDUk5DSEdtelQvQnN6Q2xQalB5dXNwS1pEWVFsa21IK01mNHQ3Z2N0MGVuelNKemdkQk1Lc1FKNzBYNFZIVGtGUmtVd2xOM2lGTTU0WU40S0c2TEhrUW5NZ3lFcUs0UTUxbnZwWmp3WnVRMXZDS2pnRERWRWVJcjhYQk1lTDNiTERKS0NOVzRRcHlSOXpvOEFyZEJiMWlKakFQQ05lb1FKN3lwRm5nc3prYzNKb2lNRTBJMnFoRG5XVzhLanYweHVqRkJwQzRJM0RBaHpncXJIRVNYVXAvWjAvdVE4cklpVWhjRWI1QVFKN3ozNFRmd0pOeTV2SnlJMUEwQm5HMklFOXlZc2lmZndUZml6dWgzWHBGSlFnaG5FK0o4MzAxNHY0dXBrTDhyK3FoSXBBa1F4ZzJGT09ITnp6TnRQaGYzUkVkZWtTWlJRanFWVEp0emd1U05lRDRlV0g1ZFJKb0dBWjBhNHJ2eG0zZ2hya0NuelNKTmhwQldJYzcvcGxwZ3dwdWRSWjdkTE5JR0NPdnRKYndYNDJHNHVQeElSTm9Bb1UyZDNpTnhVZmxQSXRJYU50bmsvd0VHQm9NZHBFQ0dIQUFBQUFCSlJVNUVya0pnZ2c9PSc7XG4gICAgICAgIHBsYXlPdmVybGF5SHRtbElubmVyLmFsdCA9ICdTdGFydCBTdHJlYW1pbmcnO1xuICAgICAgICByZXR1cm4gcGxheU92ZXJsYXlIdG1sSW5uZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGNvbm5lY3Qgb3ZlcmxheSB3aXRoIGEgY29ubmVjdGlvbiBidXR0b24uXG4gICAgICogQHBhcmFtIHBhcmVudEVsZW0gLSB0aGUgcGFyZW50IGVsZW1lbnQgdGhpcyBvdmVybGF5IHdpbGwgYmUgaW5zZXJ0ZWQgaW50by5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwYXJlbnRFbGVtKSB7XG4gICAgICAgIHN1cGVyKHBhcmVudEVsZW0sIFBsYXlPdmVybGF5LmNyZWF0ZVJvb3RFbGVtZW50KCksIFBsYXlPdmVybGF5LmNyZWF0ZUNvbnRlbnRFbGVtZW50KCkpO1xuICAgICAgICAvLyBhZGQgdGhlIG5ldyBldmVudCBsaXN0ZW5lclxuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QbGF5T3ZlcmxheS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgT3ZlcmxheUJhc2UgfSBmcm9tICcuL0Jhc2VPdmVybGF5Jztcbi8qKlxuICogQ2xhc3MgZm9yIHRoZSB0ZXh0IG92ZXJsYXkgYmFzZVxuICovXG5leHBvcnQgY2xhc3MgVGV4dE92ZXJsYXkgZXh0ZW5kcyBPdmVybGF5QmFzZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgdGV4dCBvdmVybGF5XG4gICAgICogQHBhcmFtIHJvb3REaXYgLSB0aGUgcm9vdCBlbGVtZW50IHRoaXMgb3ZlcmxheSB3aWxsIGJlIGluc2VydGVkIGludG9cbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgLSB0aGUgcm9vdCBlbGVtZW50IHRoYXQgaXMgdGhlIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gdGV4dEVsZW1lbnQgLSBhbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGV4dCBmb3IgdGhlIGFjdGlvbiBvdmVybGF5XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdERpdiwgcm9vdEVsZW1lbnQsIHRleHRFbGVtZW50KSB7XG4gICAgICAgIHN1cGVyKHJvb3REaXYsIHJvb3RFbGVtZW50LCB0ZXh0RWxlbWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgdGV4dCBvdmVybGF5cyBpbm5lciB0ZXh0XG4gICAgICogQHBhcmFtIHRleHQgLSB0aGUgdXBkYXRlIHRleHQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIHVwZGF0ZSh0ZXh0KSB7XG4gICAgICAgIGlmICh0ZXh0ICE9IG51bGwgfHwgdGV4dCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRleHRPdmVybGF5LmpzLm1hcCIsIi8qIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICovXG5pbXBvcnQganNzIGZyb20gJ2pzcyc7XG5pbXBvcnQgZ2xvYmFsIGZyb20gJ2pzcy1wbHVnaW4tZ2xvYmFsJztcbmltcG9ydCBjYW1lbENhc2UgZnJvbSAnanNzLXBsdWdpbi1jYW1lbC1jYXNlJztcbmV4cG9ydCBjbGFzcyBQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0TGlnaHRNb2RlUGFsZXR0ZSA9IHtcbiAgICAgICAgICAgICctLWNvbG9yMCc6ICcjZTJlMGRkODAnLFxuICAgICAgICAgICAgJy0tY29sb3IxJzogJyNGRkZGRkYnLFxuICAgICAgICAgICAgJy0tY29sb3IyJzogJyMwMDAwMDAnLFxuICAgICAgICAgICAgJy0tY29sb3IzJzogJyMwNTg1ZmUnLFxuICAgICAgICAgICAgJy0tY29sb3I0JzogJyMzNWIzNTAnLFxuICAgICAgICAgICAgJy0tY29sb3I1JzogJyNmZmFiMDAnLFxuICAgICAgICAgICAgJy0tY29sb3I2JzogJyNlMWUyZGQnLFxuICAgICAgICAgICAgJy0tY29sb3I3JzogJyNjM2M0YmYnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVmYXVsdERhcmtNb2RlUGFsZXR0ZSA9IHtcbiAgICAgICAgICAgICctLWNvbG9yMCc6ICcjMWQxZjIyZTAnLFxuICAgICAgICAgICAgJy0tY29sb3IxJzogJyMwMDAwMDAnLFxuICAgICAgICAgICAgJy0tY29sb3IyJzogJyNGRkZGRkYnLFxuICAgICAgICAgICAgJy0tY29sb3IzJzogJyMwNTg1ZmUnLFxuICAgICAgICAgICAgJy0tY29sb3I0JzogJyMzNWIzNTAnLFxuICAgICAgICAgICAgJy0tY29sb3I1JzogJyNmZmFiMDAnLFxuICAgICAgICAgICAgJy0tY29sb3I2JzogJyMxZTFkMjInLFxuICAgICAgICAgICAgJy0tY29sb3I3JzogJyMzYzNiNDAnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVmYXVsdFN0eWxlcyA9IHtcbiAgICAgICAgICAgICc6cm9vdCc6IHtcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjAnOiAnIzFkMWYyMmUwJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjEnOiAnIzAwMDAwMCcsXG4gICAgICAgICAgICAgICAgJy0tY29sb3IyJzogJyNGRkZGRkYnLFxuICAgICAgICAgICAgICAgICctLWNvbG9yMyc6ICcjMDU4NWZlJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjQnOiAnIzM1YjM1MCcsXG4gICAgICAgICAgICAgICAgJy0tY29sb3I1JzogJyNmZmFiMDAnLFxuICAgICAgICAgICAgICAgICctLWNvbG9yNic6ICcjMWUxZDIyJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjcnOiAnIzNjM2I0MCcsXG4gICAgICAgICAgICAgICAgJy0tY29sb3I4JzogJyM0MTAwOGMnLFxuICAgICAgICAgICAgICAgICctLWNvbG9yOSc6ICcjM2UwMDcwJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjEwJzogJyMyZTAwNTInLFxuICAgICAgICAgICAgICAgICctLWNvbG9yMTEnOiAncmdiYSg2NSwwLDEzOSwxKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLm5vc2VsZWN0Jzoge1xuICAgICAgICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjcGxheWVyVUknOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjdmlkZW9FbGVtZW50UGFyZW50Jzoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3IxKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpRmVhdHVyZXMnOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6ICczMCcsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJyxcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5VaVRvb2wgLnRvb2x0aXB0ZXh0Jzoge1xuICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJyxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzE1cHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwcHggMTBweCcsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCInTW9udHNlcnJhdCcsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzAuNzVyZW0nLFxuICAgICAgICAgICAgICAgIGxldHRlclNwYWNpbmc6ICcwLjc1cHgnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIHRvcDogJzAnLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMjUlKScsXG4gICAgICAgICAgICAgICAgbGVmdDogJzEyNSUnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogJzIwJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuVWlUb29sOmhvdmVyIC50b29sdGlwdGV4dCc6IHtcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiAndmlzaWJsZScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3I3KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI2Nvbm5lY3Rpb24gLnRvb2x0aXB0ZXh0Jzoge1xuICAgICAgICAgICAgICAgIHRvcDogJzEyNSUnLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTI1JSknLFxuICAgICAgICAgICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6ICcyMCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjY29ubmVjdGlvbic6IHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICBib3R0b206ICc4JScsXG4gICAgICAgICAgICAgICAgbGVmdDogJzUlJyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBcIidNaWNocm9tYScsIHNhbnMtc2VyaWZcIixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICczcmVtJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzNyZW0nLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdhbGwnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5ncy1wYW5lbCAudG9vbHRpcHRleHQnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICB0b3A6ICcxMjUlJyxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICAgICAgekluZGV4OiAnMjAnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnM3B4IHNvbGlkIHZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnbWF4LWNvbnRlbnQnLFxuICAgICAgICAgICAgICAgIGZhbGxiYWNrczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJ21heC1jb250ZW50J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICczcHggc29saWQgdmFyKC0tY29sb3IzKSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4J1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6ICcyMCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogJzAnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogJzEyNSUnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI2NvbnRyb2xzJzoge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIHRvcDogJzMlJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMiUnLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiJ01pY2hyb21hJywgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdhbGwnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI2NvbnRyb2xzPionOiB7XG4gICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMnJlbScsXG4gICAgICAgICAgICAgICAgbGluZUhlaWdodDogJzEuNzVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwLjVyZW0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNjb250cm9scyAjYWRkaXRpb25hbGluZm8nOiB7XG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBcIidNb250c2VycmF0Jywgc2Fucy1zZXJpZlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNmdWxsc2NyZWVuLWJ0bic6IHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMC42cmVtICFpbXBvcnRhbnQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNtaW5pbWl6ZUljb24nOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5nc0J0biwgI3N0YXRzQnRuJzoge1xuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyN1aUZlYXR1cmVzIGJ1dHRvbic6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgdmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzNyZW0nLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzNyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpRmVhdHVyZXMgYnV0dG9uOmhvdmVyJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzNweCBzb2xpZCB2YXIoLS1jb2xvcjMpJyxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnMC4yNXMgZWFzZScsXG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjU1cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAnMC41NXJlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpRmVhdHVyZXMgYnV0dG9uOmFjdGl2ZSc6IHtcbiAgICAgICAgICAgICAgICBib3JkZXI6ICczcHggc29saWQgdmFyKC0tY29sb3IzKScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjU1cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAnMC41NXJlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1mbGF0Jzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMiknLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiJ01vbnRzZXJyYXQnXCIsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzNweCBzb2xpZCB2YXIoLS1jb2xvcjMpJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxcmVtJyxcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzAuNzVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1mbGF0OmhvdmVyJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdlYXNlIDAuM3MnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5idG4tZmxhdDpkaXNhYmxlZCc6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1jb2xvcjMpJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ2RlZmF1bHQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5idG4tZmxhdDphY3RpdmUnOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5idG4tZmxhdDpmb2N1cyc6IHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiAnbm9uZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpRmVhdHVyZXMgaW1nJzoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnBhbmVsLXdyYXAnOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzIwdncnLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiAnOTB2dycsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKScsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJy4zcyBlYXNlLW91dCcsXG4gICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ2FsbCcsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dYOiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjApJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcucGFuZWwtd3JhcC12aXNpYmxlJzoge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCUpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcucGFuZWwnOiB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzFlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3NldHRpbmdzSGVhZGluZywgI3N0YXRzSGVhZGluZyc6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzJlbScsXG4gICAgICAgICAgICAgICAgbWFyZ2luQmxvY2tTdGFydDogJzAuNjdlbScsXG4gICAgICAgICAgICAgICAgbWFyZ2luQmxvY2tFbmQ6ICcwLjY3ZW0nLFxuICAgICAgICAgICAgICAgIG1hcmdpbklubGluZVN0YXJ0OiAnMHB4JyxcbiAgICAgICAgICAgICAgICBtYXJnaW5JbmxpbmVFbmQ6ICcwcHgnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwIDAgMCAycmVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjc2V0dGluZ3NDbG9zZSwgI3N0YXRzQ2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiAnMC41cmVtJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMmVtJyxcbiAgICAgICAgICAgICAgICBmbG9hdDogJ3JpZ2h0J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjc2V0dGluZ3NDbG9zZTphZnRlciwgI3N0YXRzQ2xvc2U6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlxcXFwwMGQ3XCInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5nc0Nsb3NlOmhvdmVyLCAjc3RhdHNDbG9zZTpob3Zlcic6IHtcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdlYXNlIDAuM3MnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5nc0NvbnRlbnQsICNzdGF0c0NvbnRlbnQnOiB7XG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogJzJyZW0nLFxuICAgICAgICAgICAgICAgIG1hcmdpblJpZ2h0OiAnMnJlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnNldHRpbmcnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzAuMTVyZW0gMTBweCAwLjE1cmVtIDEwcHgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5zZXR0aW5ncy10ZXh0Jzoge1xuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3IyKScsXG4gICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnNldHRpbmdzLW9wdGlvbic6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIHRleHRPdmVyZmxvdzogJ2VsbGlwc2lzJyxcbiAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjY29ubmVjdE92ZXJsYXksICNwbGF5T3ZlcmxheSwgI2luZm9PdmVybGF5LCAjZXJyb3JPdmVybGF5LCAjYWZrT3ZlcmxheSwgI2Rpc2Nvbm5lY3RPdmVybGF5Jzoge1xuICAgICAgICAgICAgICAgIHpJbmRleDogJzMwJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMiknLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMS44ZW0nLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3IxKScsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIHRleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5jbGlja2FibGVTdGF0ZSc6IHtcbiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50ZXh0RGlzcGxheVN0YXRlJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuaGlkZGVuU3RhdGUnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNwbGF5QnV0dG9uLCAjY29ubmVjdEJ1dHRvbic6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6ICczMCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnaW1nI3BsYXlCdXR0b24nOiB7XG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6ICcyNDFweCcsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMCUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyN1aUludGVyYWN0aW9uJzoge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNVSUludGVyYWN0aW9uQnV0dG9uQm91bmRhcnknOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzJweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI1VJSW50ZXJhY3Rpb25CdXR0b24nOiB7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1vdmVybGF5Jzoge1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wtc3dpdGNoJzoge1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wtc3dpdGNoIC50Z2wnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wsIC50Z2w6YWZ0ZXIsIC50Z2w6YmVmb3JlLCAudGdsICosIC50Z2wgKjphZnRlciwgLnRnbCAqOmJlZm9yZSwgLnRnbCsudGdsLXNsaWRlcic6IHtcbiAgICAgICAgICAgICAgICAnLXdlYmtpdC1ib3gtc2l6aW5nJzogJ2JvcmRlci1ib3gnLFxuICAgICAgICAgICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2w6Oi1tb3otc2VsZWN0aW9uLCAudGdsOmFmdGVyOjotbW96LXNlbGVjdGlvbiwgLnRnbDpiZWZvcmU6Oi1tb3otc2VsZWN0aW9uLCAudGdsICo6Oi1tb3otc2VsZWN0aW9uLCAudGdsICo6YWZ0ZXI6Oi1tb3otc2VsZWN0aW9uLCAudGdsICo6YmVmb3JlOjotbW96LXNlbGVjdGlvbiwgLnRnbCsudGdsLXNsaWRlcjo6LW1vei1zZWxlY3Rpb24nOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2w6OnNlbGVjdGlvbiwgLnRnbDphZnRlcjo6c2VsZWN0aW9uLCAudGdsOmJlZm9yZTo6c2VsZWN0aW9uLCAudGdsICo6OnNlbGVjdGlvbiwgLnRnbCAqOmFmdGVyOjpzZWxlY3Rpb24sIC50Z2wgKjpiZWZvcmU6OnNlbGVjdGlvbiwgLnRnbCsudGdsLXNsaWRlcjo6c2VsZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICdub25lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsLXNsaWRlcic6IHt9LFxuICAgICAgICAgICAgJy50Z2wrLnRnbC1zbGlkZXInOiB7XG4gICAgICAgICAgICAgICAgb3V0bGluZTogJzAnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc0MHB4JyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxOHB4JyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICB1c2VyU2VsZWN0OiAnbm9uZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbCsudGdsLXNsaWRlcjphZnRlciwgLnRnbCsudGdsLXNsaWRlcjpiZWZvcmUnOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wrLnRnbC1zbGlkZXI6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgICAgbGVmdDogJzAnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wrLnRnbC1zbGlkZXI6YmVmb3JlJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsLWZsYXQrLnRnbC1zbGlkZXInOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzJweCcsXG4gICAgICAgICAgICAgICAgJy13ZWJraXQtdHJhbnNpdGlvbic6ICdhbGwgLjJzIGVhc2UnLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdhbGwgLjJzIGVhc2UnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1jb2xvcjYpJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICczcHggc29saWQgdmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMmVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsLWZsYXQrLnRnbC1zbGlkZXI6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgICAgJy13ZWJraXQtdHJhbnNpdGlvbic6ICdhbGwgLjJzIGVhc2UnLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICdhbGwgLjJzIGVhc2UnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMWVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsLWZsYXQ6Y2hlY2tlZCsudGdsLXNsaWRlcic6IHtcbiAgICAgICAgICAgICAgICBib3JkZXI6ICczcHggc29saWQgdmFyKC0tY29sb3IzKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbC1mbGF0OmNoZWNrZWQrLnRnbC1zbGlkZXI6YWZ0ZXInOiB7XG4gICAgICAgICAgICAgICAgbGVmdDogJzUwJScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLWNvbG9yMyknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5idG4tYXBwbHknOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrICFpbXBvcnRhbnQnLFxuICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnNDAlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuZm9ybS1jb250cm9sJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yNyknLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzJweCBzb2xpZCB2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3IyKScsXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAncmlnaHQnLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICdpbmhlcml0J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuZm9ybS1jb250cm9sOmhvdmVyJzoge1xuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tY29sb3I3KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmZvcm0tZ3JvdXAnOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogJzRweCcsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2dyaWQnLFxuICAgICAgICAgICAgICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICc4MCUgMjAlJyxcbiAgICAgICAgICAgICAgICByb3dHYXA6ICc0cHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogJzEwcHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnMTBweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmZvcm0tZ3JvdXAgbGFiZWwnOiB7XG4gICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnNldHRpbmdzQ29udGFpbmVyJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206ICcxcHggc29saWQgdmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogJzEwcHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdCb3R0b206ICcxMHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuc2V0dGluZ3NDb250YWluZXI+IDpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6ICc0cHgnLFxuICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbTogJzRweCcsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdiYXNlbGluZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmNvbGxhcHNlJzoge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAnNSUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzdHJlYW1Ub29scyc6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b21SaWdodFJhZGl1czogJzVweCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tTGVmdFJhZGl1czogJzVweCcsXG4gICAgICAgICAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIHRvcDogJzAnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAnMiUnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogJzEwMCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnNHB4IHNvbGlkIHZhcigtLWNvbG91cjgpJyxcbiAgICAgICAgICAgICAgICBib3JkZXJUb3BXaWR0aDogJzBweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnNldHRpbmdzSGVhZGVyJzoge1xuICAgICAgICAgICAgICAgIGZvbnRTdHlsZTogJ2l0YWxpYydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3N0cmVhbVRvb2xzSGVhZGVyJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWJldHdlZW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCB2YXIoLS1jb2xvdXI4KScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3I3KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnN0cmVhbVRvb2xzJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yMiknLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICd2YXIoLS1idXR0b25Gb250KScsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogJ2xpZ2h0ZXInLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3I3KSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnN0cmVhbVRvb2xzLXNob3duPiNzdHJlYW1Ub29sc1NldHRpbmdzLCAuc3RyZWFtVG9vbHMtc2hvd24+I3N0cmVhbVRvb2xzU3RhdHMnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjc3RyZWFtVG9vbHNUb2dnbGUnOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjcXVhbGl0eVN0YXR1cyc6IHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzM3cHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogJzRweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnN2Z0ljb24nOiB7XG4gICAgICAgICAgICAgICAgZmlsbDogJ3ZhcigtLWNvbG9yMiknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5tb2RhbCc6IHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzEwMHZ3JyxcbiAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6ICcxMDB2aCcsXG4gICAgICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgICAgIHRvcDogJzAnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuaW5uZXJNb2RhbCc6IHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICczMDBweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3IwKScsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMC43NWVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcubW9kYWxCdG5Db250YWluZXInOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYXJvdW5kJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6ICcxZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdCb3R0b206ICcxZW0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5tb2RhbFRleHRBcmVhJzoge1xuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2xlZnQnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnOTUlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICByZXNpemU6ICdub25lJyxcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogJzFyZW0nLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCB2YXIoLS1jb2xvcjIpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcubW9kYWxUZXh0QXJlYTpmb2N1cy12aXNpYmxlJzoge1xuICAgICAgICAgICAgICAgIG91dGxpbmU6ICdub25lICFpbXBvcnRhbnQnLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCB2YXIoLS1jb2xvcjMpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcubW9kYWwgLmJ0bi1mbGF0Jzoge1xuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMS4wcmVtJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGN1c3RvbVN0eWxlcywgbGlnaHRNb2RlUGFsZXR0ZSwgZGFya01vZGVQYWxldHRlLCBqc3NJbnNlcnRpb25Qb2ludCB9ID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgICAgIC8vIE9uZSB0aW1lIHNldHVwIHdpdGggZGVmYXVsdCBwbHVnaW5zIGFuZCBzZXR0aW5ncy5cbiAgICAgICAgY29uc3QganNzT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC8vIEpTUyBoYXMgbWFueSBpbnRlcmVzdGluZyBwbHVnaW5zIHdlIG1heSB3aXNoIHRvIHR1cm4gb25cbiAgICAgICAgICAgIC8vcGx1Z2luczogW2Z1bmN0aW9ucygpLCB0ZW1wbGF0ZSgpLCBnbG9iYWwoKSwgZXh0ZW5kKCksIG5lc3RlZCgpLCBjb21wb3NlKCksIGNhbWVsQ2FzZSgpLCBkZWZhdWx0VW5pdChvcHRpb25zLmRlZmF1bHRVbml0KSwgZXhwYW5kKCksIHZlbmRvclByZWZpeGVyKCksIHByb3BzU29ydCgpXVxuICAgICAgICAgICAgcGx1Z2luczogW2dsb2JhbCgpLCBjYW1lbENhc2UoKV0sXG4gICAgICAgICAgICBpbnNlcnRpb25Qb2ludDoganNzSW5zZXJ0aW9uUG9pbnRcbiAgICAgICAgfTtcbiAgICAgICAganNzLnNldHVwKGpzc09wdGlvbnMpO1xuICAgICAgICB0aGlzLmN1c3RvbVN0eWxlcyA9IGN1c3RvbVN0eWxlcztcbiAgICAgICAgdGhpcy5saWdodE1vZGVQYWxldHRlID0gbGlnaHRNb2RlUGFsZXR0ZSAhPT0gbnVsbCAmJiBsaWdodE1vZGVQYWxldHRlICE9PSB2b2lkIDAgPyBsaWdodE1vZGVQYWxldHRlIDogdGhpcy5kZWZhdWx0TGlnaHRNb2RlUGFsZXR0ZTtcbiAgICAgICAgdGhpcy5kYXJrTW9kZVBhbGV0dGUgPSBkYXJrTW9kZVBhbGV0dGUgIT09IG51bGwgJiYgZGFya01vZGVQYWxldHRlICE9PSB2b2lkIDAgPyBkYXJrTW9kZVBhbGV0dGUgOiB0aGlzLmRlZmF1bHREYXJrTW9kZVBhbGV0dGU7XG4gICAgfVxuICAgIGFwcGx5U3R5bGVTaGVldCgpIHtcbiAgICAgICAgLy8gVG9kbzogcmVmYWN0b3IgY29kZWJhc2UgdG8gdXNlIGpzcyBhdCBhIGNvbXBvbmVudCBsZXZlbCwgY2xhc3NlcyBjYW4gYmUgZ3JhYmJlZCBsaWtlIHNvOlxuICAgICAgICAvL2NvbnN0IHtwaXhlbFN0cmVhbWluZ0NsYXNzZXN9ID0ganNzLmNyZWF0ZVN0eWxlU2hlZXQoc3R5bGVzKS5hdHRhY2goKTtcbiAgICAgICAgLy8gYXR0YWNoIGdlbmVyYXRlZCBzdHlsZSBzaGVldCB0byBwYWdlXG4gICAgICAgIGpzcy5jcmVhdGVTdHlsZVNoZWV0KHtcbiAgICAgICAgICAgICdAZ2xvYmFsJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlZmF1bHRTdHlsZXMpLCB0aGlzLmN1c3RvbVN0eWxlcylcbiAgICAgICAgfSkuYXR0YWNoKCk7XG4gICAgfVxuICAgIGFwcGx5UGFsZXR0ZShwYWxldHRlKSB7XG4gICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignOnJvb3QnKTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29sb3IwJywgcGFsZXR0ZVsnLS1jb2xvcjAnXSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWNvbG9yMScsIHBhbGV0dGVbJy0tY29sb3IxJ10pO1xuICAgICAgICByb290RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb2xvcjInLCBwYWxldHRlWyctLWNvbG9yMiddKTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29sb3IzJywgcGFsZXR0ZVsnLS1jb2xvcjMnXSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWNvbG9yNCcsIHBhbGV0dGVbJy0tY29sb3I0J10pO1xuICAgICAgICByb290RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb2xvcjUnLCBwYWxldHRlWyctLWNvbG9yNSddKTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29sb3I2JywgcGFsZXR0ZVsnLS1jb2xvcjYnXSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWNvbG9yNycsIHBhbGV0dGVbJy0tY29sb3I3J10pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHBsYXllcnMgY29sb3IgdmFyaWFibGVzXG4gICAgICogQHBhcmFtIGlzTGlnaHRNb2RlIC0gc2hvdWxkIHdlIHVzZSBhIGxpZ2h0IG9yIGRhcmsgY29sb3Igc2NoZW1lXG4gICAgICovXG4gICAgc2V0Q29sb3JNb2RlKGlzTGlnaHRNb2RlKSB7XG4gICAgICAgIGlmIChpc0xpZ2h0TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBseVBhbGV0dGUodGhpcy5saWdodE1vZGVQYWxldHRlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlQYWxldHRlKHRoaXMuZGFya01vZGVQYWxldHRlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEZ1bGxTY3JlZW5JY29uIH0gZnJvbSAnLi9GdWxsc2NyZWVuSWNvbic7XG5pbXBvcnQgeyBTZXR0aW5nc0ljb24gfSBmcm9tICcuL1NldHRpbmdzSWNvbic7XG5pbXBvcnQgeyBTdGF0c0ljb24gfSBmcm9tICcuL1N0YXRzSWNvbic7XG5pbXBvcnQgeyBYUkljb24gfSBmcm9tICcuL1hSSWNvbic7XG5pbXBvcnQgeyBXZWJYUkNvbnRyb2xsZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41JztcbmltcG9ydCB7IFVJRWxlbWVudENyZWF0aW9uTW9kZSB9IGZyb20gJy4uL1VJL1VJQ29uZmlndXJhdGlvblR5cGVzJztcbi8vIElmIHRoZXJlIGlzbid0IGEgdHlwZSBwcm92aWRlZCwgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gY3JlYXRlIHRoZSBlbGVtZW50LlxuZnVuY3Rpb24gc2hvdWxkQ3JlYXRlQnV0dG9uKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSA9PSB1bmRlZmluZWQgPyB0cnVlIDogdHlwZS5jcmVhdGlvbk1vZGUgPT09IFVJRWxlbWVudENyZWF0aW9uTW9kZS5DcmVhdGVEZWZhdWx0RWxlbWVudDtcbn1cbi8qKlxuICogRWxlbWVudCBjb250YWluaW5nIHZhcmlvdXMgY29udHJvbHMgbGlrZSBzdGF0cywgc2V0dGluZ3MsIGZ1bGxzY3JlZW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9scyB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IHRoZSBjb250cm9sc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgaWYgKCFjb25maWcgfHwgc2hvdWxkQ3JlYXRlQnV0dG9uKGNvbmZpZy5zdGF0c0J1dHRvblR5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRzSWNvbiA9IG5ldyBTdGF0c0ljb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbmZpZyB8fCBzaG91bGRDcmVhdGVCdXR0b24oY29uZmlnLnNldHRpbmdzQnV0dG9uVHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3NJY29uID0gbmV3IFNldHRpbmdzSWNvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29uZmlnIHx8IHNob3VsZENyZWF0ZUJ1dHRvbihjb25maWcuZnVsbHNjcmVlbkJ1dHRvblR5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLmZ1bGxzY3JlZW5JY29uID0gbmV3IEZ1bGxTY3JlZW5JY29uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb25maWcgfHwgc2hvdWxkQ3JlYXRlQnV0dG9uKGNvbmZpZy54ckljb25UeXBlKSkge1xuICAgICAgICAgICAgdGhpcy54ckljb24gPSBuZXcgWFJJY29uKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGNvbnRyb2xzLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmlkID0gJ2NvbnRyb2xzJztcbiAgICAgICAgICAgIGlmICh0aGlzLmZ1bGxzY3JlZW5JY29uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5mdWxsc2NyZWVuSWNvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nc0ljb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzSWNvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0c0ljb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzSWNvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy54ckljb24pIHtcbiAgICAgICAgICAgICAgICB2b2lkIFdlYlhSQ29udHJvbGxlci5pc1Nlc3Npb25TdXBwb3J0ZWQoJ2ltbWVyc2l2ZS12cicpLnRoZW4oKHN1cHBvcnRlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnhySWNvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLmhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBoYW5kbGVGdWxsc2NyZWVuQ2hhbmdlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGlzSW5GdWxsc2NyZWVuID0gISFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudDtcbiAgICAgICAgaWYgKGlzSW5GdWxsc2NyZWVuICYmICgoX2EgPSB0aGlzLmNvbmZpZykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhpZGVDb250cm9sc0luRnVsbHNjcmVlbikpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db250cm9scy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNSc7XG5pbXBvcnQgeyBTdGF0c1NlY3Rpb25zIH0gZnJvbSAnLi9VSUNvbmZpZ3VyYXRpb25UeXBlcyc7XG4vKipcbiAqIERhdGFDaGFubmVsIExhdGVuY3kgdGVzdCBVSSBlbGVtZW50cyBhbmQgcmVzdWx0cyBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsTGF0ZW5jeVRlc3Qge1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYnV0dG9uIGNvbnRhaW5pbmcgdGhlIHN0YXRzIGljb24uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzQ29udGFpbmVyJyk7XG4gICAgICAgICAgICAvLyBtYWtlIGhlYWRpbmdcbiAgICAgICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGhlYWRpbmcuaWQgPSAnZGF0YUNoYW5uZWxMYXRlbmN5VGVzdEhlYWRlcic7XG4gICAgICAgICAgICBoZWFkaW5nLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzLXRleHQnKTtcbiAgICAgICAgICAgIGhlYWRpbmcuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NIZWFkZXInKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKGhlYWRpbmcpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGluZ1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGhlYWRpbmdUZXh0LmlubmVySFRNTCA9IFN0YXRzU2VjdGlvbnMuRGF0YUNoYW5uZWxMYXRlbmN5VGVzdDtcbiAgICAgICAgICAgIGhlYWRpbmcuYXBwZW5kQ2hpbGQoaGVhZGluZ1RleHQpO1xuICAgICAgICAgICAgaGVhZGluZy5hcHBlbmRDaGlsZCh0aGlzLmxhdGVuY3lUZXN0QnV0dG9uKTtcbiAgICAgICAgICAgIC8vIG1ha2UgdGVzdCByZXN1bHRzIGVsZW1lbnRcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNQYXJlbnRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICByZXN1bHRzUGFyZW50RWxlbS5pZCA9ICdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udGFpbmVyJztcbiAgICAgICAgICAgIHJlc3VsdHNQYXJlbnRFbGVtLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0c1BhcmVudEVsZW0pO1xuICAgICAgICAgICAgcmVzdWx0c1BhcmVudEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBsYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuaWQgPSAnZGF0YUNoYW5uZWxMYXRlbmN5U3RhdHNSZXN1bHRzJztcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnU3RhdHNSZXN1bHQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IGxhdGVuY3lUZXN0QnV0dG9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi52YWx1ZSA9ICdSdW4gVGVzdCc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi5pZCA9ICdidG4tc3RhcnQtZGF0YS1jaGFubmVsLWxhdGVuY3ktdGVzdCc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdzdHJlYW1Ub29scy1idXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB0aGUgVUkgYmFzZWQgb24gdGhlIGxhdGVuY3kgdGVzdCdzIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIHJlc3VsdCAtIFRoZSBsYXRlbmN5IHRlc3QgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBoYW5kbGVUZXN0UmVzdWx0KHJlc3VsdCkge1xuICAgICAgICBMb2dnZXIuSW5mbyhKU09OLnN0cmluZ2lmeShyZXN1bHQpKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrIHdlIGhhdmUgcmVzdWx0cywgTmFOIHdvdWxkIG1lYW4gdGhhdCBVRSB2ZXJzaW9uIHdlIHRhbGsgdG8gZG9lc24ndCBzdXBwb3J0IG91ciB0ZXN0XG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaXNOYU4ocmVzdWx0LmRhdGFDaGFubmVsUnR0KSkge1xuICAgICAgICAgICAgdGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50LmlubmVySFRNTCA9ICc8ZGl2Pk5vdCBzdXBwb3J0ZWQ8L2Rpdj4nO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXRlbmN5U3RhdHNJbm5lckhUTUwgPSAnJztcbiAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9ICc8ZGl2PkRhdGEgY2hhbm5lbCBSVFQgKG1zKTogJyArIHJlc3VsdC5kYXRhQ2hhbm5lbFJ0dCArICc8L2Rpdj4nO1xuICAgICAgICAvKipcbiAgICAgICAgICogU2VwYXJhdGUgcGF0aCB0aW1lIGRpc2NvdmVyeSB3b3JrcyBvbmx5IHdoZW4gVUUgYW5kIFBsYXllciBjbG9ja3MgaGF2ZSBiZWVuIHN5bmNocm9uaXplZC5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChyZXN1bHQucGxheWVyVG9TdHJlYW1lclRpbWUgPj0gMCAmJiByZXN1bHQuc3RyZWFtZXJUb1BsYXllclRpbWUgPj0gMCkge1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9XG4gICAgICAgICAgICAgICAgJzxkaXY+UGxheWVyIHRvIFN0cmVhbWVyIHBhdGggKG1zKTogJyArIHJlc3VsdC5wbGF5ZXJUb1N0cmVhbWVyVGltZSArICc8L2Rpdj4nO1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9XG4gICAgICAgICAgICAgICAgJzxkaXY+U3RyZWFtZXIgdG8gUGxheWVyIHBhdGggKG1zKTogJyArIHJlc3VsdC5zdHJlYW1lclRvUGxheWVyVGltZSArICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudC5pbm5lckhUTUwgPSBsYXRlbmN5U3RhdHNJbm5lckhUTUw7XG4gICAgICAgIC8vc2V0dXAgYnV0dG9uIHRvIGRvd25sb2FkIHRoZSBkZXRhaWxlZCByZXN1bHRzXG4gICAgICAgIGNvbnN0IGRvd25sb2FkQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgZG93bmxvYWRCdXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICBkb3dubG9hZEJ1dHRvbi52YWx1ZSA9ICdEb3dubG9hZCc7XG4gICAgICAgIGRvd25sb2FkQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3N0cmVhbVRvb2xzLWJ1dHRvbicpO1xuICAgICAgICBkb3dubG9hZEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdidG4tZmxhdCcpO1xuICAgICAgICBkb3dubG9hZEJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtyZXN1bHQuZXhwb3J0TGF0ZW5jeUFzQ1NWKCldLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KTtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgICAgICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgICAgICAgYS5kb3dubG9hZCA9ICdkYXRhX2NoYW5uZWxfbGF0ZW5jeV90ZXN0X3Jlc3VsdHMuY3N2JztcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICBhLmNsaWNrKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50LmFwcGVuZENoaWxkKGRvd25sb2FkQnV0dG9uKTtcbiAgICB9XG4gICAgaGFuZGxlVGVzdFN0YXJ0KCkge1xuICAgICAgICB0aGlzLmxhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuaW5uZXJIVE1MID0gJzxkaXY+VGVzdCBpbiBwcm9ncmVzczwvZGl2Pic7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gRXZlbnQgZmlyZWQgd2hlbiBcIkNvbmZpcm1cIiBidXR0b24gaXMgY2xpY2tlZFxuZXhwb3J0IGNsYXNzIEVkaXRDb25maXJtZWRFdmVudCBleHRlbmRzIEN1c3RvbUV2ZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maXJtZWRUZXh0KSB7XG4gICAgICAgIHN1cGVyKCdlZGl0Q29uZmlybWVkJywge1xuICAgICAgICAgICAgZGV0YWlsOiBjb25maXJtZWRUZXh0LFxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlybWVkVGV4dCA9IGNvbmZpcm1lZFRleHQ7XG4gICAgfVxufVxuLyoqXG4gKiBBIG1vZGFsIHRoYXQgaXMgc2hvd24gd2hlbiBhIFVFIHdpZGdldCBpcyB0b3VjaGVkIG9uIG1vYmlsZS5cbiAqIG9yXG4gKiBBIGhpZGRlbiAob2Zmc2NyZWVuKSBpbnB1dCBmaWVsZCB0aGF0IGlzIHNob3duIG9uIG5vbi10b3VjaCBkZXZpY2VzIChlLmcuIERlc2t0b3ApXG4gKiB3aGVuIGEgVUUgd2lkZ2V0IGlzIGNsaWNrZWQuIFRoZSBoaWRkZW4gdGV4dCBmaWVsZCBpcyB1c2VkIHNvIG5vbi1sYXRpbiBjaGFyYWN0ZXJcbiAqIGlucHV0IGNhbiBiZSBjb21wb3NlZCB1c2luZyBJTUUgYXNzaXN0YW5jZSAod2hpY2ggcmVxdWlyZXMgYW4gaW5wdXQgZmllbGQpLlxuICpcbiAqIFRoZSByZWFzb24gdGhpcyBtb2RhbCBpcyByZXF1aXJlZCBpcyB0aGF0IG9uIG1vYmlsZSB0eXBpbmcgdXNlc1xuICogYW4gb24tc2NyZWVuIGtleWJvYXJkLCB3aGljaCByZXF1aXJlcyBhIHZhbGlkIGlucHV0IHRleHQgYXJlYS9pbnB1dFxuICogdG8gYmUgZm9jdXNlZCB0byBzdW1tb24gaXQuIFRoZXJlZm9yZSB3ZSBzaG93IHRoaXMgbW9kYWwgd2hpY2ggaGFzXG4gKiB0aGUgY29udGVudHMgb2YgdGhlIFVFIHdpZGdldCwgcG9wdWxhdGUgaXRzIHRleHQgYXJlYSB3aXRoIHRoZSBjb250ZW50c1xuICogb2YgdGhlIFVFIHdpZGdldCwgdGhlbiBmb2N1cyB0aGUgdGV4dCBhcmVhIHRvIGZpbmFsbHkgc3VtbW9uIHRoZSBuYXRpdmVcbiAqIG9uLXNjcmVlbiBrZXlib2FyZC5cbiAqXG4gKiBUaGUgbW9kYWwgYWxzbyBjb250YWluczpcbiAqIDEpIEEgY2FuY2VsIGJ1dHRvbiAtIHRoaXMgY2xvc2VzIHRoZSBtb2RhbFxuICogMikgQSBjb25maXJtIGJ1dHRvbiAtIHRoaXMgc3VibWl0cyB0aGUgZWRpdCBiYWNrIHRvIHRoZSBVRSBzaWRlXG4gKi9cbmV4cG9ydCBjbGFzcyBFZGl0VGV4dE1vZGFsIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSB0aGlzLnJvb3RFbGVtZW50O1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICB9XG4gICAgLy8gQmluZCB0byB0aGlzIGlmIHlvdSB3YW50IHRvIGhhbmRsZSBlZGl0IGNvbmZpcm1lZFxuICAgIGdldCBldmVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudHM7XG4gICAgfVxuICAgIHNob3dNb2RhbChleGlzdGluZ1RleHRBcmVhQ29udGVudHMpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nVGV4dEFyZWFDb250ZW50cykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBudWxsIHRlcm1pbmF0b3JzIGZyb20gdGhlIHN0cmluZ1xuICAgICAgICAgICAgZXhpc3RpbmdUZXh0QXJlYUNvbnRlbnRzID0gZXhpc3RpbmdUZXh0QXJlYUNvbnRlbnRzLnJlcGxhY2UoL1xcMC9nLCAnJyk7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhLnZhbHVlID0gZXhpc3RpbmdUZXh0QXJlYUNvbnRlbnRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJyaW5nIGZvY3VzIHRvIHRoZSB0ZXh0IGFyZWEuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBtYWtlIHRoZSBvbi1zY3JlZW4ga2V5Ym9hcmQgc2hvdyBpZiB3ZSBhcmVcbiAgICAgICAgLy8gYSBkZXZpY2UgdGhhdCBoYXMgYSBuYXRpdmUgb24tc2NyZWVuIGtleWJvYXJkLlxuICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSBub24tdG91Y2ggZGV2aWNlIHRoaXMgd2lsbCBnaXZlIElNRSBhIHZhbGlkXG4gICAgICAgIC8vIGlucHV0IGZpZWxkIHRvIHdvcmsgd2l0aC5cbiAgICAgICAgdGhpcy50ZXh0QXJlYS5mb2N1cygpO1xuICAgICAgICAvLyBQdXQgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIHRleHRhcmVhXG4gICAgICAgIHRoaXMudGV4dEFyZWEuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLnRleHRBcmVhLnZhbHVlLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByb290IGVsZW1lbnQgdGhhdCBjb250YWlucyBlaXRoZXIgdGhlIG1vZGFsIChtb2JpbGUpIG9yIGhpZGRlbiB0ZXh0IGlucHV0IChkZXNrdG9wKVxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21vZGFsJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmlubmVyTW9kYWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IGlubmVyTW9kYWwoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5uZXJNb2RhbCkge1xuICAgICAgICAgICAgdGhpcy5faW5uZXJNb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5faW5uZXJNb2RhbC5jbGFzc0xpc3QuYWRkKCdpbm5lck1vZGFsJyk7XG4gICAgICAgICAgICB0aGlzLl9pbm5lck1vZGFsLmFwcGVuZENoaWxkKHRoaXMuZWRpdFRleHRIZWFkaW5nKTtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyTW9kYWwuYXBwZW5kQ2hpbGQodGhpcy50ZXh0QXJlYSk7XG4gICAgICAgICAgICB0aGlzLl9pbm5lck1vZGFsLmFwcGVuZENoaWxkKHRoaXMubW9kYWxCdG5Db250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbm5lck1vZGFsO1xuICAgIH1cbiAgICBnZXQgZWRpdFRleHRIZWFkaW5nKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2VkaXRUZXh0SGVhZGluZykge1xuICAgICAgICAgICAgdGhpcy5fZWRpdFRleHRIZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDInKTtcbiAgICAgICAgICAgIHRoaXMuX2VkaXRUZXh0SGVhZGluZy5pbm5lclRleHQgPSAnRWRpdCBUZXh0JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdFRleHRIZWFkaW5nO1xuICAgIH1cbiAgICBnZXQgdGV4dEFyZWEoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdGV4dEFyZWEpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgICAgICAgIHRoaXMuX3RleHRBcmVhLmNsYXNzTGlzdC5hZGQoJ2Zvcm0tY29udHJvbCcpO1xuICAgICAgICAgICAgdGhpcy5fdGV4dEFyZWEuY2xhc3NMaXN0LmFkZCgnbW9kYWxUZXh0QXJlYScpO1xuICAgICAgICAgICAgdGhpcy5fdGV4dEFyZWEudGl0bGUgPSAnRWRpdCBUZXh0IEFyZWEnO1xuICAgICAgICAgICAgdGhpcy5fdGV4dEFyZWEucGxhY2Vob2xkZXIgPSAnVUUgdGV4dCB3aWRnZXQgdmFsdWUgaGVyZS4uLic7XG4gICAgICAgICAgICAvLyBXaGVuIGtleWJvYXJkIGlzIHR5cGVkIGludG8gd2Ugd2FudCB0byBlbnN1cmUga2V5cyBhcmUgbm90IHNlbnQgYmFjayB0byBVRSB1bnRpbCB3ZSBjb25maXJtLlxuICAgICAgICAgICAgdGhpcy50ZXh0QXJlYS5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbXBvc2l0aW9uZW5kJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dEFyZWE7XG4gICAgfVxuICAgIGdldCBtb2RhbEJ0bkNvbnRhaW5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tb2RhbEJ0bkNvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fbW9kYWxCdG5Db250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX21vZGFsQnRuQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21vZGFsQnRuQ29udGFpbmVyJyk7XG4gICAgICAgICAgICB0aGlzLl9tb2RhbEJ0bkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbmNlbEJ0bik7XG4gICAgICAgICAgICB0aGlzLl9tb2RhbEJ0bkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbmZpcm1CdG4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RhbEJ0bkNvbnRhaW5lcjtcbiAgICB9XG4gICAgZ2V0IGNhbmNlbEJ0bigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYW5jZWxCdG4pIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsQnRuLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxCdG4uaW5uZXJUZXh0ID0gJ0NhbmNlbCc7XG4gICAgICAgICAgICAvLyBXaGVuIGNhbmNlbCBpcyBjbGlja2VkLCByZW1vdmUgdGhpcyBtb2RhbCBmcm9tIHRoZSBET01cbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBjbGljay90YXAgZG9lcyBub3QgZ28gYmFjayB0byBVRVxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbmNlbEJ0bjtcbiAgICB9XG4gICAgZ2V0IGNvbmZpcm1CdG4oKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29uZmlybUJ0bikge1xuICAgICAgICAgICAgdGhpcy5fY29uZmlybUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fY29uZmlybUJ0bi5jbGFzc0xpc3QuYWRkKCdidG4tZmxhdCcpO1xuICAgICAgICAgICAgdGhpcy5fY29uZmlybUJ0bi5pbm5lclRleHQgPSAnQ29uZmlybSc7XG4gICAgICAgICAgICAvLyBXaGVuIGNvbmZpcm0gaXMgY2xpY2tlZCwgcmVtb3ZlIGZyb20gRE9NIGFuZCBzZW5kIHRoZSBjb250ZW50cyBvZiB0ZXh0YXJlYSB0byBVRVxuICAgICAgICAgICAgdGhpcy5fY29uZmlybUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IEVkaXRDb25maXJtZWRFdmVudCh0aGlzLnRleHRBcmVhLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNsaWNrL3RhcCBkb2VzIG5vdCBnbyBiYWNrIHRvIFVFXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlybUJ0bjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FZGl0VGV4dE1vZGFsLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFuIGVsZW1lbnQgKGkuZS4gYnV0dG9uKSB0aGF0LCB3aGVuIGNsaWNrZWQsIHdpbGwgdG9nZ2xlIGZ1bGxzY3JlZW4gb2YgYSBnaXZlbiBlbGVtZW50LlxuICogQ2FuIGJlIGluaXRpYWxpemVkIHdpdGggYW55IEhUTUxFbGVtZW50LCBpZiBpdCBpcyBzZXQgYXMgcm9vdEVsZW1lbnQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgY2xhc3MgRnVsbFNjcmVlbkljb25CYXNlIHtcbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgc2V0IHJvb3RFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5vbmNsaWNrID0gKCkgPT4gdGhpcy50b2dnbGVGdWxsc2NyZWVuKCk7XG4gICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gZmFsc2U7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgZnVsbCBzY3JlZW4gZXZlbnRzXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCAoKSA9PiB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZSgpLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCAoKSA9PiB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZSgpLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCAoKSA9PiB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZSgpLCBmYWxzZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ01TRnVsbHNjcmVlbkNoYW5nZScsICgpID0+IHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlKCksIGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGRvY3VtZW50IG9yIGZ1bGxzY3JlZW5FbGVtZW50IGZ1bGxzY3JlZW4uXG4gICAgICovXG4gICAgdG9nZ2xlRnVsbHNjcmVlbigpIHtcbiAgICAgICAgLy8gaWYgYWxyZWFkeSBmdWxsIHNjcmVlbjsgZXhpdFxuICAgICAgICAvLyBlbHNlIGdvIGZ1bGxzY3JlZW5cbiAgICAgICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgICAgIGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZ1bGxzY3JlZW5FbGVtZW50O1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50Lm1velJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5tb3pSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC53ZWJraXRFbnRlckZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LndlYmtpdEVudGVyRnVsbHNjcmVlbigpOyAvL2ZvciBpcGhvbmUgdGhpcyBjb2RlIHdvcmtlZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uIG9uIGNoYW5nZVxuICAgICAqL1xuICAgIG9uRnVsbHNjcmVlbkNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPVxuICAgICAgICAgICAgZG9jdW1lbnQud2Via2l0SXNGdWxsU2NyZWVuIHx8XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQubW96RnVsbFNjcmVlbiB8fFxuICAgICAgICAgICAgICAgIChkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50ICYmIGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQgIT09IG51bGwpIHx8XG4gICAgICAgICAgICAgICAgKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50ICYmIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50ICE9PSBudWxsKTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIEZ1bGxTY3JlZW5JY29uQmFzZSB0aGF0IHVzZXMgYW4gZXh0ZXJuYWxseVxuICogcHJvdmlkZWQgSFRNTEVsZW1lbnQgZm9yIHRvZ2dsaW5nIGZ1bGwgc2NyZWVuLlxuICovXG5leHBvcnQgY2xhc3MgRnVsbFNjcmVlbkljb25FeHRlcm5hbCBleHRlbmRzIEZ1bGxTY3JlZW5JY29uQmFzZSB7XG4gICAgY29uc3RydWN0b3IoZXh0ZXJuYWxCdXR0b24pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudCA9IGV4dGVybmFsQnV0dG9uO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGRlZmF1bHQgZnVsbHNjcmVlbiBpY29uIHRoYXQgY29udGFpbnMgYSBidXR0b24gYW5kIHN2Z3MgZm9yIGVhY2ggc3RhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBGdWxsU2NyZWVuSWNvbiBleHRlbmRzIEZ1bGxTY3JlZW5JY29uQmFzZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgY3JlYXRlZEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIGNyZWF0ZWRCdXR0b24uY2xhc3NMaXN0LmFkZCgnVWlUb29sJyk7XG4gICAgICAgIGNyZWF0ZWRCdXR0b24uaWQgPSAnZnVsbHNjcmVlbi1idG4nO1xuICAgICAgICBjcmVhdGVkQnV0dG9uLmFwcGVuZENoaWxkKHRoaXMubWF4aW1pemVJY29uKTtcbiAgICAgICAgY3JlYXRlZEJ1dHRvbi5hcHBlbmRDaGlsZCh0aGlzLm1pbmltaXplSWNvbik7XG4gICAgICAgIGNyZWF0ZWRCdXR0b24uYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwVGV4dCk7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQgPSBjcmVhdGVkQnV0dG9uO1xuICAgIH1cbiAgICBnZXQgdG9vbHRpcFRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9vbHRpcFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQuY2xhc3NMaXN0LmFkZCgndG9vbHRpcHRleHQnKTtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0LmlubmVySFRNTCA9ICdGdWxsc2NyZWVuJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9vbHRpcFRleHQ7XG4gICAgfVxuICAgIGdldCBtYXhpbWl6ZUljb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWF4aW1pemVJY29uKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXhpbWl6ZUljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgICAgdGhpcy5fbWF4aW1pemVJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICdpZCcsICdtYXhpbWl6ZUljb24nKTtcbiAgICAgICAgICAgIHRoaXMuX21heGltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneCcsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX21heGltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneScsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX21heGltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAndmlld0JveCcsICcwIDAgMzg0Ljk3IDM4NC45NycpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHN2ZyBncm91cCBmb3IgdGhlIHBhdGhzXG4gICAgICAgICAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuY2xhc3NMaXN0LmFkZCgnc3ZnSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fbWF4aW1pemVJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBwYXRocyBmb3IgdGhlIGljb24gaXRzZWxmLCBvbmUgZm9yIGVhY2ggY29ybmVyXG4gICAgICAgICAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTM4NC45NywxMi4wM2MwLTYuNzEzLTUuMzE3LTEyLjAzLTEyLjAzLTEyLjAzSDI2NC44NDdjLTYuODMzLDAtMTEuOTIyLDUuMzktMTEuOTM0LDEyLjIyM2MwLDYuODIxLDUuMTAxLDExLjgzOCwxMS45MzQsMTEuODM4aDk2LjA2MmwtMC4xOTMsOTYuNTE5YzAsNi44MzMsNS4xOTcsMTIuMDMsMTIuMDMsMTIuMDNjNi44MzMtMC4wMTIsMTIuMDMtNS4xOTcsMTIuMDMtMTIuMDNsMC4xOTMtMTA4LjM2OWMwLTAuMDM2LTAuMDEyLTAuMDYtMC4wMTItMC4wODRDMzg0Ljk1OCwxMi4wOSwzODQuOTcsMTIuMDY2LDM4NC45NywxMi4wM3onKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTIwLjQ5NiwwSDEyLjQwM2MtMC4wMzYsMC0wLjA2LDAuMDEyLTAuMDk2LDAuMDEyQzEyLjI4MywwLjAxMiwxMi4yNDcsMCwxMi4yMjMsMEM1LjUxLDAsMC4xOTIsNS4zMTcsMC4xOTIsMTIuMDNMMCwxMjAuMzk5YzAsNi44MzMsNS4zOSwxMS45MzQsMTIuMjIzLDExLjkzNGM2LjgyMSwwLDExLjgzOC01LjEwMSwxMS44MzgtMTEuOTM0bDAuMTkyLTk2LjMzOWg5Ni4yNDJjNi44MzMsMCwxMi4wMy01LjE5NywxMi4wMy0xMi4wM0MxMzIuNTE0LDUuMTk3LDEyNy4zMTcsMCwxMjAuNDk2LDB6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTEyMC4xMjMsMzYwLjkwOUgyNC4wNjF2LTk2LjI0MmMwLTYuODMzLTUuMTk3LTEyLjAzLTEyLjAzLTEyLjAzUzAsMjU3LjgzMywwLDI2NC42Njd2MTA4LjA5MmMwLDAuMDM2LDAuMDEyLDAuMDYsMC4wMTIsMC4wODRjMCwwLjAzNi0wLjAxMiwwLjA2LTAuMDEyLDAuMDk2YzAsNi43MTMsNS4zMTcsMTIuMDMsMTIuMDMsMTIuMDNoMTA4LjA5MmM2LjgzMywwLDExLjkyMi01LjM5LDExLjkzNC0xMi4yMjNDMTMyLjA1NywzNjUuOTI2LDEyNi45NTYsMzYwLjkwOSwxMjAuMTIzLDM2MC45MDl6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDQuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTM3Mi43NDcsMjUyLjkxM2MtNi44MzMsMC0xMS44NSw1LjEwMS0xMS44MzgsMTEuOTM0djk2LjA2MmgtOTYuMjQyYy02LjgzMywwLTEyLjAzLDUuMTk3LTEyLjAzLDEyLjAzczUuMTk3LDEyLjAzLDEyLjAzLDEyLjAzaDEwOC4wOTJjMC4wMzYsMCwwLjA2LTAuMDEyLDAuMDg0LTAuMDEyYzAuMDM2LTAuMDEyLDAuMDYsMC4wMTIsMC4wOTYsMC4wMTJjNi43MTMsMCwxMi4wMy01LjMxNywxMi4wMy0xMi4wM1YyNjQuODQ3QzM4NC45NywyNTguMDE0LDM3OS41OCwyNTIuOTEzLDM3Mi43NDcsMjUyLjkxM3onKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgyKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgzKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGg0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWF4aW1pemVJY29uO1xuICAgIH1cbiAgICBnZXQgbWluaW1pemVJY29uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21pbmltaXplSWNvbikge1xuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnbWluaW1pemVJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3gnLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3knLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCAnMCAwIDM4NS4zMzEgMzg1LjMzMScpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHN2ZyBncm91cCBmb3IgdGhlIHBhdGhzXG4gICAgICAgICAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuY2xhc3NMaXN0LmFkZCgnc3ZnSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBwYXRocyBmb3IgdGhlIGljb24gaXRzZWxmLCBvbmUgZm9yIGVhY2ggY29ybmVyXG4gICAgICAgICAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTI2NC45NDMsMTU2LjY2NWgxMDguMjczYzYuODMzLDAsMTEuOTM0LTUuMzksMTEuOTM0LTEyLjIxMWMwLTYuODMzLTUuMTAxLTExLjg1LTExLjkzNC0xMS44MzhoLTk2LjI0MlYzNi4xODFjMC02LjgzMy01LjE5Ny0xMi4wMy0xMi4wMy0xMi4wM3MtMTIuMDMsNS4xOTctMTIuMDMsMTIuMDN2MTA4LjI3M2MwLDAuMDM2LDAuMDEyLDAuMDYsMC4wMTIsMC4wODRjMCwwLjAzNi0wLjAxMiwwLjA2LTAuMDEyLDAuMDk2QzI1Mi45MTMsMTUxLjM0NywyNTguMjMsMTU2LjY3NywyNjQuOTQzLDE1Ni42NjV6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTEyMC4yOTEsMjQuMjQ3Yy02LjgyMSwwLTExLjgzOCw1LjExMy0xMS44MzgsMTEuOTM0djk2LjI0MkgxMi4wM2MtNi44MzMsMC0xMi4wMyw1LjE5Ny0xMi4wMywxMi4wM2MwLDYuODMzLDUuMTk3LDEyLjAzLDEyLjAzLDEyLjAzaDEwOC4yNzNjMC4wMzYsMCwwLjA2LTAuMDEyLDAuMDg0LTAuMDEyYzAuMDM2LDAsMC4wNiwwLjAxMiwwLjA5NiwwLjAxMmM2LjcxMywwLDEyLjAzLTUuMzE3LDEyLjAzLTEyLjAzVjM2LjE4MUMxMzIuNTE0LDI5LjM2LDEyNy4xMjQsMjQuMjU5LDEyMC4yOTEsMjQuMjQ3eicpO1xuICAgICAgICAgICAgY29uc3QgcGF0aDMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHBhdGgzLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00xMjAuMzg3LDIyOC42NjZIMTIuMTE1Yy02LjgzMywwLjAxMi0xMS45MzQsNS4zOS0xMS45MzQsMTIuMjIzYzAsNi44MzMsNS4xMDEsMTEuODUsMTEuOTM0LDExLjgzOGg5Ni4yNDJ2OTYuNDIzYzAsNi44MzMsNS4xOTcsMTIuMDMsMTIuMDMsMTIuMDNjNi44MzMsMCwxMi4wMy01LjE5NywxMi4wMy0xMi4wM1YyNDAuODc3YzAtMC4wMzYtMC4wMTItMC4wNi0wLjAxMi0wLjA4NGMwLTAuMDM2LDAuMDEyLTAuMDYsMC4wMTItMC4wOTZDMTMyLjQxOCwyMzMuOTgzLDEyNy4xLDIyOC42NjYsMTIwLjM4NywyMjguNjY2eicpO1xuICAgICAgICAgICAgY29uc3QgcGF0aDQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHBhdGg0LnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00zNzMuMywyMjguNjY2SDI2NS4wMjhjLTAuMDM2LDAtMC4wNiwwLjAxMi0wLjA4NCwwLjAxMmMtMC4wMzYsMC0wLjA2LTAuMDEyLTAuMDk2LTAuMDEyYy02LjcxMywwLTEyLjAzLDUuMzE3LTEyLjAzLDEyLjAzdjEwOC4yNzNjMCw2LjgzMyw1LjM5LDExLjkyMiwxMi4yMjMsMTEuOTM0YzYuODIxLDAuMDEyLDExLjgzOC01LjEwMSwxMS44MzgtMTEuOTIydi05Ni4yNDJIMzczLjNjNi44MzMsMCwxMi4wMy01LjE5NywxMi4wMy0xMi4wM1MzODAuMTM0LDIyOC42NzgsMzczLjMsMjI4LjY2NnonKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgyKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgzKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGg0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWluaW1pemVJY29uO1xuICAgIH1cbiAgICBvbkZ1bGxzY3JlZW5DaGFuZ2UoKSB7XG4gICAgICAgIHN1cGVyLm9uRnVsbHNjcmVlbkNoYW5nZSgpO1xuICAgICAgICBjb25zdCBtaW5pbWl6ZSA9IHRoaXMubWluaW1pemVJY29uO1xuICAgICAgICBjb25zdCBtYXhpbWl6ZSA9IHRoaXMubWF4aW1pemVJY29uO1xuICAgICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIG1pbmltaXplLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcbiAgICAgICAgICAgIC8vaW9zIGRpc2FwcGVhcmluZyBzdmcgZml4XG4gICAgICAgICAgICBtaW5pbWl6ZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgICAgIG1heGltaXplLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBtaW5pbWl6ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgbWF4aW1pemUuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xuICAgICAgICAgICAgLy9pb3MgZGlzYXBwZWFyaW5nIHN2ZyBmaXhcbiAgICAgICAgICAgIG1heGltaXplLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnVsbHNjcmVlbkljb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQSBidXR0b24gd2l0aCBhIHRleHQgbGFiZWwgYmVzaWRlIGl0LlxuICovXG5leHBvcnQgY2xhc3MgTGFiZWxsZWRCdXR0b24ge1xuICAgIGNvbnN0cnVjdG9yKGxhYmVsLCBidXR0b25UZXh0KSB7XG4gICAgICAgIHRoaXMuX2xhYmVsID0gbGFiZWw7XG4gICAgICAgIHRoaXMuX2J1dHRvblRleHQgPSBidXR0b25UZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjbGljayBsaXN0ZW5lciB0byB0aGUgYnV0dG9uIGVsZW1lbnQuXG4gICAgICovXG4gICAgYWRkT25DbGlja0xpc3RlbmVyKG9uQ2xpY2tGdW5jKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGlja0Z1bmMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEhUTUxJbnB1dEVsZW1lbnQgZm9yIHRoZSBidXR0b24uXG4gICAgICovXG4gICAgZ2V0IGJ1dHRvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9idXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICB0aGlzLl9idXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLnZhbHVlID0gdGhpcy5fYnV0dG9uVGV4dDtcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi5jbGFzc0xpc3QuYWRkKCdvdmVybGF5LWJ1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1dHRvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHJvb3QgZGl2IHdpdGggXCJzZXR0aW5nXCIgY3NzIGNsYXNzXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2V0dGluZycpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGRpdiBlbGVtZW50IHRvIGNvbnRhaW4gb3VyIHNldHRpbmcncyB0ZXh0XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nc1RleHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IHRoaXMuX2xhYmVsO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2V0dGluZ3NUZXh0RWxlbSk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbGFiZWwgZWxlbWVudCB0byB3cmFwIG91dCBpbnB1dCB0eXBlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgICAgICAgICAgd3JhcHBlckxhYmVsLmNsYXNzTGlzdC5hZGQoJ2J0bi1vdmVybGF5Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh3cmFwcGVyTGFiZWwpO1xuICAgICAgICAgICAgd3JhcHBlckxhYmVsLmFwcGVuZENoaWxkKHRoaXMuYnV0dG9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGFiZWxsZWRCdXR0b24uanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgU3RhdHNTZWN0aW9ucyB9IGZyb20gJy4vVUlDb25maWd1cmF0aW9uVHlwZXMnO1xuLyoqXG4gKiBMYXRlbmN5IHRlc3QgVUkgZWxlbWVudHMgYW5kIHJlc3VsdHMgaGFuZGxpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXRlbmN5VGVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0aGUgYnV0dG9uIGNvbnRhaW5pbmcgdGhlIHN0YXRzIGljb24uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzQ29udGFpbmVyJyk7XG4gICAgICAgICAgICAvLyBtYWtlIGhlYWRpbmdcbiAgICAgICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGhlYWRpbmcuaWQgPSAnbGF0ZW5jeVRlc3RIZWFkZXInO1xuICAgICAgICAgICAgaGVhZGluZy5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy10ZXh0Jyk7XG4gICAgICAgICAgICBoZWFkaW5nLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzSGVhZGVyJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZChoZWFkaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRpbmdUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBoZWFkaW5nVGV4dC5pbm5lckhUTUwgPSBTdGF0c1NlY3Rpb25zLkxhdGVuY3lUZXN0O1xuICAgICAgICAgICAgaGVhZGluZy5hcHBlbmRDaGlsZChoZWFkaW5nVGV4dCk7XG4gICAgICAgICAgICBoZWFkaW5nLmFwcGVuZENoaWxkKHRoaXMubGF0ZW5jeVRlc3RCdXR0b24pO1xuICAgICAgICAgICAgLy8gbWFrZSB0ZXN0IHJlc3VsdHMgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0c1BhcmVudEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHJlc3VsdHNQYXJlbnRFbGVtLmlkID0gJ2xhdGVuY3lUZXN0Q29udGFpbmVyJztcbiAgICAgICAgICAgIHJlc3VsdHNQYXJlbnRFbGVtLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0c1BhcmVudEVsZW0pO1xuICAgICAgICAgICAgcmVzdWx0c1BhcmVudEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBsYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuaWQgPSAnbGF0ZW5jeVN0YXRzUmVzdWx0cyc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ1N0YXRzUmVzdWx0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBsYXRlbmN5VGVzdEJ1dHRvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24udmFsdWUgPSAnUnVuIFRlc3QnO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24uaWQgPSAnYnRuLXN0YXJ0LWxhdGVuY3ktdGVzdCc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdzdHJlYW1Ub29scy1idXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB0aGUgVUkgYmFzZWQgb24gdGhlIGxhdGVuY3kgdGVzdCdzIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIGxhdGVuY3lUaW1pbmdzIC0gVGhlIGxhdGVuY3kgdGVzdCByZXN1bHRzLlxuICAgICAqL1xuICAgIGhhbmRsZVRlc3RSZXN1bHQobGF0ZW5jeVRpbWluZ3MpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oSlNPTi5zdHJpbmdpZnkobGF0ZW5jeVRpbWluZ3MpKTtcbiAgICAgICAgbGV0IGxhdGVuY3lTdGF0c0lubmVySFRNTCA9ICcnO1xuICAgICAgICBpZiAobGF0ZW5jeVRpbWluZ3MubmV0d29ya0xhdGVuY3kgIT09IHVuZGVmaW5lZCAmJiBsYXRlbmN5VGltaW5ncy5uZXR3b3JrTGF0ZW5jeSA+IDApIHtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0lubmVySFRNTCArPSAnPGRpdj5OZXQgbGF0ZW5jeSBSVFQgKG1zKTogJyArIGxhdGVuY3lUaW1pbmdzLm5ldHdvcmtMYXRlbmN5ICsgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lUaW1pbmdzLkVuY29kZU1zICE9PSB1bmRlZmluZWQgJiYgbGF0ZW5jeVRpbWluZ3MuRW5jb2RlTXMgPiAwKSB7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz0gJzxkaXY+VUUgRW5jb2RlIChtcyk6ICcgKyBsYXRlbmN5VGltaW5ncy5FbmNvZGVNcyArICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5VGltaW5ncy5DYXB0dXJlVG9TZW5kTXMgIT09IHVuZGVmaW5lZCAmJiBsYXRlbmN5VGltaW5ncy5DYXB0dXJlVG9TZW5kTXMgPiAwKSB7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz0gJzxkaXY+VUUgQ2FwdHVyZSAobXMpOiAnICsgbGF0ZW5jeVRpbWluZ3MuQ2FwdHVyZVRvU2VuZE1zICsgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lUaW1pbmdzLmJyb3dzZXJTZW5kTGF0ZW5jeSAhPT0gdW5kZWZpbmVkICYmIGxhdGVuY3lUaW1pbmdzLmJyb3dzZXJTZW5kTGF0ZW5jeSA+IDApIHtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0lubmVySFRNTCArPVxuICAgICAgICAgICAgICAgICc8ZGl2PkJyb3dzZXIgc2VuZCBsYXRlbmN5IChtcyk6ICcgKyBsYXRlbmN5VGltaW5ncy5icm93c2VyU2VuZExhdGVuY3kgKyAnPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeVRpbWluZ3MuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbGF0ZW5jeVRpbWluZ3MuYnJvd3NlclJlY2VpcHRUaW1lTXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9XG4gICAgICAgICAgICAgICAgbGF0ZW5jeVRpbWluZ3MuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgJiYgbGF0ZW5jeVRpbWluZ3MuYnJvd3NlclJlY2VpcHRUaW1lTXNcbiAgICAgICAgICAgICAgICAgICAgPyAnPGRpdj5Ccm93c2VyIHJlY2VpdmUgbGF0ZW5jeSAobXMpOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lUaW1pbmdzLmZyYW1lRGlzcGxheURlbHRhVGltZU1zICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nXG4gICAgICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lUaW1pbmdzLmxhdGVuY3lFeGNsdWRpbmdEZWNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9XG4gICAgICAgICAgICAgICAgJzxkaXY+VG90YWwgbGF0ZW5jeSAoZXhjbHVkaW5nIGJyb3dzZXIpIChtcyk6ICcgK1xuICAgICAgICAgICAgICAgICAgICBsYXRlbmN5VGltaW5ncy5sYXRlbmN5RXhjbHVkaW5nRGVjb2RlICtcbiAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lUaW1pbmdzLmVuZFRvRW5kTGF0ZW5jeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz0gbGF0ZW5jeVRpbWluZ3MuZW5kVG9FbmRMYXRlbmN5XG4gICAgICAgICAgICAgICAgPyAnPGRpdj5Ub3RhbCBsYXRlbmN5IChtcyk6ICcgKyBsYXRlbmN5VGltaW5ncy5lbmRUb0VuZExhdGVuY3kgKyAnPC9kaXY+J1xuICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50LmlubmVySFRNTCA9IGxhdGVuY3lTdGF0c0lubmVySFRNTDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MYXRlbmN5VGVzdC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBTZXR0aW5ncyBpY29uIHRoYXQgY2FuIGJlIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0ljb24ge1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGhlIGJ1dHRvbiBjb250YWluaW5nIHRoZSBzZXR0aW5ncyBpY29uLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ1VpVG9vbCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSAnc2V0dGluZ3NCdG4nO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc0ljb24pO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBnZXQgdG9vbHRpcFRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9vbHRpcFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQuY2xhc3NMaXN0LmFkZCgndG9vbHRpcHRleHQnKTtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0LmlubmVySFRNTCA9ICdTZXR0aW5ncyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rvb2x0aXBUZXh0O1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NJY29uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzSWNvbikge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnc2V0dGluZ3NJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3gnLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3knLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCAnMCAwIDQ3OC43MDMgNDc4LjcwMycpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHN2ZyBncm91cCBmb3IgdGhlIHBhdGhzXG4gICAgICAgICAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuY2xhc3NMaXN0LmFkZCgnc3ZnSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBwYXRocyBmb3IgdGhlIGljb24gaXRzZWxmLCB0aGUgaW5uZXIgYW5kIG91dCBwYXRoIG9mIGEgY29nXG4gICAgICAgICAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTQ1NC4yLDE4OS4xMDFsLTMzLjYtNS43Yy0zLjUtMTEuMy04LTIyLjItMTMuNS0zMi42bDE5LjgtMjcuN2M4LjQtMTEuOCw3LjEtMjcuOS0zLjItMzguMWwtMjkuOC0yOS44XFxcblx0XHRcdGMtNS42LTUuNi0xMy04LjctMjAuOS04LjdjLTYuMiwwLTEyLjEsMS45LTE3LjEsNS41bC0yNy44LDE5LjhjLTEwLjgtNS43LTIyLjEtMTAuNC0zMy44LTEzLjlsLTUuNi0zMy4yXFxcblx0XHRcdGMtMi40LTE0LjMtMTQuNy0yNC43LTI5LjItMjQuN2gtNDIuMWMtMTQuNSwwLTI2LjgsMTAuNC0yOS4yLDI0LjdsLTUuOCwzNGMtMTEuMiwzLjUtMjIuMSw4LjEtMzIuNSwxMy43bC0yNy41LTE5LjhcXFxuXHRcdFx0Yy01LTMuNi0xMS01LjUtMTcuMi01LjVjLTcuOSwwLTE1LjQsMy4xLTIwLjksOC43bC0yOS45LDI5LjhjLTEwLjIsMTAuMi0xMS42LDI2LjMtMy4yLDM4LjFsMjAsMjguMVxcXG5cdFx0XHRjLTUuNSwxMC41LTkuOSwyMS40LTEzLjMsMzIuN2wtMzMuMiw1LjZjLTE0LjMsMi40LTI0LjcsMTQuNy0yNC43LDI5LjJ2NDIuMWMwLDE0LjUsMTAuNCwyNi44LDI0LjcsMjkuMmwzNCw1LjhcXFxuXHRcdFx0YzMuNSwxMS4yLDguMSwyMi4xLDEzLjcsMzIuNWwtMTkuNywyNy40Yy04LjQsMTEuOC03LjEsMjcuOSwzLjIsMzguMWwyOS44LDI5LjhjNS42LDUuNiwxMyw4LjcsMjAuOSw4LjdjNi4yLDAsMTIuMS0xLjksMTcuMS01LjVcXFxuXHRcdFx0bDI4LjEtMjBjMTAuMSw1LjMsMjAuNyw5LjYsMzEuNiwxM2w1LjYsMzMuNmMyLjQsMTQuMywxNC43LDI0LjcsMjkuMiwyNC43aDQyLjJjMTQuNSwwLDI2LjgtMTAuNCwyOS4yLTI0LjdsNS43LTMzLjZcXFxuXHRcdFx0YzExLjMtMy41LDIyLjItOCwzMi42LTEzLjVsMjcuNywxOS44YzUsMy42LDExLDUuNSwxNy4yLDUuNWwwLDBjNy45LDAsMTUuMy0zLjEsMjAuOS04LjdsMjkuOC0yOS44YzEwLjItMTAuMiwxMS42LTI2LjMsMy4yLTM4LjFcXFxuXHRcdFx0bC0xOS44LTI3LjhjNS41LTEwLjUsMTAuMS0yMS40LDEzLjUtMzIuNmwzMy42LTUuNmMxNC4zLTIuNCwyNC43LTE0LjcsMjQuNy0yOS4ydi00Mi4xXFxcblx0XHRcdEM0NzguOSwyMDMuODAxLDQ2OC41LDE5MS41MDEsNDU0LjIsMTg5LjEwMXogTTQ1MS45LDI2MC40MDFjMCwxLjMtMC45LDIuNC0yLjIsMi42bC00Miw3Yy01LjMsMC45LTkuNSw0LjgtMTAuOCw5LjlcXFxuXHRcdFx0Yy0zLjgsMTQuNy05LjYsMjguOC0xNy40LDQxLjljLTIuNyw0LjYtMi41LDEwLjMsMC42LDE0LjdsMjQuNywzNC44YzAuNywxLDAuNiwyLjUtMC4zLDMuNGwtMjkuOCwyOS44Yy0wLjcsMC43LTEuNCwwLjgtMS45LDAuOFxcXG5cdFx0XHRjLTAuNiwwLTEuMS0wLjItMS41LTAuNWwtMzQuNy0yNC43Yy00LjMtMy4xLTEwLjEtMy4zLTE0LjctMC42Yy0xMy4xLDcuOC0yNy4yLDEzLjYtNDEuOSwxNy40Yy01LjIsMS4zLTkuMSw1LjYtOS45LDEwLjhsLTcuMSw0MlxcXG5cdFx0XHRjLTAuMiwxLjMtMS4zLDIuMi0yLjYsMi4yaC00Mi4xYy0xLjMsMC0yLjQtMC45LTIuNi0yLjJsLTctNDJjLTAuOS01LjMtNC44LTkuNS05LjktMTAuOGMtMTQuMy0zLjctMjguMS05LjQtNDEtMTYuOFxcXG5cdFx0XHRjLTIuMS0xLjItNC41LTEuOC02LjgtMS44Yy0yLjcsMC01LjUsMC44LTcuOCwyLjVsLTM1LDI0LjljLTAuNSwwLjMtMSwwLjUtMS41LDAuNWMtMC40LDAtMS4yLTAuMS0xLjktMC44bC0yOS44LTI5LjhcXFxuXHRcdFx0Yy0wLjktMC45LTEtMi4zLTAuMy0zLjRsMjQuNi0zNC41YzMuMS00LjQsMy4zLTEwLjIsMC42LTE0LjhjLTcuOC0xMy0xMy44LTI3LjEtMTcuNi00MS44Yy0xLjQtNS4xLTUuNi05LTEwLjgtOS45bC00Mi4zLTcuMlxcXG5cdFx0XHRjLTEuMy0wLjItMi4yLTEuMy0yLjItMi42di00Mi4xYzAtMS4zLDAuOS0yLjQsMi4yLTIuNmw0MS43LTdjNS4zLTAuOSw5LjYtNC44LDEwLjktMTBjMy43LTE0LjcsOS40LTI4LjksMTcuMS00MlxcXG5cdFx0XHRjMi43LTQuNiwyLjQtMTAuMy0wLjctMTQuNmwtMjQuOS0zNWMtMC43LTEtMC42LTIuNSwwLjMtMy40bDI5LjgtMjkuOGMwLjctMC43LDEuNC0wLjgsMS45LTAuOGMwLjYsMCwxLjEsMC4yLDEuNSwwLjVsMzQuNSwyNC42XFxcblx0XHRcdGM0LjQsMy4xLDEwLjIsMy4zLDE0LjgsMC42YzEzLTcuOCwyNy4xLTEzLjgsNDEuOC0xNy42YzUuMS0xLjQsOS01LjYsOS45LTEwLjhsNy4yLTQyLjNjMC4yLTEuMywxLjMtMi4yLDIuNi0yLjJoNDIuMVxcXG5cdFx0XHRjMS4zLDAsMi40LDAuOSwyLjYsMi4ybDcsNDEuN2MwLjksNS4zLDQuOCw5LjYsMTAsMTAuOWMxNS4xLDMuOCwyOS41LDkuNyw0Mi45LDE3LjZjNC42LDIuNywxMC4zLDIuNSwxNC43LTAuNmwzNC41LTI0LjhcXFxuXHRcdFx0YzAuNS0wLjMsMS0wLjUsMS41LTAuNWMwLjQsMCwxLjIsMC4xLDEuOSwwLjhsMjkuOCwyOS44YzAuOSwwLjksMSwyLjMsMC4zLDMuNGwtMjQuNywzNC43Yy0zLjEsNC4zLTMuMywxMC4xLTAuNiwxNC43XFxcblx0XHRcdGM3LjgsMTMuMSwxMy42LDI3LjIsMTcuNCw0MS45YzEuMyw1LjIsNS42LDkuMSwxMC44LDkuOWw0Miw3LjFjMS4zLDAuMiwyLjIsMS4zLDIuMiwyLjZ2NDIuMUg0NTEuOXonKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMjM5LjQsMTM2LjAwMWMtNTcsMC0xMDMuMyw0Ni4zLTEwMy4zLDEwMy4zczQ2LjMsMTAzLjMsMTAzLjMsMTAzLjNzMTAzLjMtNDYuMywxMDMuMy0xMDMuM1MyOTYuNCwxMzYuMDAxLDIzOS40LDEzNi4wMDF6IE0yMzkuNCwzMTUuNjAxYy00Mi4xLDAtNzYuMy0zNC4yLTc2LjMtNzYuM3MzNC4yLTc2LjMsNzYuMy03Ni4zczc2LjMsMzQuMiw3Ni4zLDc2LjNTMjgxLjUsMzE1LjYwMSwyMzkuNCwzMTUuNjAxeicpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ljb247XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2V0dGluZ3NJY29uLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEEgVUkgY29tcG9uZW50IGNvbnRhaW5pbmcgYWxsIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NQYW5lbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmlkID0gJ3NldHRpbmdzLXBhbmVsJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BhbmVsLXdyYXAnKTtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcGFuZWxFbGVtLmNsYXNzTGlzdC5hZGQoJ3BhbmVsJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZChwYW5lbEVsZW0pO1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3NIZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzZXR0aW5nc0hlYWRpbmcuaWQgPSAnc2V0dGluZ3NIZWFkaW5nJztcbiAgICAgICAgICAgIHNldHRpbmdzSGVhZGluZy50ZXh0Q29udGVudCA9ICdTZXR0aW5ncyc7XG4gICAgICAgICAgICBwYW5lbEVsZW0uYXBwZW5kQ2hpbGQoc2V0dGluZ3NIZWFkaW5nKTtcbiAgICAgICAgICAgIHBhbmVsRWxlbS5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzQ2xvc2VCdXR0b24pO1xuICAgICAgICAgICAgcGFuZWxFbGVtLmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NDb250ZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc0NvbnRlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0NvbnRlbnRFbGVtZW50LmlkID0gJ3NldHRpbmdzQ29udGVudCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzQ29udGVudEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBzZXR0aW5nc0Nsb3NlQnV0dG9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzQ2xvc2VCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzQ2xvc2VCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzQ2xvc2VCdXR0b24uaWQgPSAnc2V0dGluZ3NDbG9zZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzQ2xvc2VCdXR0b247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgc2V0dGluZ3MgcGFuZWwuXG4gICAgICovXG4gICAgc2hvdygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncGFuZWwtd3JhcC12aXNpYmxlJykpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncGFuZWwtd3JhcC12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzZXR0aW5ncyBwYW5lbC5cbiAgICAgKi9cbiAgICB0b2dnbGVWaXNpYmlsaXR5KCkge1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3BhbmVsLXdyYXAtdmlzaWJsZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWRlIHNldHRpbmdzIHBhbmVsLlxuICAgICAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncGFuZWwtd3JhcC12aXNpYmxlJykpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncGFuZWwtd3JhcC12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nc1BhbmVsLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIFN0YXRzIGljb24gdGhhdCBjYW4gYmUgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRzSWNvbiB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0aGUgYnV0dG9uIGNvbnRhaW5pbmcgdGhlIHN0YXRzIGljb24uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQudHlwZSA9ICdidXR0b24nO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnVWlUb29sJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9ICdzdGF0c0J0bic7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzSWNvbik7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCB0b29sdGlwVGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b29sdGlwVGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dC5jbGFzc0xpc3QuYWRkKCd0b29sdGlwdGV4dCcpO1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQuaW5uZXJIVE1MID0gJ0luZm9ybWF0aW9uJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9vbHRpcFRleHQ7XG4gICAgfVxuICAgIGdldCBzdGF0c0ljb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdHNJY29uKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0ljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICdpZCcsICdzdGF0c0ljb24nKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneCcsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneScsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAndmlld0JveCcsICcwIDAgMzMwIDMzMCcpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHN2ZyBncm91cCBmb3IgdGhlIHBhdGhzXG4gICAgICAgICAgICBjb25zdCBzdmdHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuY2xhc3NMaXN0LmFkZCgnc3ZnSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBwYXRocyBmb3IgdGhlIGljb24gaXRzZWxmLCB0aGUgaW5uZXIgYW5kIG91dCBwYXRoIG9mIGEgY29nXG4gICAgICAgICAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTE2NSwwLjAwOEM3NC4wMTksMC4wMDgsMCw3NC4wMjQsMCwxNjQuOTk5YzAsOTAuOTc3LDc0LjAxOSwxNjQuOTkyLDE2NSwxNjQuOTkyczE2NS03NC4wMTUsMTY1LTE2NC45OTJDMzMwLDc0LjAyNCwyNTUuOTgxLDAuMDA4LDE2NSwwLjAwOHogTTE2NSwyOTkuOTkyYy03NC40MzksMC0xMzUtNjAuNTU3LTEzNS0xMzQuOTkyUzkwLjU2MSwzMC4wMDgsMTY1LDMwLjAwOHMxMzUsNjAuNTU3LDEzNSwxMzQuOTkxQzMwMCwyMzkuNDM2LDIzOS40MzksMjk5Ljk5MiwxNjUsMjk5Ljk5MnonKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTY1LDEzMC4wMDhjLTguMjg0LDAtMTUsNi43MTYtMTUsMTV2OTkuOTgzYzAsOC4yODQsNi43MTYsMTUsMTUsMTVzMTUtNi43MTYsMTUtMTV2LTk5Ljk4M0MxODAsMTM2LjcyNSwxNzMuMjg0LDEzMC4wMDgsMTY1LDEzMC4wMDh6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTE2NSw3MC4wMTFjLTMuOTUsMC03LjgxMSwxLjYtMTAuNjEsNC4zOWMtMi43OSwyLjc5LTQuMzksNi42Ni00LjM5LDEwLjYxczEuNiw3LjgxLDQuMzksMTAuNjFjMi43OSwyLjc5LDYuNjYsNC4zOSwxMC42MSw0LjM5czcuODEtMS42LDEwLjYwOS00LjM5YzIuNzktMi44LDQuMzkxLTYuNjYsNC4zOTEtMTAuNjFzLTEuNjAxLTcuODItNC4zOTEtMTAuNjFDMTcyLjgxLDcxLjYxLDE2OC45NSw3MC4wMTEsMTY1LDcwLjAxMXonKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgyKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHNJY29uO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YXRzSWNvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTGF0ZW5jeVRlc3QgfSBmcm9tICcuL0xhdGVuY3lUZXN0JztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgTWF0aFV0aWxzIH0gZnJvbSAnLi4vVXRpbC9NYXRoVXRpbHMnO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCB9IGZyb20gJy4vRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCc7XG5pbXBvcnQgeyBpc1NlY3Rpb25FbmFibGVkLCBTdGF0c1NlY3Rpb25zIH0gZnJvbSAnLi9VSUNvbmZpZ3VyYXRpb25UeXBlcyc7XG4vKipcbiAqIEEgc3RhdCBzdHJ1Y3R1cmUsIGFuIGlkLCB0aGUgc3RhdCBzdHJpbmcsIGFuZCB0aGUgZWxlbWVudCB3aGVyZSBpdCBpcyByZW5kZXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXQge1xufVxuLyoqXG4gKiBBIFVJIGNvbXBvbmVudCBjb250YWluaW5nIGFsbCB0aGUgc3RhdHMgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRzUGFuZWwge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICAvKiBBIG1hcCBzdGF0cyB3ZSBhcmUgc3RvcmluZy9yZW5kZXJpbmcgKi9cbiAgICAgICAgdGhpcy5zdGF0c01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmxhdGVuY3lUZXN0ID0gbmV3IExhdGVuY3lUZXN0KCk7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdCA9IG5ldyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFJldHVybiBvciBjcmVhdGVzIGEgSFRNTCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGlzIHNldHRpbmcgaW4gdGhlIERPTS5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9ICdzdGF0cy1wYW5lbCc7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwYW5lbC13cmFwJyk7XG4gICAgICAgICAgICBjb25zdCBwYW5lbEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHBhbmVsRWxlbS5jbGFzc0xpc3QuYWRkKCdwYW5lbCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQocGFuZWxFbGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzSGVhZGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgc3RhdHNIZWFkaW5nLmlkID0gJ3N0YXRzSGVhZGluZyc7XG4gICAgICAgICAgICBzdGF0c0hlYWRpbmcudGV4dENvbnRlbnQgPSAnSW5mb3JtYXRpb24nO1xuICAgICAgICAgICAgcGFuZWxFbGVtLmFwcGVuZENoaWxkKHN0YXRzSGVhZGluZyk7XG4gICAgICAgICAgICBwYW5lbEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5zdGF0c0Nsb3NlQnV0dG9uKTtcbiAgICAgICAgICAgIHBhbmVsRWxlbS5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzQ29udGVudEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IHN0YXRzQ29udGVudEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdHNDb250ZW50RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNDb250ZW50RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNDb250ZW50RWxlbWVudC5pZCA9ICdzdGF0c0NvbnRlbnQnO1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtVG9vbFN0YXRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzdHJlYW1Ub29sU3RhdHMuaWQgPSAnc3RyZWFtVG9vbHNTdGF0cyc7XG4gICAgICAgICAgICBzdHJlYW1Ub29sU3RhdHMuY2xhc3NMaXN0LmFkZCgnY29udGFpbmVyJyk7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sU3RhdHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnRyb2xTdGF0cy5pZCA9ICdDb250cm9sU3RhdHMnO1xuICAgICAgICAgICAgY29udHJvbFN0YXRzLmNsYXNzTGlzdC5hZGQoJ3JvdycpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGlzdGljcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcbiAgICAgICAgICAgIHN0YXRpc3RpY3MuaWQgPSAnc3RhdGlzdGljcyc7XG4gICAgICAgICAgICBzdGF0aXN0aWNzLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzQ29udGFpbmVyJyk7XG4gICAgICAgICAgICBjb25zdCBsYXRlbmN5U3RhdHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHMuaWQgPSAnbGF0ZW5jeVN0YXRzJztcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0cy5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nc0NvbnRhaW5lcicpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGlzdGljc0hlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgc3RhdGlzdGljc0hlYWRlci5pZCA9ICdzdGF0aXN0aWNzSGVhZGVyJztcbiAgICAgICAgICAgIHN0YXRpc3RpY3NIZWFkZXIuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3MtdGV4dCcpO1xuICAgICAgICAgICAgc3RhdGlzdGljc0hlYWRlci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nc0hlYWRlcicpO1xuICAgICAgICAgICAgY29uc3QgbGF0ZW5jeVN0YXRzSGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNIZWFkZXIuaWQgPSAnbGF0ZW5jeVN0YXRzSGVhZGVyJztcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0hlYWRlci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy10ZXh0Jyk7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNIZWFkZXIuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NIZWFkZXInKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzQ29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3RyZWFtVG9vbFN0YXRzKTtcbiAgICAgICAgICAgIHN0cmVhbVRvb2xTdGF0cy5hcHBlbmRDaGlsZChjb250cm9sU3RhdHMpO1xuICAgICAgICAgICAgY29udHJvbFN0YXRzLmFwcGVuZENoaWxkKHN0YXRpc3RpY3MpO1xuICAgICAgICAgICAgY29udHJvbFN0YXRzLmFwcGVuZENoaWxkKGxhdGVuY3lTdGF0cyk7XG4gICAgICAgICAgICBzdGF0aXN0aWNzLmFwcGVuZENoaWxkKHN0YXRpc3RpY3NIZWFkZXIpO1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzLmFwcGVuZENoaWxkKGxhdGVuY3lTdGF0c0hlYWRlcik7XG4gICAgICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZCh0aGlzLl9jb25maWcsIFN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb25TdGF0c1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RhdHNUZXh0LmlubmVySFRNTCA9IFN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzO1xuICAgICAgICAgICAgICAgIHN0YXRpc3RpY3NIZWFkZXIuYXBwZW5kQ2hpbGQoc2Vzc2lvblN0YXRzVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0aXN0aWNzLmFwcGVuZENoaWxkKHRoaXMuc3RhdGlzdGljc0NvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZCh0aGlzLl9jb25maWcsIFN0YXRzU2VjdGlvbnMuTGF0ZW5jeVN0YXRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVuY3lTdGF0c1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBsYXRlbmN5U3RhdHNUZXh0LmlubmVySFRNTCA9IFN0YXRzU2VjdGlvbnMuTGF0ZW5jeVN0YXRzO1xuICAgICAgICAgICAgICAgIGxhdGVuY3lTdGF0c0hlYWRlci5hcHBlbmRDaGlsZChsYXRlbmN5U3RhdHNUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhdGVuY3lTdGF0cy5hcHBlbmRDaGlsZCh0aGlzLmxhdGVuY3lTdGF0c0NvbnRhaW5lcik7XG4gICAgICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZCh0aGlzLl9jb25maWcsIFN0YXRzU2VjdGlvbnMuTGF0ZW5jeVRlc3QpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbFN0YXRzLmFwcGVuZENoaWxkKHRoaXMubGF0ZW5jeVRlc3Qucm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU2VjdGlvbkVuYWJsZWQodGhpcy5fY29uZmlnLCBTdGF0c1NlY3Rpb25zLkRhdGFDaGFubmVsTGF0ZW5jeVRlc3QpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbFN0YXRzLmFwcGVuZENoaWxkKHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRzQ29udGVudEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBzdGF0aXN0aWNzQ29udGFpbmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3N0YXRpc3RpY3NDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRpc3RpY3NDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRpc3RpY3NDb250YWluZXIuaWQgPSAnc3RhdGlzdGljc0NvbnRhaW5lcic7XG4gICAgICAgICAgICB0aGlzLl9zdGF0aXN0aWNzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGlzdGljc0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGlzdGljc0NvbnRhaW5lcjtcbiAgICB9XG4gICAgZ2V0IGxhdGVuY3lTdGF0c0NvbnRhaW5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sYXRlbmN5U3RhdHNDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lTdGF0c0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVN0YXRzQ29udGFpbmVyLmlkID0gJ2xhdGVuY3lTdGF0c0NvbnRhaW5lcic7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5U3RhdHNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5U3RhdHNDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5sYXRlbmN5UmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZW5jeVN0YXRzQ29udGFpbmVyO1xuICAgIH1cbiAgICBnZXQgc3RhdHNSZXN1bHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdHNSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzUmVzdWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c1Jlc3VsdC5pZCA9ICdzdGF0aXN0aWNzUmVzdWx0JztcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzUmVzdWx0LmNsYXNzTGlzdC5hZGQoJ1N0YXRzUmVzdWx0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRzUmVzdWx0O1xuICAgIH1cbiAgICBnZXQgbGF0ZW5jeVJlc3VsdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sYXRlbmN5UmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5UmVzdWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5UmVzdWx0LmlkID0gJ2xhdGVuY3lSZXN1bHQnO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVJlc3VsdC5jbGFzc0xpc3QuYWRkKCdTdGF0c1Jlc3VsdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXRlbmN5UmVzdWx0O1xuICAgIH1cbiAgICBnZXQgc3RhdHNDbG9zZUJ1dHRvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdGF0c0Nsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0Nsb3NlQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0Nsb3NlQnV0dG9uLmlkID0gJ3N0YXRzQ2xvc2UnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0c0Nsb3NlQnV0dG9uO1xuICAgIH1cbiAgICBvbkRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMubGF0ZW5jeVRlc3QubGF0ZW5jeVRlc3RCdXR0b24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmxhdGVuY3lUZXN0QnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAvL2RvIG5vdGhpbmdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgb25WaWRlb0luaXRpYWxpemVkKHN0cmVhbSkge1xuICAgICAgICAvLyBzdGFydGluZyBhIGxhdGVuY3kgY2hlY2tcbiAgICAgICAgdGhpcy5sYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtLnJlcXVlc3RMYXRlbmN5VGVzdCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsTGF0ZW5jeVRlc3QubGF0ZW5jeVRlc3RCdXR0b24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBzdHJlYW0ucmVxdWVzdERhdGFDaGFubmVsTGF0ZW5jeVRlc3Qoe1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgICAgIHJwczogMTAsXG4gICAgICAgICAgICAgICAgcmVxdWVzdFNpemU6IDIwMCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVNpemU6IDIwMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5oYW5kbGVUZXN0U3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uZmlndXJlKHNldHRpbmdzKSB7XG4gICAgICAgIGlmIChzZXR0aW5ncy5EaXNhYmxlTGF0ZW5jeVRlc3QpIHtcbiAgICAgICAgICAgIHRoaXMubGF0ZW5jeVRlc3QubGF0ZW5jeVRlc3RCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5sYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi50aXRsZSA9ICdEaXNhYmxlZCBieSAtUGl4ZWxTdHJlYW1pbmdEaXNhYmxlTGF0ZW5jeVRlc3Rlcj10cnVlJztcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmRhdGFDaGFubmVsTGF0ZW5jeVRlc3QubGF0ZW5jeVRlc3RCdXR0b24udGl0bGUgPVxuICAgICAgICAgICAgICAgICdEaXNhYmxlZCBieSAtUGl4ZWxTdHJlYW1pbmdEaXNhYmxlTGF0ZW5jeVRlc3Rlcj10cnVlJztcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctUGl4ZWxTdHJlYW1pbmdEaXNhYmxlTGF0ZW5jeVRlc3Rlcj10cnVlLCByZXF1ZXN0aW5nIGxhdGVuY3kgcmVwb3J0IGZyb20gdGhlIHRoZSBicm93c2VyIHRvIFVFIGlzIGRpc2FibGVkLicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgc3RhdHMgcGFuZWwuXG4gICAgICovXG4gICAgc2hvdygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncGFuZWwtd3JhcC12aXNpYmxlJykpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncGFuZWwtd3JhcC12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzdGF0cyBwYW5lbC5cbiAgICAgKi9cbiAgICB0b2dnbGVWaXNpYmlsaXR5KCkge1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3BhbmVsLXdyYXAtdmlzaWJsZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBzdGF0cyBwYW5lbC5cbiAgICAgKi9cbiAgICBoaWRlKCkge1xuICAgICAgICBpZiAodGhpcy5yb290RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3BhbmVsLXdyYXAtdmlzaWJsZScpKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3BhbmVsLXdyYXAtdmlzaWJsZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVBsYXllckNvdW50KHBsYXllckNvdW50KSB7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnUGxheWVyQ291bnRTdGF0JywgJ1BsYXllcnMnLCBwbGF5ZXJDb3VudC50b1N0cmluZygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIHN0YXRzIGNvbWluZyBpbiBmcm9tIGJyb3dzZXIvVUVcbiAgICAgKiBAcGFyYW0gc3RhdHMgLSB0aGUgc3RhdHMgc3RydWN0dXJlXG4gICAgICovXG4gICAgaGFuZGxlU3RhdHMoc3RhdHMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAvLyBmb3JtYXQgbnVtYmVyaW5nIGJhc2VkIG9uIHRoZSBicm93c2VyIGxhbmd1YWdlXG4gICAgICAgIGNvbnN0IG51bWJlckZvcm1hdCA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlLCB7XG4gICAgICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDBcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEluYm91bmQgZGF0YVxuICAgICAgICBjb25zdCBpbmJvdW5kRGF0YSA9IE1hdGhVdGlscy5mb3JtYXRCeXRlcyhzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5ieXRlc1JlY2VpdmVkLCAyKTtcbiAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdJbmJvdW5kRGF0YVN0YXQnLCAnUmVjZWl2ZWQnLCBpbmJvdW5kRGF0YSk7XG4gICAgICAgIC8vIFBhY2tldHMgbG9zdFxuICAgICAgICBjb25zdCBwYWNrZXRzTG9zdFN0YXQgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMsICdwYWNrZXRzTG9zdCcpXG4gICAgICAgICAgICA/IG51bWJlckZvcm1hdC5mb3JtYXQoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMucGFja2V0c0xvc3QpXG4gICAgICAgICAgICA6ICdDaHJvbWUgb25seSc7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnUGFja2V0c0xvc3RTdGF0JywgJ1BhY2tldHMgTG9zdCcsIHBhY2tldHNMb3N0U3RhdCk7XG4gICAgICAgIC8vIEJpdHJhdGVcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnVmlkZW9CaXRyYXRlU3RhdCcsICdWaWRlbyBCaXRyYXRlIChrYnBzKScsIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRBdWRpb1N0YXRzLmJpdHJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnQXVkaW9CaXRyYXRlU3RhdCcsICdBdWRpbyBCaXRyYXRlIChrYnBzKScsIHN0YXRzLmluYm91bmRBdWRpb1N0YXRzLmJpdHJhdGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmlkZW8gcmVzb2x1dGlvblxuICAgICAgICBjb25zdCByZXNTdGF0ID0gc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVXaWR0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZVdpZHRoID4gMCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVIZWlnaHQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVIZWlnaHQgPiAwXG4gICAgICAgICAgICA/IHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lV2lkdGggKyAneCcgKyBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZUhlaWdodFxuICAgICAgICAgICAgOiAnQ2hyb21lIG9ubHknO1xuICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ1ZpZGVvUmVzU3RhdCcsICdWaWRlbyByZXNvbHV0aW9uJywgcmVzU3RhdCk7XG4gICAgICAgIC8vIEZyYW1lcyBkZWNvZGVkXG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEZWNvZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lc0RlY29kZWQgPSBudW1iZXJGb3JtYXQuZm9ybWF0KHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQpO1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdGcmFtZXNEZWNvZGVkU3RhdCcsICdGcmFtZXMgRGVjb2RlZCcsIGZyYW1lc0RlY29kZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZyYW1lcmF0ZVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzUGVyU2Vjb25kKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ0ZyYW1lcmF0ZVN0YXQnLCAnRnJhbWVyYXRlJywgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzUGVyU2Vjb25kLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZyYW1lcyBkcm9wcGVkXG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEcm9wcGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnRnJhbWVzRHJvcHBlZFN0YXQnLCAnRnJhbWVzIGRyb3BwZWQnLCBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEcm9wcGVkLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5jb2RlY0lkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ1ZpZGVvQ29kZWNTdGF0JywgJ1ZpZGVvIGNvZGVjJywgXG4gICAgICAgICAgICAvLyBTcGxpdCB0aGUgY29kZWMgdG8gcmVtb3ZlIHRoZSBGbXRwIGxpbmVcbiAgICAgICAgICAgIChfYiA9IChfYSA9IHN0YXRzLmNvZGVjcy5nZXQoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuY29kZWNJZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5taW1lVHlwZS5yZXBsYWNlKCd2aWRlby8nLCAnJykpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZEF1ZGlvU3RhdHMuY29kZWNJZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdBdWRpb0NvZGVjU3RhdCcsICdBdWRpbyBjb2RlYycsIFxuICAgICAgICAgICAgLy8gU3BsaXQgdGhlIGNvZGVjIHRvIHJlbW92ZSB0aGUgRm10cCBsaW5lXG4gICAgICAgICAgICAoX2QgPSAoX2MgPSBzdGF0cy5jb2RlY3MuZ2V0KHN0YXRzLmluYm91bmRBdWRpb1N0YXRzLmNvZGVjSWQpKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubWltZVR5cGUucmVwbGFjZSgnYXVkaW8vJywgJycpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RvcmUgdGhlIGFjdGl2ZSBjYW5kaWRhdGUgcGFpciByZXR1cm4gYSBuZXcgQ2FuZGlkYXRlIHBhaXIgc3RhdCBpZiBnZXRBY3RpdmVDYW5kaWRhdGUgaXMgbnVsbFxuICAgICAgICBjb25zdCBhY3RpdmVDYW5kaWRhdGVQYWlyID0gc3RhdHMuZ2V0QWN0aXZlQ2FuZGlkYXRlUGFpcigpO1xuICAgICAgICBpZiAoYWN0aXZlQ2FuZGlkYXRlUGFpcikge1xuICAgICAgICAgICAgLy8gUlRUXG4gICAgICAgICAgICBjb25zdCBuZXRSVFQgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYWN0aXZlQ2FuZGlkYXRlUGFpciwgJ2N1cnJlbnRSb3VuZFRyaXBUaW1lJykgJiZcbiAgICAgICAgICAgICAgICBzdGF0cy5pc051bWJlcihhY3RpdmVDYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lKVxuICAgICAgICAgICAgICAgID8gTWF0aC5jZWlsKGFjdGl2ZUNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUgKiAxMDAwKS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgOiBcIkNhbid0IGNhbGN1bGF0ZVwiO1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdSVFRTdGF0JywgJ05ldCBSVFQgKG1zKScsIG5ldFJUVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdEdXJhdGlvblN0YXQnLCAnRHVyYXRpb24nLCBzdGF0cy5zZXNzaW9uU3RhdHMucnVuVGltZSk7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnQ29udHJvbHNJbnB1dFN0YXQnLCAnQ29udHJvbHMgc3RyZWFtIGlucHV0Jywgc3RhdHMuc2Vzc2lvblN0YXRzLmNvbnRyb2xzU3RyZWFtSW5wdXQpO1xuICAgICAgICAvLyBRUFxuICAgICAgICBpZiAoc3RhdHMuc2Vzc2lvblN0YXRzLnZpZGVvRW5jb2RlckF2Z1FQICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFOdW1iZXIuaXNOYU4oc3RhdHMuc2Vzc2lvblN0YXRzLnZpZGVvRW5jb2RlckF2Z1FQKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdRUFN0YXQnLCAnVmlkZW8gcXVhbnRpemF0aW9uIHBhcmFtZXRlcicsIHN0YXRzLnNlc3Npb25TdGF0cy52aWRlb0VuY29kZXJBdmdRUC50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBMb2dnZXIuSW5mbyhgLS0tLS0tLS0tIFN0YXRzIC0tLS0tLS0tLVxcbiAke0pTT04uc3RyaW5naWZ5KHN0YXRzKX1cXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgaGFuZGxlTGF0ZW5jeUluZm8obGF0ZW5jeUluZm8pIHtcbiAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEVuY29kZXIgbGF0ZW5jeVxuICAgICAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmVuY29kZXJMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnRW5jb2RlTGF0ZW5jeScsICdFbmNvZGUgbGF0ZW5jeSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmVuY29kZXJMYXRlbmN5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUGFja2V0aXplciBsYXRlbmN5XG4gICAgICAgICAgICBpZiAobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcucGFja2V0aXplTGF0ZW5jeU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlTGF0ZW5jeVN0YXQoJ1BhY2tldGl6ZXJMYXRlbmN5JywgJ1BhY2tldGl6ZXIgbGF0ZW5jeSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLnBhY2tldGl6ZUxhdGVuY3lNcykudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQYWNlciBsYXRlbmN5XG4gICAgICAgICAgICBpZiAobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcucGFjZXJMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnUGFjZXJMYXRlbmN5JywgJ1BhY2VyIGxhdGVuY3kgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5mcmFtZVRpbWluZy5wYWNlckxhdGVuY3lNcykudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZW5kZXIgbGF0ZW5jeSBjYWxjdWxhdGVkIHVzaW5nIHRpbWluZyBzdGF0c1xuICAgICAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmNhcHR1cmVUb1NlbmRMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnVmlkZW9UaW1pbmdDYXB0dXJlVG9TZW5kJywgJ1Bvc3QtY2FwdHVyZSB0byBzZW5kIGxhdGVuY3kgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5mcmFtZVRpbWluZy5jYXB0dXJlVG9TZW5kTGF0ZW5jeU1zKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeUluZm8uc2VuZGVyTGF0ZW5jeU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnQWJzQ2FwdHVyZVRpbWVUb1NlbmRMYXRlbmN5JywgJ1Bvc3QtY2FwdHVyZSAoYWJzLWN0KSB0byBzZW5kIGxhdGVuY3kgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5zZW5kZXJMYXRlbmN5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5SW5mby5hdmVyYWdlQXNzZW1ibHlEZWxheU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnQXZnQXNzZW1ibHlEZWxheScsICdBc3NlbWJseSBkZWxheSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmF2ZXJhZ2VBc3NlbWJseURlbGF5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5SW5mby5hdmVyYWdlRGVjb2RlTGF0ZW5jeU1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnQXZnRGVjb2RlRGVsYXknLCAnRGVjb2RlIHRpbWUgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5hdmVyYWdlRGVjb2RlTGF0ZW5jeU1zKS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeUluZm8uYXZlcmFnZUppdHRlckJ1ZmZlckRlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdBdmdKaXR0ZXJCdWZmZXJEZWxheScsICdKaXR0ZXIgYnVmZmVyIChtcyknLCBNYXRoLmNlaWwobGF0ZW5jeUluZm8uYXZlcmFnZUppdHRlckJ1ZmZlckRlbGF5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5SW5mby5hdmVyYWdlUHJvY2Vzc2luZ0RlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdBdmdQcm9jZXNzaW5nRGVsYXknLCAnUHJvY2Vzc2luZyBkZWxheSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmF2ZXJhZ2VQcm9jZXNzaW5nRGVsYXlNcykudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmF2ZXJhZ2VFMkVMYXRlbmN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnQXZnRTJFTGF0ZW5jeScsICdUb3RhbCBsYXRlbmN5IChtcyknLCBNYXRoLmNlaWwobGF0ZW5jeUluZm8uYXZlcmFnZUUyRUxhdGVuY3kpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgc3RhdCB0byB0aGUgc3RhdHMgcmVzdWx0cyBpbiB0aGUgRE9NIG9yIHVwZGF0ZXMgYW4gZXhpdGluZyBzdGF0LlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgc3RhdCB0byBhZGQvdXBkYXRlLlxuICAgICAqIEBwYXJhbSBzdGF0IC0gVGhlIGNvbnRlbnRzIG9mIHRoZSBzdGF0LlxuICAgICAqL1xuICAgIGFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoaWQsIHN0YXRMYWJlbCwgc3RhdCkge1xuICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU3RhdChTdGF0c1NlY3Rpb25zLlNlc3Npb25TdGF0cywgaWQsIHN0YXRMYWJlbCwgc3RhdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBuZXcgc3RhdCB0byB0aGUgbGF0ZW5jeSByZXN1bHRzIGluIHRoZSBET00gb3IgdXBkYXRlcyBhbiBleGl0aW5nIHN0YXQuXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBzdGF0IHRvIGFkZC91cGRhdGUuXG4gICAgICogQHBhcmFtIHN0YXQgLSBUaGUgY29udGVudHMgb2YgdGhlIHN0YXQuXG4gICAgICovXG4gICAgYWRkT3JVcGRhdGVMYXRlbmN5U3RhdChpZCwgc3RhdExhYmVsLCBzdGF0KSB7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTdGF0KFN0YXRzU2VjdGlvbnMuTGF0ZW5jeVN0YXRzLCBpZCwgc3RhdExhYmVsLCBzdGF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBzdGF0IHRvIHRoZSBzdGF0cyByZXN1bHRzIGluIHRoZSBET00gb3IgdXBkYXRlcyBhbiBleGl0aW5nIHN0YXQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25JZCAtIFRoZSBzZWN0aW9uIHRvIGFkZCB0aGlzIHN0YXQgdG9vLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgc3RhdCB0byBhZGQvdXBkYXRlLlxuICAgICAqIEBwYXJhbSBzdGF0IC0gVGhlIGNvbnRlbnRzIG9mIHRoZSBzdGF0LlxuICAgICAqL1xuICAgIGFkZE9yVXBkYXRlU3RhdChzZWN0aW9uSWQsIGlkLCBzdGF0TGFiZWwsIHN0YXQpIHtcbiAgICAgICAgaWYgKHNlY3Rpb25JZCA9PT0gU3RhdHNTZWN0aW9ucy5TZXNzaW9uU3RhdHMgJiZcbiAgICAgICAgICAgICFpc1NlY3Rpb25FbmFibGVkKHRoaXMuX2NvbmZpZywgU3RhdHNTZWN0aW9ucy5TZXNzaW9uU3RhdHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY3Rpb25JZCA9PT0gU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMgJiZcbiAgICAgICAgICAgICFpc1NlY3Rpb25FbmFibGVkKHRoaXMuX2NvbmZpZywgU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBzdXBwb3J0IHNlc3Npb24gb3IgbGF0ZW5jeSBzdGF0cyBiZWluZyB1cGRhdGVkIGluIHRoaXMgZnVuY3Rpb24gY3VycmVudGx5XG4gICAgICAgIGlmIChzZWN0aW9uSWQgIT09IFN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzICYmIHNlY3Rpb25JZCAhPT0gU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnRFbGVtID0gc2VjdGlvbklkID09PSBTdGF0c1NlY3Rpb25zLlNlc3Npb25TdGF0cyA/IHRoaXMuc3RhdHNSZXN1bHQgOiB0aGlzLmxhdGVuY3lSZXN1bHQ7XG4gICAgICAgIGNvbnN0IHN0YXRIVE1MID0gYCR7c3RhdExhYmVsfTogJHtzdGF0fWA7XG4gICAgICAgIGlmICghdGhpcy5zdGF0c01hcC5oYXMoaWQpKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHN0YXRcbiAgICAgICAgICAgIGNvbnN0IG5ld1N0YXQgPSBuZXcgU3RhdCgpO1xuICAgICAgICAgICAgbmV3U3RhdC5pZCA9IGlkO1xuICAgICAgICAgICAgbmV3U3RhdC5zdGF0ID0gc3RhdDtcbiAgICAgICAgICAgIG5ld1N0YXQudGl0bGUgPSBzdGF0TGFiZWw7XG4gICAgICAgICAgICBuZXdTdGF0LmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIG5ld1N0YXQuZWxlbWVudC5pbm5lckhUTUwgPSBzdGF0SFRNTDtcbiAgICAgICAgICAgIC8vIGFkZCB0aGUgc3RhdCB0byB0aGUgZG9tXG4gICAgICAgICAgICBwYXJlbnRFbGVtLmFwcGVuZENoaWxkKG5ld1N0YXQuZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRzTWFwLnNldChpZCwgbmV3U3RhdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBleGlzdGluZyBzdGF0XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnN0YXRzTWFwLmdldChpZCk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmVsZW1lbnQuaW5uZXJIVE1MID0gc3RhdEhUTUw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdGF0c1BhbmVsLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgY2xhc3MgRXh0cmFGbGFncyB7XG59XG5FeHRyYUZsYWdzLkxpZ2h0TW9kZSA9ICdMaWdodE1vZGUnO1xuLyoqXG4gKiBBbGwgdGhlIFVJIHNlY3Rpb25zIGFjcm9zcyBhbGwgdGhlIHBhbmVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzU2VjdGlvbnMge1xufVxuU2V0dGluZ3NTZWN0aW9ucy5QaXhlbFN0cmVhbWluZyA9ICdQaXhlbCBTdHJlYW1pbmcnO1xuU2V0dGluZ3NTZWN0aW9ucy5VSSA9ICdVSSc7XG5TZXR0aW5nc1NlY3Rpb25zLklucHV0ID0gJ0lucHV0JztcblNldHRpbmdzU2VjdGlvbnMuRW5jb2RlciA9ICdFbmNvZGVyJztcblNldHRpbmdzU2VjdGlvbnMuV2ViUlRDID0gJ1dlYlJUQyc7XG5TZXR0aW5nc1NlY3Rpb25zLkNvbW1hbmRzID0gJ0NvbW1hbmRzJztcbmV4cG9ydCBjbGFzcyBTdGF0c1NlY3Rpb25zIHtcbn1cblN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzID0gJ1Nlc3Npb24gU3RhdHMnO1xuU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMgPSAnTGF0ZW5jeSBTdGF0cyc7XG5TdGF0c1NlY3Rpb25zLkxhdGVuY3lUZXN0ID0gJ0xhdGVuY3kgVGVzdCc7XG5TdGF0c1NlY3Rpb25zLkRhdGFDaGFubmVsTGF0ZW5jeVRlc3QgPSAnRGF0YSBDaGFubmVsIExhdGVuY3kgVGVzdCc7XG4vKiogV2hldGhlciBhIHN0cmVhbSBVSSBlbGVtZW50IGlzIGludGVybmFsbHkgbWFkZSwgZXh0ZXJuYWxseSBwcm92aWRlZCwgb3IgZGlzYWJsZWQuICovXG5leHBvcnQgdmFyIFVJRWxlbWVudENyZWF0aW9uTW9kZTtcbihmdW5jdGlvbiAoVUlFbGVtZW50Q3JlYXRpb25Nb2RlKSB7XG4gICAgVUlFbGVtZW50Q3JlYXRpb25Nb2RlW1VJRWxlbWVudENyZWF0aW9uTW9kZVtcIkNyZWF0ZURlZmF1bHRFbGVtZW50XCJdID0gMF0gPSBcIkNyZWF0ZURlZmF1bHRFbGVtZW50XCI7XG4gICAgVUlFbGVtZW50Q3JlYXRpb25Nb2RlW1VJRWxlbWVudENyZWF0aW9uTW9kZVtcIlVzZUN1c3RvbUVsZW1lbnRcIl0gPSAxXSA9IFwiVXNlQ3VzdG9tRWxlbWVudFwiO1xuICAgIFVJRWxlbWVudENyZWF0aW9uTW9kZVtVSUVsZW1lbnRDcmVhdGlvbk1vZGVbXCJEaXNhYmxlXCJdID0gMl0gPSBcIkRpc2FibGVcIjtcbn0pKFVJRWxlbWVudENyZWF0aW9uTW9kZSB8fCAoVUlFbGVtZW50Q3JlYXRpb25Nb2RlID0ge30pKTtcbmV4cG9ydCBmdW5jdGlvbiBpc1BhbmVsRW5hYmxlZChjb25maWcpIHtcbiAgICByZXR1cm4gIWNvbmZpZyB8fCAoISFjb25maWcgJiYgY29uZmlnLmlzRW5hYmxlZCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTZWN0aW9uRW5hYmxlZChjb25maWcsIHNlY3Rpb24pIHtcbiAgICByZXR1cm4gKCFjb25maWcgfHxcbiAgICAgICAgKCEhY29uZmlnICYmXG4gICAgICAgICAgICAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcuc2VjdGlvblZpc2liaWxpdHksIHNlY3Rpb24pIHx8XG4gICAgICAgICAgICAgICAgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcuc2VjdGlvblZpc2liaWxpdHksIHNlY3Rpb24pICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZWN0aW9uVmlzaWJpbGl0eVtzZWN0aW9uXSkpKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTZXR0aW5nRW5hYmxlZChjb25maWcsIHNldHRpbmcpIHtcbiAgICByZXR1cm4gKCFjb25maWcgfHxcbiAgICAgICAgKCEhY29uZmlnICYmXG4gICAgICAgICAgICAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcuc2V0dGluZ1Zpc2liaWxpdHksIHNldHRpbmcpIHx8XG4gICAgICAgICAgICAgICAgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcuc2V0dGluZ1Zpc2liaWxpdHksIHNldHRpbmcpICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXR0aW5nVmlzaWJpbGl0eVtzZXR0aW5nXSkpKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1VSUNvbmZpZ3VyYXRpb25UeXBlcy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBBIFVJIGVsZW1lbnQgc2hvd2luZyB0aGUgUVAgKHF1YW50aXphdGlvbiBwYXJhbWV0ZXIpIG9mIHRoZSB2aWRlbyBzdHJlYW0gYXQgdGhlIGxhc3QgZW5jb2RlZCBmcmFtZSAod2VsbCwgbGFzdCB0cmFuc21pdHRlZCBRUCByZWFsbHkpLlxuICogQSBibG9ja2llciBlbmNvZGluZyB3aWxsIGhhdmUgYSBoaWdoZXIgUVAgYW5kIHRoaXMgd2lsbCBtYWtlIHRoZSBpbmRpY2F0b3IgdHVybiBtb3JlIHJlZC5cbiAqIEEgbm9uLWJsb2NreSBzdHJlYW0gd2lsbCBoYXZlIGEgbG93ZXIgUVAgYW5kIHRoaXMgd2lsbCBtYWtlIHRoZSBpbmRpY2F0b3IgdHVybiBtb3JlIGdyZWVuLlxuICogVGhlIFFQIGluZGljYXRvciBpcyByZXByZXNlbnRlZCB2aXN1YWxseSB1c2luZyBhIFdpRmkgaWNvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFZpZGVvUXBJbmRpY2F0b3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICB0aGlzLnZpZGVvRW5jb2RlckF2Z1FQID0gLTE7XG4gICAgICAgIC8vIG5vbiBodG1sIGVsZW1lbnRzXG4gICAgICAgIHRoaXMuc3RhdHNUZXh0ID0gJyc7XG4gICAgICAgIHRoaXMuY29sb3IgPSAnJztcbiAgICAgICAgLy8gcXAgY29sb3JzXG4gICAgICAgIHRoaXMub3JhbmdlUVAgPSAyNjtcbiAgICAgICAgdGhpcy5yZWRRUCA9IDM1O1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByb290IGVsZW1lbnQgb2YgdGhlIFFQIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJvb3QgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBzdmcgZm9yIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSAnY29ubmVjdGlvbic7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdVaVRvb2wnKTtcbiAgICAgICAgICAgIC8vIGFkZCBzdmcgaWNvbiBmb3IgdGhlIGNvbm5lY3Rpb24gc3RyZW5ndGhcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucXVhbGl0eVN0YXR1cyk7XG4gICAgICAgICAgICAvLyBhZGQgdGhlIHRleHQgdW5kZXJuZWF0aCB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5xdWFsaXR5VGV4dCk7XG4gICAgICAgICAgICAvLyBzZXQgY29sb3JzIHRvIG5vdCBjb25uZWN0ZWQgaW5pdGlhbGx5XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVFwVG9vbHRpcCgtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRleHQgdGhhdCBkaXNwbGF5cyB1bmRlciB0aGUgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgcXVhbGl0eVRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcXVhbGl0eVRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3F1YWxpdHlUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fcXVhbGl0eVRleHQuaWQgPSAncXVhbGl0eVRleHQnO1xuICAgICAgICAgICAgdGhpcy5fcXVhbGl0eVRleHQuY2xhc3NMaXN0LmFkZCgndG9vbHRpcHRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcXVhbGl0eVRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgcXVhbGl0eVN0YXR1cygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9xdWFsaXR5U3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLl9xdWFsaXR5U3RhdHVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICAgIHRoaXMuX3F1YWxpdHlTdGF0dXMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2lkJywgJ2Nvbm5lY3Rpb25TdHJlbmd0aCcpO1xuICAgICAgICAgICAgdGhpcy5fcXVhbGl0eVN0YXR1cy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneCcsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3F1YWxpdHlTdGF0dXMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3knLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl9xdWFsaXR5U3RhdHVzLnNldEF0dHJpYnV0ZU5TKG51bGwsICd2aWV3Qm94JywgJzAgMCA0OTQuNDUgNDk0LjQ1Jyk7XG4gICAgICAgICAgICAvLyBidWlsZCB3aWZpIGljb25cbiAgICAgICAgICAgIHRoaXMucXVhbGl0eVN0YXR1cy5hcHBlbmRDaGlsZCh0aGlzLmRvdCk7XG4gICAgICAgICAgICB0aGlzLnF1YWxpdHlTdGF0dXMuYXBwZW5kQ2hpbGQodGhpcy5taWRkbGUpO1xuICAgICAgICAgICAgdGhpcy5xdWFsaXR5U3RhdHVzLmFwcGVuZENoaWxkKHRoaXMub3V0ZXIpO1xuICAgICAgICAgICAgdGhpcy5xdWFsaXR5U3RhdHVzLmFwcGVuZENoaWxkKHRoaXMuaW5uZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWFsaXR5U3RhdHVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRvdCBhdCB0aGUgYm90dG9tIG9mIHRoZSB3aWZpIGljb24uXG4gICAgICovXG4gICAgZ2V0IGRvdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnY2lyY2xlJyk7XG4gICAgICAgICAgICB0aGlzLl9kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2lkJywgJ2RvdCcpO1xuICAgICAgICAgICAgdGhpcy5fZG90LnNldEF0dHJpYnV0ZU5TKG51bGwsICdjeCcsICcyNDcuMTI1Jyk7XG4gICAgICAgICAgICB0aGlzLl9kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N5JywgJzM5OC45MjUnKTtcbiAgICAgICAgICAgIHRoaXMuX2RvdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAncicsICczNS4zJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvdXRlciBhcmMgb2YgdGhlIHdpZmkgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgb3V0ZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5fb3V0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX291dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICB0aGlzLl9vdXRlci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnb3V0ZXInKTtcbiAgICAgICAgICAgIHRoaXMuX291dGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ000NjcuOTI1LDIwNC42MjVjLTYuOCwwLTEzLjUtMi42LTE4LjctNy44Yy0xMTEuNS0xMTEuNC0yOTIuNy0xMTEuNC00MDQuMSwwYy0xMC4zLDEwLjMtMjcuMSwxMC4zLTM3LjQsMHMtMTAuMy0yNy4xLDAtMzcuNGM2NC02NCwxNDktOTkuMiwyMzkuNS05OS4yczE3NS41LDM1LjIsMjM5LjUsOTkuMmMxMC4zLDEwLjMsMTAuMywyNy4xLDAsMzcuNEM0ODEuNDI1LDIwMi4wMjUsNDc0LjYyNSwyMDQuNjI1LDQ2Ny45MjUsMjA0LjYyNXonKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fb3V0ZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWlkZGxlIGFyYyBvZiB0aGUgd2lmaSBpY29uLlxuICAgICAqL1xuICAgIGdldCBtaWRkbGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWlkZGxlKSB7XG4gICAgICAgICAgICB0aGlzLl9taWRkbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHRoaXMuX21pZGRsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnbWlkZGxlJyk7XG4gICAgICAgICAgICB0aGlzLl9taWRkbGUuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTM5NS4yMjUsMjc3LjMyNWMtNi44LDAtMTMuNS0yLjYtMTguNy03LjhjLTcxLjQtNzEuMy0xODcuNC03MS4zLTI1OC44LDBjLTEwLjMsMTAuMy0yNy4xLDEwLjMtMzcuNCwwcy0xMC4zLTI3LjEsMC0zNy40YzkyLTkyLDI0MS42LTkyLDMzMy42LDBjMTAuMywxMC4zLDEwLjMsMjcuMSwwLDM3LjRDNDA4LjcyNSwyNzQuNzI1LDQwMS45MjUsMjc3LjMyNSwzOTUuMjI1LDI3Ny4zMjV6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21pZGRsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBpbm5lciBhcmMgb2YgdGhlIHdpZmkgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgaW5uZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5uZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICB0aGlzLl9pbm5lci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnaW5uZXInKTtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00zMjMuNjI1LDM0OC44MjVjLTYuOCwwLTEzLjUtMi42LTE4LjctNy44Yy0xNS40LTE1LjQtMzYtMjMuOS01Ny44LTIzLjlzLTQyLjQsOC41LTU3LjgsMjMuOWMtMTAuMywxMC4zLTI3LjEsMTAuMy0zNy40LDBjLTEwLjMtMTAuMy0xMC4zLTI3LjEsMC0zNy40YzI1LjQtMjUuNCw1OS4yLTM5LjQsOTUuMi0zOS40czY5LjgsMTQsOTUuMiwzOS41YzEwLjMsMTAuMywxMC4zLDI3LjEsMCwzNy40QzMzNy4yMjUsMzQ2LjIyNSwzMzAuNDI1LDM0OC44MjUsMzIzLjYyNSwzNDguODI1eicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXNlZCB0byBzZXQgdGhlIHNwZWVkIG9mIHRoZSBzdGF0dXMgbGlnaHQuXG4gICAgICogQHBhcmFtIHNwZWVkIC0gU2V0IHRoZSBzcGVlZCBvZiB0aGUgYmxpbmssIGhpZ2hlciBudW1iZXJzIG1ha2UgdGhlIHN0YXR1cyBsaWdodCBibGluayBmYXN0ZXIuXG4gICAgICovXG4gICAgYmxpbmtWaWRlb1F1YWxpdHlTdGF0dXMoc3BlZWQpIHtcbiAgICAgICAgbGV0IGl0ZXJhdGlvbiA9IHNwZWVkO1xuICAgICAgICBsZXQgb3BhY2l0eSA9IDE7XG4gICAgICAgIGNvbnN0IHRpY2tJRCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIG9wYWNpdHkgLT0gMC4xO1xuICAgICAgICAgICAgdGhpcy5xdWFsaXR5VGV4dC5zdHlsZS5vcGFjaXR5ID0gU3RyaW5nKE1hdGguYWJzKChvcGFjaXR5IC0gMC41KSAqIDIpKTtcbiAgICAgICAgICAgIGlmIChvcGFjaXR5IDw9IDAuMSkge1xuICAgICAgICAgICAgICAgIGlmICgtLWl0ZXJhdGlvbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGlja0lEKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwIC8gc3BlZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB1cGRhdGVzIHRoZSBRUCB0b29sdGlwIGJ5IGNvbnZlcnRpbmcgdGhlIFZpZGVvIEVuY29kZXIgUVAgdG8gYSBjb2xvciBsaWdodFxuICAgICAqIEBwYXJhbSBRUCAtIFRoZSB2aWRlbyBlbmNvZGVyIFFQIG51bWJlciBuZWVkZWQgdG8gZmluZCB0aGUgYXZlcmFnZVxuICAgICAqL1xuICAgIHVwZGF0ZVFwVG9vbHRpcChRUCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMudmlkZW9FbmNvZGVyQXZnUVAgPSBRUDtcbiAgICAgICAgaWYgKFFQID4gdGhpcy5yZWRRUCkge1xuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdyZWQnO1xuICAgICAgICAgICAgdGhpcy5ibGlua1ZpZGVvUXVhbGl0eVN0YXR1cygyKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHNUZXh0ID0gYDxkaXYgc3R5bGU9XCJjb2xvcjogJHt0aGlzLmNvbG9yfVwiPlBvb3IgZW5jb2RpbmcgcXVhbGl0eTwvZGl2PmA7XG4gICAgICAgICAgICB0aGlzLm91dGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMubWlkZGxlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMuaW5uZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCB0aGlzLmNvbG9yKTtcbiAgICAgICAgICAgIHRoaXMuZG90LnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5jb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUVAgPiB0aGlzLm9yYW5nZVFQKSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ29yYW5nZSc7XG4gICAgICAgICAgICB0aGlzLmJsaW5rVmlkZW9RdWFsaXR5U3RhdHVzKDEpO1xuICAgICAgICAgICAgdGhpcy5zdGF0c1RleHQgPSBgPGRpdiBzdHlsZT1cImNvbG9yOiAke3RoaXMuY29sb3J9XCI+QmxvY2t5IGVuY29kaW5nIHF1YWxpdHk8L2Rpdj5gO1xuICAgICAgICAgICAgdGhpcy5vdXRlci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjM2MzYjQwJyk7XG4gICAgICAgICAgICB0aGlzLm1pZGRsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5pbm5lci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCB0aGlzLmNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChRUCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJyNiMGIwYjAnO1xuICAgICAgICAgICAgdGhpcy5vdXRlci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjM2MzYjQwJyk7XG4gICAgICAgICAgICB0aGlzLm1pZGRsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsICcjM2MzYjQwJyk7XG4gICAgICAgICAgICB0aGlzLmlubmVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMuZG90LnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHNUZXh0ID0gYDxkaXYgc3R5bGU9XCJjb2xvcjogJHt0aGlzLmNvbG9yfVwiPk5vdCBjb25uZWN0ZWQ8L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdsaW1lJztcbiAgICAgICAgICAgIHRoaXMucXVhbGl0eVN0YXR1cy5zdHlsZS5vcGFjaXR5ID0gKChfYSA9IHRoaXMuY29uZmlnKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZVdoZW5Hb29kKSA9PSB0cnVlID8gJzAnIDogJzEnO1xuICAgICAgICAgICAgdGhpcy5zdGF0c1RleHQgPSBgPGRpdiBzdHlsZT1cImNvbG9yOiAke3RoaXMuY29sb3J9XCI+Q2xlYXIgZW5jb2RpbmcgcXVhbGl0eTwvZGl2PmA7XG4gICAgICAgICAgICB0aGlzLm91dGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLm1pZGRsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5pbm5lci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCB0aGlzLmNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1YWxpdHlUZXh0LmlubmVySFRNTCA9IHRoaXMuc3RhdHNUZXh0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZGVvUXBJbmRpY2F0b3IuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogWFIgaWNvbiB0aGF0IGNhbiBiZSBjbGlja2VkLlxuICovXG5leHBvcnQgY2xhc3MgWFJJY29uIHtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRoZSBidXR0b24gY29udGFpbmluZyB0aGUgWFIgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdVaVRvb2wnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmlkID0gJ3hyQnRuJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMueHJJY29uKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcFRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IHRvb2x0aXBUZXh0KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rvb2x0aXBUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0LmNsYXNzTGlzdC5hZGQoJ3Rvb2x0aXB0ZXh0Jyk7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dC5pbm5lckhUTUwgPSAnWFInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90b29sdGlwVGV4dDtcbiAgICB9XG4gICAgZ2V0IHhySWNvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl94ckljb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3hySWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgICAgICAgICB0aGlzLl94ckljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ2lkJywgJ3hySWNvbicpO1xuICAgICAgICAgICAgdGhpcy5feHJJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd4JywgJzBweCcpO1xuICAgICAgICAgICAgdGhpcy5feHJJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd5JywgJzBweCcpO1xuICAgICAgICAgICAgdGhpcy5feHJJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd2aWV3Qm94JywgJzAgMCAxMDAgMTAwJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgc3ZnIGdyb3VwIGZvciB0aGUgcGF0aHNcbiAgICAgICAgICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBzdmdHcm91cC5jbGFzc0xpc3QuYWRkKCdzdmdJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl94ckljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHBhdGhzIGZvciB0aGUgaWNvbiBpdHNlbGYsIHRoZSBwYXRoIG9mIHRoZSB4ciBoZWFkc2V0XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00yOSA0MWMtNSAwLTkgNC05IDlzNCA5IDkgOSA5LTQgOS05LTQtOS05LTl6bTAgMTRjLTIuOCAwLTUtMi4yLTUtNXMyLjItNSA1LTUgNSAyLjIgNSA1LTIuMiA1LTUgNXptNDItMTRjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05em0wIDE0Yy0yLjggMC01LTIuMi01LTVzMi4yLTUgNS01IDUgMi4yIDUgNS0yLjIgNS01IDV6bTEyLTMxSDE3Yy02LjYgMC0xMiA1LjQtMTIgMTJ2MjhjMCA2LjYgNS40IDEyIDEyIDEyaDE0LjVjMy41IDAgNi44LTEuNSA5LTQuMWwzLjUtNGMxLjUtMS43IDMuNy0yLjcgNi0yLjdzNC41IDEgNiAyLjdsMy41IDRjMi4zIDIuNiA1LjYgNC4xIDkgNC4xSDgzYzYuNiAwIDEyLTUuNCAxMi0xMlYzNmMwLTYuNi01LjQtMTItMTItMTJ6bTggNDBjMCA0LjQtMy42IDgtOCA4SDY4LjVjLTIuMyAwLTQuNS0xLTYtMi43bC0zLjUtNGMtMi4zLTIuNi01LjYtNC4xLTktNC4xLTMuNSAwLTYuOCAxLjUtOSA0LjFsLTMuNSA0QzM2IDcxIDMzLjggNzIgMzEuNSA3MkgxN2MtNC40IDAtOC0zLjYtOC04VjM2YzAtNC40IDMuNi04IDgtOGg2NmM0LjQgMCA4IDMuNiA4IDh2Mjh6Jyk7XG4gICAgICAgICAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5feHJJY29uO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVhSSWNvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IGNsYXNzIE1hdGhVdGlscyB7XG4gICAgLyoqXG4gICAgICogZm9ybWF0cyBCeXRlcyBjb21pbmcgaW4gZm9yIHZpZGVvIHN0YXRzXG4gICAgICogQHBhcmFtIGJ5dGVzIC0gbnVtYmVyIHRvIGNvbnZlcnRcbiAgICAgKiBAcGFyYW0gZGVjaW1hbHMgLSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZm9ybWF0Qnl0ZXMoYnl0ZXMsIGRlY2ltYWxzKSB7XG4gICAgICAgIGlmIChieXRlcyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmYWN0b3IgPSAxMDI0O1xuICAgICAgICBjb25zdCBkbSA9IGRlY2ltYWxzIDwgMCA/IDAgOiBkZWNpbWFscztcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tpQicsICdNaUInLCAnR2lCJywgJ1RpQicsICdQaUInLCAnRWlCJywgJ1ppQicsICdZaUInXTtcbiAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coZmFjdG9yKSk7XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGZhY3RvciwgaSkpLnRvRml4ZWQoZG0pKSArICcgJyArIHNpemVzW2ldO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1hdGhVdGlscy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IHsgQXBwbGljYXRpb24gfSBmcm9tICcuL0FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uJztcbmV4cG9ydCB7IFBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZSB9IGZyb20gJy4vU3R5bGVzL1BpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZXMnO1xuZXhwb3J0IHsgQUZLT3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheS9BRktPdmVybGF5JztcbmV4cG9ydCB7IEFjdGlvbk92ZXJsYXkgfSBmcm9tICcuL092ZXJsYXkvQWN0aW9uT3ZlcmxheSc7XG5leHBvcnQgeyBPdmVybGF5QmFzZSB9IGZyb20gJy4vT3ZlcmxheS9CYXNlT3ZlcmxheSc7XG5leHBvcnQgeyBDb25uZWN0T3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheS9Db25uZWN0T3ZlcmxheSc7XG5leHBvcnQgeyBEaXNjb25uZWN0T3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheS9EaXNjb25uZWN0T3ZlcmxheSc7XG5leHBvcnQgeyBFcnJvck92ZXJsYXkgfSBmcm9tICcuL092ZXJsYXkvRXJyb3JPdmVybGF5JztcbmV4cG9ydCB7IEluZm9PdmVybGF5IH0gZnJvbSAnLi9PdmVybGF5L0luZm9PdmVybGF5JztcbmV4cG9ydCB7IFBsYXlPdmVybGF5IH0gZnJvbSAnLi9PdmVybGF5L1BsYXlPdmVybGF5JztcbmV4cG9ydCB7IFRleHRPdmVybGF5IH0gZnJvbSAnLi9PdmVybGF5L1RleHRPdmVybGF5JztcbmV4cG9ydCB7IENvbmZpZ1VJIH0gZnJvbSAnLi9Db25maWcvQ29uZmlnVUknO1xuZXhwb3J0IHsgU2V0dGluZ1VJQmFzZSB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdVSUJhc2UnO1xuZXhwb3J0IHsgU2V0dGluZ1VJRmxhZyB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdVSUZsYWcnO1xuZXhwb3J0IHsgU2V0dGluZ1VJTnVtYmVyIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ1VJTnVtYmVyJztcbmV4cG9ydCB7IFNldHRpbmdVSU9wdGlvbiB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdVSU9wdGlvbic7XG5leHBvcnQgeyBTZXR0aW5nVUlUZXh0IH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ1VJVGV4dCc7XG5leHBvcnQgeyBVSUVsZW1lbnRDcmVhdGlvbk1vZGUgfSBmcm9tICcuL1VJL1VJQ29uZmlndXJhdGlvblR5cGVzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWkuanMubWFwIiwiLyoqXG4gKiBhc3NlcnQgdGhhdCBjb25kaXRpb24gaXMgdHJ1ZSBvciB0aHJvdyBlcnJvciAod2l0aCBtZXNzYWdlKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbXNnKSB7XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgfVxufVxuLyoqXG4gKiBhc3NlcnQgdGhhdCB2YWx1ZSBjYW5ub3QgZXhpc3QgPSB0eXBlIGBuZXZlcmAuIHRocm93IHJ1bnRpbWUgZXJyb3IgaWYgaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ldmVyKHZhbHVlLCBtc2cpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnICE9PSBudWxsICYmIG1zZyAhPT0gdm9pZCAwID8gbXNnIDogJ1VuZXhwZWN0ZWQgb2JqZWN0OiAnICsgdmFsdWUpO1xufVxuY29uc3QgRkxPQVQzMl9NQVggPSAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCBGTE9BVDMyX01JTiA9IC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCBVSU5UMzJfTUFYID0gMHhGRkZGRkZGRiwgSU5UMzJfTUFYID0gMFg3RkZGRkZGRiwgSU5UMzJfTUlOID0gLTBYODAwMDAwMDA7XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW50MzIoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09IFwibnVtYmVyXCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnQgMzI6ICcgKyB0eXBlb2YgYXJnKTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYXJnKSB8fCBhcmcgPiBJTlQzMl9NQVggfHwgYXJnIDwgSU5UMzJfTUlOKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW50IDMyOiAnICsgYXJnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRVSW50MzIoYXJnKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgIT09IFwibnVtYmVyXCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1aW50IDMyOiAnICsgdHlwZW9mIGFyZyk7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGFyZykgfHwgYXJnID4gVUlOVDMyX01BWCB8fCBhcmcgPCAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdWludCAzMjogJyArIGFyZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RmxvYXQzMihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZsb2F0IDMyOiAnICsgdHlwZW9mIGFyZyk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoYXJnKSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChhcmcgPiBGTE9BVDMyX01BWCB8fCBhcmcgPCBGTE9BVDMyX01JTilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZsb2F0IDMyOiAnICsgYXJnKTtcbn1cbiIsIi8vIGxvb2t1cCB0YWJsZSBmcm9tIGJhc2U2NCBjaGFyYWN0ZXIgdG8gYnl0ZVxubGV0IGVuY1RhYmxlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcbi8vIGxvb2t1cCB0YWJsZSBmcm9tIGJhc2U2NCBjaGFyYWN0ZXIgKmNvZGUqIHRvIGJ5dGUgYmVjYXVzZSBsb29rdXAgYnkgbnVtYmVyIGlzIGZhc3RcbmxldCBkZWNUYWJsZSA9IFtdO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBlbmNUYWJsZS5sZW5ndGg7IGkrKylcbiAgICBkZWNUYWJsZVtlbmNUYWJsZVtpXS5jaGFyQ29kZUF0KDApXSA9IGk7XG4vLyBzdXBwb3J0IGJhc2U2NHVybCB2YXJpYW50c1xuZGVjVGFibGVbXCItXCIuY2hhckNvZGVBdCgwKV0gPSBlbmNUYWJsZS5pbmRleE9mKFwiK1wiKTtcbmRlY1RhYmxlW1wiX1wiLmNoYXJDb2RlQXQoMCldID0gZW5jVGFibGUuaW5kZXhPZihcIi9cIik7XG4vKipcbiAqIERlY29kZXMgYSBiYXNlNjQgc3RyaW5nIHRvIGEgYnl0ZSBhcnJheS5cbiAqXG4gKiAtIGlnbm9yZXMgd2hpdGUtc3BhY2UsIGluY2x1ZGluZyBsaW5lIGJyZWFrcyBhbmQgdGFic1xuICogLSBhbGxvd3MgaW5uZXIgcGFkZGluZyAoY2FuIGRlY29kZSBjb25jYXRlbmF0ZWQgYmFzZTY0IHN0cmluZ3MpXG4gKiAtIGRvZXMgbm90IHJlcXVpcmUgcGFkZGluZ1xuICogLSB1bmRlcnN0YW5kcyBiYXNlNjR1cmwgZW5jb2Rpbmc6XG4gKiAgIFwiLVwiIGluc3RlYWQgb2YgXCIrXCIsXG4gKiAgIFwiX1wiIGluc3RlYWQgb2YgXCIvXCIsXG4gKiAgIG5vIHBhZGRpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NGRlY29kZShiYXNlNjRTdHIpIHtcbiAgICAvLyBlc3RpbWF0ZSBieXRlIHNpemUsIG5vdCBhY2NvdW50aW5nIGZvciBpbm5lciBwYWRkaW5nIGFuZCB3aGl0ZXNwYWNlXG4gICAgbGV0IGVzID0gYmFzZTY0U3RyLmxlbmd0aCAqIDMgLyA0O1xuICAgIC8vIGlmIChlcyAlIDMgIT09IDApXG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJhc2U2NCBzdHJpbmcnKTtcbiAgICBpZiAoYmFzZTY0U3RyW2Jhc2U2NFN0ci5sZW5ndGggLSAyXSA9PSAnPScpXG4gICAgICAgIGVzIC09IDI7XG4gICAgZWxzZSBpZiAoYmFzZTY0U3RyW2Jhc2U2NFN0ci5sZW5ndGggLSAxXSA9PSAnPScpXG4gICAgICAgIGVzIC09IDE7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZXMpLCBieXRlUG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYnl0ZSBhcnJheVxuICAgIGdyb3VwUG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYmFzZTY0IGdyb3VwXG4gICAgYiwgLy8gY3VycmVudCBieXRlXG4gICAgcCA9IDAgLy8gcHJldmlvdXMgYnl0ZVxuICAgIDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhc2U2NFN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBiID0gZGVjVGFibGVbYmFzZTY0U3RyLmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBub2luc3BlY3Rpb24gRmFsbFRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICAgICAgICBzd2l0Y2ggKGJhc2U2NFN0cltpXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJz0nOlxuICAgICAgICAgICAgICAgICAgICBncm91cFBvcyA9IDA7IC8vIHJlc2V0IHN0YXRlIHdoZW4gcGFkZGluZyBmb3VuZFxuICAgICAgICAgICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB3aGl0ZS1zcGFjZSwgYW5kIHBhZGRpbmdcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBiYXNlNjQgc3RyaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoZ3JvdXBQb3MpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBwID0gYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgYnl0ZXNbYnl0ZVBvcysrXSA9IHAgPDwgMiB8IChiICYgNDgpID4+IDQ7XG4gICAgICAgICAgICAgICAgcCA9IGI7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGJ5dGVzW2J5dGVQb3MrK10gPSAocCAmIDE1KSA8PCA0IHwgKGIgJiA2MCkgPj4gMjtcbiAgICAgICAgICAgICAgICBwID0gYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgYnl0ZXNbYnl0ZVBvcysrXSA9IChwICYgMykgPDwgNiB8IGI7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChncm91cFBvcyA9PSAxKVxuICAgICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBiYXNlNjQgc3RyaW5nLmApO1xuICAgIHJldHVybiBieXRlcy5zdWJhcnJheSgwLCBieXRlUG9zKTtcbn1cbi8qKlxuICogRW5jb2RlcyBhIGJ5dGUgYXJyYXkgdG8gYSBiYXNlNjQgc3RyaW5nLlxuICogQWRkcyBwYWRkaW5nIGF0IHRoZSBlbmQuXG4gKiBEb2VzIG5vdCBpbnNlcnQgbmV3bGluZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRlbmNvZGUoYnl0ZXMpIHtcbiAgICBsZXQgYmFzZTY0ID0gJycsIGdyb3VwUG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYmFzZTY0IGdyb3VwXG4gICAgYiwgLy8gY3VycmVudCBieXRlXG4gICAgcCA9IDA7IC8vIGNhcnJ5IG92ZXIgZnJvbSBwcmV2aW91cyBieXRlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBiID0gYnl0ZXNbaV07XG4gICAgICAgIHN3aXRjaCAoZ3JvdXBQb3MpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbYiA+PiAyXTtcbiAgICAgICAgICAgICAgICBwID0gKGIgJiAzKSA8PCA0O1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbcCB8IGIgPj4gNF07XG4gICAgICAgICAgICAgICAgcCA9IChiICYgMTUpIDw8IDI7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtwIHwgYiA+PiA2XTtcbiAgICAgICAgICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbYiAmIDYzXTtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gcGFkZGluZyByZXF1aXJlZD9cbiAgICBpZiAoZ3JvdXBQb3MpIHtcbiAgICAgICAgYmFzZTY0ICs9IGVuY1RhYmxlW3BdO1xuICAgICAgICBiYXNlNjQgKz0gJz0nO1xuICAgICAgICBpZiAoZ3JvdXBQb3MgPT0gMSlcbiAgICAgICAgICAgIGJhc2U2NCArPSAnPSc7XG4gICAgfVxuICAgIHJldHVybiBiYXNlNjQ7XG59XG4iLCIvKipcbiAqIFRoaXMgaGFuZGxlciBpbXBsZW1lbnRzIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdW5rbm93biBmaWVsZHMuXG4gKiBXaGVuIHJlYWRpbmcgZGF0YSwgdW5rbm93biBmaWVsZHMgYXJlIHN0b3JlZCBvbiB0aGUgbWVzc2FnZSwgaW4gYVxuICogc3ltYm9sIHByb3BlcnR5LlxuICogV2hlbiB3cml0aW5nIGRhdGEsIHRoZSBzeW1ib2wgcHJvcGVydHkgaXMgcXVlcmllZCBhbmQgdW5rbm93biBmaWVsZHNcbiAqIGFyZSBzZXJpYWxpemVkIGludG8gdGhlIG91dHB1dCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IHZhciBVbmtub3duRmllbGRIYW5kbGVyO1xuKGZ1bmN0aW9uIChVbmtub3duRmllbGRIYW5kbGVyKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHN5bWJvbCB1c2VkIHRvIHN0b3JlIHVua25vd24gZmllbGRzIGZvciBhIG1lc3NhZ2UuXG4gICAgICogVGhlIHByb3BlcnR5IG11c3QgY29uZm9ybSB0byBgVW5rbm93bkZpZWxkQ29udGFpbmVyYC5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbCA9IFN5bWJvbC5mb3IoXCJwcm90b2J1Zi10cy91bmtub3duXCIpO1xuICAgIC8qKlxuICAgICAqIFN0b3JlIGFuIHVua25vd24gZmllbGQgZHVyaW5nIGJpbmFyeSByZWFkIGRpcmVjdGx5IG9uIHRoZSBtZXNzYWdlLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNvbXBhdGlibGUgd2l0aCBgQmluYXJ5UmVhZE9wdGlvbnMucmVhZFVua25vd25GaWVsZGAuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgPSAodHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkYXRhKSA9PiB7XG4gICAgICAgIGxldCBjb250YWluZXIgPSBpcyhtZXNzYWdlKSA/IG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdIDogbWVzc2FnZVtVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbF0gPSBbXTtcbiAgICAgICAgY29udGFpbmVyLnB1c2goeyBubzogZmllbGRObywgd2lyZVR5cGUsIGRhdGEgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBXcml0ZSB1bmtub3duIGZpZWxkcyBzdG9yZWQgZm9yIHRoZSBtZXNzYWdlIHRvIHRoZSB3cml0ZXIuXG4gICAgICogVGhpcyBtZXRob2QgaXMgY29tcGF0aWJsZSB3aXRoIGBCaW5hcnlXcml0ZU9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzYC5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgPSAodHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcikgPT4ge1xuICAgICAgICBmb3IgKGxldCB7IG5vLCB3aXJlVHlwZSwgZGF0YSB9IG9mIFVua25vd25GaWVsZEhhbmRsZXIubGlzdChtZXNzYWdlKSlcbiAgICAgICAgICAgIHdyaXRlci50YWcobm8sIHdpcmVUeXBlKS5yYXcoZGF0YSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBMaXN0IHVua25vd24gZmllbGRzIHN0b3JlZCBmb3IgdGhlIG1lc3NhZ2UuXG4gICAgICogTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZXMgZmllbGRzIHdpdGggdGhlIHNhbWUgbnVtYmVyLlxuICAgICAqL1xuICAgIFVua25vd25GaWVsZEhhbmRsZXIubGlzdCA9IChtZXNzYWdlLCBmaWVsZE5vKSA9PiB7XG4gICAgICAgIGlmIChpcyhtZXNzYWdlKSkge1xuICAgICAgICAgICAgbGV0IGFsbCA9IG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdO1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkTm8gPyBhbGwuZmlsdGVyKHVmID0+IHVmLm5vID09IGZpZWxkTm8pIDogYWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxhc3QgdW5rbm93biBmaWVsZCBieSBmaWVsZCBudW1iZXIuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5sYXN0ID0gKG1lc3NhZ2UsIGZpZWxkTm8pID0+IFVua25vd25GaWVsZEhhbmRsZXIubGlzdChtZXNzYWdlLCBmaWVsZE5vKS5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgaXMgPSAobWVzc2FnZSkgPT4gbWVzc2FnZSAmJiBBcnJheS5pc0FycmF5KG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdKTtcbn0pKFVua25vd25GaWVsZEhhbmRsZXIgfHwgKFVua25vd25GaWVsZEhhbmRsZXIgPSB7fSkpO1xuLyoqXG4gKiBNZXJnZXMgYmluYXJ5IHdyaXRlIG9yIHJlYWQgb3B0aW9ucy4gTGF0ZXIgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VCaW5hcnlPcHRpb25zKGEsIGIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhKSwgYik7XG59XG4vKipcbiAqIFByb3RvYnVmIGJpbmFyeSBmb3JtYXQgd2lyZSB0eXBlcy5cbiAqXG4gKiBBIHdpcmUgdHlwZSBwcm92aWRlcyBqdXN0IGVub3VnaCBpbmZvcm1hdGlvbiB0byBmaW5kIHRoZSBsZW5ndGggb2YgdGhlXG4gKiBmb2xsb3dpbmcgdmFsdWUuXG4gKlxuICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZyNzdHJ1Y3R1cmVcbiAqL1xuZXhwb3J0IHZhciBXaXJlVHlwZTtcbihmdW5jdGlvbiAoV2lyZVR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuICAgICAqL1xuICAgIFdpcmVUeXBlW1dpcmVUeXBlW1wiVmFyaW50XCJdID0gMF0gPSBcIlZhcmludFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkNjQsIHNmaXhlZDY0LCBkb3VibGUuXG4gICAgICogQWx3YXlzIDggYnl0ZXMgd2l0aCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJCaXQ2NFwiXSA9IDFdID0gXCJCaXQ2NFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG4gICAgICpcbiAgICAgKiBPbmx5IHJlcGVhdGVkIG51bWVyaWMgdHlwZXMgKHR5cGVzIHdoaWNoIHVzZSB0aGUgdmFyaW50LCAzMi1iaXQsXG4gICAgICogb3IgNjQtYml0IHdpcmUgdHlwZXMpIGNhbiBiZSBwYWNrZWQuIEluIHByb3RvMywgc3VjaCBmaWVsZHMgYXJlXG4gICAgICogcGFja2VkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJMZW5ndGhEZWxpbWl0ZWRcIl0gPSAyXSA9IFwiTGVuZ3RoRGVsaW1pdGVkXCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZ3JvdXBzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIlN0YXJ0R3JvdXBcIl0gPSAzXSA9IFwiU3RhcnRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGdyb3Vwc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJFbmRHcm91cFwiXSA9IDRdID0gXCJFbmRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkMzIsIHNmaXhlZDMyLCBmbG9hdC5cbiAgICAgKiBBbHdheXMgNCBieXRlcyB3aXRoIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci5cbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIkJpdDMyXCJdID0gNV0gPSBcIkJpdDMyXCI7XG59KShXaXJlVHlwZSB8fCAoV2lyZVR5cGUgPSB7fSkpO1xuIiwiaW1wb3J0IHsgV2lyZVR5cGUgfSBmcm9tIFwiLi9iaW5hcnktZm9ybWF0LWNvbnRyYWN0XCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG5pbXBvcnQgeyB2YXJpbnQzMnJlYWQsIHZhcmludDY0cmVhZCB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5jb25zdCBkZWZhdWx0c1JlYWQgPSB7XG4gICAgcmVhZFVua25vd25GaWVsZDogdHJ1ZSxcbiAgICByZWFkZXJGYWN0b3J5OiBieXRlcyA9PiBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSxcbn07XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3IgcmVhZGluZyBiaW5hcnkgZGF0YSBmb3JtIHBhcnRpYWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVJlYWRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHNSZWFkKSwgb3B0aW9ucykgOiBkZWZhdWx0c1JlYWQ7XG59XG5leHBvcnQgY2xhc3MgQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihidWYsIHRleHREZWNvZGVyKSB7XG4gICAgICAgIHRoaXMudmFyaW50NjQgPSB2YXJpbnQ2NHJlYWQ7IC8vIGRpcnR5IGNhc3QgZm9yIGB0aGlzYFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVhZCBhIGB1aW50MzJgIGZpZWxkLCBhbiB1bnNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51aW50MzIgPSB2YXJpbnQzMnJlYWQ7IC8vIGRpcnR5IGNhc3QgZm9yIGB0aGlzYCBhbmQgYWNjZXNzIHRvIHByb3RlY3RlZCBgYnVmYFxuICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgdGhpcy5sZW4gPSBidWYubGVuZ3RoO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBEYXRhVmlldyhidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVMZW5ndGgpO1xuICAgICAgICB0aGlzLnRleHREZWNvZGVyID0gdGV4dERlY29kZXIgIT09IG51bGwgJiYgdGV4dERlY29kZXIgIT09IHZvaWQgMCA/IHRleHREZWNvZGVyIDogbmV3IFRleHREZWNvZGVyKFwidXRmLThcIiwge1xuICAgICAgICAgICAgZmF0YWw6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVCT006IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIHRhZyAtIGZpZWxkIG51bWJlciBhbmQgd2lyZSB0eXBlLlxuICAgICAqL1xuICAgIHRhZygpIHtcbiAgICAgICAgbGV0IHRhZyA9IHRoaXMudWludDMyKCksIGZpZWxkTm8gPSB0YWcgPj4+IDMsIHdpcmVUeXBlID0gdGFnICYgNztcbiAgICAgICAgaWYgKGZpZWxkTm8gPD0gMCB8fCB3aXJlVHlwZSA8IDAgfHwgd2lyZVR5cGUgPiA1KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0YWc6IGZpZWxkIG5vIFwiICsgZmllbGRObyArIFwiIHdpcmUgdHlwZSBcIiArIHdpcmVUeXBlKTtcbiAgICAgICAgcmV0dXJuIFtmaWVsZE5vLCB3aXJlVHlwZV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNraXAgb25lIGVsZW1lbnQgb24gdGhlIHdpcmUgYW5kIHJldHVybiB0aGUgc2tpcHBlZCBkYXRhLlxuICAgICAqIFN1cHBvcnRzIFdpcmVUeXBlLlN0YXJ0R3JvdXAgc2luY2UgdjIuMC4wLWFscGhhLjIzLlxuICAgICAqL1xuICAgIHNraXAod2lyZVR5cGUpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgc3dpdGNoICh3aXJlVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBXaXJlVHlwZS5WYXJpbnQ6XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdICYgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkJpdDY0OlxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkJpdDMyOlxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDpcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLlN0YXJ0R3JvdXA6XG4gICAgICAgICAgICAgICAgLy8gRnJvbSBkZXNjcmlwdG9yLnByb3RvOiBHcm91cCB0eXBlIGlzIGRlcHJlY2F0ZWQsIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zLlxuICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSBtdXN0IHN0aWxsIGJlIGFibGUgdG8gcGFyc2UgYW5kIHRyZWF0IGFzIHVua25vd24uXG4gICAgICAgICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCh0ID0gdGhpcy50YWcoKVsxXSkgIT09IFdpcmVUeXBlLkVuZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcCh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbnQgc2tpcCB3aXJlIHR5cGUgXCIgKyB3aXJlVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KHN0YXJ0LCB0aGlzLnBvcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRocm93cyBlcnJvciBpZiBwb3NpdGlvbiBpbiBieXRlIGFycmF5IGlzIG91dCBvZiByYW5nZS5cbiAgICAgKi9cbiAgICBhc3NlcnRCb3VuZHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA+IHRoaXMubGVuKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJwcmVtYXR1cmUgRU9GXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGludDMyYCBmaWVsZCwgYSBzaWduZWQgMzIgYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyKCkgfCAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNpbnQzMmAgZmllbGQsIGEgc2lnbmVkLCB6aWd6YWctZW5jb2RlZCAzMi1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHNpbnQzMigpIHtcbiAgICAgICAgbGV0IHp6ZSA9IHRoaXMudWludDMyKCk7XG4gICAgICAgIC8vIGRlY29kZSB6aWd6YWdcbiAgICAgICAgcmV0dXJuICh6emUgPj4+IDEpIF4gLSh6emUgJiAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBpbnQ2NGAgZmllbGQsIGEgc2lnbmVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgaW50NjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKC4uLnRoaXMudmFyaW50NjQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgdWludDY0YCBmaWVsZCwgYW4gdW5zaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50NjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyguLi50aGlzLnZhcmludDY0KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNpbnQ2NGAgZmllbGQsIGEgc2lnbmVkLCB6aWctemFnLWVuY29kZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBzaW50NjQoKSB7XG4gICAgICAgIGxldCBbbG8sIGhpXSA9IHRoaXMudmFyaW50NjQoKTtcbiAgICAgICAgLy8gZGVjb2RlIHppZyB6YWdcbiAgICAgICAgbGV0IHMgPSAtKGxvICYgMSk7XG4gICAgICAgIGxvID0gKChsbyA+Pj4gMSB8IChoaSAmIDEpIDw8IDMxKSBeIHMpO1xuICAgICAgICBoaSA9IChoaSA+Pj4gMSBeIHMpO1xuICAgICAgICByZXR1cm4gbmV3IFBiTG9uZyhsbywgaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGJvb2xgIGZpZWxkLCBhIHZhcmlhbnQuXG4gICAgICovXG4gICAgYm9vbCgpIHtcbiAgICAgICAgbGV0IFtsbywgaGldID0gdGhpcy52YXJpbnQ2NCgpO1xuICAgICAgICByZXR1cm4gbG8gIT09IDAgfHwgaGkgIT09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgZml4ZWQzMmAgZmllbGQsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRVaW50MzIoKHRoaXMucG9zICs9IDQpIC0gNCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc2ZpeGVkMzJgIGZpZWxkLCBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIHNmaXhlZDMyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEludDMyKCh0aGlzLnBvcyArPSA0KSAtIDQsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGZpeGVkNjRgIGZpZWxkLCBhbiB1bnNpZ25lZCwgZml4ZWQtbGVuZ3RoIDY0IGJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIGZpeGVkNjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyh0aGlzLnNmaXhlZDMyKCksIHRoaXMuc2ZpeGVkMzIoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgZml4ZWQ2NGAgZmllbGQsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggNjQtYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkNjQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKHRoaXMuc2ZpeGVkMzIoKSwgdGhpcy5zZml4ZWQzMigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBmbG9hdGAgZmllbGQsIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZmxvYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQzMigodGhpcy5wb3MgKz0gNCkgLSA0LCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBkb3VibGVgIGZpZWxkLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEZsb2F0NjQoKHRoaXMucG9zICs9IDgpIC0gOCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgYnl0ZXNgIGZpZWxkLCBsZW5ndGgtZGVsaW1pdGVkIGFyYml0cmFyeSBkYXRhLlxuICAgICAqL1xuICAgIGJ5dGVzKCkge1xuICAgICAgICBsZXQgbGVuID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc3RyaW5nYCBmaWVsZCwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dERlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMoKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuaW1wb3J0IHsgdmFyaW50MzJ3cml0ZSwgdmFyaW50NjR3cml0ZSB9IGZyb20gXCIuL2dvb2ctdmFyaW50XCI7XG5pbXBvcnQgeyBhc3NlcnRGbG9hdDMyLCBhc3NlcnRJbnQzMiwgYXNzZXJ0VUludDMyIH0gZnJvbSBcIi4vYXNzZXJ0XCI7XG5jb25zdCBkZWZhdWx0c1dyaXRlID0ge1xuICAgIHdyaXRlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICB3cml0ZXJGYWN0b3J5OiAoKSA9PiBuZXcgQmluYXJ5V3JpdGVyKCksXG59O1xuLyoqXG4gKiBNYWtlIG9wdGlvbnMgZm9yIHdyaXRpbmcgYmluYXJ5IGRhdGEgZm9ybSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlXcml0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1dyaXRlKSwgb3B0aW9ucykgOiBkZWZhdWx0c1dyaXRlO1xufVxuZXhwb3J0IGNsYXNzIEJpbmFyeVdyaXRlciB7XG4gICAgY29uc3RydWN0b3IodGV4dEVuY29kZXIpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByZXZpb3VzIGZvcmsgc3RhdGVzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zdGFjayA9IFtdO1xuICAgICAgICB0aGlzLnRleHRFbmNvZGVyID0gdGV4dEVuY29kZXIgIT09IG51bGwgJiYgdGV4dEVuY29kZXIgIT09IHZvaWQgMCA/IHRleHRFbmNvZGVyIDogbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuYnVmID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbGwgYnl0ZXMgd3JpdHRlbiBhbmQgcmVzZXQgdGhpcyB3cml0ZXIuXG4gICAgICovXG4gICAgZmluaXNoKCkge1xuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBVaW50OEFycmF5KHRoaXMuYnVmKSk7IC8vIGZsdXNoIHRoZSBidWZmZXJcbiAgICAgICAgbGV0IGxlbiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaHVua3MubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBsZW4gKz0gdGhpcy5jaHVua3NbaV0ubGVuZ3RoO1xuICAgICAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNodW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYnl0ZXMuc2V0KHRoaXMuY2h1bmtzW2ldLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHRoaXMuY2h1bmtzW2ldLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGEgbmV3IGZvcmsgZm9yIGxlbmd0aC1kZWxpbWl0ZWQgZGF0YSBsaWtlIGEgbWVzc2FnZVxuICAgICAqIG9yIGEgcGFja2VkIHJlcGVhdGVkIGZpZWxkLlxuICAgICAqXG4gICAgICogTXVzdCBiZSBqb2luZWQgbGF0ZXIgd2l0aCBgam9pbigpYC5cbiAgICAgKi9cbiAgICBmb3JrKCkge1xuICAgICAgICB0aGlzLnN0YWNrLnB1c2goeyBjaHVua3M6IHRoaXMuY2h1bmtzLCBidWY6IHRoaXMuYnVmIH0pO1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmJ1ZiA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSm9pbiB0aGUgbGFzdCBmb3JrLiBXcml0ZSBpdHMgbGVuZ3RoIGFuZCBieXRlcywgdGhlblxuICAgICAqIHJldHVybiB0byB0aGUgcHJldmlvdXMgc3RhdGUuXG4gICAgICovXG4gICAgam9pbigpIHtcbiAgICAgICAgLy8gZ2V0IGNodW5rIG9mIGZvcmtcbiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5maW5pc2goKTtcbiAgICAgICAgLy8gcmVzdG9yZSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICBsZXQgcHJldiA9IHRoaXMuc3RhY2sucG9wKCk7XG4gICAgICAgIGlmICghcHJldilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSwgZm9yayBzdGFjayBlbXB0eScpO1xuICAgICAgICB0aGlzLmNodW5rcyA9IHByZXYuY2h1bmtzO1xuICAgICAgICB0aGlzLmJ1ZiA9IHByZXYuYnVmO1xuICAgICAgICAvLyB3cml0ZSBsZW5ndGggb2YgY2h1bmsgYXMgdmFyaW50XG4gICAgICAgIHRoaXMudWludDMyKGNodW5rLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSB0YWcgKGZpZWxkIG51bWJlciBhbmQgd2lyZSB0eXBlKS5cbiAgICAgKlxuICAgICAqIEVxdWl2YWxlbnQgdG8gYHVpbnQzMiggKGZpZWxkTm8gPDwgMyB8IHR5cGUpID4+PiAwIClgLlxuICAgICAqXG4gICAgICogR2VuZXJhdGVkIGNvZGUgc2hvdWxkIGNvbXB1dGUgdGhlIHRhZyBhaGVhZCBvZiB0aW1lIGFuZCBjYWxsIGB1aW50MzIoKWAuXG4gICAgICovXG4gICAgdGFnKGZpZWxkTm8sIHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWludDMyKChmaWVsZE5vIDw8IDMgfCB0eXBlKSA+Pj4gMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgY2h1bmsgb2YgcmF3IGJ5dGVzLlxuICAgICAqL1xuICAgIHJhdyhjaHVuaykge1xuICAgICAgICBpZiAodGhpcy5idWYubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNodW5rcy5wdXNoKG5ldyBVaW50OEFycmF5KHRoaXMuYnVmKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgdWludDMyYCB2YWx1ZSwgYW4gdW5zaWduZWQgMzIgYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50MzIodmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0VUludDMyKHZhbHVlKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWUgYXMgdmFyaW50IDMyLCBpbmxpbmVkIGZvciBzcGVlZFxuICAgICAgICB3aGlsZSAodmFsdWUgPiAweDdmKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+PiA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgaW50MzJgIHZhbHVlLCBhIHNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAqL1xuICAgIGludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgdmFyaW50MzJ3cml0ZSh2YWx1ZSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgYm9vbGAgdmFsdWUsIGEgdmFyaWFudC5cbiAgICAgKi9cbiAgICBib29sKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYnVmLnB1c2godmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBieXRlc2AgdmFsdWUsIGxlbmd0aC1kZWxpbWl0ZWQgYXJiaXRyYXJ5IGRhdGEuXG4gICAgICovXG4gICAgYnl0ZXModmFsdWUpIHtcbiAgICAgICAgdGhpcy51aW50MzIodmFsdWUuYnl0ZUxlbmd0aCk7IC8vIHdyaXRlIGxlbmd0aCBvZiBjaHVuayBhcyB2YXJpbnRcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc3RyaW5nYCB2YWx1ZSwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLnRleHRFbmNvZGVyLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMudWludDMyKGNodW5rLmJ5dGVMZW5ndGgpOyAvLyB3cml0ZSBsZW5ndGggb2YgY2h1bmsgYXMgdmFyaW50XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGZsb2F0YCB2YWx1ZSwgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICAgKi9cbiAgICBmbG9hdCh2YWx1ZSkge1xuICAgICAgICBhc3NlcnRGbG9hdDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEZsb2F0MzIoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBkb3VibGVgIHZhbHVlLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoY2h1bmsuYnVmZmVyKS5zZXRGbG9hdDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZml4ZWQzMmAgdmFsdWUsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQzMih2YWx1ZSkge1xuICAgICAgICBhc3NlcnRVSW50MzIodmFsdWUpO1xuICAgICAgICBsZXQgY2h1bmsgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcikuc2V0VWludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ZpeGVkMzJgIHZhbHVlLCBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIHNmaXhlZDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ludDMyYCB2YWx1ZSwgYSBzaWduZWQsIHppZ3phZy1lbmNvZGVkIDMyLWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgLy8gemlnemFnIGVuY29kZVxuICAgICAgICB2YWx1ZSA9ICgodmFsdWUgPDwgMSkgXiAodmFsdWUgPj4gMzEpKSA+Pj4gMDtcbiAgICAgICAgdmFyaW50MzJ3cml0ZSh2YWx1ZSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZml4ZWQ2NGAgdmFsdWUsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggNjQtYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkNjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gICAgICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcik7XG4gICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDAsIGxvbmcubG8sIHRydWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDQsIGxvbmcuaGksIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBmaXhlZDY0YCB2YWx1ZSwgYW4gdW5zaWduZWQsIGZpeGVkLWxlbmd0aCA2NCBiaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBmaXhlZDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBsZXQgdmlldyA9IG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpO1xuICAgICAgICBsZXQgbG9uZyA9IFBiVUxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoMCwgbG9uZy5sbywgdHJ1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoNCwgbG9uZy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGludDY0YCB2YWx1ZSwgYSBzaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQ2NCh2YWx1ZSkge1xuICAgICAgICBsZXQgbG9uZyA9IFBiTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgdmFyaW50NjR3cml0ZShsb25nLmxvLCBsb25nLmhpLCB0aGlzLmJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBzaW50NjRgIHZhbHVlLCBhIHNpZ25lZCwgemlnLXphZy1lbmNvZGVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpLCBcbiAgICAgICAgLy8gemlnemFnIGVuY29kZVxuICAgICAgICBzaWduID0gbG9uZy5oaSA+PiAzMSwgbG8gPSAobG9uZy5sbyA8PCAxKSBeIHNpZ24sIGhpID0gKChsb25nLmhpIDw8IDEpIHwgKGxvbmcubG8gPj4+IDMxKSkgXiBzaWduO1xuICAgICAgICB2YXJpbnQ2NHdyaXRlKGxvLCBoaSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgdWludDY0YCB2YWx1ZSwgYW4gdW5zaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICB1aW50NjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGxvbmcgPSBQYlVMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2YXJpbnQ2NHdyaXRlKGxvbmcubG8sIGxvbmcuaGksIHRoaXMuYnVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4vLyBtZXQ6XG4vL1xuLy8gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuLy8gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyXG4vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4vLyBkaXN0cmlidXRpb24uXG4vLyAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbi8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuLy9cbi8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbi8vIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbi8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbi8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbi8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbi8vXG4vLyBDb2RlIGdlbmVyYXRlZCBieSB0aGUgUHJvdG9jb2wgQnVmZmVyIGNvbXBpbGVyIGlzIG93bmVkIGJ5IHRoZSBvd25lclxuLy8gb2YgdGhlIGlucHV0IGZpbGUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgaXQuICBUaGlzIGNvZGUgaXMgbm90XG4vLyBzdGFuZGFsb25lIGFuZCByZXF1aXJlcyBhIHN1cHBvcnQgbGlicmFyeSB0byBiZSBsaW5rZWQgd2l0aCBpdC4gIFRoaXNcbi8vIHN1cHBvcnQgbGlicmFyeSBpcyBpdHNlbGYgY292ZXJlZCBieSB0aGUgYWJvdmUgbGljZW5zZS5cbi8qKlxuICogUmVhZCBhIDY0IGJpdCB2YXJpbnQgYXMgdHdvIEpTIG51bWJlcnMuXG4gKlxuICogUmV0dXJucyB0dXBsZTpcbiAqIFswXTogbG93IGJpdHNcbiAqIFswXTogaGlnaCBiaXRzXG4gKlxuICogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi84YTcxOTI3ZDc0YTRjZTM0ZWZlMmQ4NzY5ZmRhMTk4ZjUyZDIwZDEyL2pzL2V4cGVyaW1lbnRhbC9ydW50aW1lL2tlcm5lbC9idWZmZXJfZGVjb2Rlci5qcyNMMTc1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpbnQ2NHJlYWQoKSB7XG4gICAgbGV0IGxvd0JpdHMgPSAwO1xuICAgIGxldCBoaWdoQml0cyA9IDA7XG4gICAgZm9yIChsZXQgc2hpZnQgPSAwOyBzaGlmdCA8IDI4OyBzaGlmdCArPSA3KSB7XG4gICAgICAgIGxldCBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgICAgIGxvd0JpdHMgfD0gKGIgJiAweDdGKSA8PCBzaGlmdDtcbiAgICAgICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgICAgIHJldHVybiBbbG93Qml0cywgaGlnaEJpdHNdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBtaWRkbGVCeXRlID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgLy8gbGFzdCBmb3VyIGJpdHMgb2YgdGhlIGZpcnN0IDMyIGJpdCBudW1iZXJcbiAgICBsb3dCaXRzIHw9IChtaWRkbGVCeXRlICYgMHgwRikgPDwgMjg7XG4gICAgLy8gMyB1cHBlciBiaXRzIGFyZSBwYXJ0IG9mIHRoZSBuZXh0IDMyIGJpdCBudW1iZXJcbiAgICBoaWdoQml0cyA9IChtaWRkbGVCeXRlICYgMHg3MCkgPj4gNDtcbiAgICBpZiAoKG1pZGRsZUJ5dGUgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiBbbG93Qml0cywgaGlnaEJpdHNdO1xuICAgIH1cbiAgICBmb3IgKGxldCBzaGlmdCA9IDM7IHNoaWZ0IDw9IDMxOyBzaGlmdCArPSA3KSB7XG4gICAgICAgIGxldCBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgICAgIGhpZ2hCaXRzIHw9IChiICYgMHg3RikgPDwgc2hpZnQ7XG4gICAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgICAgICByZXR1cm4gW2xvd0JpdHMsIGhpZ2hCaXRzXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFyaW50Jyk7XG59XG4vKipcbiAqIFdyaXRlIGEgNjQgYml0IHZhcmludCwgZ2l2ZW4gYXMgdHdvIEpTIG51bWJlcnMsIHRvIHRoZSBnaXZlbiBieXRlcyBhcnJheS5cbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iLzhhNzE5MjdkNzRhNGNlMzRlZmUyZDg3NjlmZGExOThmNTJkMjBkMTIvanMvZXhwZXJpbWVudGFsL3J1bnRpbWUva2VybmVsL3dyaXRlci5qcyNMMzQ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpbnQ2NHdyaXRlKGxvLCBoaSwgYnl0ZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI4OyBpID0gaSArIDcpIHtcbiAgICAgICAgY29uc3Qgc2hpZnQgPSBsbyA+Pj4gaTtcbiAgICAgICAgY29uc3QgaGFzTmV4dCA9ICEoKHNoaWZ0ID4+PiA3KSA9PSAwICYmIGhpID09IDApO1xuICAgICAgICBjb25zdCBieXRlID0gKGhhc05leHQgPyBzaGlmdCB8IDB4ODAgOiBzaGlmdCkgJiAweEZGO1xuICAgICAgICBieXRlcy5wdXNoKGJ5dGUpO1xuICAgICAgICBpZiAoIWhhc05leHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzcGxpdEJpdHMgPSAoKGxvID4+PiAyOCkgJiAweDBGKSB8ICgoaGkgJiAweDA3KSA8PCA0KTtcbiAgICBjb25zdCBoYXNNb3JlQml0cyA9ICEoKGhpID4+IDMpID09IDApO1xuICAgIGJ5dGVzLnB1c2goKGhhc01vcmVCaXRzID8gc3BsaXRCaXRzIHwgMHg4MCA6IHNwbGl0Qml0cykgJiAweEZGKTtcbiAgICBpZiAoIWhhc01vcmVCaXRzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCAzMTsgaSA9IGkgKyA3KSB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gaGkgPj4+IGk7XG4gICAgICAgIGNvbnN0IGhhc05leHQgPSAhKChzaGlmdCA+Pj4gNykgPT0gMCk7XG4gICAgICAgIGNvbnN0IGJ5dGUgPSAoaGFzTmV4dCA/IHNoaWZ0IHwgMHg4MCA6IHNoaWZ0KSAmIDB4RkY7XG4gICAgICAgIGJ5dGVzLnB1c2goYnl0ZSk7XG4gICAgICAgIGlmICghaGFzTmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJ5dGVzLnB1c2goKGhpID4+PiAzMSkgJiAweDAxKTtcbn1cbi8vIGNvbnN0YW50cyBmb3IgYmluYXJ5IG1hdGhcbmNvbnN0IFRXT19QV1JfMzJfREJMID0gKDEgPDwgMTYpICogKDEgPDwgMTYpO1xuLyoqXG4gKiBQYXJzZSBkZWNpbWFsIHN0cmluZyBvZiA2NCBiaXQgaW50ZWdlciB2YWx1ZSBhcyB0d28gSlMgbnVtYmVycy5cbiAqXG4gKiBSZXR1cm5zIHR1cGxlOlxuICogWzBdOiBtaW51cyBzaWduP1xuICogWzFdOiBsb3cgYml0c1xuICogWzJdOiBoaWdoIGJpdHNcbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50NjRmcm9tU3RyaW5nKGRlYykge1xuICAgIC8vIENoZWNrIGZvciBtaW51cyBzaWduLlxuICAgIGxldCBtaW51cyA9IGRlY1swXSA9PSAnLSc7XG4gICAgaWYgKG1pbnVzKVxuICAgICAgICBkZWMgPSBkZWMuc2xpY2UoMSk7XG4gICAgLy8gV29yayA2IGRlY2ltYWwgZGlnaXRzIGF0IGEgdGltZSwgYWN0aW5nIGxpa2Ugd2UncmUgY29udmVydGluZyBiYXNlIDFlNlxuICAgIC8vIGRpZ2l0cyB0byBiaW5hcnkuIFRoaXMgaXMgc2FmZSB0byBkbyB3aXRoIGZsb2F0aW5nIHBvaW50IG1hdGggYmVjYXVzZVxuICAgIC8vIE51bWJlci5pc1NhZmVJbnRlZ2VyKEFMTF8zMl9CSVRTICogMWU2KSA9PSB0cnVlLlxuICAgIGNvbnN0IGJhc2UgPSAxZTY7XG4gICAgbGV0IGxvd0JpdHMgPSAwO1xuICAgIGxldCBoaWdoQml0cyA9IDA7XG4gICAgZnVuY3Rpb24gYWRkMWU2ZGlnaXQoYmVnaW4sIGVuZCkge1xuICAgICAgICAvLyBOb3RlOiBOdW1iZXIoJycpIGlzIDAuXG4gICAgICAgIGNvbnN0IGRpZ2l0MWU2ID0gTnVtYmVyKGRlYy5zbGljZShiZWdpbiwgZW5kKSk7XG4gICAgICAgIGhpZ2hCaXRzICo9IGJhc2U7XG4gICAgICAgIGxvd0JpdHMgPSBsb3dCaXRzICogYmFzZSArIGRpZ2l0MWU2O1xuICAgICAgICAvLyBDYXJyeSBiaXRzIGZyb20gbG93Qml0cyB0byBoaWdoQml0c1xuICAgICAgICBpZiAobG93Qml0cyA+PSBUV09fUFdSXzMyX0RCTCkge1xuICAgICAgICAgICAgaGlnaEJpdHMgPSBoaWdoQml0cyArICgobG93Qml0cyAvIFRXT19QV1JfMzJfREJMKSB8IDApO1xuICAgICAgICAgICAgbG93Qml0cyA9IGxvd0JpdHMgJSBUV09fUFdSXzMyX0RCTDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQxZTZkaWdpdCgtMjQsIC0xOCk7XG4gICAgYWRkMWU2ZGlnaXQoLTE4LCAtMTIpO1xuICAgIGFkZDFlNmRpZ2l0KC0xMiwgLTYpO1xuICAgIGFkZDFlNmRpZ2l0KC02KTtcbiAgICByZXR1cm4gW21pbnVzLCBsb3dCaXRzLCBoaWdoQml0c107XG59XG4vKipcbiAqIEZvcm1hdCA2NCBiaXQgaW50ZWdlciB2YWx1ZSAoYXMgdHdvIEpTIG51bWJlcnMpIHRvIGRlY2ltYWwgc3RyaW5nLlxuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnQ2NHRvU3RyaW5nKGJpdHNMb3csIGJpdHNIaWdoKSB7XG4gICAgLy8gU2tpcCB0aGUgZXhwZW5zaXZlIGNvbnZlcnNpb24gaWYgdGhlIG51bWJlciBpcyBzbWFsbCBlbm91Z2ggdG8gdXNlIHRoZVxuICAgIC8vIGJ1aWx0LWluIGNvbnZlcnNpb25zLlxuICAgIGlmICgoYml0c0hpZ2ggPj4+IDApIDw9IDB4MUZGRkZGKSB7XG4gICAgICAgIHJldHVybiAnJyArIChUV09fUFdSXzMyX0RCTCAqIGJpdHNIaWdoICsgKGJpdHNMb3cgPj4+IDApKTtcbiAgICB9XG4gICAgLy8gV2hhdCB0aGlzIGNvZGUgaXMgZG9pbmcgaXMgZXNzZW50aWFsbHkgY29udmVydGluZyB0aGUgaW5wdXQgbnVtYmVyIGZyb21cbiAgICAvLyBiYXNlLTIgdG8gYmFzZS0xZTcsIHdoaWNoIGFsbG93cyB1cyB0byByZXByZXNlbnQgdGhlIDY0LWJpdCByYW5nZSB3aXRoXG4gICAgLy8gb25seSAzICh2ZXJ5IGxhcmdlKSBkaWdpdHMuIFRob3NlIGRpZ2l0cyBhcmUgdGhlbiB0cml2aWFsIHRvIGNvbnZlcnQgdG9cbiAgICAvLyBhIGJhc2UtMTAgc3RyaW5nLlxuICAgIC8vIFRoZSBtYWdpYyBudW1iZXJzIHVzZWQgaGVyZSBhcmUgLVxuICAgIC8vIDJeMjQgPSAxNjc3NzIxNiA9ICgxLDY3NzcyMTYpIGluIGJhc2UtMWU3LlxuICAgIC8vIDJeNDggPSAyODE0NzQ5NzY3MTA2NTYgPSAoMiw4MTQ3NDk3LDY3MTA2NTYpIGluIGJhc2UtMWU3LlxuICAgIC8vIFNwbGl0IDMyOjMyIHJlcHJlc2VudGF0aW9uIGludG8gMTY6MjQ6MjQgcmVwcmVzZW50YXRpb24gc28gb3VyXG4gICAgLy8gaW50ZXJtZWRpYXRlIGRpZ2l0cyBkb24ndCBvdmVyZmxvdy5cbiAgICBsZXQgbG93ID0gYml0c0xvdyAmIDB4RkZGRkZGO1xuICAgIGxldCBtaWQgPSAoKChiaXRzTG93ID4+PiAyNCkgfCAoYml0c0hpZ2ggPDwgOCkpID4+PiAwKSAmIDB4RkZGRkZGO1xuICAgIGxldCBoaWdoID0gKGJpdHNIaWdoID4+IDE2KSAmIDB4RkZGRjtcbiAgICAvLyBBc3NlbWJsZSBvdXIgdGhyZWUgYmFzZS0xZTcgZGlnaXRzLCBpZ25vcmluZyBjYXJyaWVzLiBUaGUgbWF4aW11bVxuICAgIC8vIHZhbHVlIGluIGEgZGlnaXQgYXQgdGhpcyBzdGVwIGlzIHJlcHJlc2VudGFibGUgYXMgYSA0OC1iaXQgaW50ZWdlciwgd2hpY2hcbiAgICAvLyBjYW4gYmUgc3RvcmVkIGluIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICBsZXQgZGlnaXRBID0gbG93ICsgKG1pZCAqIDY3NzcyMTYpICsgKGhpZ2ggKiA2NzEwNjU2KTtcbiAgICBsZXQgZGlnaXRCID0gbWlkICsgKGhpZ2ggKiA4MTQ3NDk3KTtcbiAgICBsZXQgZGlnaXRDID0gKGhpZ2ggKiAyKTtcbiAgICAvLyBBcHBseSBjYXJyaWVzIGZyb20gQSB0byBCIGFuZCBmcm9tIEIgdG8gQy5cbiAgICBsZXQgYmFzZSA9IDEwMDAwMDAwO1xuICAgIGlmIChkaWdpdEEgPj0gYmFzZSkge1xuICAgICAgICBkaWdpdEIgKz0gTWF0aC5mbG9vcihkaWdpdEEgLyBiYXNlKTtcbiAgICAgICAgZGlnaXRBICU9IGJhc2U7XG4gICAgfVxuICAgIGlmIChkaWdpdEIgPj0gYmFzZSkge1xuICAgICAgICBkaWdpdEMgKz0gTWF0aC5mbG9vcihkaWdpdEIgLyBiYXNlKTtcbiAgICAgICAgZGlnaXRCICU9IGJhc2U7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgYmFzZS0xZTcgZGlnaXRzIHRvIGJhc2UtMTAsIHdpdGggb3B0aW9uYWwgbGVhZGluZyB6ZXJvZXMuXG4gICAgZnVuY3Rpb24gZGVjaW1hbEZyb20xZTcoZGlnaXQxZTcsIG5lZWRMZWFkaW5nWmVyb3MpIHtcbiAgICAgICAgbGV0IHBhcnRpYWwgPSBkaWdpdDFlNyA/IFN0cmluZyhkaWdpdDFlNykgOiAnJztcbiAgICAgICAgaWYgKG5lZWRMZWFkaW5nWmVyb3MpIHtcbiAgICAgICAgICAgIHJldHVybiAnMDAwMDAwMCcuc2xpY2UocGFydGlhbC5sZW5ndGgpICsgcGFydGlhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydGlhbDtcbiAgICB9XG4gICAgcmV0dXJuIGRlY2ltYWxGcm9tMWU3KGRpZ2l0QywgLypuZWVkTGVhZGluZ1plcm9zPSovIDApICtcbiAgICAgICAgZGVjaW1hbEZyb20xZTcoZGlnaXRCLCAvKm5lZWRMZWFkaW5nWmVyb3M9Ki8gZGlnaXRDKSArXG4gICAgICAgIC8vIElmIHRoZSBmaW5hbCAxZTcgZGlnaXQgZGlkbid0IG5lZWQgbGVhZGluZyB6ZXJvcywgd2Ugd291bGQgaGF2ZVxuICAgICAgICAvLyByZXR1cm5lZCB2aWEgdGhlIHRyaXZpYWwgY29kZSBwYXRoIGF0IHRoZSB0b3AuXG4gICAgICAgIGRlY2ltYWxGcm9tMWU3KGRpZ2l0QSwgLypuZWVkTGVhZGluZ1plcm9zPSovIDEpO1xufVxuLyoqXG4gKiBXcml0ZSBhIDMyIGJpdCB2YXJpbnQsIHNpZ25lZCBvciB1bnNpZ25lZC4gU2FtZSBhcyBgdmFyaW50NjR3cml0ZSgwLCB2YWx1ZSwgYnl0ZXMpYFxuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvMWIxODgzM2Y0ZjJhMmY2ODFmNGU0YTI1Y2RmM2IwYTQzMTE1ZWMyNi9qcy9iaW5hcnkvZW5jb2Rlci5qcyNMMTQ0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpbnQzMndyaXRlKHZhbHVlLCBieXRlcykge1xuICAgIGlmICh2YWx1ZSA+PSAwKSB7XG4gICAgICAgIC8vIHdyaXRlIHZhbHVlIGFzIHZhcmludCAzMlxuICAgICAgICB3aGlsZSAodmFsdWUgPiAweDdmKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKCh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+PiA3O1xuICAgICAgICB9XG4gICAgICAgIGJ5dGVzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA5OyBpKyspIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2godmFsdWUgJiAxMjcgfCAxMjgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA+PiA3O1xuICAgICAgICB9XG4gICAgICAgIGJ5dGVzLnB1c2goMSk7XG4gICAgfVxufVxuLyoqXG4gKiBSZWFkIGFuIHVuc2lnbmVkIDMyIGJpdCB2YXJpbnQuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi84YTcxOTI3ZDc0YTRjZTM0ZWZlMmQ4NzY5ZmRhMTk4ZjUyZDIwZDEyL2pzL2V4cGVyaW1lbnRhbC9ydW50aW1lL2tlcm5lbC9idWZmZXJfZGVjb2Rlci5qcyNMMjIwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpbnQzMnJlYWQoKSB7XG4gICAgbGV0IGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICBsZXQgcmVzdWx0ID0gYiAmIDB4N0Y7XG4gICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgcmVzdWx0IHw9IChiICYgMHg3RikgPDwgNztcbiAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICByZXN1bHQgfD0gKGIgJiAweDdGKSA8PCAxNDtcbiAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICByZXN1bHQgfD0gKGIgJiAweDdGKSA8PCAyMTtcbiAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIEV4dHJhY3Qgb25seSBsYXN0IDQgYml0c1xuICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICByZXN1bHQgfD0gKGIgJiAweDBGKSA8PCAyODtcbiAgICBmb3IgKGxldCByZWFkQnl0ZXMgPSA1OyAoKGIgJiAweDgwKSAhPT0gMCkgJiYgcmVhZEJ5dGVzIDwgMTA7IHJlYWRCeXRlcysrKVxuICAgICAgICBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgaWYgKChiICYgMHg4MCkgIT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhcmludCcpO1xuICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgLy8gUmVzdWx0IGNhbiBoYXZlIDMyIGJpdHMsIGNvbnZlcnQgaXQgdG8gdW5zaWduZWRcbiAgICByZXR1cm4gcmVzdWx0ID4+PiAwO1xufVxuIiwiY29uc3QgZGVmYXVsdHNXcml0ZSA9IHtcbiAgICBlbWl0RGVmYXVsdFZhbHVlczogZmFsc2UsXG4gICAgZW51bUFzSW50ZWdlcjogZmFsc2UsXG4gICAgdXNlUHJvdG9GaWVsZE5hbWU6IGZhbHNlLFxuICAgIHByZXR0eVNwYWNlczogMCxcbn0sIGRlZmF1bHRzUmVhZCA9IHtcbiAgICBpZ25vcmVVbmtub3duRmllbGRzOiBmYWxzZSxcbn07XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3IgcmVhZGluZyBKU09OIGRhdGEgZnJvbSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uUmVhZE9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1JlYWQpLCBvcHRpb25zKSA6IGRlZmF1bHRzUmVhZDtcbn1cbi8qKlxuICogTWFrZSBvcHRpb25zIGZvciB3cml0aW5nIEpTT04gZGF0YSBmcm9tIHBhcnRpYWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25Xcml0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1dyaXRlKSwgb3B0aW9ucykgOiBkZWZhdWx0c1dyaXRlO1xufVxuLyoqXG4gKiBNZXJnZXMgSlNPTiB3cml0ZSBvciByZWFkIG9wdGlvbnMuIExhdGVyIHZhbHVlcyBvdmVycmlkZSBlYXJsaWVyIHZhbHVlcy4gVHlwZSByZWdpc3RyaWVzIGFyZSBtZXJnZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUpzb25PcHRpb25zKGEsIGIpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBjID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhKSwgYik7XG4gICAgYy50eXBlUmVnaXN0cnkgPSBbLi4uKChfYSA9IGEgPT09IG51bGwgfHwgYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogYS50eXBlUmVnaXN0cnkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKSwgLi4uKChfYiA9IGIgPT09IG51bGwgfHwgYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogYi50eXBlUmVnaXN0cnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdKV07XG4gICAgcmV0dXJuIGM7XG59XG4iLCIvKipcbiAqIEdldCB0aGUgdHlwZSBvZiBhIEpTT04gdmFsdWUuXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYXJyYXksIG51bGwgYW5kIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVvZkpzb25WYWx1ZSh2YWx1ZSkge1xuICAgIGxldCB0ID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh0ID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICAgICAgcmV0dXJuIFwiYXJyYXlcIjtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgIH1cbiAgICByZXR1cm4gdDtcbn1cbi8qKlxuICogSXMgdGhpcyBhIEpTT04gb2JqZWN0IChpbnN0ZWFkIG9mIGFuIGFycmF5IG9yIG51bGwpP1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNKc29uT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiIsIi8qKlxuICogQ29udmVydHMgc25ha2VfY2FzZSB0byBsb3dlckNhbWVsQ2FzZS5cbiAqXG4gKiBTaG91bGQgYmVoYXZlIGxpa2UgcHJvdG9jOlxuICogaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iL2U4YWUxMzdjOTY0NDRlYTMxMzQ4NWVkMTExOGM1ZTQzYjIwOTljZjEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYyNMMTE4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb3dlckNhbWVsQ2FzZShzbmFrZUNhc2UpIHtcbiAgICBsZXQgY2FwTmV4dCA9IGZhbHNlO1xuICAgIGNvbnN0IHNiID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbmFrZUNhc2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IG5leHQgPSBzbmFrZUNhc2UuY2hhckF0KGkpO1xuICAgICAgICBpZiAobmV4dCA9PSAnXycpIHtcbiAgICAgICAgICAgIGNhcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9cXGQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dCk7XG4gICAgICAgICAgICBjYXBOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjYXBOZXh0KSB7XG4gICAgICAgICAgICBzYi5wdXNoKG5leHQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICBjYXBOZXh0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzYi5wdXNoKG5leHQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzYi5wdXNoKG5leHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzYi5qb2luKCcnKTtcbn1cbiIsIi8qKlxuICogVGhlIHN5bWJvbCB1c2VkIGFzIGEga2V5IG9uIG1lc3NhZ2Ugb2JqZWN0cyB0byBzdG9yZSB0aGUgbWVzc2FnZSB0eXBlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIC0gaXQgaXMgaGVyZSB0byBzdGF5LCBidXRcbiAqIGltcGxlbWVudGF0aW9uIGRldGFpbHMgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJwcm90b2J1Zi10cy9tZXNzYWdlLXR5cGVcIik7XG4iLCJpbXBvcnQgeyBNRVNTQUdFX1RZUEUgfSBmcm9tIFwiLi9tZXNzYWdlLXR5cGUtY29udHJhY3RcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZpZWxkSW5mbyB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvblR5cGVDaGVjayB9IGZyb20gXCIuL3JlZmxlY3Rpb24tdHlwZS1jaGVja1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbkpzb25SZWFkZXIgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWpzb24tcmVhZGVyXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uSnNvbldyaXRlciB9IGZyb20gXCIuL3JlZmxlY3Rpb24tanNvbi13cml0ZXJcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb25CaW5hcnlSZWFkZXIgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWJpbmFyeS1yZWFkZXJcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb25CaW5hcnlXcml0ZXIgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWJpbmFyeS13cml0ZXJcIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25DcmVhdGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWNyZWF0ZVwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tbWVyZ2UtcGFydGlhbFwiO1xuaW1wb3J0IHsgdHlwZW9mSnNvblZhbHVlIH0gZnJvbSBcIi4vanNvbi10eXBpbmdzXCI7XG5pbXBvcnQgeyBqc29uUmVhZE9wdGlvbnMsIGpzb25Xcml0ZU9wdGlvbnMsIH0gZnJvbSBcIi4vanNvbi1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25FcXVhbHMgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWVxdWFsc1wiO1xuaW1wb3J0IHsgYmluYXJ5V3JpdGVPcHRpb25zIH0gZnJvbSBcIi4vYmluYXJ5LXdyaXRlclwiO1xuaW1wb3J0IHsgYmluYXJ5UmVhZE9wdGlvbnMgfSBmcm9tIFwiLi9iaW5hcnktcmVhZGVyXCI7XG5jb25zdCBiYXNlRGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3QuZ2V0UHJvdG90eXBlT2Yoe30pKTtcbi8qKlxuICogVGhpcyBzdGFuZGFyZCBtZXNzYWdlIHR5cGUgcHJvdmlkZXMgcmVmbGVjdGlvbi1iYXNlZFxuICogb3BlcmF0aW9ucyB0byB3b3JrIHdpdGggYSBtZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGZpZWxkcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlZmF1bHRDaGVja0RlcHRoID0gMTY7XG4gICAgICAgIHRoaXMudHlwZU5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcy5tYXAobm9ybWFsaXplRmllbGRJbmZvKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgICAgIHRoaXMubWVzc2FnZVByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlRGVzY3JpcHRvcnMpLCB7IFtNRVNTQUdFX1RZUEVdOiB7IHZhbHVlOiB0aGlzIH0gfSkpO1xuICAgICAgICB0aGlzLnJlZlR5cGVDaGVjayA9IG5ldyBSZWZsZWN0aW9uVHlwZUNoZWNrKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkpzb25SZWFkZXIgPSBuZXcgUmVmbGVjdGlvbkpzb25SZWFkZXIodGhpcyk7XG4gICAgICAgIHRoaXMucmVmSnNvbldyaXRlciA9IG5ldyBSZWZsZWN0aW9uSnNvbldyaXRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZCaW5SZWFkZXIgPSBuZXcgUmVmbGVjdGlvbkJpbmFyeVJlYWRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZCaW5Xcml0ZXIgPSBuZXcgUmVmbGVjdGlvbkJpbmFyeVdyaXRlcih0aGlzKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gcmVmbGVjdGlvbkNyZWF0ZSh0aGlzKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9uZSB0aGUgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFVua25vd24gZmllbGRzIGFyZSBkaXNjYXJkZWQuXG4gICAgICovXG4gICAgY2xvbmUobWVzc2FnZSkge1xuICAgICAgICBsZXQgY29weSA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgY29weSwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZSBoYXZlIHRoZSBzYW1lIGZpZWxkIHZhbHVlcy5cbiAgICAgKiBDaGVja3MgZm9yIGRlZXAgZXF1YWxpdHksIHRyYXZlcnNpbmcgcmVwZWF0ZWQgZmllbGRzLCBvbmVvZiBncm91cHMsIG1hcHNcbiAgICAgKiBhbmQgbWVzc2FnZXMgcmVjdXJzaXZlbHkuXG4gICAgICogV2lsbCBhbHNvIHJldHVybiB0cnVlIGlmIGJvdGggbWVzc2FnZXMgYXJlIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGVxdWFscyhhLCBiKSB7XG4gICAgICAgIHJldHVybiByZWZsZWN0aW9uRXF1YWxzKHRoaXMsIGEsIGIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgZ2l2ZW4gdmFsdWUgYXNzaWduYWJsZSB0byBvdXIgbWVzc2FnZSB0eXBlXG4gICAgICogYW5kIGNvbnRhaW5zIG5vIFtleGNlc3MgcHJvcGVydGllc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svaW50ZXJmYWNlcy5odG1sI2V4Y2Vzcy1wcm9wZXJ0eS1jaGVja3MpP1xuICAgICAqL1xuICAgIGlzKGFyZywgZGVwdGggPSB0aGlzLmRlZmF1bHRDaGVja0RlcHRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZlR5cGVDaGVjay5pcyhhcmcsIGRlcHRoLCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBnaXZlbiB2YWx1ZSBhc3NpZ25hYmxlIHRvIG91ciBtZXNzYWdlIHR5cGUsXG4gICAgICogcmVnYXJkbGVzcyBvZiBbZXhjZXNzIHByb3BlcnRpZXNdKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2ludGVyZmFjZXMuaHRtbCNleGNlc3MtcHJvcGVydHktY2hlY2tzKT9cbiAgICAgKi9cbiAgICBpc0Fzc2lnbmFibGUoYXJnLCBkZXB0aCA9IHRoaXMuZGVmYXVsdENoZWNrRGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmVHlwZUNoZWNrLmlzKGFyZywgZGVwdGgsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb3B5IHBhcnRpYWwgZGF0YSBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBtZXJnZVBhcnRpYWwodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCB0YXJnZXQsIHNvdXJjZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBtZXNzYWdlIGZyb20gYmluYXJ5IGZvcm1hdC5cbiAgICAgKi9cbiAgICBmcm9tQmluYXJ5KGRhdGEsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG9wdCA9IGJpbmFyeVJlYWRPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEJpbmFyeVJlYWQob3B0LnJlYWRlckZhY3RvcnkoZGF0YSksIGRhdGEuYnl0ZUxlbmd0aCwgb3B0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIG5ldyBtZXNzYWdlIGZyb20gYSBKU09OIHZhbHVlLlxuICAgICAqL1xuICAgIGZyb21Kc29uKGpzb24sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxKc29uUmVhZChqc29uLCBqc29uUmVhZE9wdGlvbnMob3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgbmV3IG1lc3NhZ2UgZnJvbSBhIEpTT04gc3RyaW5nLlxuICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgVC5mcm9tSnNvbihKU09OLnBhcnNlKGpzb24pKWAuXG4gICAgICovXG4gICAgZnJvbUpzb25TdHJpbmcoanNvbiwgb3B0aW9ucykge1xuICAgICAgICBsZXQgdmFsdWUgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tSnNvbih2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIHRoZSBtZXNzYWdlIHRvIGNhbm9uaWNhbCBKU09OIHZhbHVlLlxuICAgICAqL1xuICAgIHRvSnNvbihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIGpzb25Xcml0ZU9wdGlvbnMob3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRoZSBtZXNzYWdlIHRvIGNhbm9uaWNhbCBKU09OIHN0cmluZy5cbiAgICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYEpTT04uc3RyaW5naWZ5KFQudG9Kc29uKHQpKWBcbiAgICAgKi9cbiAgICB0b0pzb25TdHJpbmcobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudG9Kc29uKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmV0dHlTcGFjZXMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSB0aGUgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0LlxuICAgICAqL1xuICAgIHRvQmluYXJ5KG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG9wdCA9IGJpbmFyeVdyaXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCBvcHQud3JpdGVyRmFjdG9yeSgpLCBvcHQpLmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZC4gSWYgeW91IGp1c3Qgd2FudCB0byByZWFkIGEgbWVzc2FnZSBmcm9tXG4gICAgICogSlNPTiwgdXNlIGBmcm9tSnNvbigpYCBvciBgZnJvbUpzb25TdHJpbmcoKWAuXG4gICAgICpcbiAgICAgKiBSZWFkcyBKU09OIHZhbHVlIGFuZCBtZXJnZXMgdGhlIGZpZWxkcyBpbnRvIHRoZSB0YXJnZXRcbiAgICAgKiBhY2NvcmRpbmcgdG8gcHJvdG9idWYgcnVsZXMuIElmIHRoZSB0YXJnZXQgaXMgb21pdHRlZCxcbiAgICAgKiBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGZpcnN0LlxuICAgICAqL1xuICAgIGludGVybmFsSnNvblJlYWQoanNvbiwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGlmIChqc29uICE9PSBudWxsICYmIHR5cGVvZiBqc29uID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoanNvbikpIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgICAgIHRoaXMucmVmSnNvblJlYWRlci5yZWFkKGpzb24sIG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVzc2FnZSAke3RoaXMudHlwZU5hbWV9IGZyb20gSlNPTiAke3R5cGVvZkpzb25WYWx1ZShqc29uKX0uYCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kLiBJZiB5b3UganVzdCB3YW50IHRvIHdyaXRlIGEgbWVzc2FnZVxuICAgICAqIHRvIEpTT04sIHVzZSBgdG9Kc29uKClgIG9yIGB0b0pzb25TdHJpbmcoKS5cbiAgICAgKlxuICAgICAqIFdyaXRlcyBKU09OIHZhbHVlIGFuZCByZXR1cm5zIGl0LlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci53cml0ZShtZXNzYWdlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QuIElmIHlvdSBqdXN0IHdhbnQgdG8gd3JpdGUgYSBtZXNzYWdlXG4gICAgICogaW4gYmluYXJ5IGZvcm1hdCwgdXNlIGB0b0JpbmFyeSgpYC5cbiAgICAgKlxuICAgICAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgaW4gYmluYXJ5IGZvcm1hdCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZ2l2ZW5cbiAgICAgKiB3cml0ZXIuIFJldHVybnMgcGFzc2VkIHdyaXRlci5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnJlZkJpbldyaXRlci53cml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZC4gSWYgeW91IGp1c3Qgd2FudCB0byByZWFkIGEgbWVzc2FnZSBmcm9tXG4gICAgICogYmluYXJ5IGRhdGEsIHVzZSBgZnJvbUJpbmFyeSgpYC5cbiAgICAgKlxuICAgICAqIFJlYWRzIGRhdGEgZnJvbSBiaW5hcnkgZm9ybWF0IGFuZCBtZXJnZXMgdGhlIGZpZWxkcyBpbnRvXG4gICAgICogdGhlIHRhcmdldCBhY2NvcmRpbmcgdG8gcHJvdG9idWYgcnVsZXMuIElmIHRoZSB0YXJnZXQgaXNcbiAgICAgKiBvbWl0dGVkLCBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGZpcnN0LlxuICAgICAqL1xuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy5yZWZCaW5SZWFkZXIucmVhZChyZWFkZXIsIG1lc3NhZ2UsIG9wdGlvbnMsIGxlbmd0aCk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn1cbiIsIi8qKlxuICogSXMgdGhlIGdpdmVuIHZhbHVlIGEgdmFsaWQgb25lb2YgZ3JvdXA/XG4gKlxuICogV2UgcmVwcmVzZW50IHByb3RvYnVmIGBvbmVvZmAgYXMgYWxnZWJyYWljIGRhdGEgdHlwZXMgKEFEVCkgaW4gZ2VuZXJhdGVkXG4gKiBjb2RlLiBCdXQgd2hlbiB3b3JraW5nIHdpdGggbWVzc2FnZXMgb2YgdW5rbm93biB0eXBlLCB0aGUgQURUIGRvZXMgbm90XG4gKiBoZWxwIHVzLlxuICpcbiAqIFRoaXMgdHlwZSBndWFyZCBjaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBhZGhlcmVzIHRvIHRoZSBBRFQgcnVsZXMsIHdoaWNoXG4gKiBhcmUgYXMgZm9sbG93czpcbiAqXG4gKiAxKSBNdXN0IGJlIGFuIG9iamVjdC5cbiAqXG4gKiAyKSBNdXN0IGhhdmUgYSBcIm9uZW9mS2luZFwiIGRpc2NyaW1pbmF0b3IgcHJvcGVydHkuXG4gKlxuICogMykgSWYgXCJvbmVvZktpbmRcIiBpcyBgdW5kZWZpbmVkYCwgbm8gbWVtYmVyIGZpZWxkIGlzIHNlbGVjdGVkLiBUaGUgb2JqZWN0XG4gKiBtdXN0IG5vdCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0aWVzLlxuICpcbiAqIDQpIElmIFwib25lb2ZLaW5kXCIgaXMgYSBgc3RyaW5nYCwgdGhlIG1lbWJlciBmaWVsZCB3aXRoIHRoaXMgbmFtZSBpc1xuICogc2VsZWN0ZWQuXG4gKlxuICogNSkgSWYgYSBtZW1iZXIgZmllbGQgaXMgc2VsZWN0ZWQsIHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgc2Vjb25kIHByb3BlcnR5XG4gKiB3aXRoIHRoaXMgbmFtZS4gVGhlIHByb3BlcnR5IG11c3Qgbm90IGJlIGB1bmRlZmluZWRgLlxuICpcbiAqIDYpIE5vIGV4dHJhIHByb3BlcnRpZXMgYXJlIGFsbG93ZWQuIFRoZSBvYmplY3QgaGFzIGVpdGhlciBvbmUgcHJvcGVydHlcbiAqIChubyBzZWxlY3Rpb24pIG9yIHR3byBwcm9wZXJ0aWVzIChzZWxlY3Rpb24pLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT25lb2ZHcm91cChhbnkpIHtcbiAgICBpZiAodHlwZW9mIGFueSAhPSAnb2JqZWN0JyB8fCBhbnkgPT09IG51bGwgfHwgIWFueS5oYXNPd25Qcm9wZXJ0eSgnb25lb2ZLaW5kJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGVvZiBhbnkub25lb2ZLaW5kKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIGlmIChhbnlbYW55Lm9uZW9mS2luZF0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYW55KS5sZW5ndGggPT0gMjtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGFueSkubGVuZ3RoID09IDE7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gYSBvbmVvZiBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9uZW9mVmFsdWUob25lb2YsIGtpbmQpIHtcbiAgICByZXR1cm4gb25lb2Zba2luZF07XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0T25lb2ZWYWx1ZShvbmVvZiwga2luZCwgdmFsdWUpIHtcbiAgICBpZiAob25lb2Yub25lb2ZLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIG9uZW9mW29uZW9mLm9uZW9mS2luZF07XG4gICAgfVxuICAgIG9uZW9mLm9uZW9mS2luZCA9IGtpbmQ7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb25lb2Zba2luZF0gPSB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0VW5rbm93bk9uZW9mVmFsdWUob25lb2YsIGtpbmQsIHZhbHVlKSB7XG4gICAgaWYgKG9uZW9mLm9uZW9mS2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBvbmVvZltvbmVvZi5vbmVvZktpbmRdO1xuICAgIH1cbiAgICBvbmVvZi5vbmVvZktpbmQgPSBraW5kO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvbmVvZltraW5kXSA9IHZhbHVlO1xuICAgIH1cbn1cbi8qKlxuICogUmVtb3ZlcyB0aGUgc2VsZWN0ZWQgZmllbGQgaW4gYSBvbmVvZiBncm91cC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIHJlY29tbWVuZGVkIHdheSB0byBtb2RpZnkgYSBvbmVvZiBncm91cCBpcyB0byBzZXRcbiAqIGEgbmV3IG9iamVjdDpcbiAqXG4gKiBgYGB0c1xuICogbWVzc2FnZS5yZXN1bHQgPSB7IG9uZW9mS2luZDogdW5kZWZpbmVkIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT25lb2ZWYWx1ZShvbmVvZikge1xuICAgIGlmIChvbmVvZi5vbmVvZktpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgb25lb2Zbb25lb2Yub25lb2ZLaW5kXTtcbiAgICB9XG4gICAgb25lb2Yub25lb2ZLaW5kID0gdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gb25lb2YgZ3JvdXAuXG4gKlxuICogTm90IHRoYXQgdGhlIHJlY29tbWVuZGVkIHdheSB0byBhY2Nlc3MgYSBvbmVvZiBncm91cCBpcyB0byBjaGVja1xuICogdGhlIFwib25lb2ZLaW5kXCIgcHJvcGVydHkgYW5kIGxldCBUeXBlU2NyaXB0IG5hcnJvdyBkb3duIHRoZSB1bmlvblxuICogdHlwZSBmb3IgeW91OlxuICpcbiAqIGBgYHRzXG4gKiBpZiAobWVzc2FnZS5yZXN1bHQub25lb2ZLaW5kID09PSBcImVycm9yXCIpIHtcbiAqICAgbWVzc2FnZS5yZXN1bHQuZXJyb3I7IC8vIHN0cmluZ1xuICogfVxuICogYGBgXG4gKlxuICogSW4gdGhlIHJhcmUgY2FzZSB5b3UganVzdCBuZWVkIHRoZSB2YWx1ZSwgYW5kIGRvIG5vdCBjYXJlIGFib3V0XG4gKiB3aGljaCBwcm90b2J1ZiBmaWVsZCBpcyBzZWxlY3RlZCwgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvblxuICogZm9yIGNvbnZlbmllbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRPbmVvZlZhbHVlKG9uZW9mKSB7XG4gICAgaWYgKG9uZW9mLm9uZW9mS2luZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBvbmVvZltvbmVvZi5vbmVvZktpbmRdO1xufVxuIiwiaW1wb3J0IHsgaW50NjRmcm9tU3RyaW5nLCBpbnQ2NHRvU3RyaW5nIH0gZnJvbSBcIi4vZ29vZy12YXJpbnRcIjtcbmxldCBCSTtcbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RCaSgpIHtcbiAgICBjb25zdCBkdiA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoOCkpO1xuICAgIGNvbnN0IG9rID0gZ2xvYmFsVGhpcy5CaWdJbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiB0eXBlb2YgZHYuZ2V0QmlnSW50NjQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAmJiB0eXBlb2YgZHYuZ2V0QmlnVWludDY0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgJiYgdHlwZW9mIGR2LnNldEJpZ0ludDY0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgJiYgdHlwZW9mIGR2LnNldEJpZ1VpbnQ2NCA9PT0gXCJmdW5jdGlvblwiO1xuICAgIEJJID0gb2sgPyB7XG4gICAgICAgIE1JTjogQmlnSW50KFwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiksXG4gICAgICAgIE1BWDogQmlnSW50KFwiOTIyMzM3MjAzNjg1NDc3NTgwN1wiKSxcbiAgICAgICAgVU1JTjogQmlnSW50KFwiMFwiKSxcbiAgICAgICAgVU1BWDogQmlnSW50KFwiMTg0NDY3NDQwNzM3MDk1NTE2MTVcIiksXG4gICAgICAgIEM6IEJpZ0ludCxcbiAgICAgICAgVjogZHYsXG4gICAgfSA6IHVuZGVmaW5lZDtcbn1cbmRldGVjdEJpKCk7XG5mdW5jdGlvbiBhc3NlcnRCaShiaSkge1xuICAgIGlmICghYmkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJpZ0ludCB1bmF2YWlsYWJsZSwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vc3RhbW0vcHJvdG9idWYtdHMvYmxvYi92MS4wLjgvTUFOVUFMLm1kI2JpZ2ludC1zdXBwb3J0XCIpO1xufVxuLy8gdXNlZCB0byB2YWxpZGF0ZSBmcm9tKHN0cmluZykgaW5wdXQgKHdoZW4gYmlnaW50IGlzIHVuYXZhaWxhYmxlKVxuY29uc3QgUkVfREVDSU1BTF9TVFIgPSAvXi0/WzAtOV0rJC87XG4vLyBjb25zdGFudHMgZm9yIGJpbmFyeSBtYXRoXG5jb25zdCBUV09fUFdSXzMyX0RCTCA9IDB4MTAwMDAwMDAwO1xuY29uc3QgSEFMRl8yX1BXUl8zMiA9IDB4MDgwMDAwMDAwO1xuLy8gYmFzZSBjbGFzcyBmb3IgUGJMb25nIGFuZCBQYlVMb25nIHByb3ZpZGVzIHNoYXJlZCBjb2RlXG5jbGFzcyBTaGFyZWRQYkxvbmcge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBiaXRzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvLCBoaSkge1xuICAgICAgICB0aGlzLmxvID0gbG8gfCAwO1xuICAgICAgICB0aGlzLmhpID0gaGkgfCAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGlzIGluc3RhbmNlIGVxdWFsIHRvIDA/XG4gICAgICovXG4gICAgaXNaZXJvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbyA9PSAwICYmIHRoaXMuaGkgPT0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBhIG5hdGl2ZSBudW1iZXIuXG4gICAgICovXG4gICAgdG9OdW1iZXIoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmhpICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sbyA+Pj4gMCk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIocmVzdWx0KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBjb252ZXJ0IHRvIHNhZmUgbnVtYmVyXCIpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuICogNjQtYml0IHVuc2lnbmVkIGludGVnZXIgYXMgdHdvIDMyLWJpdCB2YWx1ZXMuXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIGBzdHJpbmdgLCBgbnVtYmVyYCBhbmQgYGJpZ2ludGAgcmVwcmVzZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGJVTG9uZyBleHRlbmRzIFNoYXJlZFBiTG9uZyB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gYSBgc3RyaW5nYCwgYG51bWJlcmAgb3IgYGJpZ2ludGAuXG4gICAgICovXG4gICAgc3RhdGljIGZyb20odmFsdWUpIHtcbiAgICAgICAgaWYgKEJJKVxuICAgICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEZhbGxUaHJvdWdoSW5Td2l0Y2hTdGF0ZW1lbnRKU1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJJLkModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCSS5DKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBCSS5VTUlOKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgdmFsdWUgZm9yIHVsb25nJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IEJJLlVNQVgpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vsb25nIHRvbyBsYXJnZScpO1xuICAgICAgICAgICAgICAgICAgICBCSS5WLnNldEJpZ1VpbnQ2NCgwLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyhCSS5WLmdldEludDMyKDAsIHRydWUpLCBCSS5WLmdldEludDMyKDQsIHRydWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVJFX0RFQ0lNQUxfU1RSLnRlc3QodmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgW21pbnVzLCBsbywgaGldID0gaW50NjRmcm9tU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbnVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgdmFsdWUgZm9yIHVsb25nJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyhsbywgaGkpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbnVtYmVyIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIHZhbHVlIGZvciB1bG9uZycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBiVUxvbmcodmFsdWUsIHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gdmFsdWUgJyArIHR5cGVvZiB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gZGVjaW1hbCBzdHJpbmcuXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBCSSA/IHRoaXMudG9CaWdJbnQoKS50b1N0cmluZygpIDogaW50NjR0b1N0cmluZyh0aGlzLmxvLCB0aGlzLmhpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBuYXRpdmUgYmlnaW50LlxuICAgICAqL1xuICAgIHRvQmlnSW50KCkge1xuICAgICAgICBhc3NlcnRCaShCSSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoMCwgdGhpcy5sbywgdHJ1ZSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoNCwgdGhpcy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBCSS5WLmdldEJpZ1VpbnQ2NCgwLCB0cnVlKTtcbiAgICB9XG59XG4vKipcbiAqIHVsb25nIDAgc2luZ2xldG9uLlxuICovXG5QYlVMb25nLlpFUk8gPSBuZXcgUGJVTG9uZygwLCAwKTtcbi8qKlxuICogNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFzIHR3byAzMi1iaXQgdmFsdWVzLlxuICogQ29udmVydHMgYmV0d2VlbiBgc3RyaW5nYCwgYG51bWJlcmAgYW5kIGBiaWdpbnRgIHJlcHJlc2VudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBiTG9uZyBleHRlbmRzIFNoYXJlZFBiTG9uZyB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gYSBgc3RyaW5nYCwgYG51bWJlcmAgb3IgYGJpZ2ludGAuXG4gICAgICovXG4gICAgc3RhdGljIGZyb20odmFsdWUpIHtcbiAgICAgICAgaWYgKEJJKVxuICAgICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEZhbGxUaHJvdWdoSW5Td2l0Y2hTdGF0ZW1lbnRKU1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJJLkModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCSS5DKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBCSS5NSU4pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBzbWFsbCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiBCSS5NQVgpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBsYXJnZScpO1xuICAgICAgICAgICAgICAgICAgICBCSS5WLnNldEJpZ0ludDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYkxvbmcoQkkuVi5nZXRJbnQzMigwLCB0cnVlKSwgQkkuVi5nZXRJbnQzMig0LCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFSRV9ERUNJTUFMX1NUUi50ZXN0KHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IFttaW51cywgbG8sIGhpXSA9IGludDY0ZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW51cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpID4gSEFMRl8yX1BXUl8zMiB8fCAoaGkgPT0gSEFMRl8yX1BXUl8zMiAmJiBsbyAhPSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBzbWFsbCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhpID49IEhBTEZfMl9QV1JfMzIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBsYXJnZScpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGJsID0gbmV3IFBiTG9uZyhsbywgaGkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWludXMgPyBwYmwubmVnYXRlKCkgOiBwYmw7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdudW1iZXIgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBQYkxvbmcodmFsdWUsIHZhbHVlIC8gVFdPX1BXUl8zMl9EQkwpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBQYkxvbmcoLXZhbHVlLCAtdmFsdWUgLyBUV09fUFdSXzMyX0RCTCkubmVnYXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biB2YWx1ZSAnICsgdHlwZW9mIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG8gd2UgaGF2ZSBhIG1pbnVzIHNpZ24/XG4gICAgICovXG4gICAgaXNOZWdhdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmhpICYgSEFMRl8yX1BXUl8zMikgIT09IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5lZ2F0ZSB0d28ncyBjb21wbGVtZW50LlxuICAgICAqIEludmVydCBhbGwgdGhlIGJpdHMgYW5kIGFkZCBvbmUgdG8gdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBuZWdhdGUoKSB7XG4gICAgICAgIGxldCBoaSA9IH50aGlzLmhpLCBsbyA9IHRoaXMubG87XG4gICAgICAgIGlmIChsbylcbiAgICAgICAgICAgIGxvID0gfmxvICsgMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaGkgKz0gMTtcbiAgICAgICAgcmV0dXJuIG5ldyBQYkxvbmcobG8sIGhpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBkZWNpbWFsIHN0cmluZy5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKEJJKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9CaWdJbnQoKS50b1N0cmluZygpO1xuICAgICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgIGxldCBuID0gdGhpcy5uZWdhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiAnLScgKyBpbnQ2NHRvU3RyaW5nKG4ubG8sIG4uaGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnQ2NHRvU3RyaW5nKHRoaXMubG8sIHRoaXMuaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIG5hdGl2ZSBiaWdpbnQuXG4gICAgICovXG4gICAgdG9CaWdJbnQoKSB7XG4gICAgICAgIGFzc2VydEJpKEJJKTtcbiAgICAgICAgQkkuVi5zZXRJbnQzMigwLCB0aGlzLmxvLCB0cnVlKTtcbiAgICAgICAgQkkuVi5zZXRJbnQzMig0LCB0aGlzLmhpLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIEJJLlYuZ2V0QmlnSW50NjQoMCwgdHJ1ZSk7XG4gICAgfVxufVxuLyoqXG4gKiBsb25nIDAgc2luZ2xldG9uLlxuICovXG5QYkxvbmcuWkVSTyA9IG5ldyBQYkxvbmcoMCwgMCk7XG4iLCJpbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyLCBXaXJlVHlwZSB9IGZyb20gXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IExvbmdUeXBlLCBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uTG9uZ0NvbnZlcnQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWxvbmctY29udmVydFwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvblNjYWxhckRlZmF1bHQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLXNjYWxhci1kZWZhdWx0XCI7XG4vKipcbiAqIFJlYWRzIHByb3RvMyBtZXNzYWdlcyBpbiBiaW5hcnkgZm9ybWF0IHVzaW5nIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgfVxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkTm9Ub0ZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNJbnB1dCA9IChfYSA9IHRoaXMuaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgdGhpcy5maWVsZE5vVG9GaWVsZCA9IG5ldyBNYXAoZmllbGRzSW5wdXQubWFwKGZpZWxkID0+IFtmaWVsZC5ubywgZmllbGRdKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBtZXNzYWdlIGZyb20gYmluYXJ5IGZvcm1hdCBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFJlcGVhdGVkIGZpZWxkcyBhcmUgYXBwZW5kZWQuIE1hcCBlbnRyaWVzIGFyZSBhZGRlZCwgb3ZlcndyaXRpbmdcbiAgICAgKiBleGlzdGluZyBrZXlzLlxuICAgICAqXG4gICAgICogSWYgYSBtZXNzYWdlIGZpZWxkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGVcbiAgICAgKiBuZXcgZGF0YS5cbiAgICAgKi9cbiAgICByZWFkKHJlYWRlciwgbWVzc2FnZSwgb3B0aW9ucywgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBjb25zdCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgLy8gcmVhZCB0aGUgdGFnIGFuZCBmaW5kIHRoZSBmaWVsZFxuICAgICAgICAgICAgY29uc3QgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKSwgZmllbGQgPSB0aGlzLmZpZWxkTm9Ub0ZpZWxkLmdldChmaWVsZE5vKTtcbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICBpZiAodSA9PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMuaW5mby50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLmluZm8udHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRhcmdldCBvYmplY3QgZm9yIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZ1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9IG1lc3NhZ2UsIHJlcGVhdGVkID0gZmllbGQucmVwZWF0LCBsb2NhbE5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgICAgICAvLyBpZiBmaWVsZCBpcyBtZW1iZXIgb2Ygb25lb2YgQURULCB1c2UgQURUIGFzIHRhcmdldFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgICAgICAvLyBpZiBvdGhlciBvbmVvZiBtZW1iZXIgc2VsZWN0ZWQsIHNldCBuZXcgQURUXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5vbmVvZktpbmQgIT09IGxvY2FsTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbWVzc2FnZVtmaWVsZC5vbmVvZl0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbmVvZktpbmQ6IGxvY2FsTmFtZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBoYW5kbGVkIG9uZW9mIGFib3ZlLCB3ZSBqdXN0IGhhdmUgcmVhZCB0aGUgdmFsdWUgaW50byBgdGFyZ2V0W2xvY2FsTmFtZV1gXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5raW5kID09IFwiZW51bVwiID8gU2NhbGFyVHlwZS5JTlQzMiA6IGZpZWxkLlQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBMID0gZmllbGQua2luZCA9PSBcInNjYWxhclwiID8gZmllbGQuTCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGFyZ2V0W2xvY2FsTmFtZV07IC8vIHNhZmUgdG8gYXNzdW1lIHByZXNlbmNlIG9mIGFycmF5LCBvbmVvZiBjYW5ub3QgY29udGFpbiByZXBlYXRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aXJlVHlwZSA9PSBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQgJiYgVCAhPSBTY2FsYXJUeXBlLlNUUklORyAmJiBUICE9IFNjYWxhclR5cGUuQllURVMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IHJlYWRlci51aW50MzIoKSArIHJlYWRlci5wb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLnNjYWxhcihyZWFkZXIsIFQsIEwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLnNjYWxhcihyZWFkZXIsIFQsIEwpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IHRoaXMuc2NhbGFyKHJlYWRlciwgVCwgTCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyciA9IHRhcmdldFtsb2NhbE5hbWVdOyAvLyBzYWZlIHRvIGFzc3VtZSBwcmVzZW5jZSBvZiBhcnJheSwgb25lb2YgY2Fubm90IGNvbnRhaW4gcmVwZWF0ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gZmllbGQuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChtc2cpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdID0gZmllbGQuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgdGFyZ2V0W2xvY2FsTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgIGxldCBbbWFwS2V5LCBtYXBWYWxdID0gdGhpcy5tYXBFbnRyeShmaWVsZCwgcmVhZGVyLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2FmZSB0byBhc3N1bWUgcHJlc2VuY2Ugb2YgbWFwIG9iamVjdCwgb25lb2YgY2Fubm90IGNvbnRhaW4gcmVwZWF0ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdW21hcEtleV0gPSBtYXBWYWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBtYXAgZmllbGQsIGV4cGVjdGluZyBrZXkgZmllbGQgPSAxLCB2YWx1ZSBmaWVsZCA9IDJcbiAgICAgKi9cbiAgICBtYXBFbnRyeShmaWVsZCwgcmVhZGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBsZW5ndGggPSByZWFkZXIudWludDMyKCk7XG4gICAgICAgIGxldCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICBsZXQga2V5ID0gdW5kZWZpbmVkOyAvLyBqYXZhc2NyaXB0IG9ubHkgYWxsb3dzIG51bWJlciBvciBzdHJpbmcgZm9yIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgIGxldCB2YWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MKVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcmVhZGVyLmJvb2woKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb25nIHR5cGVzIGFyZSByZWFkIGFzIHN0cmluZywgbnVtYmVyIHR5cGVzIGFyZSBva2F5IGFzIG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5zY2FsYXIocmVhZGVyLCBmaWVsZC5LLCBMb25nVHlwZS5TVFJJTkcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5zY2FsYXIocmVhZGVyLCBmaWVsZC5WLlQsIGZpZWxkLlYuTCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5WLlQoKS5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGluIG1hcCBlbnRyeSBmb3IgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGQubmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBrZXlSYXcgPSByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdChmaWVsZC5LKTtcbiAgICAgICAgICAgIGtleSA9IGZpZWxkLksgPT0gU2NhbGFyVHlwZS5CT09MID8ga2V5UmF3LnRvU3RyaW5nKCkgOiBrZXlSYXc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0KGZpZWxkLlYuVCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gZmllbGQuVi5UKCkuY3JlYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgdmFsXTtcbiAgICB9XG4gICAgc2NhbGFyKHJlYWRlciwgdHlwZSwgbG9uZ1R5cGUpIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuZG91YmxlKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLmludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChyZWFkZXIudWludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLmZpeGVkNjQoKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5maXhlZDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5ieXRlcygpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnVpbnQzMigpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc2ZpeGVkMzIoKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KHJlYWRlci5zZml4ZWQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc2ludDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLnNpbnQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBVbmtub3duRmllbGRIYW5kbGVyLCBXaXJlVHlwZSB9IGZyb20gXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IFJlcGVhdFR5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gXCIuL2Fzc2VydFwiO1xuaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuLyoqXG4gKiBXcml0ZXMgcHJvdG8zIG1lc3NhZ2VzIGluIGJpbmFyeSBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvZW5jb2RpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25CaW5hcnlXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzSW5wdXQgPSB0aGlzLmluZm8uZmllbGRzID8gdGhpcy5pbmZvLmZpZWxkcy5jb25jYXQoKSA6IFtdO1xuICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHNJbnB1dC5zb3J0KChhLCBiKSA9PiBhLm5vIC0gYi5ubyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQuXG4gICAgICovXG4gICAgd3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUsIC8vIHRoaXMgd2lsbCBiZSBvdXIgZmllbGQgdmFsdWUsIHdoZXRoZXIgaXQgaXMgbWVtYmVyIG9mIGEgb25lb2Ygb3Igbm90XG4gICAgICAgICAgICBlbWl0RGVmYXVsdCwgLy8gd2hldGhlciB3ZSBlbWl0IHRoZSBkZWZhdWx0IHZhbHVlIChvbmx5IHRydWUgZm9yIG9uZW9mIG1lbWJlcnMpXG4gICAgICAgICAgICByZXBlYXRlZCA9IGZpZWxkLnJlcGVhdCwgbG9jYWxOYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gaGFuZGxlIG9uZW9mIEFEVFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBtZXNzYWdlW2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kICE9PSBsb2NhbE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBpZiBmaWVsZCBpcyBub3Qgc2VsZWN0ZWQsIHNraXBcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdyb3VwW2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgZW1pdERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBtZXNzYWdlW2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgZW1pdERlZmF1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGhhdmUgaGFuZGxlZCBvbmVvZiBhYm92ZS4gd2UganVzdCBoYXZlIHRvIGhvbm9yIGBlbWl0RGVmYXVsdGAuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5raW5kID09IFwiZW51bVwiID8gU2NhbGFyVHlwZS5JTlQzMiA6IGZpZWxkLlQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCA9PSBSZXBlYXRUeXBlLlBBQ0tFRClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhY2tlZCh3cml0ZXIsIFQsIGZpZWxkLm5vLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIFQsIGZpZWxkLm5vLCBpdGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZpZWxkLm9wdCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NhbGFyKHdyaXRlciwgVCwgZmllbGQubm8sIHZhbHVlLCBlbWl0RGVmYXVsdCB8fCBmaWVsZC5vcHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlKHdyaXRlciwgb3B0aW9ucywgZmllbGQuVCgpLCBmaWVsZC5ubywgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5UKCksIGZpZWxkLm5vLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwRW50cnkod3JpdGVyLCBvcHRpb25zLCBmaWVsZCwga2V5LCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMuaW5mby50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICB9XG4gICAgbWFwRW50cnkod3JpdGVyLCBvcHRpb25zLCBmaWVsZCwga2V5LCB2YWx1ZSkge1xuICAgICAgICB3cml0ZXIudGFnKGZpZWxkLm5vLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpO1xuICAgICAgICB3cml0ZXIuZm9yaygpO1xuICAgICAgICAvLyBqYXZhc2NyaXB0IG9ubHkgYWxsb3dzIG51bWJlciBvciBzdHJpbmcgZm9yIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIHdlIGNvbnZlcnQgZnJvbSBvdXIgcmVwcmVzZW50YXRpb24gdG8gdGhlIHByb3RvYnVmIHR5cGVcbiAgICAgICAgbGV0IGtleVZhbHVlID0ga2V5O1xuICAgICAgICBzd2l0Y2ggKGZpZWxkLkspIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAga2V5VmFsdWUgPSBOdW1iZXIucGFyc2VJbnQoa2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGFzc2VydChrZXkgPT0gJ3RydWUnIHx8IGtleSA9PSAnZmFsc2UnKTtcbiAgICAgICAgICAgICAgICBrZXlWYWx1ZSA9IGtleSA9PSAndHJ1ZSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd3JpdGUga2V5LCBleHBlY3Rpbmcga2V5IGZpZWxkIG51bWJlciA9IDFcbiAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBmaWVsZC5LLCAxLCBrZXlWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgIC8vIHdyaXRlIHZhbHVlLCBleHBlY3RpbmcgdmFsdWUgZmllbGQgbnVtYmVyID0gMlxuICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIGZpZWxkLlYuVCwgMiwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBTY2FsYXJUeXBlLklOVDMyLCAyLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5WLlQoKSwgMiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5qb2luKCk7XG4gICAgfVxuICAgIG1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBoYW5kbGVyLCBmaWVsZE5vLCB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaGFuZGxlci5pbnRlcm5hbEJpbmFyeVdyaXRlKHZhbHVlLCB3cml0ZXIudGFnKGZpZWxkTm8sIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKTtcbiAgICAgICAgd3JpdGVyLmpvaW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBzaW5nbGUgc2NhbGFyIHZhbHVlLlxuICAgICAqL1xuICAgIHNjYWxhcih3cml0ZXIsIHR5cGUsIGZpZWxkTm8sIHZhbHVlLCBlbWl0RGVmYXVsdCkge1xuICAgICAgICBsZXQgW3dpcmVUeXBlLCBtZXRob2QsIGlzRGVmYXVsdF0gPSB0aGlzLnNjYWxhckluZm8odHlwZSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWlzRGVmYXVsdCB8fCBlbWl0RGVmYXVsdCkge1xuICAgICAgICAgICAgd3JpdGVyLnRhZyhmaWVsZE5vLCB3aXJlVHlwZSk7XG4gICAgICAgICAgICB3cml0ZXJbbWV0aG9kXSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYW4gYXJyYXkgb2Ygc2NhbGFyIHZhbHVlcyBpbiBwYWNrZWQgZm9ybWF0LlxuICAgICAqL1xuICAgIHBhY2tlZCh3cml0ZXIsIHR5cGUsIGZpZWxkTm8sIHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBhc3NlcnQodHlwZSAhPT0gU2NhbGFyVHlwZS5CWVRFUyAmJiB0eXBlICE9PSBTY2FsYXJUeXBlLlNUUklORyk7XG4gICAgICAgIC8vIHdyaXRlIHRhZ1xuICAgICAgICB3cml0ZXIudGFnKGZpZWxkTm8sIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7XG4gICAgICAgIC8vIGJlZ2luIGxlbmd0aC1kZWxpbWl0ZWRcbiAgICAgICAgd3JpdGVyLmZvcmsoKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWVzIHdpdGhvdXQgdGFnc1xuICAgICAgICBsZXQgWywgbWV0aG9kLF0gPSB0aGlzLnNjYWxhckluZm8odHlwZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXJbbWV0aG9kXSh2YWx1ZVtpXSk7XG4gICAgICAgIC8vIGVuZCBsZW5ndGggZGVsaW1pdGVkXG4gICAgICAgIHdyaXRlci5qb2luKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBpbmZvcm1hdGlvbiBmb3Igd3JpdGluZyBhIHNjYWxhciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdHVwbGU6XG4gICAgICogWzBdOiBhcHByb3ByaWF0ZSBXaXJlVHlwZVxuICAgICAqIFsxXTogbmFtZSBvZiB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIG9mIElCaW5hcnlXcml0ZXJcbiAgICAgKiBbMl06IHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgZGVmYXVsdCB2YWx1ZVxuICAgICAqXG4gICAgICogSWYgYXJndW1lbnQgYHZhbHVlYCBpcyBvbWl0dGVkLCBbMl0gaXMgYWx3YXlzIGZhbHNlLlxuICAgICAqL1xuICAgIHNjYWxhckluZm8odHlwZSwgdmFsdWUpIHtcbiAgICAgICAgbGV0IHQgPSBXaXJlVHlwZS5WYXJpbnQ7XG4gICAgICAgIGxldCBtO1xuICAgICAgICBsZXQgaSA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBkID0gdmFsdWUgPT09IDA7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIG0gPSBcImludDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8ICF2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDtcbiAgICAgICAgICAgICAgICBtID0gXCJzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGQgPSB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbSA9IFwiYm9vbFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICBtID0gXCJ1aW50MzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDY0O1xuICAgICAgICAgICAgICAgIG0gPSBcImRvdWJsZVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQzMjtcbiAgICAgICAgICAgICAgICBtID0gXCJmbG9hdFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8IFBiTG9uZy5mcm9tKHZhbHVlKS5pc1plcm8oKTtcbiAgICAgICAgICAgICAgICBtID0gXCJpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCBQYlVMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcInVpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJVTG9uZy5mcm9tKHZhbHVlKS5pc1plcm8oKTtcbiAgICAgICAgICAgICAgICB0ID0gV2lyZVR5cGUuQml0NjQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiZml4ZWQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8ICF2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiYnl0ZXNcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQzMjtcbiAgICAgICAgICAgICAgICBtID0gXCJmaXhlZDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDMyO1xuICAgICAgICAgICAgICAgIG0gPSBcInNmaXhlZDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQ2NDtcbiAgICAgICAgICAgICAgICBtID0gXCJzZml4ZWQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgICAgICBtID0gXCJzaW50MzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcInNpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdCwgbSwgaSB8fCBkXTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tc2NhbGFyLWRlZmF1bHRcIjtcbmltcG9ydCB7IE1FU1NBR0VfVFlQRSB9IGZyb20gJy4vbWVzc2FnZS10eXBlLWNvbnRyYWN0Jztcbi8qKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZ2VuZXJpYyBtZXNzYWdlLCB1c2luZyB0aGUgZmllbGRcbiAqIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdGlvbkNyZWF0ZSh0eXBlKSB7XG4gICAgLyoqXG4gICAgICogVGhpcyB0ZXJuYXJ5IGNhbiBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uXG4gICAgICogVGhlIGBPYmplY3QuY3JlYXRlKClgIGNvZGUgcGF0aCB1dGlsaXplcyBhIG5ldyBgbWVzc2FnZVByb3RvdHlwZWBcbiAgICAgKiBwcm9wZXJ0eSBvbiB0aGUgYElNZXNzYWdlVHlwZWAgd2hpY2ggaGFzIHRoaXMgc2FtZSBgTUVTU0FHRV9UWVBFYFxuICAgICAqIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIGl0LiBEb2luZyBpdCB0aGlzIHdheSBtZWFucyB0aGF0IHdlIG9ubHlcbiAgICAgKiBwYXkgdGhlIGNvc3Qgb2YgYE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpYCBvbmNlIHBlciBgSU1lc3NhZ2VUeXBlYFxuICAgICAqIGNsYXNzIG9mIG9uY2UgcGVyIFwiaW5zdGFuY2VcIi4gVGhlIGZhbHN5IGNvZGUgcGF0aCBpcyBvbmx5IHByb3ZpZGVkXG4gICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGluIGNhc2VzIHdoZXJlIHRoZSBydW50aW1lIGxpYnJhcnkgaXNcbiAgICAgKiB1cGRhdGVkIHdpdGhvdXQgYWxzbyB1cGRhdGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuXG4gICAgICovXG4gICAgY29uc3QgbXNnID0gdHlwZS5tZXNzYWdlUHJvdG90eXBlXG4gICAgICAgID8gT2JqZWN0LmNyZWF0ZSh0eXBlLm1lc3NhZ2VQcm90b3R5cGUpXG4gICAgICAgIDogT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCBNRVNTQUdFX1RZUEUsIHsgdmFsdWU6IHR5cGUgfSk7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgdHlwZS5maWVsZHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgIGlmIChmaWVsZC5vcHQpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKGZpZWxkLm9uZW9mKVxuICAgICAgICAgICAgbXNnW2ZpZWxkLm9uZW9mXSA9IHsgb25lb2ZLaW5kOiB1bmRlZmluZWQgfTtcbiAgICAgICAgZWxzZSBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgbXNnW25hbWVdID0gW107XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgbXNnW25hbWVdID0gcmVmbGVjdGlvblNjYWxhckRlZmF1bHQoZmllbGQuVCwgZmllbGQuTCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlcXVpcmUgMCB0byBiZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwgZW51bXNcbiAgICAgICAgICAgICAgICAgICAgbXNnW25hbWVdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICBtc2dbbmFtZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtc2c7XG59XG4iLCJpbXBvcnQgeyBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0d28gbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGhhdmUgdGhlIHNhbWUgZmllbGQgdmFsdWVzLlxuICogQ2hlY2tzIGZvciBkZWVwIGVxdWFsaXR5LCB0cmF2ZXJzaW5nIHJlcGVhdGVkIGZpZWxkcywgb25lb2YgZ3JvdXBzLCBtYXBzXG4gKiBhbmQgbWVzc2FnZXMgcmVjdXJzaXZlbHkuXG4gKiBXaWxsIGFsc28gcmV0dXJuIHRydWUgaWYgYm90aCBtZXNzYWdlcyBhcmUgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0aW9uRXF1YWxzKGluZm8sIGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFhIHx8ICFiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgaW5mby5maWVsZHMpIHtcbiAgICAgICAgbGV0IGxvY2FsTmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgbGV0IHZhbF9hID0gZmllbGQub25lb2YgPyBhW2ZpZWxkLm9uZW9mXVtsb2NhbE5hbWVdIDogYVtsb2NhbE5hbWVdO1xuICAgICAgICBsZXQgdmFsX2IgPSBmaWVsZC5vbmVvZiA/IGJbZmllbGQub25lb2ZdW2xvY2FsTmFtZV0gOiBiW2xvY2FsTmFtZV07XG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGZpZWxkLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVDtcbiAgICAgICAgICAgICAgICBpZiAoIShmaWVsZC5yZXBlYXRcbiAgICAgICAgICAgICAgICAgICAgPyByZXBlYXRlZFByaW1pdGl2ZUVxKHQsIHZhbF9hLCB2YWxfYilcbiAgICAgICAgICAgICAgICAgICAgOiBwcmltaXRpdmVFcSh0LCB2YWxfYSwgdmFsX2IpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgIGlmICghKGZpZWxkLlYua2luZCA9PSBcIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA/IHJlcGVhdGVkTXNnRXEoZmllbGQuVi5UKCksIG9iamVjdFZhbHVlcyh2YWxfYSksIG9iamVjdFZhbHVlcyh2YWxfYikpXG4gICAgICAgICAgICAgICAgICAgIDogcmVwZWF0ZWRQcmltaXRpdmVFcShmaWVsZC5WLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVi5ULCBvYmplY3RWYWx1ZXModmFsX2EpLCBvYmplY3RWYWx1ZXModmFsX2IpKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZmllbGQucmVwZWF0XG4gICAgICAgICAgICAgICAgICAgID8gcmVwZWF0ZWRNc2dFcShULCB2YWxfYSwgdmFsX2IpXG4gICAgICAgICAgICAgICAgICAgIDogVC5lcXVhbHModmFsX2EsIHZhbF9iKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IG9iamVjdFZhbHVlcyA9IE9iamVjdC52YWx1ZXM7XG5mdW5jdGlvbiBwcmltaXRpdmVFcSh0eXBlLCBhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIGlmICh0eXBlICE9PSBTY2FsYXJUeXBlLkJZVEVTKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IGJhID0gYTtcbiAgICBsZXQgYmIgPSBiO1xuICAgIGlmIChiYS5sZW5ndGggIT09IGJiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChiYVtpXSAhPSBiYltpXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlcGVhdGVkUHJpbWl0aXZlRXEodHlwZSwgYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghcHJpbWl0aXZlRXEodHlwZSwgYVtpXSwgYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXBlYXRlZE1zZ0VxKHR5cGUsIGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIXR5cGUuZXF1YWxzKGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHsgbG93ZXJDYW1lbENhc2UgfSBmcm9tIFwiLi9sb3dlci1jYW1lbC1jYXNlXCI7XG4vKipcbiAqIFNjYWxhciB2YWx1ZSB0eXBlcy4gVGhpcyBpcyBhIHN1YnNldCBvZiBmaWVsZCB0eXBlcyBkZWNsYXJlZCBieSBwcm90b2J1ZlxuICogZW51bSBnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSBUaGUgdHlwZXMgR1JPVVAgYW5kIE1FU1NBR0VcbiAqIGFyZSBvbWl0dGVkLCBidXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgYXJlIGlkZW50aWNhbC5cbiAqL1xuZXhwb3J0IHZhciBTY2FsYXJUeXBlO1xuKGZ1bmN0aW9uIChTY2FsYXJUeXBlKSB7XG4gICAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzLlxuICAgIC8vIE9yZGVyIGlzIHdlaXJkIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiRE9VQkxFXCJdID0gMV0gPSBcIkRPVUJMRVwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkZMT0FUXCJdID0gMl0gPSBcIkZMT0FUXCI7XG4gICAgLy8gTm90IFppZ1phZyBlbmNvZGVkLiAgTmVnYXRpdmUgbnVtYmVycyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDY0IGlmXG4gICAgLy8gbmVnYXRpdmUgdmFsdWVzIGFyZSBsaWtlbHkuXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiSU5UNjRcIl0gPSAzXSA9IFwiSU5UNjRcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJVSU5UNjRcIl0gPSA0XSA9IFwiVUlOVDY0XCI7XG4gICAgLy8gTm90IFppZ1phZyBlbmNvZGVkLiAgTmVnYXRpdmUgbnVtYmVycyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDMyIGlmXG4gICAgLy8gbmVnYXRpdmUgdmFsdWVzIGFyZSBsaWtlbHkuXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiSU5UMzJcIl0gPSA1XSA9IFwiSU5UMzJcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJGSVhFRDY0XCJdID0gNl0gPSBcIkZJWEVENjRcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJGSVhFRDMyXCJdID0gN10gPSBcIkZJWEVEMzJcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJCT09MXCJdID0gOF0gPSBcIkJPT0xcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTVFJJTkdcIl0gPSA5XSA9IFwiU1RSSU5HXCI7XG4gICAgLy8gVGFnLWRlbGltaXRlZCBhZ2dyZWdhdGUuXG4gICAgLy8gR3JvdXAgdHlwZSBpcyBkZXByZWNhdGVkIGFuZCBub3Qgc3VwcG9ydGVkIGluIHByb3RvMy4gSG93ZXZlciwgUHJvdG8zXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIHBhcnNlIHRoZSBncm91cCB3aXJlIGZvcm1hdCBhbmRcbiAgICAvLyB0cmVhdCBncm91cCBmaWVsZHMgYXMgdW5rbm93biBmaWVsZHMuXG4gICAgLy8gVFlQRV9HUk9VUCA9IDEwLFxuICAgIC8vIFRZUEVfTUVTU0FHRSA9IDExLCAgLy8gTGVuZ3RoLWRlbGltaXRlZCBhZ2dyZWdhdGUuXG4gICAgLy8gTmV3IGluIHZlcnNpb24gMi5cbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJCWVRFU1wiXSA9IDEyXSA9IFwiQllURVNcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJVSU5UMzJcIl0gPSAxM10gPSBcIlVJTlQzMlwiO1xuICAgIC8vIFRZUEVfRU5VTSA9IDE0LFxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNGSVhFRDMyXCJdID0gMTVdID0gXCJTRklYRUQzMlwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNGSVhFRDY0XCJdID0gMTZdID0gXCJTRklYRUQ2NFwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNJTlQzMlwiXSA9IDE3XSA9IFwiU0lOVDMyXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU0lOVDY0XCJdID0gMThdID0gXCJTSU5UNjRcIjtcbn0pKFNjYWxhclR5cGUgfHwgKFNjYWxhclR5cGUgPSB7fSkpO1xuLyoqXG4gKiBKYXZhU2NyaXB0IHJlcHJlc2VudGF0aW9uIG9mIDY0IGJpdCBpbnRlZ3JhbCB0eXBlcy4gRXF1aXZhbGVudCB0byB0aGVcbiAqIGZpZWxkIG9wdGlvbiBcImpzdHlwZVwiLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHByb3RvYnVmLXRzIHJlcHJlc2VudHMgNjQgYml0IHR5cGVzIGFzIGBiaWdpbnRgLlxuICpcbiAqIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBieSBlbmFibGluZyB0aGUgcGx1Z2luIHBhcmFtZXRlclxuICogYGxvbmdfdHlwZV9zdHJpbmdgLCB3aGljaCB3aWxsIHJlcHJlc2VudCA2NCBiaXQgdHlwZXMgYXMgYHN0cmluZ2AuXG4gKlxuICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW91ciBmb3IgaW5kaXZpZHVhbCBmaWVsZHNcbiAqIHdpdGggdGhlIGZpZWxkIG9wdGlvbiBcImpzdHlwZVwiOlxuICpcbiAqIGBgYHByb3RvYnVmXG4gKiB1aW50NjQgbXlfZmllbGQgPSAxIFtqc3R5cGUgPSBKU19TVFJJTkddO1xuICogdWludDY0IG90aGVyX2ZpZWxkID0gMiBbanN0eXBlID0gSlNfTlVNQkVSXTtcbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIExvbmdUeXBlO1xuKGZ1bmN0aW9uIChMb25nVHlwZSkge1xuICAgIC8qKlxuICAgICAqIFVzZSBKYXZhU2NyaXB0IGBiaWdpbnRgLlxuICAgICAqXG4gICAgICogRmllbGQgb3B0aW9uIGBbanN0eXBlID0gSlNfTk9STUFMXWAuXG4gICAgICovXG4gICAgTG9uZ1R5cGVbTG9uZ1R5cGVbXCJCSUdJTlRcIl0gPSAwXSA9IFwiQklHSU5UXCI7XG4gICAgLyoqXG4gICAgICogVXNlIEphdmFTY3JpcHQgYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBGaWVsZCBvcHRpb24gYFtqc3R5cGUgPSBKU19TVFJJTkddYC5cbiAgICAgKi9cbiAgICBMb25nVHlwZVtMb25nVHlwZVtcIlNUUklOR1wiXSA9IDFdID0gXCJTVFJJTkdcIjtcbiAgICAvKipcbiAgICAgKiBVc2UgSmF2YVNjcmlwdCBgbnVtYmVyYC5cbiAgICAgKlxuICAgICAqIExhcmdlIHZhbHVlcyB3aWxsIGxvb3NlIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEZpZWxkIG9wdGlvbiBgW2pzdHlwZSA9IEpTX05VTUJFUl1gLlxuICAgICAqL1xuICAgIExvbmdUeXBlW0xvbmdUeXBlW1wiTlVNQkVSXCJdID0gMl0gPSBcIk5VTUJFUlwiO1xufSkoTG9uZ1R5cGUgfHwgKExvbmdUeXBlID0ge30pKTtcbi8qKlxuICogUHJvdG9idWYgMi4xLjAgaW50cm9kdWNlZCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzLlxuICogU2V0dGluZyB0aGUgZmllbGQgb3B0aW9uIGBbcGFja2VkID0gdHJ1ZV1gIGVuYWJsZXMgcGFja2luZy5cbiAqXG4gKiBJbiBwcm90bzMsIGFsbCByZXBlYXRlZCBmaWVsZHMgYXJlIHBhY2tlZCBieSBkZWZhdWx0LlxuICogU2V0dGluZyB0aGUgZmllbGQgb3B0aW9uIGBbcGFja2VkID0gZmFsc2VdYCBkaXNhYmxlcyBwYWNraW5nLlxuICpcbiAqIFBhY2tlZCByZXBlYXRlZCBmaWVsZHMgYXJlIGVuY29kZWQgd2l0aCBhIHNpbmdsZSB0YWcsXG4gKiB0aGVuIGEgbGVuZ3RoLWRlbGltaXRlciwgdGhlbiB0aGUgZWxlbWVudCB2YWx1ZXMuXG4gKlxuICogVW5wYWNrZWQgcmVwZWF0ZWQgZmllbGRzIGFyZSBlbmNvZGVkIHdpdGggYSB0YWcgYW5kXG4gKiB2YWx1ZSBmb3IgZWFjaCBlbGVtZW50LlxuICpcbiAqIGBieXRlc2AgYW5kIGBzdHJpbmdgIGNhbm5vdCBiZSBwYWNrZWQuXG4gKi9cbmV4cG9ydCB2YXIgUmVwZWF0VHlwZTtcbihmdW5jdGlvbiAoUmVwZWF0VHlwZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCBpcyBub3QgcmVwZWF0ZWQuXG4gICAgICovXG4gICAgUmVwZWF0VHlwZVtSZXBlYXRUeXBlW1wiTk9cIl0gPSAwXSA9IFwiTk9cIjtcbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGQgaXMgcmVwZWF0ZWQgYW5kIHNob3VsZCBiZSBwYWNrZWQuXG4gICAgICogSW52YWxpZCBmb3IgYGJ5dGVzYCBhbmQgYHN0cmluZ2AsIHRoZXkgY2Fubm90IGJlIHBhY2tlZC5cbiAgICAgKi9cbiAgICBSZXBlYXRUeXBlW1JlcGVhdFR5cGVbXCJQQUNLRURcIl0gPSAxXSA9IFwiUEFDS0VEXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIGlzIHJlcGVhdGVkIGJ1dCBzaG91bGQgbm90IGJlIHBhY2tlZC5cbiAgICAgKiBUaGUgb25seSB2YWxpZCByZXBlYXQgdHlwZSBmb3IgcmVwZWF0ZWQgYGJ5dGVzYCBhbmQgYHN0cmluZ2AuXG4gICAgICovXG4gICAgUmVwZWF0VHlwZVtSZXBlYXRUeXBlW1wiVU5QQUNLRURcIl0gPSAyXSA9IFwiVU5QQUNLRURcIjtcbn0pKFJlcGVhdFR5cGUgfHwgKFJlcGVhdFR5cGUgPSB7fSkpO1xuLyoqXG4gKiBUdXJucyBQYXJ0aWFsRmllbGRJbmZvIGludG8gRmllbGRJbmZvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmllbGRJbmZvKGZpZWxkKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIGZpZWxkLmxvY2FsTmFtZSA9IChfYSA9IGZpZWxkLmxvY2FsTmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbG93ZXJDYW1lbENhc2UoZmllbGQubmFtZSk7XG4gICAgZmllbGQuanNvbk5hbWUgPSAoX2IgPSBmaWVsZC5qc29uTmFtZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbG93ZXJDYW1lbENhc2UoZmllbGQubmFtZSk7XG4gICAgZmllbGQucmVwZWF0ID0gKF9jID0gZmllbGQucmVwZWF0KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBSZXBlYXRUeXBlLk5PO1xuICAgIGZpZWxkLm9wdCA9IChfZCA9IGZpZWxkLm9wdCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogKGZpZWxkLnJlcGVhdCA/IGZhbHNlIDogZmllbGQub25lb2YgPyBmYWxzZSA6IGZpZWxkLmtpbmQgPT0gXCJtZXNzYWdlXCIpO1xuICAgIHJldHVybiBmaWVsZDtcbn1cbi8qKlxuICogUmVhZCBjdXN0b20gZmllbGQgb3B0aW9ucyBmcm9tIGEgZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCB1c2UgcmVhZEZpZWxkT3B0aW9uKClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWVsZE9wdGlvbnMobWVzc2FnZVR5cGUsIGZpZWxkTmFtZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvcHRpb25zID0gKF9hID0gbWVzc2FnZVR5cGUuZmllbGRzLmZpbmQoKG0sIGkpID0+IG0ubG9jYWxOYW1lID09IGZpZWxkTmFtZSB8fCBpID09IGZpZWxkTmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpb25zO1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0gPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0pIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWVsZE9wdGlvbihtZXNzYWdlVHlwZSwgZmllbGROYW1lLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoX2EgPSBtZXNzYWdlVHlwZS5maWVsZHMuZmluZCgobSwgaSkgPT4gbS5sb2NhbE5hbWUgPT0gZmllbGROYW1lIHx8IGkgPT0gZmllbGROYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9wdGlvbnM7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvblZhbCA9IG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV07XG4gICAgaWYgKG9wdGlvblZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWw7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25UeXBlID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25WYWwpIDogb3B0aW9uVmFsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNZXNzYWdlT3B0aW9uKG1lc3NhZ2VUeXBlLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IG1lc3NhZ2VUeXBlLm9wdGlvbnM7XG4gICAgY29uc3Qgb3B0aW9uVmFsID0gb3B0aW9uc1tleHRlbnNpb25OYW1lXTtcbiAgICBpZiAob3B0aW9uVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvblZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuc2lvblR5cGUgPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvblZhbCkgOiBvcHRpb25WYWw7XG59XG4iLCJpbXBvcnQgeyBpc0pzb25PYmplY3QsIHR5cGVvZkpzb25WYWx1ZSB9IGZyb20gXCIuL2pzb24tdHlwaW5nc1wiO1xuaW1wb3J0IHsgYmFzZTY0ZGVjb2RlIH0gZnJvbSBcIi4vYmFzZTY0XCI7XG5pbXBvcnQgeyBMb25nVHlwZSwgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgUGJMb25nLCBQYlVMb25nIH0gZnJvbSBcIi4vcGItbG9uZ1wiO1xuaW1wb3J0IHsgYXNzZXJ0LCBhc3NlcnRGbG9hdDMyLCBhc3NlcnRJbnQzMiwgYXNzZXJ0VUludDMyIH0gZnJvbSBcIi4vYXNzZXJ0XCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uTG9uZ0NvbnZlcnQgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWxvbmctY29udmVydFwiO1xuLyoqXG4gKiBSZWFkcyBwcm90bzMgbWVzc2FnZXMgaW4gY2Fub25pY2FsIEpTT04gZm9ybWF0IHVzaW5nIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uSnNvblJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB0aGlzLmluZm8gPSBpbmZvO1xuICAgIH1cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0aGlzLmZNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5mTWFwID0ge307XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNJbnB1dCA9IChfYSA9IHRoaXMuaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNJbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZk1hcFtmaWVsZC5uYW1lXSA9IGZpZWxkO1xuICAgICAgICAgICAgICAgIHRoaXMuZk1hcFtmaWVsZC5qc29uTmFtZV0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICB0aGlzLmZNYXBbZmllbGQubG9jYWxOYW1lXSA9IGZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENhbm5vdCBwYXJzZSBKU09OIDx0eXBlIG9mIGpzb25WYWx1ZT4gZm9yIDx0eXBlIG5hbWU+IzxmaWVsZE5hbWU+LlxuICAgIGFzc2VydChjb25kaXRpb24sIGZpZWxkTmFtZSwganNvblZhbHVlKSB7XG4gICAgICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICAgICAgICBsZXQgd2hhdCA9IHR5cGVvZkpzb25WYWx1ZShqc29uVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHdoYXQgPT0gXCJudW1iZXJcIiB8fCB3aGF0ID09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgIHdoYXQgPSBqc29uVmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIEpTT04gJHt3aGF0fSBmb3IgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGROYW1lfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgbWVzc2FnZSBmcm9tIGNhbm9uaWNhbCBKU09OIGZvcm1hdCBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFJlcGVhdGVkIGZpZWxkcyBhcmUgYXBwZW5kZWQuIE1hcCBlbnRyaWVzIGFyZSBhZGRlZCwgb3ZlcndyaXRpbmdcbiAgICAgKiBleGlzdGluZyBrZXlzLlxuICAgICAqXG4gICAgICogSWYgYSBtZXNzYWdlIGZpZWxkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGVcbiAgICAgKiBuZXcgZGF0YS5cbiAgICAgKi9cbiAgICByZWFkKGlucHV0LCBtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBjb25zdCBvbmVvZnNIYW5kbGVkID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2pzb25LZXksIGpzb25WYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZk1hcFtqc29uS2V5XTtcbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlVW5rbm93bkZpZWxkcylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3VuZCB1bmtub3duIGZpZWxkIHdoaWxlIHJlYWRpbmcgJHt0aGlzLmluZm8udHlwZU5hbWV9IGZyb20gSlNPTiBmb3JtYXQuIEpTT04ga2V5OiAke2pzb25LZXl9YCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsb2NhbE5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgICAgICAvLyBoYW5kbGUgb25lb2YgQURUXG4gICAgICAgICAgICBsZXQgdGFyZ2V0OyAvLyB0aGlzIHdpbGwgYmUgdGhlIHRhcmdldCBmb3IgdGhlIGZpZWxkIHZhbHVlLCB3aGV0aGVyIGl0IGlzIG1lbWJlciBvZiBhIG9uZW9mIG9yIG5vdFxuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbCAmJiAoZmllbGQua2luZCAhPT0gJ2VudW0nIHx8IGZpZWxkLlQoKVswXSAhPT0gJ2dvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gc2luY2UganNvbiBvYmplY3RzIGFyZSB1bm9yZGVyZWQgYnkgc3BlY2lmaWNhdGlvbiwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHRha2UgdGhlIGxhc3Qgb2YgbXVsdGlwbGUgb25lb2ZzXG4gICAgICAgICAgICAgICAgaWYgKG9uZW9mc0hhbmRsZWQuaW5jbHVkZXMoZmllbGQub25lb2YpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE11bHRpcGxlIG1lbWJlcnMgb2YgdGhlIG9uZW9mIGdyb3VwIFwiJHtmaWVsZC5vbmVvZn1cIiBvZiAke3RoaXMuaW5mby50eXBlTmFtZX0gYXJlIHByZXNlbnQgaW4gSlNPTi5gKTtcbiAgICAgICAgICAgICAgICBvbmVvZnNIYW5kbGVkLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IG1lc3NhZ2VbZmllbGQub25lb2ZdID0ge1xuICAgICAgICAgICAgICAgICAgICBvbmVvZktpbmQ6IGxvY2FsTmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBoYW5kbGVkIG9uZW9mIGFib3ZlLiB3ZSBqdXN0IGhhdmUgcmVhZCB0aGUgdmFsdWUgaW50byBgdGFyZ2V0YC5cbiAgICAgICAgICAgIGlmIChmaWVsZC5raW5kID09ICdtYXAnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5wdXRcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChpc0pzb25PYmplY3QoanNvblZhbHVlKSwgZmllbGQubmFtZSwganNvblZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBvdXIgdGFyZ2V0IHRvIHB1dCBtYXAgZW50cmllcyBpbnRvXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRPYmogPSB0YXJnZXRbbG9jYWxOYW1lXTtcbiAgICAgICAgICAgICAgICAvLyByZWFkIGVudHJpZXNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtqc29uT2JqS2V5LCBqc29uT2JqVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoanNvbk9ialZhbHVlICE9PSBudWxsLCBmaWVsZC5uYW1lICsgXCIgbWFwIHZhbHVlXCIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZWFkIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWw7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGZpZWxkLlYuVCgpLmludGVybmFsSnNvblJlYWQoanNvbk9ialZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5lbnVtKGZpZWxkLlYuVCgpLCBqc29uT2JqVmFsdWUsIGZpZWxkLm5hbWUsIG9wdGlvbnMuaWdub3JlVW5rbm93bkZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuc2NhbGFyKGpzb25PYmpWYWx1ZSwgZmllbGQuVi5ULCBmaWVsZC5WLkwsIGZpZWxkLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkLCBmaWVsZC5uYW1lICsgXCIgbWFwIHZhbHVlXCIsIGpzb25PYmpWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWQga2V5XG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBqc29uT2JqS2V5O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSyA9PSBTY2FsYXJUeXBlLkJPT0wpXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkgPT0gXCJ0cnVlXCIgPyB0cnVlIDoga2V5ID09IFwiZmFsc2VcIiA/IGZhbHNlIDoga2V5O1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnNjYWxhcihrZXksIGZpZWxkLkssIExvbmdUeXBlLlNUUklORywgZmllbGQubmFtZSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmpba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5yZXBlYXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNvblZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpbnB1dFxuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KEFycmF5LmlzQXJyYXkoanNvblZhbHVlKSwgZmllbGQubmFtZSwganNvblZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBvdXIgdGFyZ2V0IHRvIHB1dCBhcnJheSBlbnRyaWVzIGludG9cbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEFyciA9IHRhcmdldFtsb2NhbE5hbWVdO1xuICAgICAgICAgICAgICAgIC8vIHJlYWQgYXJyYXkgZW50cmllc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QganNvbkl0ZW0gb2YganNvblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KGpzb25JdGVtICE9PSBudWxsLCBmaWVsZC5uYW1lLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGZpZWxkLlQoKS5pbnRlcm5hbEpzb25SZWFkKGpzb25JdGVtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5lbnVtKGZpZWxkLlQoKSwganNvbkl0ZW0sIGZpZWxkLm5hbWUsIG9wdGlvbnMuaWdub3JlVW5rbm93bkZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuc2NhbGFyKGpzb25JdGVtLCBmaWVsZC5ULCBmaWVsZC5MLCBmaWVsZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCwgZmllbGQubmFtZSwganNvblZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRBcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbCAmJiBmaWVsZC5UKCkudHlwZU5hbWUgIT0gJ2dvb2dsZS5wcm90b2J1Zi5WYWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChmaWVsZC5vbmVvZiA9PT0gdW5kZWZpbmVkLCBmaWVsZC5uYW1lICsgXCIgKG9uZW9mIG1lbWJlcilcIiwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IGZpZWxkLlQoKS5pbnRlcm5hbEpzb25SZWFkKGpzb25WYWx1ZSwgb3B0aW9ucywgdGFyZ2V0W2xvY2FsTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5lbnVtKGZpZWxkLlQoKSwganNvblZhbHVlLCBmaWVsZC5uYW1lLCBvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbbG9jYWxOYW1lXSA9IHRoaXMuc2NhbGFyKGpzb25WYWx1ZSwgZmllbGQuVCwgZmllbGQuTCwgZmllbGQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgZmFsc2VgIGZvciB1bnJlY29nbml6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKlxuICAgICAqIGdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUgYWNjZXB0cyBvbmx5IEpTT04gYG51bGxgIChvciB0aGUgb2xkIGBcIk5VTExfVkFMVUVcImApLlxuICAgICAqL1xuICAgIGVudW0odHlwZSwganNvbiwgZmllbGROYW1lLCBpZ25vcmVVbmtub3duRmllbGRzKSB7XG4gICAgICAgIGlmICh0eXBlWzBdID09ICdnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlJylcbiAgICAgICAgICAgIGFzc2VydChqc29uID09PSBudWxsIHx8IGpzb24gPT09IFwiTlVMTF9WQUxVRVwiLCBgVW5hYmxlIHRvIHBhcnNlIGZpZWxkICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX0sIGVudW0gJHt0eXBlWzBdfSBvbmx5IGFjY2VwdHMgbnVsbC5gKTtcbiAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAvLyB3ZSByZXF1aXJlIDAgdG8gYmUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIGVudW1zXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgc3dpdGNoICh0eXBlb2YganNvbikge1xuICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgIGFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKGpzb24pLCBgVW5hYmxlIHRvIHBhcnNlIGZpZWxkICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX0sIGVudW0gY2FuIG9ubHkgYmUgaW50ZWdyYWwgbnVtYmVyLCBnb3QgJHtqc29ufS5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxFbnVtTmFtZSA9IGpzb247XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVbMl0gJiYganNvbi5zdWJzdHJpbmcoMCwgdHlwZVsyXS5sZW5ndGgpID09PSB0eXBlWzJdKVxuICAgICAgICAgICAgICAgICAgICAvLyBsb29rdXAgd2l0aG91dCB0aGUgc2hhcmVkIHByZWZpeFxuICAgICAgICAgICAgICAgICAgICBsb2NhbEVudW1OYW1lID0ganNvbi5zdWJzdHJpbmcodHlwZVsyXS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGxldCBlbnVtTnVtYmVyID0gdHlwZVsxXVtsb2NhbEVudW1OYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVudW1OdW1iZXIgPT09ICd1bmRlZmluZWQnICYmIGlnbm9yZVVua25vd25GaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIGVudW1OdW1iZXIgPT0gXCJudW1iZXJcIiwgYFVuYWJsZSB0byBwYXJzZSBmaWVsZCAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9LCBlbnVtICR7dHlwZVswXX0gaGFzIG5vIHZhbHVlIGZvciBcIiR7anNvbn1cIi5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW51bU51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmFibGUgdG8gcGFyc2UgZmllbGQgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGROYW1lfSwgY2Fubm90IHBhcnNlIGVudW0gdmFsdWUgZnJvbSAke3R5cGVvZiBqc29ufVwiLmApO1xuICAgIH1cbiAgICBzY2FsYXIoanNvbiwgdHlwZSwgbG9uZ1R5cGUsIGZpZWxkTmFtZSkge1xuICAgICAgICBsZXQgZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0LCBkb3VibGU6IEpTT04gdmFsdWUgd2lsbCBiZSBhIG51bWJlciBvciBvbmUgb2YgdGhlIHNwZWNpYWwgc3RyaW5nIHZhbHVlcyBcIk5hTlwiLCBcIkluZmluaXR5XCIsIGFuZCBcIi1JbmZpbml0eVwiLlxuICAgICAgICAgICAgICAgIC8vIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLiBFeHBvbmVudCBub3RhdGlvbiBpcyBhbHNvIGFjY2VwdGVkLlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAuMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IFwiTmFOXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk5hTjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IFwiSW5maW5pdHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIi1JbmZpbml0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImVtcHR5IHN0cmluZ1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uID09IFwic3RyaW5nXCIgJiYganNvbi50cmltKCkubGVuZ3RoICE9PSBqc29uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiZXh0cmEgd2hpdGVzcGFjZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9IFwic3RyaW5nXCIgJiYgdHlwZW9mIGpzb24gIT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZsb2F0ID0gTnVtYmVyKGpzb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGZsb2F0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwibm90IGEgbnVtYmVyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShmbG9hdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZmluaXR5IGFuZCAtaW5maW5pdHkgYXJlIGhhbmRsZWQgYnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFib3ZlLCBzbyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJ0b28gbGFyZ2Ugb3Igc21hbGxcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFNjYWxhclR5cGUuRkxPQVQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRGbG9hdDMyKGZsb2F0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0O1xuICAgICAgICAgICAgICAgIC8vIGludDMyLCBmaXhlZDMyLCB1aW50MzI6IEpTT04gdmFsdWUgd2lsbCBiZSBhIGRlY2ltYWwgbnVtYmVyLiBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludDMyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gPT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGludDMyID0ganNvbjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoanNvbiA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImVtcHR5IHN0cmluZ1wiO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YganNvbiA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNvbi50cmltKCkubGVuZ3RoICE9PSBqc29uLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJleHRyYSB3aGl0ZXNwYWNlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgPSBOdW1iZXIoanNvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGludDMyID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU2NhbGFyVHlwZS5VSU5UMzIpXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRVSW50MzIoaW50MzIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRJbnQzMihpbnQzMik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQzMjtcbiAgICAgICAgICAgICAgICAvLyBpbnQ2NCwgZml4ZWQ2NCwgdWludDY0OiBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIHN0cmluZy4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJMb25nLlpFUk8sIGxvbmdUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9IFwibnVtYmVyXCIgJiYgdHlwZW9mIGpzb24gIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiTG9uZy5mcm9tKGpzb24pLCBsb25nVHlwZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiVUxvbmcuWkVSTywgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT0gXCJudW1iZXJcIiAmJiB0eXBlb2YganNvbiAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJVTG9uZy5mcm9tKGpzb24pLCBsb25nVHlwZSk7XG4gICAgICAgICAgICAgICAgLy8gYm9vbDpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiZXh0cmEgd2hpdGVzcGFjZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChqc29uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiaW52YWxpZCBVVEY4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgICAgICAgICAvLyBieXRlczogSlNPTiB2YWx1ZSB3aWxsIGJlIHRoZSBkYXRhIGVuY29kZWQgYXMgYSBzdHJpbmcgdXNpbmcgc3RhbmRhcmQgYmFzZTY0IGVuY29kaW5nIHdpdGggcGFkZGluZ3MuXG4gICAgICAgICAgICAgICAgLy8gRWl0aGVyIHN0YW5kYXJkIG9yIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZyB3aXRoL3dpdGhvdXQgcGFkZGluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwgfHwganNvbiA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0ZGVjb2RlKGpzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hc3NlcnQoZmFsc2UsIGZpZWxkTmFtZSArIChlID8gXCIgLSBcIiArIGUgOiBcIlwiKSwganNvbik7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgYmFzZTY0ZW5jb2RlIH0gZnJvbSBcIi4vYmFzZTY0XCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG5pbXBvcnQgeyBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydEZsb2F0MzIsIGFzc2VydEludDMyLCBhc3NlcnRVSW50MzIgfSBmcm9tIFwiLi9hc3NlcnRcIjtcbi8qKlxuICogV3JpdGVzIHByb3RvMyBtZXNzYWdlcyBpbiBjYW5vbmljYWwgSlNPTiBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvblxuICogaW5mb3JtYXRpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uSnNvbldyaXRlciB7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZmllbGRzID0gKF9hID0gaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgbWVzc2FnZSB0byBhIEpTT04gb2JqZWN0LCBiYXNlZCBvbiB0aGUgZmllbGQgZGVzY3JpcHRvcnMuXG4gICAgICovXG4gICAgd3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBqc29uID0ge30sIHNvdXJjZSA9IG1lc3NhZ2U7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgIC8vIGZpZWxkIGlzIG5vdCBwYXJ0IG9mIGEgb25lb2YsIHNpbXBseSB3cml0ZSBhcyBpc1xuICAgICAgICAgICAgaWYgKCFmaWVsZC5vbmVvZikge1xuICAgICAgICAgICAgICAgIGxldCBqc29uVmFsdWUgPSB0aGlzLmZpZWxkKGZpZWxkLCBzb3VyY2VbZmllbGQubG9jYWxOYW1lXSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBqc29uW29wdGlvbnMudXNlUHJvdG9GaWVsZE5hbWUgPyBmaWVsZC5uYW1lIDogZmllbGQuanNvbk5hbWVdID0ganNvblZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZmllbGQgaXMgcGFydCBvZiBhIG9uZW9mXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IHNvdXJjZVtmaWVsZC5vbmVvZl07XG4gICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kICE9PSBmaWVsZC5sb2NhbE5hbWUpXG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vdCBzZWxlY3RlZCwgc2tpcFxuICAgICAgICAgICAgY29uc3Qgb3B0ID0gZmllbGQua2luZCA9PSAnc2NhbGFyJyB8fCBmaWVsZC5raW5kID09ICdlbnVtJ1xuICAgICAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgeyBlbWl0RGVmYXVsdFZhbHVlczogdHJ1ZSB9KSA6IG9wdGlvbnM7XG4gICAgICAgICAgICBsZXQganNvblZhbHVlID0gdGhpcy5maWVsZChmaWVsZCwgZ3JvdXBbZmllbGQubG9jYWxOYW1lXSwgb3B0KTtcbiAgICAgICAgICAgIGFzc2VydChqc29uVmFsdWUgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBqc29uW29wdGlvbnMudXNlUHJvdG9GaWVsZE5hbWUgPyBmaWVsZC5uYW1lIDogZmllbGQuanNvbk5hbWVdID0ganNvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICBmaWVsZChmaWVsZCwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGpzb25WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGZpZWxkLmtpbmQgPT0gJ21hcCcpIHtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBqc29uT2JqID0ge307XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbZW50cnlLZXksIGVudHJ5VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5zY2FsYXIoZmllbGQuVi5ULCBlbnRyeVZhbHVlLCBmaWVsZC5uYW1lLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbk9ialtlbnRyeUtleS50b1N0cmluZygpXSA9IHZhbDsgLy8gSlNPTiBzdGFuZGFyZCBhbGxvd3Mgb25seSAoZG91YmxlIHF1b3RlZCkgc3RyaW5nIGFzIHByb3BlcnR5IGtleVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gZmllbGQuVi5UKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2VudHJ5S2V5LCBlbnRyeVZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMubWVzc2FnZShtZXNzYWdlVHlwZSwgZW50cnlWYWx1ZSwgZmllbGQubmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbk9ialtlbnRyeUtleS50b1N0cmluZygpXSA9IHZhbDsgLy8gSlNPTiBzdGFuZGFyZCBhbGxvd3Mgb25seSAoZG91YmxlIHF1b3RlZCkgc3RyaW5nIGFzIHByb3BlcnR5IGtleVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW1JbmZvID0gZmllbGQuVi5UKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2VudHJ5S2V5LCBlbnRyeVZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChlbnRyeVZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGVudHJ5VmFsdWUgPT0gJ251bWJlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5lbnVtKGVudW1JbmZvLCBlbnRyeVZhbHVlLCBmaWVsZC5uYW1lLCBmYWxzZSwgdHJ1ZSwgb3B0aW9ucy5lbnVtQXNJbnRlZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqW2VudHJ5S2V5LnRvU3RyaW5nKCldID0gdmFsOyAvLyBKU09OIHN0YW5kYXJkIGFsbG93cyBvbmx5IChkb3VibGUgcXVvdGVkKSBzdHJpbmcgYXMgcHJvcGVydHkga2V5XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcyB8fCBPYmplY3Qua2V5cyhqc29uT2JqKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IGpzb25PYmo7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZmllbGQucmVwZWF0KSB7XG4gICAgICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh2YWx1ZSkpO1xuICAgICAgICAgICAgY29uc3QganNvbkFyciA9IFtdO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnNjYWxhcihmaWVsZC5ULCB2YWx1ZVtpXSwgZmllbGQubmFtZSwgZmllbGQub3B0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uQXJyLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtSW5mbyA9IGZpZWxkLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbHVlW2ldID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlW2ldID09ICdudW1iZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZW51bShlbnVtSW5mbywgdmFsdWVbaV0sIGZpZWxkLm5hbWUsIGZpZWxkLm9wdCwgdHJ1ZSwgb3B0aW9ucy5lbnVtQXNJbnRlZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uQXJyLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IGZpZWxkLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5tZXNzYWdlKG1lc3NhZ2VUeXBlLCB2YWx1ZVtpXSwgZmllbGQubmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAganNvbkFyci5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgY29udmVydGVkIGFycmF5IHRvIGpzb24gb3V0cHV0XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcyB8fCBqc29uQXJyLmxlbmd0aCA+IDAgfHwgb3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcylcbiAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSBqc29uQXJyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSB0aGlzLnNjYWxhcihmaWVsZC5ULCB2YWx1ZSwgZmllbGQubmFtZSwgZmllbGQub3B0LCBvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAganNvblZhbHVlID0gdGhpcy5lbnVtKGZpZWxkLlQoKSwgdmFsdWUsIGZpZWxkLm5hbWUsIGZpZWxkLm9wdCwgb3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcywgb3B0aW9ucy5lbnVtQXNJbnRlZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAganNvblZhbHVlID0gdGhpcy5tZXNzYWdlKGZpZWxkLlQoKSwgdmFsdWUsIGZpZWxkLm5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvblZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBudWxsYCBhcyB0aGUgZGVmYXVsdCBmb3IgZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZS5cbiAgICAgKi9cbiAgICBlbnVtKHR5cGUsIHZhbHVlLCBmaWVsZE5hbWUsIG9wdGlvbmFsLCBlbWl0RGVmYXVsdFZhbHVlcywgZW51bUFzSW50ZWdlcikge1xuICAgICAgICBpZiAodHlwZVswXSA9PSAnZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZScpXG4gICAgICAgICAgICByZXR1cm4gIWVtaXREZWZhdWx0VmFsdWVzICYmICFvcHRpb25hbCA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQob3B0aW9uYWwpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPT09IDAgJiYgIWVtaXREZWZhdWx0VmFsdWVzICYmICFvcHRpb25hbClcbiAgICAgICAgICAgIC8vIHdlIHJlcXVpcmUgMCB0byBiZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwgZW51bXNcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpO1xuICAgICAgICBhc3NlcnQoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpO1xuICAgICAgICBpZiAoZW51bUFzSW50ZWdlciB8fCAhdHlwZVsxXS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpXG4gICAgICAgICAgICAvLyBpZiB3ZSBkb24ndCBub3cgdGhlIGVudW0gdmFsdWUsIGp1c3QgcmV0dXJuIHRoZSBudW1iZXJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVbMl0pXG4gICAgICAgICAgICAvLyByZXN0b3JlIHRoZSBkcm9wcGVkIHByZWZpeFxuICAgICAgICAgICAgcmV0dXJuIHR5cGVbMl0gKyB0eXBlWzFdW3ZhbHVlXTtcbiAgICAgICAgcmV0dXJuIHR5cGVbMV1bdmFsdWVdO1xuICAgIH1cbiAgICBtZXNzYWdlKHR5cGUsIHZhbHVlLCBmaWVsZE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5lbWl0RGVmYXVsdFZhbHVlcyA/IG51bGwgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0eXBlLmludGVybmFsSnNvbldyaXRlKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgc2NhbGFyKHR5cGUsIHZhbHVlLCBmaWVsZE5hbWUsIG9wdGlvbmFsLCBlbWl0RGVmYXVsdFZhbHVlcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0KG9wdGlvbmFsKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWQgPSBlbWl0RGVmYXVsdFZhbHVlcyB8fCBvcHRpb25hbDtcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEZhbGxUaHJvdWdoSW5Td2l0Y2hTdGF0ZW1lbnRKU1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIC8vIGludDMyLCBmaXhlZDMyLCB1aW50MzI6IEpTT04gdmFsdWUgd2lsbCBiZSBhIGRlY2ltYWwgbnVtYmVyLiBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydFVJbnQzMih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgLy8gZmxvYXQsIGRvdWJsZTogSlNPTiB2YWx1ZSB3aWxsIGJlIGEgbnVtYmVyIG9yIG9uZSBvZiB0aGUgc3BlY2lhbCBzdHJpbmcgdmFsdWVzIFwiTmFOXCIsIFwiSW5maW5pdHlcIiwgYW5kIFwiLUluZmluaXR5XCIuXG4gICAgICAgICAgICAvLyBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC4gRXhwb25lbnQgbm90YXRpb24gaXMgYWxzbyBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GTE9BVDpcbiAgICAgICAgICAgICAgICBhc3NlcnRGbG9hdDMyKHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpO1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05hTic7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnSW5maW5pdHknO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy1JbmZpbml0eSc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgLy8gc3RyaW5nOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/ICcnIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGJvb2w6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdib29sZWFuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgLy8gSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBzdHJpbmcuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PSAnYmlnaW50Jyk7XG4gICAgICAgICAgICAgICAgbGV0IHVsb25nID0gUGJVTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodWxvbmcuaXNaZXJvKCkgJiYgIWVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bG9uZy50b1N0cmluZygpO1xuICAgICAgICAgICAgLy8gSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBzdHJpbmcuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDY0OlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQ2NDpcbiAgICAgICAgICAgICAgICBhc3NlcnQodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT0gJ2JpZ2ludCcpO1xuICAgICAgICAgICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChsb25nLmlzWmVybygpICYmICFlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9uZy50b1N0cmluZygpO1xuICAgICAgICAgICAgLy8gYnl0ZXM6IEpTT04gdmFsdWUgd2lsbCBiZSB0aGUgZGF0YSBlbmNvZGVkIGFzIGEgc3RyaW5nIHVzaW5nIHN0YW5kYXJkIGJhc2U2NCBlbmNvZGluZyB3aXRoIHBhZGRpbmdzLlxuICAgICAgICAgICAgLy8gRWl0aGVyIHN0YW5kYXJkIG9yIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZyB3aXRoL3dpdGhvdXQgcGFkZGluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgICAgIGFzc2VydCh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpO1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUuYnl0ZUxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gXCJcIiA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0ZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IExvbmdUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG4vKipcbiAqIFV0aWxpdHkgbWV0aG9kIHRvIGNvbnZlcnQgYSBQYkxvbmcgb3IgUGJVbG9uZyB0byBhIEphdmFTY3JpcHRcbiAqIHJlcHJlc2VudGF0aW9uIGR1cmluZyBydW50aW1lLlxuICpcbiAqIFdvcmtzIHdpdGggZ2VuZXJhdGVkIGZpZWxkIGluZm9ybWF0aW9uLCBgdW5kZWZpbmVkYCBpcyBlcXVpdmFsZW50XG4gKiB0byBgU1RSSU5HYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25Mb25nQ29udmVydChsb25nLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgTG9uZ1R5cGUuQklHSU5UOlxuICAgICAgICAgICAgcmV0dXJuIGxvbmcudG9CaWdJbnQoKTtcbiAgICAgICAgY2FzZSBMb25nVHlwZS5OVU1CRVI6XG4gICAgICAgICAgICByZXR1cm4gbG9uZy50b051bWJlcigpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICAvLyBjYXNlIExvbmdUeXBlLlNUUklORzpcbiAgICAgICAgICAgIHJldHVybiBsb25nLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBDb3B5IHBhcnRpYWwgZGF0YSBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAqXG4gKiBJZiBhIHNpbmd1bGFyIHNjYWxhciBvciBlbnVtIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgaXRcbiAqIHJlcGxhY2VzIHRoZSBmaWVsZCBpbiB0aGUgdGFyZ2V0LlxuICpcbiAqIElmIGEgc2luZ3VsYXIgbWVzc2FnZSBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGl0IGlzIG1lcmdlZFxuICogd2l0aCB0aGUgdGFyZ2V0IGZpZWxkIGJ5IGNhbGxpbmcgbWVyZ2VQYXJ0aWFsKCkgb2YgdGhlIHJlc3BvbnNpYmxlXG4gKiBtZXNzYWdlIHR5cGUuXG4gKlxuICogSWYgYSByZXBlYXRlZCBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGl0cyB2YWx1ZXMgcmVwbGFjZVxuICogYWxsIHZhbHVlcyBpbiB0aGUgdGFyZ2V0IGFycmF5LCByZW1vdmluZyBleHRyYW5lb3VzIHZhbHVlcy5cbiAqIFJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGFyZSBjb3BpZWQsIG5vdCBtZXJnZWQuXG4gKlxuICogSWYgYSBtYXAgZmllbGQgaXMgcHJlc2VudCBpbiB0aGUgc291cmNlLCBlbnRyaWVzIGFyZSBhZGRlZCB0byB0aGVcbiAqIHRhcmdldCBtYXAsIHJlcGxhY2luZyBlbnRyaWVzIHdpdGggdGhlIHNhbWUga2V5LiBFbnRyaWVzIHRoYXQgb25seVxuICogZXhpc3QgaW4gdGhlIHRhcmdldCByZW1haW4uIEVudHJpZXMgd2l0aCBtZXNzYWdlIHZhbHVlcyBhcmUgY29waWVkLFxuICogbm90IG1lcmdlZC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gcHJvdG9idWYgbWVyZ2Ugc2VtYW50aWNzLFxuICogd2hpY2ggYXBwZW5kcyByZXBlYXRlZCBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKGluZm8sIHRhcmdldCwgc291cmNlKSB7XG4gICAgbGV0IGZpZWxkVmFsdWUsIC8vIHRoZSBmaWVsZCB2YWx1ZSB3ZSBhcmUgd29ya2luZyB3aXRoXG4gICAgaW5wdXQgPSBzb3VyY2UsIG91dHB1dDsgLy8gd2hlcmUgd2Ugd2FudCBvdXIgZmllbGQgdmFsdWUgdG8gZ29cbiAgICBmb3IgKGxldCBmaWVsZCBvZiBpbmZvLmZpZWxkcykge1xuICAgICAgICBsZXQgbmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IGlucHV0W2ZpZWxkLm9uZW9mXTsgLy8gdGhpcyBpcyB0aGUgb25lb2ZgcyBncm91cCBpbiB0aGUgc291cmNlXG4gICAgICAgICAgICBpZiAoKGdyb3VwID09PSBudWxsIHx8IGdyb3VwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBncm91cC5vbmVvZktpbmQpID09IHVuZGVmaW5lZCkgeyAvLyB0aGUgdXNlciBpcyBmcmVlIHRvIG9taXRcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gd2Ugc2tpcCB0aGlzIGZpZWxkLCBhbmQgYWxsIG90aGVyIG1lbWJlcnMgdG9vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gZ3JvdXBbbmFtZV07IC8vIG91ciB2YWx1ZSBjb21lcyBmcm9tIHRoZSB0aGUgb25lb2YgZ3JvdXAgb2YgdGhlIHNvdXJjZVxuICAgICAgICAgICAgb3V0cHV0ID0gdGFyZ2V0W2ZpZWxkLm9uZW9mXTsgLy8gYW5kIG91ciBvdXRwdXQgaXMgdGhlIG9uZW9mIGdyb3VwIG9mIHRoZSB0YXJnZXRcbiAgICAgICAgICAgIG91dHB1dC5vbmVvZktpbmQgPSBncm91cC5vbmVvZktpbmQ7IC8vIGFsd2F5cyB1cGRhdGUgZGlzY3JpbWluYXRvclxuICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG91dHB1dFtuYW1lXTsgLy8gcmVtb3ZlIGFueSBleGlzdGluZyB2YWx1ZVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIGZ1cnRoZXIgd29yayBvbiBmaWVsZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGlucHV0W25hbWVdOyAvLyB3ZSBhcmUgdXNpbmcgdGhlIHNvdXJjZSBkaXJlY3RseVxuICAgICAgICAgICAgb3V0cHV0ID0gdGFyZ2V0OyAvLyB3ZSB3YW50IG91ciBmaWVsZCB2YWx1ZSB0byBnbyBkaXJlY3RseSBpbnRvIHRoZSB0YXJnZXRcbiAgICAgICAgICAgIGlmIChmaWVsZFZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIGZ1cnRoZXIgd29yayBvbiBmaWVsZCwgZXhpc3RpbmcgdmFsdWUgaXMgdXNlZCBhcyBpc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZC5yZXBlYXQpXG4gICAgICAgICAgICBvdXRwdXRbbmFtZV0ubGVuZ3RoID0gZmllbGRWYWx1ZS5sZW5ndGg7IC8vIHJlc2l6ZSB0YXJnZXQgYXJyYXkgdG8gbWF0Y2ggc291cmNlIGFycmF5XG4gICAgICAgIC8vIG5vdyB3ZSBqdXN0IHdvcmsgd2l0aCBgZmllbGRWYWx1ZWAgYW5kIGBvdXRwdXRgIHRvIG1lcmdlIHRoZSB2YWx1ZVxuICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZFZhbHVlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2ldID0gZmllbGRWYWx1ZVtpXTsgLy8gbm90IGEgcmVmZXJlbmNlIHR5cGVcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IGZpZWxkVmFsdWU7IC8vIG5vdCBhIHJlZmVyZW5jZSB0eXBlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgIGxldCBUID0gZmllbGQuVCgpO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZC5yZXBlYXQpXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRWYWx1ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXVtpXSA9IFQuY3JlYXRlKGZpZWxkVmFsdWVbaV0pO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG91dHB1dFtuYW1lXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmFtZV0gPSBULmNyZWF0ZShmaWVsZFZhbHVlKTsgLy8gbm90aGluZyB0byBtZXJnZSB3aXRoXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBULm1lcmdlUGFydGlhbChvdXRwdXRbbmFtZV0sIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgIC8vIE1hcCBhbmQgcmVwZWF0ZWQgZmllbGRzIGFyZSBzaW1wbHkgb3ZlcndyaXR0ZW4sIG5vdCBhcHBlbmRlZCBvciBtZXJnZWRcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dFtuYW1lXSwgZmllbGRWYWx1ZSk7IC8vIGVsZW1lbnRzIGFyZSBub3QgcmVmZXJlbmNlIHR5cGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBUID0gZmllbGQuVi5UKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrIG9mIE9iamVjdC5rZXlzKGZpZWxkVmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXVtrXSA9IFQuY3JlYXRlKGZpZWxkVmFsdWVba10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTG9uZ1R5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25Mb25nQ29udmVydCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tbG9uZy1jb252ZXJ0XCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG4vKipcbiAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgc2NhbGFyIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdCh0eXBlLCBsb25nVHlwZSA9IExvbmdUeXBlLlNUUklORykge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KFBiVUxvbmcuWkVSTywgbG9uZ1R5cGUpO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UNjQ6XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQ2NDpcbiAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJMb25nLlpFUk8sIGxvbmdUeXBlKTtcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkRPVUJMRTpcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgcmV0dXJuIDAuMDtcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTG9uZ1R5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IGlzT25lb2ZHcm91cCB9IGZyb20gXCIuL29uZW9mXCI7XG4vLyBub2luc3BlY3Rpb24gSlNNZXRob2RDYW5CZVN0YXRpY1xuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25UeXBlQ2hlY2sge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IChfYSA9IGluZm8uZmllbGRzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgcmVxID0gW10sIGtub3duID0gW10sIG9uZW9mcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvbmVvZnMuaW5jbHVkZXMoZmllbGQub25lb2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uZW9mcy5wdXNoKGZpZWxkLm9uZW9mKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgICAgICBrbm93bi5wdXNoKGZpZWxkLm9uZW9mKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBrbm93bi5wdXNoKGZpZWxkLmxvY2FsTmFtZSk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQub3B0IHx8IGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEucHVzaChmaWVsZC5sb2NhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5wdXNoKGZpZWxkLmxvY2FsTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnB1c2goZmllbGQubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGEgPSB7IHJlcSwga25vd24sIG9uZW9mczogT2JqZWN0LnZhbHVlcyhvbmVvZnMpIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBhcmd1bWVudCBhIHZhbGlkIG1lc3NhZ2UgYXMgc3BlY2lmaWVkIGJ5IHRoZVxuICAgICAqIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24/XG4gICAgICpcbiAgICAgKiBDaGVja3MgYWxsIGZpZWxkIHR5cGVzIHJlY3Vyc2l2ZWx5LiBUaGUgYGRlcHRoYFxuICAgICAqIHNwZWNpZmllcyBob3cgZGVlcCBpbnRvIHRoZSBzdHJ1Y3R1cmUgdGhlIGNoZWNrIHdpbGwgYmUuXG4gICAgICpcbiAgICAgKiBXaXRoIGEgZGVwdGggb2YgMCwgb25seSB0aGUgcHJlc2VuY2Ugb2YgZmllbGRzXG4gICAgICogaXMgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIFdpdGggYSBkZXB0aCBvZiAxIG9yIG1vcmUsIHRoZSBmaWVsZCB0eXBlcyBhcmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIFdpdGggYSBkZXB0aCBvZiAyIG9yIG1vcmUsIHRoZSBtZW1iZXJzIG9mIG1hcCwgcmVwZWF0ZWRcbiAgICAgKiBhbmQgbWVzc2FnZSBmaWVsZHMgYXJlIGNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBNZXNzYWdlIGZpZWxkcyB3aWxsIGJlIGNoZWNrZWQgcmVjdXJzaXZlbHkgd2l0aCBkZXB0aCAtIDEuXG4gICAgICpcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1hcCBlbnRyaWVzIC8gcmVwZWF0ZWQgdmFsdWVzIGJlaW5nIGNoZWNrZWRcbiAgICAgKiBpcyA8IGRlcHRoLlxuICAgICAqL1xuICAgIGlzKG1lc3NhZ2UsIGRlcHRoLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAoZGVwdGggPCAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWVzc2FnZSAhPSAnb2JqZWN0JylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobWVzc2FnZSksIGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIC8vIGlmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZyBpbiBhcmcsIHRoaXMgY2Fubm90IGJlIGEgVFxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPCBkYXRhLnJlcS5sZW5ndGggfHwgZGF0YS5yZXEuc29tZShuID0+ICFrZXlzLmluY2x1ZGVzKG4pKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBhcmcgY29udGFpbnMgYSBrZXkgd2UgZG9udCBrbm93LCB0aGlzIGlzIG5vdCBhIGxpdGVyYWwgVFxuICAgICAgICAgICAgaWYgKGtleXMuc29tZShrID0+ICFkYXRhLmtub3duLmluY2x1ZGVzKGspKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gXCJXaXRoIGEgZGVwdGggb2YgMCwgb25seSB0aGUgcHJlc2VuY2UgYW5kIGFic2VuY2Ugb2YgZmllbGRzIGlzIGNoZWNrZWQuXCJcbiAgICAgICAgLy8gXCJXaXRoIGEgZGVwdGggb2YgMSBvciBtb3JlLCB0aGUgZmllbGQgdHlwZXMgYXJlIGNoZWNrZWQuXCJcbiAgICAgICAgaWYgKGRlcHRoIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgb25lb2YgZ3JvdXBcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIGRhdGEub25lb2ZzKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IG1lc3NhZ2VbbmFtZV07XG4gICAgICAgICAgICBpZiAoIWlzT25lb2ZHcm91cChncm91cCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGdyb3VwLm9uZW9mS2luZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5maW5kKGYgPT4gZi5sb2NhbE5hbWUgPT09IGdyb3VwLm9uZW9mS2luZCk7XG4gICAgICAgICAgICBpZiAoIWZpZWxkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2UgZm91bmQgbm8gZmllbGQsIGJ1dCBoYXZlIGEga2luZCwgc29tZXRoaW5nIGlzIHdyb25nXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmllbGQoZ3JvdXBbZ3JvdXAub25lb2ZLaW5kXSwgZmllbGQsIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB0eXBlc1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQub25lb2YgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWVsZChtZXNzYWdlW2ZpZWxkLmxvY2FsTmFtZV0sIGZpZWxkLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZpZWxkKGFyZywgZmllbGQsIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpIHtcbiAgICAgICAgbGV0IHJlcGVhdGVkID0gZmllbGQucmVwZWF0O1xuICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBpZiAoYXJnID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC5vcHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGFyZywgZmllbGQuVCwgZGVwdGgsIGZpZWxkLkwpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcihhcmcsIGZpZWxkLlQsIGZpZWxkLkwpO1xuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICBpZiAoYXJnID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC5vcHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGFyZywgU2NhbGFyVHlwZS5JTlQzMiwgZGVwdGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcihhcmcsIFNjYWxhclR5cGUuSU5UMzIpO1xuICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICBpZiAoYXJnID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZXMoYXJnLCBmaWVsZC5UKCksIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2UoYXJnLCBmaWVsZC5UKCksIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpO1xuICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9ICdvYmplY3QnIHx8IGFyZyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8IDIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXBLZXlzKGFyZywgZmllbGQuSywgZGVwdGgpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFycyhPYmplY3QudmFsdWVzKGFyZyksIGZpZWxkLlYuVCwgZGVwdGgsIGZpZWxkLlYuTCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKE9iamVjdC52YWx1ZXMoYXJnKSwgU2NhbGFyVHlwZS5JTlQzMiwgZGVwdGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZXMoT2JqZWN0LnZhbHVlcyhhcmcpLCBmaWVsZC5WLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBtZXNzYWdlKGFyZywgdHlwZSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkge1xuICAgICAgICBpZiAoYWxsb3dFeGNlc3NQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5pc0Fzc2lnbmFibGUoYXJnLCBkZXB0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGUuaXMoYXJnLCBkZXB0aCk7XG4gICAgfVxuICAgIG1lc3NhZ2VzKGFyZywgdHlwZSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRlcHRoIDwgMilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoYWxsb3dFeGNlc3NQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZy5sZW5ndGggJiYgaSA8IGRlcHRoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzQXNzaWduYWJsZShhcmdbaV0sIGRlcHRoIC0gMSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnLmxlbmd0aCAmJiBpIDwgZGVwdGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXMoYXJnW2ldLCBkZXB0aCAtIDEpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNjYWxhcihhcmcsIHR5cGUsIGxvbmdUeXBlKSB7XG4gICAgICAgIGxldCBhcmdUeXBlID0gdHlwZW9mIGFyZztcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UNjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgIHN3aXRjaCAobG9uZ1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBMb25nVHlwZS5CSUdJTlQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSBcImJpZ2ludFwiO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExvbmdUeXBlLk5VTUJFUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwibnVtYmVyXCIgJiYgIWlzTmFOKGFyZyk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSBcInN0cmluZ1wiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09ICdib29sZWFuJztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ3N0cmluZyc7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09ICdudW1iZXInICYmICFpc05hTihhcmcpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGFyZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2NhbGFycyhhcmcsIHR5cGUsIGRlcHRoLCBsb25nVHlwZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJnKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRlcHRoIDwgMilcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmcubGVuZ3RoICYmIGkgPCBkZXB0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2FsYXIoYXJnW2ldLCB0eXBlLCBsb25nVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1hcEtleXMobWFwLCB0eXBlLCBkZXB0aCkge1xuICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG1hcCk7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGtleXMuc2xpY2UoMCwgZGVwdGgpLm1hcChrID0+IHBhcnNlSW50KGspKSwgdHlwZSwgZGVwdGgpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFycyhrZXlzLnNsaWNlKDAsIGRlcHRoKS5tYXAoayA9PiBrID09ICd0cnVlJyA/IHRydWUgOiBrID09ICdmYWxzZScgPyBmYWxzZSA6IGspLCB0eXBlLCBkZXB0aCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoa2V5cywgdHlwZSwgZGVwdGgsIExvbmdUeXBlLlNUUklORyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXF1aXJlZEFyZ3MocmVxdWlyZWQsIGFyZ3MpIHtcbiAgaWYgKGFyZ3MubGVuZ3RoIDwgcmVxdWlyZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHJlcXVpcmVkICsgJyBhcmd1bWVudCcgKyAocmVxdWlyZWQgPiAxID8gJ3MnIDogJycpICsgJyByZXF1aXJlZCwgYnV0IG9ubHkgJyArIGFyZ3MubGVuZ3RoICsgJyBwcmVzZW50Jyk7XG4gIH1cbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0ludGVnZXIoZGlydHlOdW1iZXIpIHtcbiAgaWYgKGRpcnR5TnVtYmVyID09PSBudWxsIHx8IGRpcnR5TnVtYmVyID09PSB0cnVlIHx8IGRpcnR5TnVtYmVyID09PSBmYWxzZSkge1xuICAgIHJldHVybiBOYU47XG4gIH1cbiAgdmFyIG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG4gIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuICByZXR1cm4gbnVtYmVyIDwgMCA/IE1hdGguY2VpbChudW1iZXIpIDogTWF0aC5mbG9vcihudW1iZXIpO1xufSIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGFkZE1pbGxpc2Vjb25kc1xuICogQGNhdGVnb3J5IE1pbGxpc2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0byBiZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge051bWJlcn0gYW1vdW50IC0gdGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgbWlsbGlzZWNvbmRzIGFkZGVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCA3NTAgbWlsbGlzZWNvbmRzIHRvIDEwIEp1bHkgMjAxNCAxMjo0NTozMC4wMDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRNaWxsaXNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMzAsIDApLCA3NTApXG4gKiAvLz0+IFRodSBKdWwgMTAgMjAxNCAxMjo0NTozMC43NTBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkTWlsbGlzZWNvbmRzKGRpcnR5RGF0ZSwgZGlydHlBbW91bnQpIHtcbiAgcmVxdWlyZWRBcmdzKDIsIGFyZ3VtZW50cyk7XG4gIHZhciB0aW1lc3RhbXAgPSB0b0RhdGUoZGlydHlEYXRlKS5nZXRUaW1lKCk7XG4gIHZhciBhbW91bnQgPSB0b0ludGVnZXIoZGlydHlBbW91bnQpO1xuICByZXR1cm4gbmV3IERhdGUodGltZXN0YW1wICsgYW1vdW50KTtcbn0iLCJpbXBvcnQgdG9JbnRlZ2VyIGZyb20gXCIuLi9fbGliL3RvSW50ZWdlci9pbmRleC5qc1wiO1xuaW1wb3J0IGFkZE1pbGxpc2Vjb25kcyBmcm9tIFwiLi4vYWRkTWlsbGlzZWNvbmRzL2luZGV4LmpzXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSBhZGRTZWNvbmRzXG4gKiBAY2F0ZWdvcnkgU2Vjb25kIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzIHRvIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBhbW91bnQgLSB0aGUgYW1vdW50IG9mIHNlY29uZHMgdG8gYmUgYWRkZWQuIFBvc2l0aXZlIGRlY2ltYWxzIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5mbG9vcmAsIGRlY2ltYWxzIGxlc3MgdGhhbiB6ZXJvIHdpbGwgYmUgcm91bmRlZCB1c2luZyBgTWF0aC5jZWlsYC5cbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgbmV3IGRhdGUgd2l0aCB0aGUgc2Vjb25kcyBhZGRlZFxuICogQHRocm93cyB7VHlwZUVycm9yfSAyIGFyZ3VtZW50cyByZXF1aXJlZFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBZGQgMzAgc2Vjb25kcyB0byAxMCBKdWx5IDIwMTQgMTI6NDU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBhZGRTZWNvbmRzKG5ldyBEYXRlKDIwMTQsIDYsIDEwLCAxMiwgNDUsIDApLCAzMClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZFNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBhbW91bnQgKiAxMDAwKTtcbn0iLCJpbXBvcnQgdG9EYXRlIGZyb20gXCIuLi90b0RhdGUvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGlzQmVmb3JlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIElzIHRoZSBmaXJzdCBkYXRlIGJlZm9yZSB0aGUgc2Vjb25kIG9uZT9cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdGhhdCBzaG91bGQgYmUgYmVmb3JlIHRoZSBvdGhlciBvbmUgdG8gcmV0dXJuIHRydWVcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGVUb0NvbXBhcmUgLSB0aGUgZGF0ZSB0byBjb21wYXJlIHdpdGhcbiAqIEByZXR1cm5zIHtCb29sZWFufSB0aGUgZmlyc3QgZGF0ZSBpcyBiZWZvcmUgdGhlIHNlY29uZCBkYXRlXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIElzIDEwIEp1bHkgMTk4OSBiZWZvcmUgMTEgRmVicnVhcnkgMTk4Nz9cbiAqIGNvbnN0IHJlc3VsdCA9IGlzQmVmb3JlKG5ldyBEYXRlKDE5ODksIDYsIDEwKSwgbmV3IERhdGUoMTk4NywgMSwgMTEpKVxuICogLy89PiBmYWxzZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0JlZm9yZShkaXJ0eURhdGUsIGRpcnR5RGF0ZVRvQ29tcGFyZSkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIGRhdGUgPSB0b0RhdGUoZGlydHlEYXRlKTtcbiAgdmFyIGRhdGVUb0NvbXBhcmUgPSB0b0RhdGUoZGlydHlEYXRlVG9Db21wYXJlKTtcbiAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpIDwgZGF0ZVRvQ29tcGFyZS5nZXRUaW1lKCk7XG59IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3R5cGVvZlwiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgdG9EYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBEYXRlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdHMgY2xvbmUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgbnVtYmVyLCBpdCBpcyB0cmVhdGVkIGFzIGEgdGltZXN0YW1wLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBub25lIG9mIHRoZSBhYm92ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgSW52YWxpZCBEYXRlLlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGFyZ3VtZW50IC0gdGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtEYXRlfSB0aGUgcGFyc2VkIGRhdGUgaW4gdGhlIGxvY2FsIHRpbWUgem9uZVxuICogQHRocm93cyB7VHlwZUVycm9yfSAxIGFyZ3VtZW50IHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0RhdGUoYXJndW1lbnQpIHtcbiAgcmVxdWlyZWRBcmdzKDEsIGFyZ3VtZW50cyk7XG4gIHZhciBhcmdTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpO1xuXG4gIC8vIENsb25lIHRoZSBkYXRlXG4gIGlmIChhcmd1bWVudCBpbnN0YW5jZW9mIERhdGUgfHwgX3R5cGVvZihhcmd1bWVudCkgPT09ICdvYmplY3QnICYmIGFyZ1N0ciA9PT0gJ1tvYmplY3QgRGF0ZV0nKSB7XG4gICAgLy8gUHJldmVudCB0aGUgZGF0ZSB0byBsb3NlIHRoZSBtaWxsaXNlY29uZHMgd2hlbiBwYXNzZWQgdG8gbmV3IERhdGUoKSBpbiBJRTEwXG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50LmdldFRpbWUoKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnbnVtYmVyJyB8fCBhcmdTdHIgPT09ICdbb2JqZWN0IE51bWJlcl0nKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycgfHwgYXJnU3RyID09PSAnW29iamVjdCBTdHJpbmddJykgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFwiU3RhcnRpbmcgd2l0aCB2Mi4wLjAtYmV0YS4xIGRhdGUtZm5zIGRvZXNuJ3QgYWNjZXB0IHN0cmluZ3MgYXMgZGF0ZSBhcmd1bWVudHMuIFBsZWFzZSB1c2UgYHBhcnNlSVNPYCB0byBwYXJzZSBzdHJpbmdzLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VwZ3JhZGVHdWlkZS5tZCNzdHJpbmctYXJndW1lbnRzXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihuZXcgRXJyb3IoKS5zdGFjayk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShOYU4pO1xuICB9XG59IiwiLyogZXNsaW50LWRpc2FibGUgbm8tdmFyLCBwcmVmZXItdGVtcGxhdGUgKi9cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gL1tBLVpdL2dcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS9cbnZhciBjYWNoZSA9IHt9XG5cbmZ1bmN0aW9uIHRvSHlwaGVuTG93ZXIobWF0Y2gpIHtcbiAgcmV0dXJuICctJyArIG1hdGNoLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKG5hbWUpIHtcbiAgaWYgKGNhY2hlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgcmV0dXJuIGNhY2hlW25hbWVdXG4gIH1cblxuICB2YXIgaE5hbWUgPSBuYW1lLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgdG9IeXBoZW5Mb3dlcilcbiAgcmV0dXJuIChjYWNoZVtuYW1lXSA9IG1zUGF0dGVybi50ZXN0KGhOYW1lKSA/ICctJyArIGhOYW1lIDogaE5hbWUpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGh5cGhlbmF0ZVN0eWxlTmFtZVxuIiwidmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnQgdmFyIGlzQnJvd3NlciA9ICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yod2luZG93KSkgPT09IFwib2JqZWN0XCIgJiYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKGRvY3VtZW50KSkgPT09ICdvYmplY3QnICYmIGRvY3VtZW50Lm5vZGVUeXBlID09PSA5O1xuXG5leHBvcnQgZGVmYXVsdCBpc0Jyb3dzZXI7XG4iLCJpbXBvcnQgaHlwaGVuYXRlIGZyb20gJ2h5cGhlbmF0ZS1zdHlsZS1uYW1lJztcblxuLyoqXG4gKiBDb252ZXJ0IGNhbWVsIGNhc2VkIHByb3BlcnR5IG5hbWVzIHRvIGRhc2ggc2VwYXJhdGVkLlxuICovXG5cbmZ1bmN0aW9uIGNvbnZlcnRDYXNlKHN0eWxlKSB7XG4gIHZhciBjb252ZXJ0ZWQgPSB7fTtcblxuICBmb3IgKHZhciBwcm9wIGluIHN0eWxlKSB7XG4gICAgdmFyIGtleSA9IHByb3AuaW5kZXhPZignLS0nKSA9PT0gMCA/IHByb3AgOiBoeXBoZW5hdGUocHJvcCk7XG4gICAgY29udmVydGVkW2tleV0gPSBzdHlsZVtwcm9wXTtcbiAgfVxuXG4gIGlmIChzdHlsZS5mYWxsYmFja3MpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5mYWxsYmFja3MpKSBjb252ZXJ0ZWQuZmFsbGJhY2tzID0gc3R5bGUuZmFsbGJhY2tzLm1hcChjb252ZXJ0Q2FzZSk7ZWxzZSBjb252ZXJ0ZWQuZmFsbGJhY2tzID0gY29udmVydENhc2Uoc3R5bGUuZmFsbGJhY2tzKTtcbiAgfVxuXG4gIHJldHVybiBjb252ZXJ0ZWQ7XG59XG4vKipcbiAqIEFsbG93IGNhbWVsIGNhc2VkIHByb3BlcnR5IG5hbWVzIGJ5IGNvbnZlcnRpbmcgdGhlbSBiYWNrIHRvIGRhc2hlcml6ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBjYW1lbENhc2UoKSB7XG4gIGZ1bmN0aW9uIG9uUHJvY2Vzc1N0eWxlKHN0eWxlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUpKSB7XG4gICAgICAvLyBIYW5kbGUgcnVsZXMgbGlrZSBAZm9udC1mYWNlLCB3aGljaCBjYW4gaGF2ZSBtdWx0aXBsZSBzdHlsZXMgaW4gYW4gYXJyYXlcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdHlsZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgc3R5bGVbaW5kZXhdID0gY29udmVydENhc2Uoc3R5bGVbaW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0Q2FzZShzdHlsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkNoYW5nZVZhbHVlKHZhbHVlLCBwcm9wLCBydWxlKSB7XG4gICAgaWYgKHByb3AuaW5kZXhPZignLS0nKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHZhciBoeXBoZW5hdGVkUHJvcCA9IGh5cGhlbmF0ZShwcm9wKTsgLy8gVGhlcmUgd2FzIG5vIGNhbWVsIGNhc2UgaW4gcGxhY2VcblxuICAgIGlmIChwcm9wID09PSBoeXBoZW5hdGVkUHJvcCkgcmV0dXJuIHZhbHVlO1xuICAgIHJ1bGUucHJvcChoeXBoZW5hdGVkUHJvcCwgdmFsdWUpOyAvLyBDb3JlIHdpbGwgaWdub3JlIHRoYXQgcHJvcGVydHkgdmFsdWUgd2Ugc2V0IHRoZSBwcm9wZXIgb25lIGFib3ZlLlxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9uUHJvY2Vzc1N0eWxlOiBvblByb2Nlc3NTdHlsZSxcbiAgICBvbkNoYW5nZVZhbHVlOiBvbkNoYW5nZVZhbHVlXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhbWVsQ2FzZTtcbiIsImltcG9ydCBfZXh0ZW5kcyBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzJztcbmltcG9ydCB7IFJ1bGVMaXN0IH0gZnJvbSAnanNzJztcblxudmFyIGF0ID0gJ0BnbG9iYWwnO1xudmFyIGF0UHJlZml4ID0gJ0BnbG9iYWwgJztcblxudmFyIEdsb2JhbENvbnRhaW5lclJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbG9iYWxDb250YWluZXJSdWxlKGtleSwgc3R5bGVzLCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlID0gJ2dsb2JhbCc7XG4gICAgdGhpcy5hdCA9IGF0O1xuICAgIHRoaXMuaXNQcm9jZXNzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMucnVsZXMgPSBuZXcgUnVsZUxpc3QoX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIHBhcmVudDogdGhpc1xuICAgIH0pKTtcblxuICAgIGZvciAodmFyIHNlbGVjdG9yIGluIHN0eWxlcykge1xuICAgICAgdGhpcy5ydWxlcy5hZGQoc2VsZWN0b3IsIHN0eWxlc1tzZWxlY3Rvcl0pO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMucHJvY2VzcygpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgYSBydWxlLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBHbG9iYWxDb250YWluZXJSdWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0UnVsZSA9IGZ1bmN0aW9uIGdldFJ1bGUobmFtZSkge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLmdldChuYW1lKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGFuZCByZWdpc3RlciBydWxlLCBydW4gcGx1Z2lucy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uYWRkUnVsZSA9IGZ1bmN0aW9uIGFkZFJ1bGUobmFtZSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgcnVsZSA9IHRoaXMucnVsZXMuYWRkKG5hbWUsIHN0eWxlLCBvcHRpb25zKTtcbiAgICBpZiAocnVsZSkgdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUocnVsZSk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cbiAgLyoqXG4gICAqIFJlcGxhY2UgcnVsZSwgcnVuIHBsdWdpbnMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlcGxhY2VSdWxlID0gZnVuY3Rpb24gcmVwbGFjZVJ1bGUobmFtZSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgbmV3UnVsZSA9IHRoaXMucnVsZXMucmVwbGFjZShuYW1lLCBzdHlsZSwgb3B0aW9ucyk7XG4gICAgaWYgKG5ld1J1bGUpIHRoaXMub3B0aW9ucy5qc3MucGx1Z2lucy5vblByb2Nlc3NSdWxlKG5ld1J1bGUpO1xuICAgIHJldHVybiBuZXdSdWxlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgaW5kZXggb2YgYSBydWxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZihydWxlKSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZXMuaW5kZXhPZihydWxlKTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQ1NTIHN0cmluZy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZXMudG9TdHJpbmcob3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIEdsb2JhbENvbnRhaW5lclJ1bGU7XG59KCk7XG5cbnZhciBHbG9iYWxQcmVmaXhlZFJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBHbG9iYWxQcmVmaXhlZFJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICdnbG9iYWwnO1xuICAgIHRoaXMuYXQgPSBhdDtcbiAgICB0aGlzLmlzUHJvY2Vzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB2YXIgc2VsZWN0b3IgPSBrZXkuc3Vic3RyKGF0UHJlZml4Lmxlbmd0aCk7XG4gICAgdGhpcy5ydWxlID0gb3B0aW9ucy5qc3MuY3JlYXRlUnVsZShzZWxlY3Rvciwgc3R5bGUsIF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBwYXJlbnQ6IHRoaXNcbiAgICB9KSk7XG4gIH1cblxuICB2YXIgX3Byb3RvMiA9IEdsb2JhbFByZWZpeGVkUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMi50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlID8gdGhpcy5ydWxlLnRvU3RyaW5nKG9wdGlvbnMpIDogJyc7XG4gIH07XG5cbiAgcmV0dXJuIEdsb2JhbFByZWZpeGVkUnVsZTtcbn0oKTtcblxudmFyIHNlcGFyYXRvclJlZ0V4cCA9IC9cXHMqLFxccyovZztcblxuZnVuY3Rpb24gYWRkU2NvcGUoc2VsZWN0b3IsIHNjb3BlKSB7XG4gIHZhciBwYXJ0cyA9IHNlbGVjdG9yLnNwbGl0KHNlcGFyYXRvclJlZ0V4cCk7XG4gIHZhciBzY29wZWQgPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgc2NvcGVkICs9IHNjb3BlICsgXCIgXCIgKyBwYXJ0c1tpXS50cmltKCk7XG4gICAgaWYgKHBhcnRzW2kgKyAxXSkgc2NvcGVkICs9ICcsICc7XG4gIH1cblxuICByZXR1cm4gc2NvcGVkO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVOZXN0ZWRHbG9iYWxDb250YWluZXJSdWxlKHJ1bGUsIHNoZWV0KSB7XG4gIHZhciBvcHRpb25zID0gcnVsZS5vcHRpb25zLFxuICAgICAgc3R5bGUgPSBydWxlLnN0eWxlO1xuICB2YXIgcnVsZXMgPSBzdHlsZSA/IHN0eWxlW2F0XSA6IG51bGw7XG4gIGlmICghcnVsZXMpIHJldHVybjtcblxuICBmb3IgKHZhciBuYW1lIGluIHJ1bGVzKSB7XG4gICAgc2hlZXQuYWRkUnVsZShuYW1lLCBydWxlc1tuYW1lXSwgX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIHNlbGVjdG9yOiBhZGRTY29wZShuYW1lLCBydWxlLnNlbGVjdG9yKVxuICAgIH0pKTtcbiAgfVxuXG4gIGRlbGV0ZSBzdHlsZVthdF07XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVByZWZpeGVkR2xvYmFsUnVsZShydWxlLCBzaGVldCkge1xuICB2YXIgb3B0aW9ucyA9IHJ1bGUub3B0aW9ucyxcbiAgICAgIHN0eWxlID0gcnVsZS5zdHlsZTtcblxuICBmb3IgKHZhciBwcm9wIGluIHN0eWxlKSB7XG4gICAgaWYgKHByb3BbMF0gIT09ICdAJyB8fCBwcm9wLnN1YnN0cigwLCBhdC5sZW5ndGgpICE9PSBhdCkgY29udGludWU7XG4gICAgdmFyIHNlbGVjdG9yID0gYWRkU2NvcGUocHJvcC5zdWJzdHIoYXQubGVuZ3RoKSwgcnVsZS5zZWxlY3Rvcik7XG4gICAgc2hlZXQuYWRkUnVsZShzZWxlY3Rvciwgc3R5bGVbcHJvcF0sIF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3JcbiAgICB9KSk7XG4gICAgZGVsZXRlIHN0eWxlW3Byb3BdO1xuICB9XG59XG4vKipcbiAqIENvbnZlcnQgbmVzdGVkIHJ1bGVzIHRvIHNlcGFyYXRlLCByZW1vdmUgdGhlbSBmcm9tIG9yaWdpbmFsIHN0eWxlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGpzc0dsb2JhbCgpIHtcbiAgZnVuY3Rpb24gb25DcmVhdGVSdWxlKG5hbWUsIHN0eWxlcywgb3B0aW9ucykge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAobmFtZSA9PT0gYXQpIHtcbiAgICAgIHJldHVybiBuZXcgR2xvYmFsQ29udGFpbmVyUnVsZShuYW1lLCBzdHlsZXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChuYW1lWzBdID09PSAnQCcgJiYgbmFtZS5zdWJzdHIoMCwgYXRQcmVmaXgubGVuZ3RoKSA9PT0gYXRQcmVmaXgpIHtcbiAgICAgIHJldHVybiBuZXcgR2xvYmFsUHJlZml4ZWRSdWxlKG5hbWUsIHN0eWxlcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgaWYgKHBhcmVudC50eXBlID09PSAnZ2xvYmFsJyB8fCBwYXJlbnQub3B0aW9ucy5wYXJlbnQgJiYgcGFyZW50Lm9wdGlvbnMucGFyZW50LnR5cGUgPT09ICdnbG9iYWwnKSB7XG4gICAgICAgIG9wdGlvbnMuc2NvcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLnNlbGVjdG9yICYmIG9wdGlvbnMuc2NvcGVkID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5zZWxlY3RvciA9IG5hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBvblByb2Nlc3NSdWxlKHJ1bGUsIHNoZWV0KSB7XG4gICAgaWYgKHJ1bGUudHlwZSAhPT0gJ3N0eWxlJyB8fCAhc2hlZXQpIHJldHVybjtcbiAgICBoYW5kbGVOZXN0ZWRHbG9iYWxDb250YWluZXJSdWxlKHJ1bGUsIHNoZWV0KTtcbiAgICBoYW5kbGVQcmVmaXhlZEdsb2JhbFJ1bGUocnVsZSwgc2hlZXQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvbkNyZWF0ZVJ1bGU6IG9uQ3JlYXRlUnVsZSxcbiAgICBvblByb2Nlc3NSdWxlOiBvblByb2Nlc3NSdWxlXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGpzc0dsb2JhbDtcbiIsImltcG9ydCBfZXh0ZW5kcyBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzJztcbmltcG9ydCBpc0luQnJvd3NlciBmcm9tICdpcy1pbi1icm93c2VyJztcbmltcG9ydCB3YXJuaW5nIGZyb20gJ3Rpbnktd2FybmluZyc7XG5pbXBvcnQgX2NyZWF0ZUNsYXNzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzJztcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlJztcbmltcG9ydCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZCc7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSc7XG5cbnZhciBwbGFpbk9iamVjdENvbnN0cnVyY3RvciA9IHt9LmNvbnN0cnVjdG9yO1xuZnVuY3Rpb24gY2xvbmVTdHlsZShzdHlsZSkge1xuICBpZiAoc3R5bGUgPT0gbnVsbCB8fCB0eXBlb2Ygc3R5bGUgIT09ICdvYmplY3QnKSByZXR1cm4gc3R5bGU7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0eWxlKSkgcmV0dXJuIHN0eWxlLm1hcChjbG9uZVN0eWxlKTtcbiAgaWYgKHN0eWxlLmNvbnN0cnVjdG9yICE9PSBwbGFpbk9iamVjdENvbnN0cnVyY3RvcikgcmV0dXJuIHN0eWxlO1xuICB2YXIgbmV3U3R5bGUgPSB7fTtcblxuICBmb3IgKHZhciBuYW1lIGluIHN0eWxlKSB7XG4gICAgbmV3U3R5bGVbbmFtZV0gPSBjbG9uZVN0eWxlKHN0eWxlW25hbWVdKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdHlsZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBydWxlIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVJ1bGUobmFtZSwgZGVjbCwgb3B0aW9ucykge1xuICBpZiAobmFtZSA9PT0gdm9pZCAwKSB7XG4gICAgbmFtZSA9ICd1bm5hbWVkJztcbiAgfVxuXG4gIHZhciBqc3MgPSBvcHRpb25zLmpzcztcbiAgdmFyIGRlY2xDb3B5ID0gY2xvbmVTdHlsZShkZWNsKTtcbiAgdmFyIHJ1bGUgPSBqc3MucGx1Z2lucy5vbkNyZWF0ZVJ1bGUobmFtZSwgZGVjbENvcHksIG9wdGlvbnMpO1xuICBpZiAocnVsZSkgcmV0dXJuIHJ1bGU7IC8vIEl0IGlzIGFuIGF0LXJ1bGUgYW5kIGl0IGhhcyBubyBpbnN0YW5jZS5cblxuICBpZiAobmFtZVswXSA9PT0gJ0AnKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBVbmtub3duIHJ1bGUgXCIgKyBuYW1lKSA6IHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgam9pbiA9IGZ1bmN0aW9uIGpvaW4odmFsdWUsIGJ5KSB7XG4gIHZhciByZXN1bHQgPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gUmVtb3ZlICFpbXBvcnRhbnQgZnJvbSB0aGUgdmFsdWUsIGl0IHdpbGwgYmUgcmVhZGRlZCBsYXRlci5cbiAgICBpZiAodmFsdWVbaV0gPT09ICchaW1wb3J0YW50JykgYnJlYWs7XG4gICAgaWYgKHJlc3VsdCkgcmVzdWx0ICs9IGJ5O1xuICAgIHJlc3VsdCArPSB2YWx1ZVtpXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuLyoqXG4gKiBDb252ZXJ0cyBKU1MgYXJyYXkgdmFsdWUgdG8gYSBDU1Mgc3RyaW5nLlxuICpcbiAqIGBtYXJnaW46IFtbJzVweCcsICcxMHB4J11dYCA+IGBtYXJnaW46IDVweCAxMHB4O2BcbiAqIGBib3JkZXI6IFsnMXB4JywgJzJweCddYCA+IGBib3JkZXI6IDFweCwgMnB4O2BcbiAqIGBtYXJnaW46IFtbJzVweCcsICcxMHB4J10sICchaW1wb3J0YW50J11gID4gYG1hcmdpbjogNXB4IDEwcHggIWltcG9ydGFudDtgXG4gKiBgY29sb3I6IFsncmVkJywgIWltcG9ydGFudF1gID4gYGNvbG9yOiByZWQgIWltcG9ydGFudDtgXG4gKi9cblxuXG52YXIgdG9Dc3NWYWx1ZSA9IGZ1bmN0aW9uIHRvQ3NzVmFsdWUodmFsdWUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICB2YXIgY3NzVmFsdWUgPSAnJzsgLy8gU3VwcG9ydCBzcGFjZSBzZXBhcmF0ZWQgdmFsdWVzIHZpYSBgW1snNXB4JywgJzEwcHgnXV1gLlxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlWzBdKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWx1ZVtpXSA9PT0gJyFpbXBvcnRhbnQnKSBicmVhaztcbiAgICAgIGlmIChjc3NWYWx1ZSkgY3NzVmFsdWUgKz0gJywgJztcbiAgICAgIGNzc1ZhbHVlICs9IGpvaW4odmFsdWVbaV0sICcgJyk7XG4gICAgfVxuICB9IGVsc2UgY3NzVmFsdWUgPSBqb2luKHZhbHVlLCAnLCAnKTsgLy8gQWRkICFpbXBvcnRhbnQsIGJlY2F1c2UgaXQgd2FzIGlnbm9yZWQuXG5cblxuICBpZiAodmFsdWVbdmFsdWUubGVuZ3RoIC0gMV0gPT09ICchaW1wb3J0YW50Jykge1xuICAgIGNzc1ZhbHVlICs9ICcgIWltcG9ydGFudCc7XG4gIH1cblxuICByZXR1cm4gY3NzVmFsdWU7XG59O1xuXG5mdW5jdGlvbiBnZXRXaGl0ZXNwYWNlU3ltYm9scyhvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZm9ybWF0ID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7XG4gICAgICBsaW5lYnJlYWs6ICcnLFxuICAgICAgc3BhY2U6ICcnXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGluZWJyZWFrOiAnXFxuJyxcbiAgICBzcGFjZTogJyAnXG4gIH07XG59XG5cbi8qKlxuICogSW5kZW50IGEgc3RyaW5nLlxuICogaHR0cDovL2pzcGVyZi5jb20vYXJyYXktam9pbi12cy1mb3JcbiAqL1xuXG5mdW5jdGlvbiBpbmRlbnRTdHIoc3RyLCBpbmRlbnQpIHtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBpbmRlbnQ7IGluZGV4KyspIHtcbiAgICByZXN1bHQgKz0gJyAgJztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgKyBzdHI7XG59XG4vKipcbiAqIENvbnZlcnRzIGEgUnVsZSB0byBDU1Mgc3RyaW5nLlxuICovXG5cblxuZnVuY3Rpb24gdG9Dc3Moc2VsZWN0b3IsIHN0eWxlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICghc3R5bGUpIHJldHVybiByZXN1bHQ7XG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRpbmRlbnQgPSBfb3B0aW9ucy5pbmRlbnQsXG4gICAgICBpbmRlbnQgPSBfb3B0aW9ucyRpbmRlbnQgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRpbmRlbnQ7XG4gIHZhciBmYWxsYmFja3MgPSBzdHlsZS5mYWxsYmFja3M7XG5cbiAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSBmYWxzZSkge1xuICAgIGluZGVudCA9IC1JbmZpbml0eTtcbiAgfVxuXG4gIHZhciBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMgPSBnZXRXaGl0ZXNwYWNlU3ltYm9scyhvcHRpb25zKSxcbiAgICAgIGxpbmVicmVhayA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5saW5lYnJlYWssXG4gICAgICBzcGFjZSA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5zcGFjZTtcblxuICBpZiAoc2VsZWN0b3IpIGluZGVudCsrOyAvLyBBcHBseSBmYWxsYmFja3MgZmlyc3QuXG5cbiAgaWYgKGZhbGxiYWNrcykge1xuICAgIC8vIEFycmF5IHN5bnRheCB7ZmFsbGJhY2tzOiBbe3Byb3A6IHZhbHVlfV19XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmFsbGJhY2tzKSkge1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGZhbGxiYWNrcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdmFyIGZhbGxiYWNrID0gZmFsbGJhY2tzW2luZGV4XTtcblxuICAgICAgICBmb3IgKHZhciBwcm9wIGluIGZhbGxiYWNrKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gZmFsbGJhY2tbcHJvcF07XG5cbiAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkgcmVzdWx0ICs9IGxpbmVicmVhaztcbiAgICAgICAgICAgIHJlc3VsdCArPSBpbmRlbnRTdHIocHJvcCArIFwiOlwiICsgc3BhY2UgKyB0b0Nzc1ZhbHVlKHZhbHVlKSArIFwiO1wiLCBpbmRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPYmplY3Qgc3ludGF4IHtmYWxsYmFja3M6IHtwcm9wOiB2YWx1ZX19XG4gICAgICBmb3IgKHZhciBfcHJvcCBpbiBmYWxsYmFja3MpIHtcbiAgICAgICAgdmFyIF92YWx1ZSA9IGZhbGxiYWNrc1tfcHJvcF07XG5cbiAgICAgICAgaWYgKF92YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgcmVzdWx0ICs9IGxpbmVicmVhaztcbiAgICAgICAgICByZXN1bHQgKz0gaW5kZW50U3RyKF9wcm9wICsgXCI6XCIgKyBzcGFjZSArIHRvQ3NzVmFsdWUoX3ZhbHVlKSArIFwiO1wiLCBpbmRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX3Byb3AyIGluIHN0eWxlKSB7XG4gICAgdmFyIF92YWx1ZTIgPSBzdHlsZVtfcHJvcDJdO1xuXG4gICAgaWYgKF92YWx1ZTIgIT0gbnVsbCAmJiBfcHJvcDIgIT09ICdmYWxsYmFja3MnKSB7XG4gICAgICBpZiAocmVzdWx0KSByZXN1bHQgKz0gbGluZWJyZWFrO1xuICAgICAgcmVzdWx0ICs9IGluZGVudFN0cihfcHJvcDIgKyBcIjpcIiArIHNwYWNlICsgdG9Dc3NWYWx1ZShfdmFsdWUyKSArIFwiO1wiLCBpbmRlbnQpO1xuICAgIH1cbiAgfSAvLyBBbGxvdyBlbXB0eSBzdHlsZSBpbiB0aGlzIGNhc2UsIGJlY2F1c2UgcHJvcGVydGllcyB3aWxsIGJlIGFkZGVkIGR5bmFtaWNhbGx5LlxuXG5cbiAgaWYgKCFyZXN1bHQgJiYgIW9wdGlvbnMuYWxsb3dFbXB0eSkgcmV0dXJuIHJlc3VsdDsgLy8gV2hlbiBydWxlIGlzIGJlaW5nIHN0cmluZ2lmaWVkIGJlZm9yZSBzZWxlY3RvciB3YXMgZGVmaW5lZC5cblxuICBpZiAoIXNlbGVjdG9yKSByZXR1cm4gcmVzdWx0O1xuICBpbmRlbnQtLTtcbiAgaWYgKHJlc3VsdCkgcmVzdWx0ID0gXCJcIiArIGxpbmVicmVhayArIHJlc3VsdCArIGxpbmVicmVhaztcbiAgcmV0dXJuIGluZGVudFN0cihcIlwiICsgc2VsZWN0b3IgKyBzcGFjZSArIFwie1wiICsgcmVzdWx0LCBpbmRlbnQpICsgaW5kZW50U3RyKCd9JywgaW5kZW50KTtcbn1cblxudmFyIGVzY2FwZVJlZ2V4ID0gLyhbW1xcXS4jKiQ+PCt+PXxeOigpLFwiJ2BcXHNdKS9nO1xudmFyIG5hdGl2ZUVzY2FwZSA9IHR5cGVvZiBDU1MgIT09ICd1bmRlZmluZWQnICYmIENTUy5lc2NhcGU7XG52YXIgZXNjYXBlID0gKGZ1bmN0aW9uIChzdHIpIHtcbiAgcmV0dXJuIG5hdGl2ZUVzY2FwZSA/IG5hdGl2ZUVzY2FwZShzdHIpIDogc3RyLnJlcGxhY2UoZXNjYXBlUmVnZXgsICdcXFxcJDEnKTtcbn0pO1xuXG52YXIgQmFzZVN0eWxlUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEJhc2VTdHlsZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICdzdHlsZSc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHZhciBzaGVldCA9IG9wdGlvbnMuc2hlZXQsXG4gICAgICAgIFJlbmRlcmVyID0gb3B0aW9ucy5SZW5kZXJlcjtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICBpZiAoc2hlZXQpIHRoaXMucmVuZGVyZXIgPSBzaGVldC5yZW5kZXJlcjtlbHNlIGlmIChSZW5kZXJlcikgdGhpcy5yZW5kZXJlciA9IG5ldyBSZW5kZXJlcigpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IGEgc3R5bGUgcHJvcGVydHkuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IEJhc2VTdHlsZVJ1bGUucHJvdG90eXBlO1xuXG4gIF9wcm90by5wcm9wID0gZnVuY3Rpb24gcHJvcChuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIC8vIEl0J3MgYSBnZXR0ZXIuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnN0eWxlW25hbWVdOyAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLlxuXG4gICAgdmFyIGZvcmNlID0gb3B0aW9ucyA/IG9wdGlvbnMuZm9yY2UgOiBmYWxzZTtcbiAgICBpZiAoIWZvcmNlICYmIHRoaXMuc3R5bGVbbmFtZV0gPT09IHZhbHVlKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbmV3VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnByb2Nlc3MgIT09IGZhbHNlKSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMub3B0aW9ucy5qc3MucGx1Z2lucy5vbkNoYW5nZVZhbHVlKHZhbHVlLCBuYW1lLCB0aGlzKTtcbiAgICB9XG5cbiAgICB2YXIgaXNFbXB0eSA9IG5ld1ZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUgPT09IGZhbHNlO1xuICAgIHZhciBpc0RlZmluZWQgPSBuYW1lIGluIHRoaXMuc3R5bGU7IC8vIFZhbHVlIGlzIGVtcHR5IGFuZCB3YXNuJ3QgZGVmaW5lZCBiZWZvcmUuXG5cbiAgICBpZiAoaXNFbXB0eSAmJiAhaXNEZWZpbmVkICYmICFmb3JjZSkgcmV0dXJuIHRoaXM7IC8vIFdlIGFyZSBnb2luZyB0byByZW1vdmUgdGhpcyB2YWx1ZS5cblxuICAgIHZhciByZW1vdmUgPSBpc0VtcHR5ICYmIGlzRGVmaW5lZDtcbiAgICBpZiAocmVtb3ZlKSBkZWxldGUgdGhpcy5zdHlsZVtuYW1lXTtlbHNlIHRoaXMuc3R5bGVbbmFtZV0gPSBuZXdWYWx1ZTsgLy8gUmVuZGVyYWJsZSBpcyBkZWZpbmVkIGlmIFN0eWxlU2hlZXQgb3B0aW9uIGBsaW5rYCBpcyB0cnVlLlxuXG4gICAgaWYgKHRoaXMucmVuZGVyYWJsZSAmJiB0aGlzLnJlbmRlcmVyKSB7XG4gICAgICBpZiAocmVtb3ZlKSB0aGlzLnJlbmRlcmVyLnJlbW92ZVByb3BlcnR5KHRoaXMucmVuZGVyYWJsZSwgbmFtZSk7ZWxzZSB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMucmVuZGVyYWJsZSwgbmFtZSwgbmV3VmFsdWUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIHNoZWV0ID0gdGhpcy5vcHRpb25zLnNoZWV0O1xuXG4gICAgaWYgKHNoZWV0ICYmIHNoZWV0LmF0dGFjaGVkKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAnW0pTU10gUnVsZSBpcyBub3QgbGlua2VkLiBNaXNzaW5nIHNoZWV0IG9wdGlvbiBcImxpbms6IHRydWVcIi4nKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICByZXR1cm4gQmFzZVN0eWxlUnVsZTtcbn0oKTtcbnZhciBTdHlsZVJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9CYXNlU3R5bGVSdWxlKSB7XG4gIF9pbmhlcml0c0xvb3NlKFN0eWxlUnVsZSwgX0Jhc2VTdHlsZVJ1bGUpO1xuXG4gIGZ1bmN0aW9uIFN0eWxlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfQmFzZVN0eWxlUnVsZS5jYWxsKHRoaXMsIGtleSwgc3R5bGUsIG9wdGlvbnMpIHx8IHRoaXM7XG4gICAgdmFyIHNlbGVjdG9yID0gb3B0aW9ucy5zZWxlY3RvcixcbiAgICAgICAgc2NvcGVkID0gb3B0aW9ucy5zY29wZWQsXG4gICAgICAgIHNoZWV0ID0gb3B0aW9ucy5zaGVldCxcbiAgICAgICAgZ2VuZXJhdGVJZCA9IG9wdGlvbnMuZ2VuZXJhdGVJZDtcblxuICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgX3RoaXMuc2VsZWN0b3JUZXh0ID0gc2VsZWN0b3I7XG4gICAgfSBlbHNlIGlmIChzY29wZWQgIT09IGZhbHNlKSB7XG4gICAgICBfdGhpcy5pZCA9IGdlbmVyYXRlSWQoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIHNoZWV0KTtcbiAgICAgIF90aGlzLnNlbGVjdG9yVGV4dCA9IFwiLlwiICsgZXNjYXBlKF90aGlzLmlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBzZWxlY3RvciBzdHJpbmcuXG4gICAqIEF0dGVudGlvbjogdXNlIHRoaXMgd2l0aCBjYXV0aW9uLiBNb3N0IGJyb3dzZXJzIGRpZG4ndCBpbXBsZW1lbnRcbiAgICogc2VsZWN0b3JUZXh0IHNldHRlciwgc28gdGhpcyBtYXkgcmVzdWx0IGluIHJlcmVuZGVyaW5nIG9mIGVudGlyZSBTdHlsZSBTaGVldC5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvMiA9IFN0eWxlUnVsZS5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIEFwcGx5IHJ1bGUgdG8gYW4gZWxlbWVudCBpbmxpbmUuXG4gICAqL1xuICBfcHJvdG8yLmFwcGx5VG8gPSBmdW5jdGlvbiBhcHBseVRvKHJlbmRlcmFibGUpIHtcbiAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuXG4gICAgaWYgKHJlbmRlcmVyKSB7XG4gICAgICB2YXIganNvbiA9IHRoaXMudG9KU09OKCk7XG5cbiAgICAgIGZvciAodmFyIHByb3AgaW4ganNvbikge1xuICAgICAgICByZW5kZXJlci5zZXRQcm9wZXJ0eShyZW5kZXJhYmxlLCBwcm9wLCBqc29uW3Byb3BdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBydWxlLlxuICAgKiBGYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAqIFVzZWZ1bCBmb3IgaW5saW5lIHN0eWxlcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8yLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICB2YXIganNvbiA9IHt9O1xuXG4gICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLnN0eWxlKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnN0eWxlW3Byb3BdO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGpzb25bcHJvcF0gPSB2YWx1ZTtlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkganNvbltwcm9wXSA9IHRvQ3NzVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBqc29uO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90bzIudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgdmFyIHNoZWV0ID0gdGhpcy5vcHRpb25zLnNoZWV0O1xuICAgIHZhciBsaW5rID0gc2hlZXQgPyBzaGVldC5vcHRpb25zLmxpbmsgOiBmYWxzZTtcbiAgICB2YXIgb3B0cyA9IGxpbmsgPyBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgYWxsb3dFbXB0eTogdHJ1ZVxuICAgIH0pIDogb3B0aW9ucztcbiAgICByZXR1cm4gdG9Dc3ModGhpcy5zZWxlY3RvclRleHQsIHRoaXMuc3R5bGUsIG9wdHMpO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhTdHlsZVJ1bGUsIFt7XG4gICAga2V5OiBcInNlbGVjdG9yXCIsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoc2VsZWN0b3IpIHtcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gdGhpcy5zZWxlY3RvclRleHQpIHJldHVybjtcbiAgICAgIHRoaXMuc2VsZWN0b3JUZXh0ID0gc2VsZWN0b3I7XG4gICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyLFxuICAgICAgICAgIHJlbmRlcmFibGUgPSB0aGlzLnJlbmRlcmFibGU7XG4gICAgICBpZiAoIXJlbmRlcmFibGUgfHwgIXJlbmRlcmVyKSByZXR1cm47XG4gICAgICB2YXIgaGFzQ2hhbmdlZCA9IHJlbmRlcmVyLnNldFNlbGVjdG9yKHJlbmRlcmFibGUsIHNlbGVjdG9yKTsgLy8gSWYgc2VsZWN0b3Igc2V0dGVyIGlzIG5vdCBpbXBsZW1lbnRlZCwgcmVyZW5kZXIgdGhlIHJ1bGUuXG5cbiAgICAgIGlmICghaGFzQ2hhbmdlZCkge1xuICAgICAgICByZW5kZXJlci5yZXBsYWNlUnVsZShyZW5kZXJhYmxlLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHNlbGVjdG9yIHN0cmluZy5cbiAgICAgKi9cbiAgICAsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RvclRleHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFN0eWxlUnVsZTtcbn0oQmFzZVN0eWxlUnVsZSk7XG52YXIgcGx1Z2luU3R5bGVSdWxlID0ge1xuICBvbkNyZWF0ZVJ1bGU6IGZ1bmN0aW9uIG9uQ3JlYXRlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgaWYgKGtleVswXSA9PT0gJ0AnIHx8IG9wdGlvbnMucGFyZW50ICYmIG9wdGlvbnMucGFyZW50LnR5cGUgPT09ICdrZXlmcmFtZXMnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0eWxlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKTtcbiAgfVxufTtcblxudmFyIGRlZmF1bHRUb1N0cmluZ09wdGlvbnMgPSB7XG4gIGluZGVudDogMSxcbiAgY2hpbGRyZW46IHRydWVcbn07XG52YXIgYXRSZWdFeHAgPSAvQChbXFx3LV0rKS87XG4vKipcbiAqIENvbmRpdGlvbmFsIHJ1bGUgZm9yIEBtZWRpYSwgQHN1cHBvcnRzXG4gKi9cblxudmFyIENvbmRpdGlvbmFsUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbmRpdGlvbmFsUnVsZShrZXksIHN0eWxlcywgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICdjb25kaXRpb25hbCc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHZhciBhdE1hdGNoID0ga2V5Lm1hdGNoKGF0UmVnRXhwKTtcbiAgICB0aGlzLmF0ID0gYXRNYXRjaCA/IGF0TWF0Y2hbMV0gOiAndW5rbm93bic7IC8vIEtleSBtaWdodCBjb250YWluIGEgdW5pcXVlIHN1ZmZpeCBpbiBjYXNlIHRoZSBgbmFtZWAgcGFzc2VkIGJ5IHVzZXIgd2FzIGR1cGxpY2F0ZS5cblxuICAgIHRoaXMucXVlcnkgPSBvcHRpb25zLm5hbWUgfHwgXCJAXCIgKyB0aGlzLmF0O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5ydWxlcyA9IG5ldyBSdWxlTGlzdChfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgcGFyZW50OiB0aGlzXG4gICAgfSkpO1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIHRoaXMucnVsZXMuYWRkKG5hbWUsIHN0eWxlc1tuYW1lXSk7XG4gICAgfVxuXG4gICAgdGhpcy5ydWxlcy5wcm9jZXNzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhIHJ1bGUuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IENvbmRpdGlvbmFsUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmdldFJ1bGUgPSBmdW5jdGlvbiBnZXRSdWxlKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlcy5nZXQobmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBpbmRleCBvZiBhIHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHJ1bGUpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlcy5pbmRleE9mKHJ1bGUpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIHJ1bGUsIHJ1biBwbHVnaW5zLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5hZGRSdWxlID0gZnVuY3Rpb24gYWRkUnVsZShuYW1lLCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHZhciBydWxlID0gdGhpcy5ydWxlcy5hZGQobmFtZSwgc3R5bGUsIG9wdGlvbnMpO1xuICAgIGlmICghcnVsZSkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUocnVsZSk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cbiAgLyoqXG4gICAqIFJlcGxhY2UgcnVsZSwgcnVuIHBsdWdpbnMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlcGxhY2VSdWxlID0gZnVuY3Rpb24gcmVwbGFjZVJ1bGUobmFtZSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgbmV3UnVsZSA9IHRoaXMucnVsZXMucmVwbGFjZShuYW1lLCBzdHlsZSwgb3B0aW9ucyk7XG4gICAgaWYgKG5ld1J1bGUpIHRoaXMub3B0aW9ucy5qc3MucGx1Z2lucy5vblByb2Nlc3NSdWxlKG5ld1J1bGUpO1xuICAgIHJldHVybiBuZXdSdWxlO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdFRvU3RyaW5nT3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgX2dldFdoaXRlc3BhY2VTeW1ib2xzID0gZ2V0V2hpdGVzcGFjZVN5bWJvbHMob3B0aW9ucyksXG4gICAgICAgIGxpbmVicmVhayA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5saW5lYnJlYWs7XG5cbiAgICBpZiAob3B0aW9ucy5pbmRlbnQgPT0gbnVsbCkgb3B0aW9ucy5pbmRlbnQgPSBkZWZhdWx0VG9TdHJpbmdPcHRpb25zLmluZGVudDtcbiAgICBpZiAob3B0aW9ucy5jaGlsZHJlbiA9PSBudWxsKSBvcHRpb25zLmNoaWxkcmVuID0gZGVmYXVsdFRvU3RyaW5nT3B0aW9ucy5jaGlsZHJlbjtcblxuICAgIGlmIChvcHRpb25zLmNoaWxkcmVuID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMucXVlcnkgKyBcIiB7fVwiO1xuICAgIH1cblxuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucnVsZXMudG9TdHJpbmcob3B0aW9ucyk7XG4gICAgcmV0dXJuIGNoaWxkcmVuID8gdGhpcy5xdWVyeSArIFwiIHtcIiArIGxpbmVicmVhayArIGNoaWxkcmVuICsgbGluZWJyZWFrICsgXCJ9XCIgOiAnJztcbiAgfTtcblxuICByZXR1cm4gQ29uZGl0aW9uYWxSdWxlO1xufSgpO1xudmFyIGtleVJlZ0V4cCA9IC9AY29udGFpbmVyfEBtZWRpYXxAc3VwcG9ydHNcXHMrLztcbnZhciBwbHVnaW5Db25kaXRpb25hbFJ1bGUgPSB7XG4gIG9uQ3JlYXRlUnVsZTogZnVuY3Rpb24gb25DcmVhdGVSdWxlKGtleSwgc3R5bGVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGtleVJlZ0V4cC50ZXN0KGtleSkgPyBuZXcgQ29uZGl0aW9uYWxSdWxlKGtleSwgc3R5bGVzLCBvcHRpb25zKSA6IG51bGw7XG4gIH1cbn07XG5cbnZhciBkZWZhdWx0VG9TdHJpbmdPcHRpb25zJDEgPSB7XG4gIGluZGVudDogMSxcbiAgY2hpbGRyZW46IHRydWVcbn07XG52YXIgbmFtZVJlZ0V4cCA9IC9Aa2V5ZnJhbWVzXFxzKyhbXFx3LV0rKS87XG4vKipcbiAqIFJ1bGUgZm9yIEBrZXlmcmFtZXNcbiAqL1xuXG52YXIgS2V5ZnJhbWVzUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEtleWZyYW1lc1J1bGUoa2V5LCBmcmFtZXMsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnR5cGUgPSAna2V5ZnJhbWVzJztcbiAgICB0aGlzLmF0ID0gJ0BrZXlmcmFtZXMnO1xuICAgIHRoaXMuaXNQcm9jZXNzZWQgPSBmYWxzZTtcbiAgICB2YXIgbmFtZU1hdGNoID0ga2V5Lm1hdGNoKG5hbWVSZWdFeHApO1xuXG4gICAgaWYgKG5hbWVNYXRjaCAmJiBuYW1lTWF0Y2hbMV0pIHtcbiAgICAgIHRoaXMubmFtZSA9IG5hbWVNYXRjaFsxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYW1lID0gJ25vbmFtZSc7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCBcIltKU1NdIEJhZCBrZXlmcmFtZXMgbmFtZSBcIiArIGtleSkgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdGhpcy5rZXkgPSB0aGlzLnR5cGUgKyBcIi1cIiArIHRoaXMubmFtZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHZhciBzY29wZWQgPSBvcHRpb25zLnNjb3BlZCxcbiAgICAgICAgc2hlZXQgPSBvcHRpb25zLnNoZWV0LFxuICAgICAgICBnZW5lcmF0ZUlkID0gb3B0aW9ucy5nZW5lcmF0ZUlkO1xuICAgIHRoaXMuaWQgPSBzY29wZWQgPT09IGZhbHNlID8gdGhpcy5uYW1lIDogZXNjYXBlKGdlbmVyYXRlSWQodGhpcywgc2hlZXQpKTtcbiAgICB0aGlzLnJ1bGVzID0gbmV3IFJ1bGVMaXN0KF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBwYXJlbnQ6IHRoaXNcbiAgICB9KSk7XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIGZyYW1lcykge1xuICAgICAgdGhpcy5ydWxlcy5hZGQobmFtZSwgZnJhbWVzW25hbWVdLCBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgICBwYXJlbnQ6IHRoaXNcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzLnByb2Nlc3MoKTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQ1NTIHN0cmluZy5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gS2V5ZnJhbWVzUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0VG9TdHJpbmdPcHRpb25zJDE7XG4gICAgfVxuXG4gICAgdmFyIF9nZXRXaGl0ZXNwYWNlU3ltYm9scyA9IGdldFdoaXRlc3BhY2VTeW1ib2xzKG9wdGlvbnMpLFxuICAgICAgICBsaW5lYnJlYWsgPSBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMubGluZWJyZWFrO1xuXG4gICAgaWYgKG9wdGlvbnMuaW5kZW50ID09IG51bGwpIG9wdGlvbnMuaW5kZW50ID0gZGVmYXVsdFRvU3RyaW5nT3B0aW9ucyQxLmluZGVudDtcbiAgICBpZiAob3B0aW9ucy5jaGlsZHJlbiA9PSBudWxsKSBvcHRpb25zLmNoaWxkcmVuID0gZGVmYXVsdFRvU3RyaW5nT3B0aW9ucyQxLmNoaWxkcmVuO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hpbGRyZW4gPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdCArIFwiIFwiICsgdGhpcy5pZCArIFwiIHt9XCI7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5ydWxlcy50b1N0cmluZyhvcHRpb25zKTtcbiAgICBpZiAoY2hpbGRyZW4pIGNoaWxkcmVuID0gXCJcIiArIGxpbmVicmVhayArIGNoaWxkcmVuICsgbGluZWJyZWFrO1xuICAgIHJldHVybiB0aGlzLmF0ICsgXCIgXCIgKyB0aGlzLmlkICsgXCIge1wiICsgY2hpbGRyZW4gKyBcIn1cIjtcbiAgfTtcblxuICByZXR1cm4gS2V5ZnJhbWVzUnVsZTtcbn0oKTtcbnZhciBrZXlSZWdFeHAkMSA9IC9Aa2V5ZnJhbWVzXFxzKy87XG52YXIgcmVmUmVnRXhwID0gL1xcJChbXFx3LV0rKS9nO1xuXG52YXIgZmluZFJlZmVyZW5jZWRLZXlmcmFtZSA9IGZ1bmN0aW9uIGZpbmRSZWZlcmVuY2VkS2V5ZnJhbWUodmFsLCBrZXlmcmFtZXMpIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbC5yZXBsYWNlKHJlZlJlZ0V4cCwgZnVuY3Rpb24gKG1hdGNoLCBuYW1lKSB7XG4gICAgICBpZiAobmFtZSBpbiBrZXlmcmFtZXMpIHtcbiAgICAgICAgcmV0dXJuIGtleWZyYW1lc1tuYW1lXTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBSZWZlcmVuY2VkIGtleWZyYW1lcyBydWxlIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQuXCIpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn07XG4vKipcbiAqIFJlcGxhY2UgdGhlIHJlZmVyZW5jZSBmb3IgYSBhbmltYXRpb24gbmFtZS5cbiAqL1xuXG5cbnZhciByZXBsYWNlUmVmID0gZnVuY3Rpb24gcmVwbGFjZVJlZihzdHlsZSwgcHJvcCwga2V5ZnJhbWVzKSB7XG4gIHZhciB2YWx1ZSA9IHN0eWxlW3Byb3BdO1xuICB2YXIgcmVmS2V5ZnJhbWUgPSBmaW5kUmVmZXJlbmNlZEtleWZyYW1lKHZhbHVlLCBrZXlmcmFtZXMpO1xuXG4gIGlmIChyZWZLZXlmcmFtZSAhPT0gdmFsdWUpIHtcbiAgICBzdHlsZVtwcm9wXSA9IHJlZktleWZyYW1lO1xuICB9XG59O1xuXG52YXIgcGx1Z2luS2V5ZnJhbWVzUnVsZSA9IHtcbiAgb25DcmVhdGVSdWxlOiBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUoa2V5LCBmcmFtZXMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5UmVnRXhwJDEudGVzdChrZXkpID8gbmV3IEtleWZyYW1lc1J1bGUoa2V5LCBmcmFtZXMsIG9wdGlvbnMpIDogbnVsbDtcbiAgfSxcbiAgLy8gQW5pbWF0aW9uIG5hbWUgcmVmIHJlcGxhY2VyLlxuICBvblByb2Nlc3NTdHlsZTogZnVuY3Rpb24gb25Qcm9jZXNzU3R5bGUoc3R5bGUsIHJ1bGUsIHNoZWV0KSB7XG4gICAgaWYgKHJ1bGUudHlwZSAhPT0gJ3N0eWxlJyB8fCAhc2hlZXQpIHJldHVybiBzdHlsZTtcbiAgICBpZiAoJ2FuaW1hdGlvbi1uYW1lJyBpbiBzdHlsZSkgcmVwbGFjZVJlZihzdHlsZSwgJ2FuaW1hdGlvbi1uYW1lJywgc2hlZXQua2V5ZnJhbWVzKTtcbiAgICBpZiAoJ2FuaW1hdGlvbicgaW4gc3R5bGUpIHJlcGxhY2VSZWYoc3R5bGUsICdhbmltYXRpb24nLCBzaGVldC5rZXlmcmFtZXMpO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfSxcbiAgb25DaGFuZ2VWYWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VWYWx1ZSh2YWwsIHByb3AsIHJ1bGUpIHtcbiAgICB2YXIgc2hlZXQgPSBydWxlLm9wdGlvbnMuc2hlZXQ7XG5cbiAgICBpZiAoIXNoZWV0KSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcCkge1xuICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgICAgcmV0dXJuIGZpbmRSZWZlcmVuY2VkS2V5ZnJhbWUodmFsLCBzaGVldC5rZXlmcmFtZXMpO1xuXG4gICAgICBjYXNlICdhbmltYXRpb24tbmFtZSc6XG4gICAgICAgIHJldHVybiBmaW5kUmVmZXJlbmNlZEtleWZyYW1lKHZhbCwgc2hlZXQua2V5ZnJhbWVzKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBLZXlmcmFtZVJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9CYXNlU3R5bGVSdWxlKSB7XG4gIF9pbmhlcml0c0xvb3NlKEtleWZyYW1lUnVsZSwgX0Jhc2VTdHlsZVJ1bGUpO1xuXG4gIGZ1bmN0aW9uIEtleWZyYW1lUnVsZSgpIHtcbiAgICByZXR1cm4gX0Jhc2VTdHlsZVJ1bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEtleWZyYW1lUnVsZS5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIENTUyBzdHJpbmcuXG4gICAqL1xuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgdmFyIHNoZWV0ID0gdGhpcy5vcHRpb25zLnNoZWV0O1xuICAgIHZhciBsaW5rID0gc2hlZXQgPyBzaGVldC5vcHRpb25zLmxpbmsgOiBmYWxzZTtcbiAgICB2YXIgb3B0cyA9IGxpbmsgPyBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgYWxsb3dFbXB0eTogdHJ1ZVxuICAgIH0pIDogb3B0aW9ucztcbiAgICByZXR1cm4gdG9Dc3ModGhpcy5rZXksIHRoaXMuc3R5bGUsIG9wdHMpO1xuICB9O1xuXG4gIHJldHVybiBLZXlmcmFtZVJ1bGU7XG59KEJhc2VTdHlsZVJ1bGUpO1xudmFyIHBsdWdpbktleWZyYW1lUnVsZSA9IHtcbiAgb25DcmVhdGVSdWxlOiBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnBhcmVudCAmJiBvcHRpb25zLnBhcmVudC50eXBlID09PSAna2V5ZnJhbWVzJykge1xuICAgICAgcmV0dXJuIG5ldyBLZXlmcmFtZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbnZhciBGb250RmFjZVJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGb250RmFjZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICdmb250LWZhY2UnO1xuICAgIHRoaXMuYXQgPSAnQGZvbnQtZmFjZSc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBGb250RmFjZVJ1bGUucHJvdG90eXBlO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICB2YXIgX2dldFdoaXRlc3BhY2VTeW1ib2xzID0gZ2V0V2hpdGVzcGFjZVN5bWJvbHMob3B0aW9ucyksXG4gICAgICAgIGxpbmVicmVhayA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5saW5lYnJlYWs7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnN0eWxlKSkge1xuICAgICAgdmFyIHN0ciA9ICcnO1xuXG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5zdHlsZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgc3RyICs9IHRvQ3NzKHRoaXMuYXQsIHRoaXMuc3R5bGVbaW5kZXhdKTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGVbaW5kZXggKyAxXSkgc3RyICs9IGxpbmVicmVhaztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9Dc3ModGhpcy5hdCwgdGhpcy5zdHlsZSwgb3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIEZvbnRGYWNlUnVsZTtcbn0oKTtcbnZhciBrZXlSZWdFeHAkMiA9IC9AZm9udC1mYWNlLztcbnZhciBwbHVnaW5Gb250RmFjZVJ1bGUgPSB7XG4gIG9uQ3JlYXRlUnVsZTogZnVuY3Rpb24gb25DcmVhdGVSdWxlKGtleSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4ga2V5UmVnRXhwJDIudGVzdChrZXkpID8gbmV3IEZvbnRGYWNlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSA6IG51bGw7XG4gIH1cbn07XG5cbnZhciBWaWV3cG9ydFJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBWaWV3cG9ydFJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICd2aWV3cG9ydCc7XG4gICAgdGhpcy5hdCA9ICdAdmlld3BvcnQnO1xuICAgIHRoaXMuaXNQcm9jZXNzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQ1NTIHN0cmluZy5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gVmlld3BvcnRSdWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRvQ3NzKHRoaXMua2V5LCB0aGlzLnN0eWxlLCBvcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gVmlld3BvcnRSdWxlO1xufSgpO1xudmFyIHBsdWdpblZpZXdwb3J0UnVsZSA9IHtcbiAgb25DcmVhdGVSdWxlOiBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBrZXkgPT09ICdAdmlld3BvcnQnIHx8IGtleSA9PT0gJ0AtbXMtdmlld3BvcnQnID8gbmV3IFZpZXdwb3J0UnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSA6IG51bGw7XG4gIH1cbn07XG5cbnZhciBTaW1wbGVSdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2ltcGxlUnVsZShrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlID0gJ3NpbXBsZSc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cblxuICB2YXIgX3Byb3RvID0gU2ltcGxlUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcob3B0aW9ucykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpKSB7XG4gICAgICB2YXIgc3RyID0gJyc7XG5cbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnZhbHVlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBzdHIgKz0gdGhpcy5rZXkgKyBcIiBcIiArIHRoaXMudmFsdWVbaW5kZXhdICsgXCI7XCI7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlW2luZGV4ICsgMV0pIHN0ciArPSAnXFxuJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5rZXkgKyBcIiBcIiArIHRoaXMudmFsdWUgKyBcIjtcIjtcbiAgfTtcblxuICByZXR1cm4gU2ltcGxlUnVsZTtcbn0oKTtcbnZhciBrZXlzTWFwID0ge1xuICAnQGNoYXJzZXQnOiB0cnVlLFxuICAnQGltcG9ydCc6IHRydWUsXG4gICdAbmFtZXNwYWNlJzogdHJ1ZVxufTtcbnZhciBwbHVnaW5TaW1wbGVSdWxlID0ge1xuICBvbkNyZWF0ZVJ1bGU6IGZ1bmN0aW9uIG9uQ3JlYXRlUnVsZShrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGtleSBpbiBrZXlzTWFwID8gbmV3IFNpbXBsZVJ1bGUoa2V5LCB2YWx1ZSwgb3B0aW9ucykgOiBudWxsO1xuICB9XG59O1xuXG52YXIgcGx1Z2lucyA9IFtwbHVnaW5TdHlsZVJ1bGUsIHBsdWdpbkNvbmRpdGlvbmFsUnVsZSwgcGx1Z2luS2V5ZnJhbWVzUnVsZSwgcGx1Z2luS2V5ZnJhbWVSdWxlLCBwbHVnaW5Gb250RmFjZVJ1bGUsIHBsdWdpblZpZXdwb3J0UnVsZSwgcGx1Z2luU2ltcGxlUnVsZV07XG5cbnZhciBkZWZhdWx0VXBkYXRlT3B0aW9ucyA9IHtcbiAgcHJvY2VzczogdHJ1ZVxufTtcbnZhciBmb3JjZVVwZGF0ZU9wdGlvbnMgPSB7XG4gIGZvcmNlOiB0cnVlLFxuICBwcm9jZXNzOiB0cnVlXG4gIC8qKlxuICAgKiBDb250YWlucyBydWxlcyBvYmplY3RzIGFuZCBhbGxvd3MgYWRkaW5nL3JlbW92aW5nIGV0Yy5cbiAgICogSXMgdXNlZCBmb3IgZS5nLiBieSBgU3R5bGVTaGVldGAgb3IgYENvbmRpdGlvbmFsUnVsZWAuXG4gICAqL1xuXG59O1xuXG52YXIgUnVsZUxpc3QgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvLyBSdWxlcyByZWdpc3RyeSBmb3IgYWNjZXNzIGJ5IC5nZXQoKSBtZXRob2QuXG4gIC8vIEl0IGNvbnRhaW5zIHRoZSBzYW1lIHJ1bGUgcmVnaXN0ZXJlZCBieSBuYW1lIGFuZCBieSBzZWxlY3Rvci5cbiAgLy8gT3JpZ2luYWwgc3R5bGVzIG9iamVjdC5cbiAgLy8gVXNlZCB0byBlbnN1cmUgY29ycmVjdCBydWxlcyBvcmRlci5cbiAgZnVuY3Rpb24gUnVsZUxpc3Qob3B0aW9ucykge1xuICAgIHRoaXMubWFwID0ge307XG4gICAgdGhpcy5yYXcgPSB7fTtcbiAgICB0aGlzLmluZGV4ID0gW107XG4gICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuY2xhc3NlcyA9IG9wdGlvbnMuY2xhc3NlcztcbiAgICB0aGlzLmtleWZyYW1lcyA9IG9wdGlvbnMua2V5ZnJhbWVzO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIHJ1bGUuXG4gICAqXG4gICAqIFdpbGwgbm90IHJlbmRlciBhZnRlciBTdHlsZSBTaGVldCB3YXMgcmVuZGVyZWQgdGhlIGZpcnN0IHRpbWUuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFJ1bGVMaXN0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uYWRkID0gZnVuY3Rpb24gYWRkKG5hbWUsIGRlY2wsIHJ1bGVPcHRpb25zKSB7XG4gICAgdmFyIF90aGlzJG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIHBhcmVudCA9IF90aGlzJG9wdGlvbnMucGFyZW50LFxuICAgICAgICBzaGVldCA9IF90aGlzJG9wdGlvbnMuc2hlZXQsXG4gICAgICAgIGpzcyA9IF90aGlzJG9wdGlvbnMuanNzLFxuICAgICAgICBSZW5kZXJlciA9IF90aGlzJG9wdGlvbnMuUmVuZGVyZXIsXG4gICAgICAgIGdlbmVyYXRlSWQgPSBfdGhpcyRvcHRpb25zLmdlbmVyYXRlSWQsXG4gICAgICAgIHNjb3BlZCA9IF90aGlzJG9wdGlvbnMuc2NvcGVkO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc2VzOiB0aGlzLmNsYXNzZXMsXG4gICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgIHNoZWV0OiBzaGVldCxcbiAgICAgIGpzczoganNzLFxuICAgICAgUmVuZGVyZXI6IFJlbmRlcmVyLFxuICAgICAgZ2VuZXJhdGVJZDogZ2VuZXJhdGVJZCxcbiAgICAgIHNjb3BlZDogc2NvcGVkLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGtleWZyYW1lczogdGhpcy5rZXlmcmFtZXMsXG4gICAgICBzZWxlY3RvcjogdW5kZWZpbmVkXG4gICAgfSwgcnVsZU9wdGlvbnMpOyAvLyBXaGVuIHVzZXIgdXNlcyAuY3JlYXRlU3R5bGVTaGVldCgpLCBkdXBsaWNhdGUgbmFtZXMgYXJlIG5vdCBwb3NzaWJsZSwgYnV0XG4gICAgLy8gYHNoZWV0LmFkZFJ1bGUoKWAgb3BlbnMgdGhlIGRvb3IgZm9yIGFueSBkdXBsaWNhdGUgcnVsZSBuYW1lLiBXaGVuIHRoaXMgaGFwcGVuc1xuICAgIC8vIHdlIG5lZWQgdG8gbWFrZSB0aGUga2V5IHVuaXF1ZSB3aXRoaW4gdGhpcyBSdWxlTGlzdCBpbnN0YW5jZSBzY29wZS5cblxuXG4gICAgdmFyIGtleSA9IG5hbWU7XG5cbiAgICBpZiAobmFtZSBpbiB0aGlzLnJhdykge1xuICAgICAga2V5ID0gbmFtZSArIFwiLWRcIiArIHRoaXMuY291bnRlcisrO1xuICAgIH0gLy8gV2UgbmVlZCB0byBzYXZlIHRoZSBvcmlnaW5hbCBkZWNsIGJlZm9yZSBjcmVhdGluZyB0aGUgcnVsZVxuICAgIC8vIGJlY2F1c2UgY2FjaGUgcGx1Z2luIG5lZWRzIHRvIHVzZSBpdCBhcyBhIGtleSB0byByZXR1cm4gYSBjYWNoZWQgcnVsZS5cblxuXG4gICAgdGhpcy5yYXdba2V5XSA9IGRlY2w7XG5cbiAgICBpZiAoa2V5IGluIHRoaXMuY2xhc3Nlcykge1xuICAgICAgLy8gRS5nLiBydWxlcyBpbnNpZGUgb2YgQG1lZGlhIGNvbnRhaW5lclxuICAgICAgb3B0aW9ucy5zZWxlY3RvciA9IFwiLlwiICsgZXNjYXBlKHRoaXMuY2xhc3Nlc1trZXldKTtcbiAgICB9XG5cbiAgICB2YXIgcnVsZSA9IGNyZWF0ZVJ1bGUoa2V5LCBkZWNsLCBvcHRpb25zKTtcbiAgICBpZiAoIXJ1bGUpIHJldHVybiBudWxsO1xuICAgIHRoaXMucmVnaXN0ZXIocnVsZSk7XG4gICAgdmFyIGluZGV4ID0gb3B0aW9ucy5pbmRleCA9PT0gdW5kZWZpbmVkID8gdGhpcy5pbmRleC5sZW5ndGggOiBvcHRpb25zLmluZGV4O1xuICAgIHRoaXMuaW5kZXguc3BsaWNlKGluZGV4LCAwLCBydWxlKTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuICAvKipcbiAgICogUmVwbGFjZSBydWxlLlxuICAgKiBDcmVhdGUgYSBuZXcgcnVsZSBhbmQgcmVtb3ZlIG9sZCBvbmUgaW5zdGVhZCBvZiBvdmVyd3JpdGluZ1xuICAgKiBiZWNhdXNlIHdlIHdhbnQgdG8gaW52b2tlIG9uQ3JlYXRlUnVsZSBob29rIHRvIG1ha2UgcGx1Z2lucyB3b3JrLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShuYW1lLCBkZWNsLCBydWxlT3B0aW9ucykge1xuICAgIHZhciBvbGRSdWxlID0gdGhpcy5nZXQobmFtZSk7XG4gICAgdmFyIG9sZEluZGV4ID0gdGhpcy5pbmRleC5pbmRleE9mKG9sZFJ1bGUpO1xuXG4gICAgaWYgKG9sZFJ1bGUpIHtcbiAgICAgIHRoaXMucmVtb3ZlKG9sZFJ1bGUpO1xuICAgIH1cblxuICAgIHZhciBvcHRpb25zID0gcnVsZU9wdGlvbnM7XG4gICAgaWYgKG9sZEluZGV4ICE9PSAtMSkgb3B0aW9ucyA9IF9leHRlbmRzKHt9LCBydWxlT3B0aW9ucywge1xuICAgICAgaW5kZXg6IG9sZEluZGV4XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuYWRkKG5hbWUsIGRlY2wsIG9wdGlvbnMpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgYSBydWxlIGJ5IG5hbWUgb3Igc2VsZWN0b3IuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdldCA9IGZ1bmN0aW9uIGdldChuYW1lT3JTZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLm1hcFtuYW1lT3JTZWxlY3Rvcl07XG4gIH1cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZShydWxlKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyKHJ1bGUpO1xuICAgIGRlbGV0ZSB0aGlzLnJhd1tydWxlLmtleV07XG4gICAgdGhpcy5pbmRleC5zcGxpY2UodGhpcy5pbmRleC5pbmRleE9mKHJ1bGUpLCAxKTtcbiAgfVxuICAvKipcbiAgICogR2V0IGluZGV4IG9mIGEgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YocnVsZSkge1xuICAgIHJldHVybiB0aGlzLmluZGV4LmluZGV4T2YocnVsZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biBgb25Qcm9jZXNzUnVsZSgpYCBwbHVnaW5zIG9uIGV2ZXJ5IHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKCkge1xuICAgIHZhciBwbHVnaW5zID0gdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zOyAvLyBXZSBuZWVkIHRvIGNsb25lIGFycmF5IGJlY2F1c2UgaWYgd2UgbW9kaWZ5IHRoZSBpbmRleCBzb21ld2hlcmUgZWxzZSBkdXJpbmcgYSBsb29wXG4gICAgLy8gd2UgZW5kIHVwIHdpdGggdmVyeSBoYXJkLXRvLXRyYWNrLWRvd24gc2lkZSBlZmZlY3RzLlxuXG4gICAgdGhpcy5pbmRleC5zbGljZSgwKS5mb3JFYWNoKHBsdWdpbnMub25Qcm9jZXNzUnVsZSwgcGx1Z2lucyk7XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgcnVsZSBpbiBgLm1hcGAsIGAuY2xhc3Nlc2AgYW5kIGAua2V5ZnJhbWVzYCBtYXBzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKHJ1bGUpIHtcbiAgICB0aGlzLm1hcFtydWxlLmtleV0gPSBydWxlO1xuXG4gICAgaWYgKHJ1bGUgaW5zdGFuY2VvZiBTdHlsZVJ1bGUpIHtcbiAgICAgIHRoaXMubWFwW3J1bGUuc2VsZWN0b3JdID0gcnVsZTtcbiAgICAgIGlmIChydWxlLmlkKSB0aGlzLmNsYXNzZXNbcnVsZS5rZXldID0gcnVsZS5pZDtcbiAgICB9IGVsc2UgaWYgKHJ1bGUgaW5zdGFuY2VvZiBLZXlmcmFtZXNSdWxlICYmIHRoaXMua2V5ZnJhbWVzKSB7XG4gICAgICB0aGlzLmtleWZyYW1lc1tydWxlLm5hbWVdID0gcnVsZS5pZDtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYSBydWxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by51bnJlZ2lzdGVyID0gZnVuY3Rpb24gdW5yZWdpc3RlcihydWxlKSB7XG4gICAgZGVsZXRlIHRoaXMubWFwW3J1bGUua2V5XTtcblxuICAgIGlmIChydWxlIGluc3RhbmNlb2YgU3R5bGVSdWxlKSB7XG4gICAgICBkZWxldGUgdGhpcy5tYXBbcnVsZS5zZWxlY3Rvcl07XG4gICAgICBkZWxldGUgdGhpcy5jbGFzc2VzW3J1bGUua2V5XTtcbiAgICB9IGVsc2UgaWYgKHJ1bGUgaW5zdGFuY2VvZiBLZXlmcmFtZXNSdWxlKSB7XG4gICAgICBkZWxldGUgdGhpcy5rZXlmcmFtZXNbcnVsZS5uYW1lXTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZnVuY3Rpb24gdmFsdWVzIHdpdGggYSBuZXcgZGF0YS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHZhciBuYW1lO1xuICAgIHZhciBkYXRhO1xuICAgIHZhciBvcHRpb25zO1xuXG4gICAgaWYgKHR5cGVvZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAwID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzBdKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWUgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMF07XG4gICAgICBkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA8PSAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdO1xuICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMiA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1syXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXTtcbiAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgICBuYW1lID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgdGhpcy51cGRhdGVPbmUodGhpcy5nZXQobmFtZSksIGRhdGEsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5pbmRleC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdGhpcy51cGRhdGVPbmUodGhpcy5pbmRleFtpbmRleF0sIGRhdGEsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogRXhlY3V0ZSBwbHVnaW5zLCB1cGRhdGUgcnVsZSBwcm9wcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udXBkYXRlT25lID0gZnVuY3Rpb24gdXBkYXRlT25lKHJ1bGUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdFVwZGF0ZU9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmFyIF90aGlzJG9wdGlvbnMyID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBwbHVnaW5zID0gX3RoaXMkb3B0aW9uczIuanNzLnBsdWdpbnMsXG4gICAgICAgIHNoZWV0ID0gX3RoaXMkb3B0aW9uczIuc2hlZXQ7IC8vIEl0IGlzIGEgcnVsZXMgY29udGFpbmVyIGxpa2UgZm9yIGUuZy4gQ29uZGl0aW9uYWxSdWxlLlxuXG4gICAgaWYgKHJ1bGUucnVsZXMgaW5zdGFuY2VvZiBSdWxlTGlzdCkge1xuICAgICAgcnVsZS5ydWxlcy51cGRhdGUoZGF0YSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlID0gcnVsZS5zdHlsZTtcbiAgICBwbHVnaW5zLm9uVXBkYXRlKGRhdGEsIHJ1bGUsIHNoZWV0LCBvcHRpb25zKTsgLy8gV2UgcmVseSBvbiBhIG5ldyBgc3R5bGVgIHJlZiBpbiBjYXNlIGl0IHdhcyBtdXRhdGVkIGR1cmluZyBvblVwZGF0ZSBob29rLlxuXG4gICAgaWYgKG9wdGlvbnMucHJvY2VzcyAmJiBzdHlsZSAmJiBzdHlsZSAhPT0gcnVsZS5zdHlsZSkge1xuICAgICAgLy8gV2UgbmVlZCB0byBydW4gdGhlIHBsdWdpbnMgaW4gY2FzZSBuZXcgYHN0eWxlYCByZWxpZXMgb24gc3ludGF4IHBsdWdpbnMuXG4gICAgICBwbHVnaW5zLm9uUHJvY2Vzc1N0eWxlKHJ1bGUuc3R5bGUsIHJ1bGUsIHNoZWV0KTsgLy8gVXBkYXRlIGFuZCBhZGQgcHJvcHMuXG5cbiAgICAgIGZvciAodmFyIHByb3AgaW4gcnVsZS5zdHlsZSkge1xuICAgICAgICB2YXIgbmV4dFZhbHVlID0gcnVsZS5zdHlsZVtwcm9wXTtcbiAgICAgICAgdmFyIHByZXZWYWx1ZSA9IHN0eWxlW3Byb3BdOyAvLyBXZSBuZWVkIHRvIHVzZSBgZm9yY2U6IHRydWVgIGJlY2F1c2UgYHJ1bGUuc3R5bGVgIGhhcyBiZWVuIHVwZGF0ZWQgZHVyaW5nIG9uVXBkYXRlIGhvb2ssIHNvIGBydWxlLnByb3AoKWAgd2lsbCBub3QgdXBkYXRlIHRoZSBDU1NPTSBydWxlLlxuICAgICAgICAvLyBXZSBkbyB0aGlzIGNvbXBhcmlzb24gdG8gYXZvaWQgdW5uZWVkZWQgYHJ1bGUucHJvcCgpYCBjYWxscywgc2luY2Ugd2UgaGF2ZSB0aGUgb2xkIGBzdHlsZWAgb2JqZWN0IGhlcmUuXG5cbiAgICAgICAgaWYgKG5leHRWYWx1ZSAhPT0gcHJldlZhbHVlKSB7XG4gICAgICAgICAgcnVsZS5wcm9wKHByb3AsIG5leHRWYWx1ZSwgZm9yY2VVcGRhdGVPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBSZW1vdmUgcHJvcHMuXG5cblxuICAgICAgZm9yICh2YXIgX3Byb3AgaW4gc3R5bGUpIHtcbiAgICAgICAgdmFyIF9uZXh0VmFsdWUgPSBydWxlLnN0eWxlW19wcm9wXTtcbiAgICAgICAgdmFyIF9wcmV2VmFsdWUgPSBzdHlsZVtfcHJvcF07IC8vIFdlIG5lZWQgdG8gdXNlIGBmb3JjZTogdHJ1ZWAgYmVjYXVzZSBgcnVsZS5zdHlsZWAgaGFzIGJlZW4gdXBkYXRlZCBkdXJpbmcgb25VcGRhdGUgaG9vaywgc28gYHJ1bGUucHJvcCgpYCB3aWxsIG5vdCB1cGRhdGUgdGhlIENTU09NIHJ1bGUuXG4gICAgICAgIC8vIFdlIGRvIHRoaXMgY29tcGFyaXNvbiB0byBhdm9pZCB1bm5lZWRlZCBgcnVsZS5wcm9wKClgIGNhbGxzLCBzaW5jZSB3ZSBoYXZlIHRoZSBvbGQgYHN0eWxlYCBvYmplY3QgaGVyZS5cblxuICAgICAgICBpZiAoX25leHRWYWx1ZSA9PSBudWxsICYmIF9uZXh0VmFsdWUgIT09IF9wcmV2VmFsdWUpIHtcbiAgICAgICAgICBydWxlLnByb3AoX3Byb3AsIG51bGwsIGZvcmNlVXBkYXRlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnQgcnVsZXMgdG8gYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIHNoZWV0ID0gdGhpcy5vcHRpb25zLnNoZWV0O1xuICAgIHZhciBsaW5rID0gc2hlZXQgPyBzaGVldC5vcHRpb25zLmxpbmsgOiBmYWxzZTtcblxuICAgIHZhciBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMgPSBnZXRXaGl0ZXNwYWNlU3ltYm9scyhvcHRpb25zKSxcbiAgICAgICAgbGluZWJyZWFrID0gX2dldFdoaXRlc3BhY2VTeW1ib2xzLmxpbmVicmVhaztcblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmluZGV4Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIHJ1bGUgPSB0aGlzLmluZGV4W2luZGV4XTtcbiAgICAgIHZhciBjc3MgPSBydWxlLnRvU3RyaW5nKG9wdGlvbnMpOyAvLyBObyBuZWVkIHRvIHJlbmRlciBhbiBlbXB0eSBydWxlLlxuXG4gICAgICBpZiAoIWNzcyAmJiAhbGluaykgY29udGludWU7XG4gICAgICBpZiAoc3RyKSBzdHIgKz0gbGluZWJyZWFrO1xuICAgICAgc3RyICs9IGNzcztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIHJldHVybiBSdWxlTGlzdDtcbn0oKTtcblxudmFyIFN0eWxlU2hlZXQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdHlsZVNoZWV0KHN0eWxlcywgb3B0aW9ucykge1xuICAgIHRoaXMuYXR0YWNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRlcGxveWVkID0gZmFsc2U7XG4gICAgdGhpcy5jbGFzc2VzID0ge307XG4gICAgdGhpcy5rZXlmcmFtZXMgPSB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgc2hlZXQ6IHRoaXMsXG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICBjbGFzc2VzOiB0aGlzLmNsYXNzZXMsXG4gICAgICBrZXlmcmFtZXM6IHRoaXMua2V5ZnJhbWVzXG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9ucy5SZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlciA9IG5ldyBvcHRpb25zLlJlbmRlcmVyKHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMgPSBuZXcgUnVsZUxpc3QodGhpcy5vcHRpb25zKTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICB0aGlzLnJ1bGVzLmFkZChuYW1lLCBzdHlsZXNbbmFtZV0pO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMucHJvY2VzcygpO1xuICB9XG4gIC8qKlxuICAgKiBBdHRhY2ggcmVuZGVyYWJsZSB0byB0aGUgcmVuZGVyIHRyZWUuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFN0eWxlU2hlZXQucHJvdG90eXBlO1xuXG4gIF9wcm90by5hdHRhY2ggPSBmdW5jdGlvbiBhdHRhY2goKSB7XG4gICAgaWYgKHRoaXMuYXR0YWNoZWQpIHJldHVybiB0aGlzO1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB0aGlzLnJlbmRlcmVyLmF0dGFjaCgpO1xuICAgIHRoaXMuYXR0YWNoZWQgPSB0cnVlOyAvLyBPcmRlciBpcyBpbXBvcnRhbnQsIGJlY2F1c2Ugd2UgY2FuJ3QgdXNlIGluc2VydFJ1bGUgQVBJIGlmIHN0eWxlIGVsZW1lbnQgaXMgbm90IGF0dGFjaGVkLlxuXG4gICAgaWYgKCF0aGlzLmRlcGxveWVkKSB0aGlzLmRlcGxveSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgcmVuZGVyYWJsZSBmcm9tIHJlbmRlciB0cmVlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kZXRhY2ggPSBmdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgaWYgKCF0aGlzLmF0dGFjaGVkKSByZXR1cm4gdGhpcztcbiAgICBpZiAodGhpcy5yZW5kZXJlcikgdGhpcy5yZW5kZXJlci5kZXRhY2goKTtcbiAgICB0aGlzLmF0dGFjaGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIHJ1bGUgdG8gdGhlIGN1cnJlbnQgc3R5bGVzaGVldC5cbiAgICogV2lsbCBpbnNlcnQgYSBydWxlIGFsc28gYWZ0ZXIgdGhlIHN0eWxlc2hlZXQgaGFzIGJlZW4gcmVuZGVyZWQgZmlyc3QgdGltZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uYWRkUnVsZSA9IGZ1bmN0aW9uIGFkZFJ1bGUobmFtZSwgZGVjbCwgb3B0aW9ucykge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMucXVldWU7IC8vIFBsdWdpbnMgY2FuIGNyZWF0ZSBydWxlcy5cbiAgICAvLyBJbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgcmlnaHQgb3JkZXIsIHdlIG5lZWQgdG8gcXVldWUgYWxsIGAuYWRkUnVsZWAgY2FsbHMsXG4gICAgLy8gd2hpY2ggaGFwcGVuIGFmdGVyIHRoZSBmaXJzdCBgcnVsZXMuYWRkKClgIGNhbGwuXG5cbiAgICBpZiAodGhpcy5hdHRhY2hlZCAmJiAhcXVldWUpIHRoaXMucXVldWUgPSBbXTtcbiAgICB2YXIgcnVsZSA9IHRoaXMucnVsZXMuYWRkKG5hbWUsIGRlY2wsIG9wdGlvbnMpO1xuICAgIGlmICghcnVsZSkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUocnVsZSk7XG5cbiAgICBpZiAodGhpcy5hdHRhY2hlZCkge1xuICAgICAgaWYgKCF0aGlzLmRlcGxveWVkKSByZXR1cm4gcnVsZTsgLy8gRG9uJ3QgaW5zZXJ0IHJ1bGUgZGlyZWN0bHkgaWYgdGhlcmUgaXMgbm8gc3RyaW5naWZpZWQgdmVyc2lvbiB5ZXQuXG4gICAgICAvLyBJdCB3aWxsIGJlIGluc2VydGVkIGFsbCB0b2dldGhlciB3aGVuIC5hdHRhY2ggaXMgY2FsbGVkLlxuXG4gICAgICBpZiAocXVldWUpIHF1ZXVlLnB1c2gocnVsZSk7ZWxzZSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlKTtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZSkge1xuICAgICAgICAgIHRoaXMucXVldWUuZm9yRWFjaCh0aGlzLmluc2VydFJ1bGUsIHRoaXMpO1xuICAgICAgICAgIHRoaXMucXVldWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBydWxlO1xuICAgIH0gLy8gV2UgY2FuJ3QgYWRkIHJ1bGVzIHRvIGEgZGV0YWNoZWQgc3R5bGUgbm9kZS5cbiAgICAvLyBXZSB3aWxsIHJlZGVwbG95IHRoZSBzaGVldCBvbmNlIHVzZXIgd2lsbCBhdHRhY2ggaXQuXG5cblxuICAgIHRoaXMuZGVwbG95ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuICAvKipcbiAgICogUmVwbGFjZSBhIHJ1bGUgaW4gdGhlIGN1cnJlbnQgc3R5bGVzaGVldC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVwbGFjZVJ1bGUgPSBmdW5jdGlvbiByZXBsYWNlUnVsZShuYW1lT3JTZWxlY3RvciwgZGVjbCwgb3B0aW9ucykge1xuICAgIHZhciBvbGRSdWxlID0gdGhpcy5ydWxlcy5nZXQobmFtZU9yU2VsZWN0b3IpO1xuICAgIGlmICghb2xkUnVsZSkgcmV0dXJuIHRoaXMuYWRkUnVsZShuYW1lT3JTZWxlY3RvciwgZGVjbCwgb3B0aW9ucyk7XG4gICAgdmFyIG5ld1J1bGUgPSB0aGlzLnJ1bGVzLnJlcGxhY2UobmFtZU9yU2VsZWN0b3IsIGRlY2wsIG9wdGlvbnMpO1xuXG4gICAgaWYgKG5ld1J1bGUpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5qc3MucGx1Z2lucy5vblByb2Nlc3NSdWxlKG5ld1J1bGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmF0dGFjaGVkKSB7XG4gICAgICBpZiAoIXRoaXMuZGVwbG95ZWQpIHJldHVybiBuZXdSdWxlOyAvLyBEb24ndCByZXBsYWNlIC8gZGVsZXRlIHJ1bGUgZGlyZWN0bHkgaWYgdGhlcmUgaXMgbm8gc3RyaW5naWZpZWQgdmVyc2lvbiB5ZXQuXG4gICAgICAvLyBJdCB3aWxsIGJlIGluc2VydGVkIGFsbCB0b2dldGhlciB3aGVuIC5hdHRhY2ggaXMgY2FsbGVkLlxuXG4gICAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgICBpZiAoIW5ld1J1bGUpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRlbGV0ZVJ1bGUob2xkUnVsZSk7XG4gICAgICAgIH0gZWxzZSBpZiAob2xkUnVsZS5yZW5kZXJhYmxlKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZXBsYWNlUnVsZShvbGRSdWxlLnJlbmRlcmFibGUsIG5ld1J1bGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdSdWxlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVwbGFjZSBydWxlcyB0byBhIGRldGFjaGVkIHN0eWxlIG5vZGUuXG4gICAgLy8gV2Ugd2lsbCByZWRlcGxveSB0aGUgc2hlZXQgb25jZSB1c2VyIHdpbGwgYXR0YWNoIGl0LlxuXG5cbiAgICB0aGlzLmRlcGxveWVkID0gZmFsc2U7XG4gICAgcmV0dXJuIG5ld1J1bGU7XG4gIH1cbiAgLyoqXG4gICAqIEluc2VydCBydWxlIGludG8gdGhlIFN0eWxlU2hlZXRcbiAgICovXG4gIDtcblxuICBfcHJvdG8uaW5zZXJ0UnVsZSA9IGZ1bmN0aW9uIGluc2VydFJ1bGUocnVsZSkge1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmluc2VydFJ1bGUocnVsZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGFkZCBydWxlcy5cbiAgICogV2lsbCByZW5kZXIgYWxzbyBhZnRlciBTdHlsZSBTaGVldCB3YXMgcmVuZGVyZWQgdGhlIGZpcnN0IHRpbWUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFkZFJ1bGVzID0gZnVuY3Rpb24gYWRkUnVsZXMoc3R5bGVzLCBvcHRpb25zKSB7XG4gICAgdmFyIGFkZGVkID0gW107XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHN0eWxlcykge1xuICAgICAgdmFyIHJ1bGUgPSB0aGlzLmFkZFJ1bGUobmFtZSwgc3R5bGVzW25hbWVdLCBvcHRpb25zKTtcbiAgICAgIGlmIChydWxlKSBhZGRlZC5wdXNoKHJ1bGUpO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRlZDtcbiAgfVxuICAvKipcbiAgICogR2V0IGEgcnVsZSBieSBuYW1lIG9yIHNlbGVjdG9yLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5nZXRSdWxlID0gZnVuY3Rpb24gZ2V0UnVsZShuYW1lT3JTZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLmdldChuYW1lT3JTZWxlY3Rvcik7XG4gIH1cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHJ1bGUgYnkgbmFtZS5cbiAgICogUmV0dXJucyBgdHJ1ZWA6IGlmIHJ1bGUgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoZSBET00uXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmRlbGV0ZVJ1bGUgPSBmdW5jdGlvbiBkZWxldGVSdWxlKG5hbWUpIHtcbiAgICB2YXIgcnVsZSA9IHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JyA/IG5hbWUgOiB0aGlzLnJ1bGVzLmdldChuYW1lKTtcblxuICAgIGlmICghcnVsZSB8fCAvLyBTdHlsZSBzaGVldCB3YXMgY3JlYXRlZCB3aXRob3V0IGxpbms6IHRydWUgYW5kIGF0dGFjaGVkLCBpbiB0aGlzIGNhc2Ugd2VcbiAgICAvLyB3b24ndCBiZSBhYmxlIHRvIHJlbW92ZSB0aGUgQ1NTIHJ1bGUgZnJvbSB0aGUgRE9NLlxuICAgIHRoaXMuYXR0YWNoZWQgJiYgIXJ1bGUucmVuZGVyYWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMucmVtb3ZlKHJ1bGUpO1xuXG4gICAgaWYgKHRoaXMuYXR0YWNoZWQgJiYgcnVsZS5yZW5kZXJhYmxlICYmIHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmRlbGV0ZVJ1bGUocnVsZS5yZW5kZXJhYmxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogR2V0IGluZGV4IG9mIGEgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YocnVsZSkge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLmluZGV4T2YocnVsZSk7XG4gIH1cbiAgLyoqXG4gICAqIERlcGxveSBwdXJlIENTUyBzdHJpbmcgdG8gYSByZW5kZXJhYmxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kZXBsb3kgPSBmdW5jdGlvbiBkZXBsb3koKSB7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHRoaXMucmVuZGVyZXIuZGVwbG95KCk7XG4gICAgdGhpcy5kZXBsb3llZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgZnVuY3Rpb24gdmFsdWVzIHdpdGggYSBuZXcgZGF0YS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgIHZhciBfdGhpcyRydWxlcztcblxuICAgIChfdGhpcyRydWxlcyA9IHRoaXMucnVsZXMpLnVwZGF0ZS5hcHBseShfdGhpcyRydWxlcywgYXJndW1lbnRzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgc2luZ2xlIHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVwZGF0ZU9uZSA9IGZ1bmN0aW9uIHVwZGF0ZU9uZShydWxlLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgdGhpcy5ydWxlcy51cGRhdGVPbmUocnVsZSwgZGF0YSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnQgcnVsZXMgdG8gYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlcy50b1N0cmluZyhvcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gU3R5bGVTaGVldDtcbn0oKTtcblxudmFyIFBsdWdpbnNSZWdpc3RyeSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBsdWdpbnNSZWdpc3RyeSgpIHtcbiAgICB0aGlzLnBsdWdpbnMgPSB7XG4gICAgICBpbnRlcm5hbDogW10sXG4gICAgICBleHRlcm5hbDogW11cbiAgICB9O1xuICAgIHRoaXMucmVnaXN0cnkgPSB7fTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQbHVnaW5zUmVnaXN0cnkucHJvdG90eXBlO1xuXG4gIC8qKlxuICAgKiBDYWxsIGBvbkNyZWF0ZVJ1bGVgIGhvb2tzIGFuZCByZXR1cm4gYW4gb2JqZWN0IGlmIHJldHVybmVkIGJ5IGEgaG9vay5cbiAgICovXG4gIF9wcm90by5vbkNyZWF0ZVJ1bGUgPSBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUobmFtZSwgZGVjbCwgb3B0aW9ucykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpc3RyeS5vbkNyZWF0ZVJ1bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBydWxlID0gdGhpcy5yZWdpc3RyeS5vbkNyZWF0ZVJ1bGVbaV0obmFtZSwgZGVjbCwgb3B0aW9ucyk7XG4gICAgICBpZiAocnVsZSkgcmV0dXJuIHJ1bGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgYG9uUHJvY2Vzc1J1bGVgIGhvb2tzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5vblByb2Nlc3NSdWxlID0gZnVuY3Rpb24gb25Qcm9jZXNzUnVsZShydWxlKSB7XG4gICAgaWYgKHJ1bGUuaXNQcm9jZXNzZWQpIHJldHVybjtcbiAgICB2YXIgc2hlZXQgPSBydWxlLm9wdGlvbnMuc2hlZXQ7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkub25Qcm9jZXNzUnVsZS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5yZWdpc3RyeS5vblByb2Nlc3NSdWxlW2ldKHJ1bGUsIHNoZWV0KTtcbiAgICB9XG5cbiAgICBpZiAocnVsZS5zdHlsZSkgdGhpcy5vblByb2Nlc3NTdHlsZShydWxlLnN0eWxlLCBydWxlLCBzaGVldCk7XG4gICAgcnVsZS5pc1Byb2Nlc3NlZCA9IHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgYG9uUHJvY2Vzc1N0eWxlYCBob29rcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ub25Qcm9jZXNzU3R5bGUgPSBmdW5jdGlvbiBvblByb2Nlc3NTdHlsZShzdHlsZSwgcnVsZSwgc2hlZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkub25Qcm9jZXNzU3R5bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJ1bGUuc3R5bGUgPSB0aGlzLnJlZ2lzdHJ5Lm9uUHJvY2Vzc1N0eWxlW2ldKHJ1bGUuc3R5bGUsIHJ1bGUsIHNoZWV0KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgYG9uUHJvY2Vzc1NoZWV0YCBob29rcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ub25Qcm9jZXNzU2hlZXQgPSBmdW5jdGlvbiBvblByb2Nlc3NTaGVldChzaGVldCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpc3RyeS5vblByb2Nlc3NTaGVldC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5yZWdpc3RyeS5vblByb2Nlc3NTaGVldFtpXShzaGVldCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIGBvblVwZGF0ZWAgaG9va3MuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLm9uVXBkYXRlID0gZnVuY3Rpb24gb25VcGRhdGUoZGF0YSwgcnVsZSwgc2hlZXQsIG9wdGlvbnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkub25VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucmVnaXN0cnkub25VcGRhdGVbaV0oZGF0YSwgcnVsZSwgc2hlZXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ2FsbCBgb25DaGFuZ2VWYWx1ZWAgaG9va3MuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLm9uQ2hhbmdlVmFsdWUgPSBmdW5jdGlvbiBvbkNoYW5nZVZhbHVlKHZhbHVlLCBwcm9wLCBydWxlKSB7XG4gICAgdmFyIHByb2Nlc3NlZFZhbHVlID0gdmFsdWU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkub25DaGFuZ2VWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcHJvY2Vzc2VkVmFsdWUgPSB0aGlzLnJlZ2lzdHJ5Lm9uQ2hhbmdlVmFsdWVbaV0ocHJvY2Vzc2VkVmFsdWUsIHByb3AsIHJ1bGUpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzZWRWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBwbHVnaW4uXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVzZSA9IGZ1bmN0aW9uIHVzZShuZXdQbHVnaW4sIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICBxdWV1ZTogJ2V4dGVybmFsJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgcGx1Z2lucyA9IHRoaXMucGx1Z2luc1tvcHRpb25zLnF1ZXVlXTsgLy8gQXZvaWRzIGFwcGx5aW5nIHNhbWUgcGx1Z2luIHR3aWNlLCBhdCBsZWFzdCBiYXNlZCBvbiByZWYuXG5cbiAgICBpZiAocGx1Z2lucy5pbmRleE9mKG5ld1BsdWdpbikgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGx1Z2lucy5wdXNoKG5ld1BsdWdpbik7XG4gICAgdGhpcy5yZWdpc3RyeSA9IFtdLmNvbmNhdCh0aGlzLnBsdWdpbnMuZXh0ZXJuYWwsIHRoaXMucGx1Z2lucy5pbnRlcm5hbCkucmVkdWNlKGZ1bmN0aW9uIChyZWdpc3RyeSwgcGx1Z2luKSB7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIHBsdWdpbikge1xuICAgICAgICBpZiAobmFtZSBpbiByZWdpc3RyeSkge1xuICAgICAgICAgIHJlZ2lzdHJ5W25hbWVdLnB1c2gocGx1Z2luW25hbWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCBcIltKU1NdIFVua25vd24gaG9vayBcXFwiXCIgKyBuYW1lICsgXCJcXFwiLlwiKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgfSwge1xuICAgICAgb25DcmVhdGVSdWxlOiBbXSxcbiAgICAgIG9uUHJvY2Vzc1J1bGU6IFtdLFxuICAgICAgb25Qcm9jZXNzU3R5bGU6IFtdLFxuICAgICAgb25Qcm9jZXNzU2hlZXQ6IFtdLFxuICAgICAgb25DaGFuZ2VWYWx1ZTogW10sXG4gICAgICBvblVwZGF0ZTogW11cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gUGx1Z2luc1JlZ2lzdHJ5O1xufSgpO1xuXG4vKipcbiAqIFNoZWV0cyByZWdpc3RyeSB0byBhY2Nlc3MgYWxsIGluc3RhbmNlcyBpbiBvbmUgcGxhY2UuXG4gKi9cblxudmFyIFNoZWV0c1JlZ2lzdHJ5ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2hlZXRzUmVnaXN0cnkoKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IFtdO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNoZWV0c1JlZ2lzdHJ5LnByb3RvdHlwZTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBTdHlsZSBTaGVldC5cbiAgICovXG4gIF9wcm90by5hZGQgPSBmdW5jdGlvbiBhZGQoc2hlZXQpIHtcbiAgICB2YXIgcmVnaXN0cnkgPSB0aGlzLnJlZ2lzdHJ5O1xuICAgIHZhciBpbmRleCA9IHNoZWV0Lm9wdGlvbnMuaW5kZXg7XG4gICAgaWYgKHJlZ2lzdHJ5LmluZGV4T2Yoc2hlZXQpICE9PSAtMSkgcmV0dXJuO1xuXG4gICAgaWYgKHJlZ2lzdHJ5Lmxlbmd0aCA9PT0gMCB8fCBpbmRleCA+PSB0aGlzLmluZGV4KSB7XG4gICAgICByZWdpc3RyeS5wdXNoKHNoZWV0KTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEZpbmQgYSBwb3NpdGlvbi5cblxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyeS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlZ2lzdHJ5W2ldLm9wdGlvbnMuaW5kZXggPiBpbmRleCkge1xuICAgICAgICByZWdpc3RyeS5zcGxpY2UoaSwgMCwgc2hlZXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXNldCB0aGUgcmVnaXN0cnkuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IFtdO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYSBTdHlsZSBTaGVldC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKHNoZWV0KSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5yZWdpc3RyeS5pbmRleE9mKHNoZWV0KTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnNwbGljZShpbmRleCwgMSk7XG4gIH1cbiAgLyoqXG4gICAqIENvbnZlcnQgYWxsIGF0dGFjaGVkIHNoZWV0cyB0byBhIENTUyBzdHJpbmcuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoX3RlbXApIHtcbiAgICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBhdHRhY2hlZCA9IF9yZWYuYXR0YWNoZWQsXG4gICAgICAgIG9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBbXCJhdHRhY2hlZFwiXSk7XG5cbiAgICB2YXIgX2dldFdoaXRlc3BhY2VTeW1ib2xzID0gZ2V0V2hpdGVzcGFjZVN5bWJvbHMob3B0aW9ucyksXG4gICAgICAgIGxpbmVicmVhayA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5saW5lYnJlYWs7XG5cbiAgICB2YXIgY3NzID0gJyc7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmVnaXN0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzaGVldCA9IHRoaXMucmVnaXN0cnlbaV07XG5cbiAgICAgIGlmIChhdHRhY2hlZCAhPSBudWxsICYmIHNoZWV0LmF0dGFjaGVkICE9PSBhdHRhY2hlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzcykgY3NzICs9IGxpbmVicmVhaztcbiAgICAgIGNzcyArPSBzaGVldC50b1N0cmluZyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3NzO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhTaGVldHNSZWdpc3RyeSwgW3tcbiAgICBrZXk6IFwiaW5kZXhcIixcblxuICAgIC8qKlxuICAgICAqIEN1cnJlbnQgaGlnaGVzdCBpbmRleCBudW1iZXIuXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5sZW5ndGggPT09IDAgPyAwIDogdGhpcy5yZWdpc3RyeVt0aGlzLnJlZ2lzdHJ5Lmxlbmd0aCAtIDFdLm9wdGlvbnMuaW5kZXg7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNoZWV0c1JlZ2lzdHJ5O1xufSgpO1xuXG4vKipcbiAqIFRoaXMgaXMgYSBnbG9iYWwgc2hlZXRzIHJlZ2lzdHJ5LiBPbmx5IERvbVJlbmRlcmVyIHdpbGwgYWRkIHNoZWV0cyB0byBpdC5cbiAqIE9uIHRoZSBzZXJ2ZXIgb25lIHNob3VsZCB1c2UgYW4gb3duIFNoZWV0c1JlZ2lzdHJ5IGluc3RhbmNlIGFuZCBhZGQgdGhlXG4gKiBzaGVldHMgdG8gaXQsIGJlY2F1c2UgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRvIGNyZWF0ZSBhIG5ldyByZWdpc3RyeSBmb3JcbiAqIGVhY2ggcmVxdWVzdCBpbiBvcmRlciB0byBub3QgbGVhayBzaGVldHMgYWNyb3NzIHJlcXVlc3RzLlxuICovXG5cbnZhciBzaGVldHMgPSBuZXcgU2hlZXRzUmVnaXN0cnkoKTtcblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLyoqXG4gKiBOb3cgdGhhdCBgZ2xvYmFsVGhpc2AgaXMgYXZhaWxhYmxlIG9uIG1vc3QgcGxhdGZvcm1zXG4gKiAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZ2xvYmFsVGhpcyNicm93c2VyX2NvbXBhdGliaWxpdHkpXG4gKiB3ZSBjaGVjayBmb3IgYGdsb2JhbFRoaXNgIGZpcnN0LiBgZ2xvYmFsVGhpc2AgaXMgbmVjZXNzYXJ5IGZvciBqc3NcbiAqIHRvIHJ1biBpbiBBZ29yaWMncyBzZWN1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0IChTRVMpLiBVbmRlciBTRVMsXG4gKiBgZ2xvYmFsVGhpc2AgZXhpc3RzLCBidXQgYHdpbmRvd2AsIGBzZWxmYCwgYW5kIGBGdW5jdGlvbigncmV0dXJuXG4gKiB0aGlzJykoKWAgYXJlIGFsbCB1bmRlZmluZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbiAqL1xudmFyIGdsb2JhbFRoaXMkMSA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PT0gTWF0aCA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxudmFyIG5zID0gJzJmMWFjYzZjM2E2MDZiMDgyZTVlZWY1ZTU0NDE0ZmZiJztcbmlmIChnbG9iYWxUaGlzJDFbbnNdID09IG51bGwpIGdsb2JhbFRoaXMkMVtuc10gPSAwOyAvLyBCdW5kbGUgbWF5IGNvbnRhaW4gbXVsdGlwbGUgSlNTIHZlcnNpb25zIGF0IHRoZSBzYW1lIHRpbWUuIEluIG9yZGVyIHRvIGlkZW50aWZ5XG4vLyB0aGUgY3VycmVudCB2ZXJzaW9uIHdpdGgganVzdCBvbmUgc2hvcnQgbnVtYmVyIGFuZCB1c2UgaXQgZm9yIGNsYXNzZXMgZ2VuZXJhdGlvblxuLy8gd2UgdXNlIGEgY291bnRlci4gQWxzbyBpdCBpcyBtb3JlIGFjY3VyYXRlLCBiZWNhdXNlIHVzZXIgY2FuIG1hbnVhbGx5IHJlZXZhbHVhdGVcbi8vIHRoZSBtb2R1bGUuXG5cbnZhciBtb2R1bGVJZCA9IGdsb2JhbFRoaXMkMVtuc10rKztcblxudmFyIG1heFJ1bGVzID0gMWUxMDtcbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoIGdlbmVyYXRlcyB1bmlxdWUgY2xhc3MgbmFtZXMgYmFzZWQgb24gY291bnRlcnMuXG4gKiBXaGVuIG5ldyBnZW5lcmF0b3IgZnVuY3Rpb24gaXMgY3JlYXRlZCwgcnVsZSBjb3VudGVyIGlzIHJlc2V0ZWQuXG4gKiBXZSBuZWVkIHRvIHJlc2V0IHRoZSBydWxlIGNvdW50ZXIgZm9yIFNTUiBmb3IgZWFjaCByZXF1ZXN0LlxuICovXG5cbnZhciBjcmVhdGVHZW5lcmF0ZUlkID0gZnVuY3Rpb24gY3JlYXRlR2VuZXJhdGVJZChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgcnVsZUNvdW50ZXIgPSAwO1xuXG4gIHZhciBnZW5lcmF0ZUlkID0gZnVuY3Rpb24gZ2VuZXJhdGVJZChydWxlLCBzaGVldCkge1xuICAgIHJ1bGVDb3VudGVyICs9IDE7XG5cbiAgICBpZiAocnVsZUNvdW50ZXIgPiBtYXhSdWxlcykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBZb3UgbWlnaHQgaGF2ZSBhIG1lbW9yeSBsZWFrLiBSdWxlIGNvdW50ZXIgaXMgYXQgXCIgKyBydWxlQ291bnRlciArIFwiLlwiKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICB2YXIganNzSWQgPSAnJztcbiAgICB2YXIgcHJlZml4ID0gJyc7XG5cbiAgICBpZiAoc2hlZXQpIHtcbiAgICAgIGlmIChzaGVldC5vcHRpb25zLmNsYXNzTmFtZVByZWZpeCkge1xuICAgICAgICBwcmVmaXggPSBzaGVldC5vcHRpb25zLmNsYXNzTmFtZVByZWZpeDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNoZWV0Lm9wdGlvbnMuanNzLmlkICE9IG51bGwpIHtcbiAgICAgICAganNzSWQgPSBTdHJpbmcoc2hlZXQub3B0aW9ucy5qc3MuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1pbmlmeSkge1xuICAgICAgLy8gVXNpbmcgXCJjXCIgYmVjYXVzZSBhIG51bWJlciBjYW4ndCBiZSB0aGUgZmlyc3QgY2hhciBpbiBhIGNsYXNzIG5hbWUuXG4gICAgICByZXR1cm4gXCJcIiArIChwcmVmaXggfHwgJ2MnKSArIG1vZHVsZUlkICsganNzSWQgKyBydWxlQ291bnRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJlZml4ICsgcnVsZS5rZXkgKyBcIi1cIiArIG1vZHVsZUlkICsgKGpzc0lkID8gXCItXCIgKyBqc3NJZCA6ICcnKSArIFwiLVwiICsgcnVsZUNvdW50ZXI7XG4gIH07XG5cbiAgcmV0dXJuIGdlbmVyYXRlSWQ7XG59O1xuXG4vKipcbiAqIENhY2hlIHRoZSB2YWx1ZSBmcm9tIHRoZSBmaXJzdCB0aW1lIGEgZnVuY3Rpb24gaXMgY2FsbGVkLlxuICovXG5cbnZhciBtZW1vaXplID0gZnVuY3Rpb24gbWVtb2l6ZShmbikge1xuICB2YXIgdmFsdWU7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF2YWx1ZSkgdmFsdWUgPSBmbigpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn07XG4vKipcbiAqIEdldCBhIHN0eWxlIHByb3BlcnR5IHZhbHVlLlxuICovXG5cblxudmFyIGdldFByb3BlcnR5VmFsdWUgPSBmdW5jdGlvbiBnZXRQcm9wZXJ0eVZhbHVlKGNzc1J1bGUsIHByb3ApIHtcbiAgdHJ5IHtcbiAgICAvLyBTdXBwb3J0IENTU1RPTS5cbiAgICBpZiAoY3NzUnVsZS5hdHRyaWJ1dGVTdHlsZU1hcCkge1xuICAgICAgcmV0dXJuIGNzc1J1bGUuYXR0cmlidXRlU3R5bGVNYXAuZ2V0KHByb3ApO1xuICAgIH1cblxuICAgIHJldHVybiBjc3NSdWxlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUocHJvcCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIElFIG1heSB0aHJvdyBpZiBwcm9wZXJ0eSBpcyB1bmtub3duLlxuICAgIHJldHVybiAnJztcbiAgfVxufTtcbi8qKlxuICogU2V0IGEgc3R5bGUgcHJvcGVydHkuXG4gKi9cblxuXG52YXIgc2V0UHJvcGVydHkgPSBmdW5jdGlvbiBzZXRQcm9wZXJ0eShjc3NSdWxlLCBwcm9wLCB2YWx1ZSkge1xuICB0cnkge1xuICAgIHZhciBjc3NWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjc3NWYWx1ZSA9IHRvQ3NzVmFsdWUodmFsdWUpO1xuICAgIH0gLy8gU3VwcG9ydCBDU1NUT00uXG5cblxuICAgIGlmIChjc3NSdWxlLmF0dHJpYnV0ZVN0eWxlTWFwKSB7XG4gICAgICBjc3NSdWxlLmF0dHJpYnV0ZVN0eWxlTWFwLnNldChwcm9wLCBjc3NWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRleE9mSW1wb3J0YW50RmxhZyA9IGNzc1ZhbHVlID8gY3NzVmFsdWUuaW5kZXhPZignIWltcG9ydGFudCcpIDogLTE7XG4gICAgICB2YXIgY3NzVmFsdWVXaXRob3V0SW1wb3J0YW50RmxhZyA9IGluZGV4T2ZJbXBvcnRhbnRGbGFnID4gLTEgPyBjc3NWYWx1ZS5zdWJzdHIoMCwgaW5kZXhPZkltcG9ydGFudEZsYWcgLSAxKSA6IGNzc1ZhbHVlO1xuICAgICAgY3NzUnVsZS5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wLCBjc3NWYWx1ZVdpdGhvdXRJbXBvcnRhbnRGbGFnLCBpbmRleE9mSW1wb3J0YW50RmxhZyA+IC0xID8gJ2ltcG9ydGFudCcgOiAnJyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBJRSBtYXkgdGhyb3cgaWYgcHJvcGVydHkgaXMgdW5rbm93bi5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4vKipcbiAqIFJlbW92ZSBhIHN0eWxlIHByb3BlcnR5LlxuICovXG5cblxudmFyIHJlbW92ZVByb3BlcnR5ID0gZnVuY3Rpb24gcmVtb3ZlUHJvcGVydHkoY3NzUnVsZSwgcHJvcCkge1xuICB0cnkge1xuICAgIC8vIFN1cHBvcnQgQ1NTVE9NLlxuICAgIGlmIChjc3NSdWxlLmF0dHJpYnV0ZVN0eWxlTWFwKSB7XG4gICAgICBjc3NSdWxlLmF0dHJpYnV0ZVN0eWxlTWFwLmRlbGV0ZShwcm9wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3NzUnVsZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsIFwiW0pTU10gRE9NRXhjZXB0aW9uIFxcXCJcIiArIGVyci5tZXNzYWdlICsgXCJcXFwiIHdhcyB0aHJvd24uIFRyaWVkIHRvIHJlbW92ZSBwcm9wZXJ0eSBcXFwiXCIgKyBwcm9wICsgXCJcXFwiLlwiKSA6IHZvaWQgMDtcbiAgfVxufTtcbi8qKlxuICogU2V0IHRoZSBzZWxlY3Rvci5cbiAqL1xuXG5cbnZhciBzZXRTZWxlY3RvciA9IGZ1bmN0aW9uIHNldFNlbGVjdG9yKGNzc1J1bGUsIHNlbGVjdG9yVGV4dCkge1xuICBjc3NSdWxlLnNlbGVjdG9yVGV4dCA9IHNlbGVjdG9yVGV4dDsgLy8gUmV0dXJuIGZhbHNlIGlmIHNldHRlciB3YXMgbm90IHN1Y2Nlc3NmdWwuXG4gIC8vIEN1cnJlbnRseSB3b3JrcyBpbiBjaHJvbWUgb25seS5cblxuICByZXR1cm4gY3NzUnVsZS5zZWxlY3RvclRleHQgPT09IHNlbGVjdG9yVGV4dDtcbn07XG4vKipcbiAqIEdldHMgdGhlIGBoZWFkYCBlbGVtZW50IHVwb24gdGhlIGZpcnN0IGNhbGwgYW5kIGNhY2hlcyBpdC5cbiAqIFdlIGFzc3VtZSBpdCBjYW4ndCBiZSBudWxsLlxuICovXG5cblxudmFyIGdldEhlYWQgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKTtcbn0pO1xuLyoqXG4gKiBGaW5kIGF0dGFjaGVkIHNoZWV0IHdpdGggYW4gaW5kZXggaGlnaGVyIHRoYW4gdGhlIHBhc3NlZCBvbmUuXG4gKi9cblxuZnVuY3Rpb24gZmluZEhpZ2hlclNoZWV0KHJlZ2lzdHJ5LCBvcHRpb25zKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVnaXN0cnkubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc2hlZXQgPSByZWdpc3RyeVtpXTtcblxuICAgIGlmIChzaGVldC5hdHRhY2hlZCAmJiBzaGVldC5vcHRpb25zLmluZGV4ID4gb3B0aW9ucy5pbmRleCAmJiBzaGVldC5vcHRpb25zLmluc2VydGlvblBvaW50ID09PSBvcHRpb25zLmluc2VydGlvblBvaW50KSB7XG4gICAgICByZXR1cm4gc2hlZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEZpbmQgYXR0YWNoZWQgc2hlZXQgd2l0aCB0aGUgaGlnaGVzdCBpbmRleC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGZpbmRIaWdoZXN0U2hlZXQocmVnaXN0cnksIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIgaSA9IHJlZ2lzdHJ5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHNoZWV0ID0gcmVnaXN0cnlbaV07XG5cbiAgICBpZiAoc2hlZXQuYXR0YWNoZWQgJiYgc2hlZXQub3B0aW9ucy5pbnNlcnRpb25Qb2ludCA9PT0gb3B0aW9ucy5pbnNlcnRpb25Qb2ludCkge1xuICAgICAgcmV0dXJuIHNoZWV0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBGaW5kIGEgY29tbWVudCB3aXRoIFwianNzXCIgaW5zaWRlLlxuICovXG5cblxuZnVuY3Rpb24gZmluZENvbW1lbnROb2RlKHRleHQpIHtcbiAgdmFyIGhlYWQgPSBnZXRIZWFkKCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbm9kZSA9IGhlYWQuY2hpbGROb2Rlc1tpXTtcblxuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PT0gdGV4dCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEZpbmQgYSBub2RlIGJlZm9yZSB3aGljaCB3ZSBjYW4gaW5zZXJ0IHRoZSBzaGVldC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGZpbmRQcmV2Tm9kZShvcHRpb25zKSB7XG4gIHZhciByZWdpc3RyeSA9IHNoZWV0cy5yZWdpc3RyeTtcblxuICBpZiAocmVnaXN0cnkubGVuZ3RoID4gMCkge1xuICAgIC8vIFRyeSB0byBpbnNlcnQgYmVmb3JlIHRoZSBuZXh0IGhpZ2hlciBzaGVldC5cbiAgICB2YXIgc2hlZXQgPSBmaW5kSGlnaGVyU2hlZXQocmVnaXN0cnksIG9wdGlvbnMpO1xuXG4gICAgaWYgKHNoZWV0ICYmIHNoZWV0LnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXJlbnQ6IHNoZWV0LnJlbmRlcmVyLmVsZW1lbnQucGFyZW50Tm9kZSxcbiAgICAgICAgbm9kZTogc2hlZXQucmVuZGVyZXIuZWxlbWVudFxuICAgICAgfTtcbiAgICB9IC8vIE90aGVyd2lzZSBpbnNlcnQgYWZ0ZXIgdGhlIGxhc3QgYXR0YWNoZWQuXG5cblxuICAgIHNoZWV0ID0gZmluZEhpZ2hlc3RTaGVldChyZWdpc3RyeSwgb3B0aW9ucyk7XG5cbiAgICBpZiAoc2hlZXQgJiYgc2hlZXQucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmVudDogc2hlZXQucmVuZGVyZXIuZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgICBub2RlOiBzaGVldC5yZW5kZXJlci5lbGVtZW50Lm5leHRTaWJsaW5nXG4gICAgICB9O1xuICAgIH1cbiAgfSAvLyBUcnkgdG8gZmluZCBhIGNvbW1lbnQgcGxhY2Vob2xkZXIgaWYgcmVnaXN0cnkgaXMgZW1wdHkuXG5cblxuICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBvcHRpb25zLmluc2VydGlvblBvaW50O1xuXG4gIGlmIChpbnNlcnRpb25Qb2ludCAmJiB0eXBlb2YgaW5zZXJ0aW9uUG9pbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIGNvbW1lbnQgPSBmaW5kQ29tbWVudE5vZGUoaW5zZXJ0aW9uUG9pbnQpO1xuXG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmVudDogY29tbWVudC5wYXJlbnROb2RlLFxuICAgICAgICBub2RlOiBjb21tZW50Lm5leHRTaWJsaW5nXG4gICAgICB9O1xuICAgIH0gLy8gSWYgdXNlciBzcGVjaWZpZXMgYW4gaW5zZXJ0aW9uIHBvaW50IGFuZCBpdCBjYW4ndCBiZSBmb3VuZCBpbiB0aGUgZG9jdW1lbnQgLVxuICAgIC8vIGJhZCBzcGVjaWZpY2l0eSBpc3N1ZXMgbWF5IGFwcGVhci5cblxuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBJbnNlcnRpb24gcG9pbnQgXFxcIlwiICsgaW5zZXJ0aW9uUG9pbnQgKyBcIlxcXCIgbm90IGZvdW5kLlwiKSA6IHZvaWQgMDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogSW5zZXJ0IHN0eWxlIGVsZW1lbnQgaW50byB0aGUgRE9NLlxuICovXG5cblxuZnVuY3Rpb24gaW5zZXJ0U3R5bGUoc3R5bGUsIG9wdGlvbnMpIHtcbiAgdmFyIGluc2VydGlvblBvaW50ID0gb3B0aW9ucy5pbnNlcnRpb25Qb2ludDtcbiAgdmFyIG5leHROb2RlID0gZmluZFByZXZOb2RlKG9wdGlvbnMpO1xuXG4gIGlmIChuZXh0Tm9kZSAhPT0gZmFsc2UgJiYgbmV4dE5vZGUucGFyZW50KSB7XG4gICAgbmV4dE5vZGUucGFyZW50Lmluc2VydEJlZm9yZShzdHlsZSwgbmV4dE5vZGUubm9kZSk7XG4gICAgcmV0dXJuO1xuICB9IC8vIFdvcmtzIHdpdGggaWZyYW1lcyBhbmQgYW55IG5vZGUgdHlwZXMuXG5cblxuICBpZiAoaW5zZXJ0aW9uUG9pbnQgJiYgdHlwZW9mIGluc2VydGlvblBvaW50Lm5vZGVUeXBlID09PSAnbnVtYmVyJykge1xuICAgIHZhciBpbnNlcnRpb25Qb2ludEVsZW1lbnQgPSBpbnNlcnRpb25Qb2ludDtcbiAgICB2YXIgcGFyZW50Tm9kZSA9IGluc2VydGlvblBvaW50RWxlbWVudC5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnROb2RlKSBwYXJlbnROb2RlLmluc2VydEJlZm9yZShzdHlsZSwgaW5zZXJ0aW9uUG9pbnRFbGVtZW50Lm5leHRTaWJsaW5nKTtlbHNlIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsICdbSlNTXSBJbnNlcnRpb24gcG9pbnQgaXMgbm90IGluIHRoZSBET00uJykgOiB2b2lkIDA7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZ2V0SGVhZCgpLmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbi8qKlxuICogUmVhZCBqc3Mgbm9uY2Ugc2V0dGluZyBmcm9tIHRoZSBwYWdlIGlmIHRoZSB1c2VyIGhhcyBzZXQgaXQuXG4gKi9cblxuXG52YXIgZ2V0Tm9uY2UgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW3Byb3BlcnR5PVwiY3NwLW5vbmNlXCJdJyk7XG4gIHJldHVybiBub2RlID8gbm9kZS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSA6IG51bGw7XG59KTtcblxudmFyIF9pbnNlcnRSdWxlID0gZnVuY3Rpb24gaW5zZXJ0UnVsZShjb250YWluZXIsIHJ1bGUsIGluZGV4KSB7XG4gIHRyeSB7XG4gICAgaWYgKCdpbnNlcnRSdWxlJyBpbiBjb250YWluZXIpIHtcbiAgICAgIGNvbnRhaW5lci5pbnNlcnRSdWxlKHJ1bGUsIGluZGV4KTtcbiAgICB9IC8vIEtleWZyYW1lcyBydWxlLlxuICAgIGVsc2UgaWYgKCdhcHBlbmRSdWxlJyBpbiBjb250YWluZXIpIHtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZFJ1bGUocnVsZSk7XG4gICAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsIFwiW0pTU10gXCIgKyBlcnIubWVzc2FnZSkgOiB2b2lkIDA7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRhaW5lci5jc3NSdWxlc1tpbmRleF07XG59O1xuXG52YXIgZ2V0VmFsaWRSdWxlSW5zZXJ0aW9uSW5kZXggPSBmdW5jdGlvbiBnZXRWYWxpZFJ1bGVJbnNlcnRpb25JbmRleChjb250YWluZXIsIGluZGV4KSB7XG4gIHZhciBtYXhJbmRleCA9IGNvbnRhaW5lci5jc3NSdWxlcy5sZW5ndGg7IC8vIEluIGNhc2UgcHJldmlvdXMgaW5zZXJ0aW9uIGZhaWxzLCBwYXNzZWQgaW5kZXggbWlnaHQgYmUgd3JvbmdcblxuICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA+IG1heEluZGV4KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgcmV0dXJuIG1heEluZGV4O1xuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufTtcblxudmFyIGNyZWF0ZVN0eWxlID0gZnVuY3Rpb24gY3JlYXRlU3R5bGUoKSB7XG4gIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7IC8vIFdpdGhvdXQgaXQsIElFIHdpbGwgaGF2ZSBhIGJyb2tlbiBzb3VyY2Ugb3JkZXIgc3BlY2lmaWNpdHkgaWYgd2VcbiAgLy8gaW5zZXJ0IHJ1bGVzIGFmdGVyIHdlIGluc2VydCB0aGUgc3R5bGUgdGFnLlxuICAvLyBJdCBzZWVtcyB0byBraWNrLW9mZiB0aGUgc291cmNlIG9yZGVyIHNwZWNpZmljaXR5IGFsZ29yaXRobS5cblxuICBlbC50ZXh0Q29udGVudCA9ICdcXG4nO1xuICByZXR1cm4gZWw7XG59O1xuXG52YXIgRG9tUmVuZGVyZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvLyBXaWxsIGJlIGVtcHR5IGlmIGxpbms6IHRydWUgb3B0aW9uIGlzIG5vdCBzZXQsIGJlY2F1c2VcbiAgLy8gaXQgaXMgb25seSBmb3IgdXNlIHRvZ2V0aGVyIHdpdGggaW5zZXJ0UnVsZSBBUEkuXG4gIGZ1bmN0aW9uIERvbVJlbmRlcmVyKHNoZWV0KSB7XG4gICAgdGhpcy5nZXRQcm9wZXJ0eVZhbHVlID0gZ2V0UHJvcGVydHlWYWx1ZTtcbiAgICB0aGlzLnNldFByb3BlcnR5ID0gc2V0UHJvcGVydHk7XG4gICAgdGhpcy5yZW1vdmVQcm9wZXJ0eSA9IHJlbW92ZVByb3BlcnR5O1xuICAgIHRoaXMuc2V0U2VsZWN0b3IgPSBzZXRTZWxlY3RvcjtcbiAgICB0aGlzLmhhc0luc2VydGVkUnVsZXMgPSBmYWxzZTtcbiAgICB0aGlzLmNzc1J1bGVzID0gW107XG4gICAgLy8gVGhlcmUgaXMgbm8gc2hlZXQgd2hlbiB0aGUgcmVuZGVyZXIgaXMgdXNlZCBmcm9tIGEgc3RhbmRhbG9uZSBTdHlsZVJ1bGUuXG4gICAgaWYgKHNoZWV0KSBzaGVldHMuYWRkKHNoZWV0KTtcbiAgICB0aGlzLnNoZWV0ID0gc2hlZXQ7XG5cbiAgICB2YXIgX3JlZiA9IHRoaXMuc2hlZXQgPyB0aGlzLnNoZWV0Lm9wdGlvbnMgOiB7fSxcbiAgICAgICAgbWVkaWEgPSBfcmVmLm1lZGlhLFxuICAgICAgICBtZXRhID0gX3JlZi5tZXRhLFxuICAgICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50O1xuXG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudCB8fCBjcmVhdGVTdHlsZSgpO1xuICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtanNzJywgJycpO1xuICAgIGlmIChtZWRpYSkgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnbWVkaWEnLCBtZWRpYSk7XG4gICAgaWYgKG1ldGEpIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWV0YScsIG1ldGEpO1xuICAgIHZhciBub25jZSA9IGdldE5vbmNlKCk7XG4gICAgaWYgKG5vbmNlKSB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTtcbiAgfVxuICAvKipcbiAgICogSW5zZXJ0IHN0eWxlIGVsZW1lbnQgaW50byByZW5kZXIgdHJlZS5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gRG9tUmVuZGVyZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5hdHRhY2ggPSBmdW5jdGlvbiBhdHRhY2goKSB7XG4gICAgLy8gSW4gdGhlIGNhc2UgdGhlIGVsZW1lbnQgbm9kZSBpcyBleHRlcm5hbCBhbmQgaXQgaXMgYWxyZWFkeSBpbiB0aGUgRE9NLlxuICAgIGlmICh0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSB8fCAhdGhpcy5zaGVldCkgcmV0dXJuO1xuICAgIGluc2VydFN0eWxlKHRoaXMuZWxlbWVudCwgdGhpcy5zaGVldC5vcHRpb25zKTsgLy8gV2hlbiBydWxlcyBhcmUgaW5zZXJ0ZWQgdXNpbmcgYGluc2VydFJ1bGVgIEFQSSwgYWZ0ZXIgYHNoZWV0LmRldGFjaCgpLmF0dGFjaCgpYFxuICAgIC8vIG1vc3QgYnJvd3NlcnMgY3JlYXRlIGEgbmV3IENTU1N0eWxlU2hlZXQsIGV4Y2VwdCBvZiBhbGwgSUVzLlxuXG4gICAgdmFyIGRlcGxveWVkID0gQm9vbGVhbih0aGlzLnNoZWV0ICYmIHRoaXMuc2hlZXQuZGVwbG95ZWQpO1xuXG4gICAgaWYgKHRoaXMuaGFzSW5zZXJ0ZWRSdWxlcyAmJiBkZXBsb3llZCkge1xuICAgICAgdGhpcy5oYXNJbnNlcnRlZFJ1bGVzID0gZmFsc2U7XG4gICAgICB0aGlzLmRlcGxveSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIHN0eWxlIGVsZW1lbnQgZnJvbSByZW5kZXIgdHJlZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZGV0YWNoID0gZnVuY3Rpb24gZGV0YWNoKCkge1xuICAgIGlmICghdGhpcy5zaGVldCkgcmV0dXJuO1xuICAgIHZhciBwYXJlbnROb2RlID0gdGhpcy5lbGVtZW50LnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUpIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50KTsgLy8gSW4gdGhlIG1vc3QgYnJvd3NlcnMsIHJ1bGVzIGluc2VydGVkIHVzaW5nIGluc2VydFJ1bGUoKSBBUEkgd2lsbCBiZSBsb3N0IHdoZW4gc3R5bGUgZWxlbWVudCBpcyByZW1vdmVkLlxuICAgIC8vIFRob3VnaCBJRSB3aWxsIGtlZXAgdGhlbSBhbmQgd2UgbmVlZCBhIGNvbnNpc3RlbnQgYmVoYXZpb3IuXG5cbiAgICBpZiAodGhpcy5zaGVldC5vcHRpb25zLmxpbmspIHtcbiAgICAgIHRoaXMuY3NzUnVsZXMgPSBbXTtcbiAgICAgIHRoaXMuZWxlbWVudC50ZXh0Q29udGVudCA9ICdcXG4nO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSW5qZWN0IENTUyBzdHJpbmcgaW50byBlbGVtZW50LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kZXBsb3kgPSBmdW5jdGlvbiBkZXBsb3koKSB7XG4gICAgdmFyIHNoZWV0ID0gdGhpcy5zaGVldDtcbiAgICBpZiAoIXNoZWV0KSByZXR1cm47XG5cbiAgICBpZiAoc2hlZXQub3B0aW9ucy5saW5rKSB7XG4gICAgICB0aGlzLmluc2VydFJ1bGVzKHNoZWV0LnJ1bGVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVsZW1lbnQudGV4dENvbnRlbnQgPSBcIlxcblwiICsgc2hlZXQudG9TdHJpbmcoKSArIFwiXFxuXCI7XG4gIH1cbiAgLyoqXG4gICAqIEluc2VydCBSdWxlTGlzdCBpbnRvIGFuIGVsZW1lbnQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmluc2VydFJ1bGVzID0gZnVuY3Rpb24gaW5zZXJ0UnVsZXMocnVsZXMsIG5hdGl2ZVBhcmVudCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMuaW5kZXgubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaW5zZXJ0UnVsZShydWxlcy5pbmRleFtpXSwgaSwgbmF0aXZlUGFyZW50KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEluc2VydCBhIHJ1bGUgaW50byBlbGVtZW50LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pbnNlcnRSdWxlID0gZnVuY3Rpb24gaW5zZXJ0UnVsZShydWxlLCBpbmRleCwgbmF0aXZlUGFyZW50KSB7XG4gICAgaWYgKG5hdGl2ZVBhcmVudCA9PT0gdm9pZCAwKSB7XG4gICAgICBuYXRpdmVQYXJlbnQgPSB0aGlzLmVsZW1lbnQuc2hlZXQ7XG4gICAgfVxuXG4gICAgaWYgKHJ1bGUucnVsZXMpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBydWxlO1xuICAgICAgdmFyIGxhdGVzdE5hdGl2ZVBhcmVudCA9IG5hdGl2ZVBhcmVudDtcblxuICAgICAgaWYgKHJ1bGUudHlwZSA9PT0gJ2NvbmRpdGlvbmFsJyB8fCBydWxlLnR5cGUgPT09ICdrZXlmcmFtZXMnKSB7XG4gICAgICAgIHZhciBfaW5zZXJ0aW9uSW5kZXggPSBnZXRWYWxpZFJ1bGVJbnNlcnRpb25JbmRleChuYXRpdmVQYXJlbnQsIGluZGV4KTsgLy8gV2UgbmVlZCB0byByZW5kZXIgdGhlIGNvbnRhaW5lciB3aXRob3V0IGNoaWxkcmVuIGZpcnN0LlxuXG5cbiAgICAgICAgbGF0ZXN0TmF0aXZlUGFyZW50ID0gX2luc2VydFJ1bGUobmF0aXZlUGFyZW50LCBwYXJlbnQudG9TdHJpbmcoe1xuICAgICAgICAgIGNoaWxkcmVuOiBmYWxzZVxuICAgICAgICB9KSwgX2luc2VydGlvbkluZGV4KTtcblxuICAgICAgICBpZiAobGF0ZXN0TmF0aXZlUGFyZW50ID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmQ3NzUnVsZShydWxlLCBfaW5zZXJ0aW9uSW5kZXgsIGxhdGVzdE5hdGl2ZVBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW5zZXJ0UnVsZXMocGFyZW50LnJ1bGVzLCBsYXRlc3ROYXRpdmVQYXJlbnQpO1xuICAgICAgcmV0dXJuIGxhdGVzdE5hdGl2ZVBhcmVudDtcbiAgICB9XG5cbiAgICB2YXIgcnVsZVN0ciA9IHJ1bGUudG9TdHJpbmcoKTtcbiAgICBpZiAoIXJ1bGVTdHIpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgaW5zZXJ0aW9uSW5kZXggPSBnZXRWYWxpZFJ1bGVJbnNlcnRpb25JbmRleChuYXRpdmVQYXJlbnQsIGluZGV4KTtcblxuICAgIHZhciBuYXRpdmVSdWxlID0gX2luc2VydFJ1bGUobmF0aXZlUGFyZW50LCBydWxlU3RyLCBpbnNlcnRpb25JbmRleCk7XG5cbiAgICBpZiAobmF0aXZlUnVsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmhhc0luc2VydGVkUnVsZXMgPSB0cnVlO1xuICAgIHRoaXMucmVmQ3NzUnVsZShydWxlLCBpbnNlcnRpb25JbmRleCwgbmF0aXZlUnVsZSk7XG4gICAgcmV0dXJuIG5hdGl2ZVJ1bGU7XG4gIH07XG5cbiAgX3Byb3RvLnJlZkNzc1J1bGUgPSBmdW5jdGlvbiByZWZDc3NSdWxlKHJ1bGUsIGluZGV4LCBjc3NSdWxlKSB7XG4gICAgcnVsZS5yZW5kZXJhYmxlID0gY3NzUnVsZTsgLy8gV2Ugb25seSB3YW50IHRvIHJlZmVyZW5jZSB0aGUgdG9wIGxldmVsIHJ1bGVzLCBkZWxldGVSdWxlIEFQSSBkb2Vzbid0IHN1cHBvcnQgcmVtb3ZpbmcgbmVzdGVkIHJ1bGVzXG4gICAgLy8gbGlrZSBydWxlcyBpbnNpZGUgbWVkaWEgcXVlcmllcyBvciBrZXlmcmFtZXNcblxuICAgIGlmIChydWxlLm9wdGlvbnMucGFyZW50IGluc3RhbmNlb2YgU3R5bGVTaGVldCkge1xuICAgICAgdGhpcy5jc3NSdWxlcy5zcGxpY2UoaW5kZXgsIDAsIGNzc1J1bGUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogRGVsZXRlIGEgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZGVsZXRlUnVsZSA9IGZ1bmN0aW9uIGRlbGV0ZVJ1bGUoY3NzUnVsZSkge1xuICAgIHZhciBzaGVldCA9IHRoaXMuZWxlbWVudC5zaGVldDtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4T2YoY3NzUnVsZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgIHNoZWV0LmRlbGV0ZVJ1bGUoaW5kZXgpO1xuICAgIHRoaXMuY3NzUnVsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogR2V0IGluZGV4IG9mIGEgQ1NTIFJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKGNzc1J1bGUpIHtcbiAgICByZXR1cm4gdGhpcy5jc3NSdWxlcy5pbmRleE9mKGNzc1J1bGUpO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyBDU1MgcnVsZSBhbmQgcmVwbGFjZSB0aGUgZXhpc3Rpbmcgb25lLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZXBsYWNlUnVsZSA9IGZ1bmN0aW9uIHJlcGxhY2VSdWxlKGNzc1J1bGUsIHJ1bGUpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmluZGV4T2YoY3NzUnVsZSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuZWxlbWVudC5zaGVldC5kZWxldGVSdWxlKGluZGV4KTtcbiAgICB0aGlzLmNzc1J1bGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0UnVsZShydWxlLCBpbmRleCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhbGwgcnVsZXMgZWxlbWVudHMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdldFJ1bGVzID0gZnVuY3Rpb24gZ2V0UnVsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5zaGVldC5jc3NSdWxlcztcbiAgfTtcblxuICByZXR1cm4gRG9tUmVuZGVyZXI7XG59KCk7XG5cbnZhciBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuXG52YXIgSnNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gSnNzKG9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gaW5zdGFuY2VDb3VudGVyKys7XG4gICAgdGhpcy52ZXJzaW9uID0gXCIxMC4xMC4wXCI7XG4gICAgdGhpcy5wbHVnaW5zID0gbmV3IFBsdWdpbnNSZWdpc3RyeSgpO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGlkOiB7XG4gICAgICAgIG1pbmlmeTogZmFsc2VcbiAgICAgIH0sXG4gICAgICBjcmVhdGVHZW5lcmF0ZUlkOiBjcmVhdGVHZW5lcmF0ZUlkLFxuICAgICAgUmVuZGVyZXI6IGlzSW5Ccm93c2VyID8gRG9tUmVuZGVyZXIgOiBudWxsLFxuICAgICAgcGx1Z2luczogW11cbiAgICB9O1xuICAgIHRoaXMuZ2VuZXJhdGVJZCA9IGNyZWF0ZUdlbmVyYXRlSWQoe1xuICAgICAgbWluaWZ5OiBmYWxzZVxuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBsdWdpbnMudXNlKHBsdWdpbnNbaV0sIHtcbiAgICAgICAgcXVldWU6ICdpbnRlcm5hbCdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2V0dXAob3B0aW9ucyk7XG4gIH1cbiAgLyoqXG4gICAqIFByZXBhcmVzIHZhcmlvdXMgb3B0aW9ucywgYXBwbGllcyBwbHVnaW5zLlxuICAgKiBTaG91bGQgbm90IGJlIHVzZWQgdHdpY2Ugb24gdGhlIHNhbWUgaW5zdGFuY2UsIGJlY2F1c2UgdGhlcmUgaXMgbm8gcGx1Z2luc1xuICAgKiBkZWR1cGxpY2F0aW9uIGxvZ2ljLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBKc3MucHJvdG90eXBlO1xuXG4gIF9wcm90by5zZXR1cCA9IGZ1bmN0aW9uIHNldHVwKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuY3JlYXRlR2VuZXJhdGVJZCkge1xuICAgICAgdGhpcy5vcHRpb25zLmNyZWF0ZUdlbmVyYXRlSWQgPSBvcHRpb25zLmNyZWF0ZUdlbmVyYXRlSWQ7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaWQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5pZCA9IF9leHRlbmRzKHt9LCB0aGlzLm9wdGlvbnMuaWQsIG9wdGlvbnMuaWQpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNyZWF0ZUdlbmVyYXRlSWQgfHwgb3B0aW9ucy5pZCkge1xuICAgICAgdGhpcy5nZW5lcmF0ZUlkID0gdGhpcy5vcHRpb25zLmNyZWF0ZUdlbmVyYXRlSWQodGhpcy5vcHRpb25zLmlkKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pbnNlcnRpb25Qb2ludCAhPSBudWxsKSB0aGlzLm9wdGlvbnMuaW5zZXJ0aW9uUG9pbnQgPSBvcHRpb25zLmluc2VydGlvblBvaW50O1xuXG4gICAgaWYgKCdSZW5kZXJlcicgaW4gb3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zLlJlbmRlcmVyID0gb3B0aW9ucy5SZW5kZXJlcjtcbiAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItc3ByZWFkXG5cblxuICAgIGlmIChvcHRpb25zLnBsdWdpbnMpIHRoaXMudXNlLmFwcGx5KHRoaXMsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFN0eWxlIFNoZWV0LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5jcmVhdGVTdHlsZVNoZWV0ID0gZnVuY3Rpb24gY3JlYXRlU3R5bGVTaGVldChzdHlsZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgICAgaW5kZXggPSBfb3B0aW9ucy5pbmRleDtcblxuICAgIGlmICh0eXBlb2YgaW5kZXggIT09ICdudW1iZXInKSB7XG4gICAgICBpbmRleCA9IHNoZWV0cy5pbmRleCA9PT0gMCA/IDAgOiBzaGVldHMuaW5kZXggKyAxO1xuICAgIH1cblxuICAgIHZhciBzaGVldCA9IG5ldyBTdHlsZVNoZWV0KHN0eWxlcywgX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIGpzczogdGhpcyxcbiAgICAgIGdlbmVyYXRlSWQ6IG9wdGlvbnMuZ2VuZXJhdGVJZCB8fCB0aGlzLmdlbmVyYXRlSWQsXG4gICAgICBpbnNlcnRpb25Qb2ludDogdGhpcy5vcHRpb25zLmluc2VydGlvblBvaW50LFxuICAgICAgUmVuZGVyZXI6IHRoaXMub3B0aW9ucy5SZW5kZXJlcixcbiAgICAgIGluZGV4OiBpbmRleFxuICAgIH0pKTtcbiAgICB0aGlzLnBsdWdpbnMub25Qcm9jZXNzU2hlZXQoc2hlZXQpO1xuICAgIHJldHVybiBzaGVldDtcbiAgfVxuICAvKipcbiAgICogRGV0YWNoIHRoZSBTdHlsZSBTaGVldCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZW1vdmVTdHlsZVNoZWV0ID0gZnVuY3Rpb24gcmVtb3ZlU3R5bGVTaGVldChzaGVldCkge1xuICAgIHNoZWV0LmRldGFjaCgpO1xuICAgIHNoZWV0cy5yZW1vdmUoc2hlZXQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBydWxlIHdpdGhvdXQgYSBTdHlsZSBTaGVldC5cbiAgICogW0RlcHJlY2F0ZWRdIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5jcmVhdGVSdWxlID0gZnVuY3Rpb24gY3JlYXRlUnVsZSQxKG5hbWUsIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgaWYgKHN0eWxlID09PSB2b2lkIDApIHtcbiAgICAgIHN0eWxlID0ge307XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIEVuYWJsZSBydWxlIHdpdGhvdXQgbmFtZSBmb3IgaW5saW5lIHN0eWxlcy5cbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVSdWxlKHVuZGVmaW5lZCwgbmFtZSwgc3R5bGUpO1xuICAgIH1cblxuICAgIHZhciBydWxlT3B0aW9ucyA9IF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAganNzOiB0aGlzLFxuICAgICAgUmVuZGVyZXI6IHRoaXMub3B0aW9ucy5SZW5kZXJlclxuICAgIH0pO1xuXG4gICAgaWYgKCFydWxlT3B0aW9ucy5nZW5lcmF0ZUlkKSBydWxlT3B0aW9ucy5nZW5lcmF0ZUlkID0gdGhpcy5nZW5lcmF0ZUlkO1xuICAgIGlmICghcnVsZU9wdGlvbnMuY2xhc3NlcykgcnVsZU9wdGlvbnMuY2xhc3NlcyA9IHt9O1xuICAgIGlmICghcnVsZU9wdGlvbnMua2V5ZnJhbWVzKSBydWxlT3B0aW9ucy5rZXlmcmFtZXMgPSB7fTtcblxuICAgIHZhciBydWxlID0gY3JlYXRlUnVsZShuYW1lLCBzdHlsZSwgcnVsZU9wdGlvbnMpO1xuXG4gICAgaWYgKHJ1bGUpIHRoaXMucGx1Z2lucy5vblByb2Nlc3NSdWxlKHJ1bGUpO1xuICAgIHJldHVybiBydWxlO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBwbHVnaW4uIFBhc3NlZCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgd2l0aCBhIHJ1bGUgaW5zdGFuY2UuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVzZSA9IGZ1bmN0aW9uIHVzZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHBsdWdpbnMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBwbHVnaW5zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICBfdGhpcy5wbHVnaW5zLnVzZShwbHVnaW4pO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHJldHVybiBKc3M7XG59KCk7XG5cbnZhciBjcmVhdGVKc3MgPSBmdW5jdGlvbiBjcmVhdGVKc3Mob3B0aW9ucykge1xuICByZXR1cm4gbmV3IEpzcyhvcHRpb25zKTtcbn07XG5cbi8qKlxuICogU2hlZXRzTWFuYWdlciBpcyBsaWtlIGEgV2Vha01hcCB3aGljaCBpcyBkZXNpZ25lZCB0byBjb3VudCBTdHlsZVNoZWV0XG4gKiBpbnN0YW5jZXMgYW5kIGF0dGFjaC9kZXRhY2ggYXV0b21hdGljYWxseS5cbiAqIFVzZWQgaW4gcmVhY3QtanNzLlxuICovXG5cbnZhciBTaGVldHNNYW5hZ2VyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2hlZXRzTWFuYWdlcigpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5zaGVldHMgPSBuZXcgV2Vha01hcCgpO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNoZWV0c01hbmFnZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5zaGVldHMuZ2V0KGtleSk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnNoZWV0O1xuICB9O1xuXG4gIF9wcm90by5hZGQgPSBmdW5jdGlvbiBhZGQoa2V5LCBzaGVldCkge1xuICAgIGlmICh0aGlzLnNoZWV0cy5oYXMoa2V5KSkgcmV0dXJuO1xuICAgIHRoaXMubGVuZ3RoKys7XG4gICAgdGhpcy5zaGVldHMuc2V0KGtleSwge1xuICAgICAgc2hlZXQ6IHNoZWV0LFxuICAgICAgcmVmczogMFxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5tYW5hZ2UgPSBmdW5jdGlvbiBtYW5hZ2Uoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5zaGVldHMuZ2V0KGtleSk7XG5cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGlmIChlbnRyeS5yZWZzID09PSAwKSB7XG4gICAgICAgIGVudHJ5LnNoZWV0LmF0dGFjaCgpO1xuICAgICAgfVxuXG4gICAgICBlbnRyeS5yZWZzKys7XG4gICAgICByZXR1cm4gZW50cnkuc2hlZXQ7XG4gICAgfVxuXG4gICAgd2FybmluZyhmYWxzZSwgXCJbSlNTXSBTaGVldHNNYW5hZ2VyOiBjYW4ndCBmaW5kIHNoZWV0IHRvIG1hbmFnZVwiKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIF9wcm90by51bm1hbmFnZSA9IGZ1bmN0aW9uIHVubWFuYWdlKGtleSkge1xuICAgIHZhciBlbnRyeSA9IHRoaXMuc2hlZXRzLmdldChrZXkpO1xuXG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBpZiAoZW50cnkucmVmcyA+IDApIHtcbiAgICAgICAgZW50cnkucmVmcy0tO1xuICAgICAgICBpZiAoZW50cnkucmVmcyA9PT0gMCkgZW50cnkuc2hlZXQuZGV0YWNoKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5pbmcoZmFsc2UsIFwiU2hlZXRzTWFuYWdlcjogY2FuJ3QgZmluZCBzaGVldCB0byB1bm1hbmFnZVwiKTtcbiAgICB9XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKFNoZWV0c01hbmFnZXIsIFt7XG4gICAga2V5OiBcInNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2hlZXRzTWFuYWdlcjtcbn0oKTtcblxuLyoqXG4qIEV4cG9ydCBhIGNvbnN0YW50IGluZGljYXRpbmcgaWYgdGhpcyBicm93c2VyIGhhcyBDU1NUT00gc3VwcG9ydC5cbiogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vd2ViL3VwZGF0ZXMvMjAxOC8wMy9jc3NvbVxuKi9cbnZhciBoYXNDU1NUT01TdXBwb3J0ID0gdHlwZW9mIENTUyA9PT0gJ29iamVjdCcgJiYgQ1NTICE9IG51bGwgJiYgJ251bWJlcicgaW4gQ1NTO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgc3R5bGVzIG9iamVjdCB3aXRoIG9ubHkgcHJvcHMgdGhhdCBjb250YWluIGZ1bmN0aW9uIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RHluYW1pY1N0eWxlcyhzdHlsZXMpIHtcbiAgdmFyIHRvID0gbnVsbDtcblxuICBmb3IgKHZhciBrZXkgaW4gc3R5bGVzKSB7XG4gICAgdmFyIHZhbHVlID0gc3R5bGVzW2tleV07XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cbiAgICBpZiAodHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKCF0bykgdG8gPSB7fTtcbiAgICAgIHRvW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdmFyIGV4dHJhY3RlZCA9IGdldER5bmFtaWNTdHlsZXModmFsdWUpO1xuXG4gICAgICBpZiAoZXh0cmFjdGVkKSB7XG4gICAgICAgIGlmICghdG8pIHRvID0ge307XG4gICAgICAgIHRvW2tleV0gPSBleHRyYWN0ZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvO1xufVxuXG4vKipcbiAqIEEgYmV0dGVyIGFic3RyYWN0aW9uIG92ZXIgQ1NTLlxuICpcbiAqIEBjb3B5cmlnaHQgT2xlZyBJc29uZW4gKFNsb2JvZHNrb2kpIC8gSXNvbmVuIDIwMTQtcHJlc2VudFxuICogQHdlYnNpdGUgaHR0cHM6Ly9naXRodWIuY29tL2Nzc2luanMvanNzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xudmFyIGluZGV4ID0gY3JlYXRlSnNzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGluZGV4O1xuZXhwb3J0IHsgUnVsZUxpc3QsIFNoZWV0c01hbmFnZXIsIFNoZWV0c1JlZ2lzdHJ5LCBjcmVhdGVKc3MgYXMgY3JlYXRlLCBjcmVhdGVHZW5lcmF0ZUlkLCBjcmVhdGVSdWxlLCBnZXREeW5hbWljU3R5bGVzLCBoYXNDU1NUT01TdXBwb3J0LCBzaGVldHMsIHRvQ3NzVmFsdWUgfTtcbiIsIi8qIGVzbGludC1lbnYgbm9kZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBTRFAgaGVscGVycy5cbmNvbnN0IFNEUFV0aWxzID0ge307XG5cbi8vIEdlbmVyYXRlIGFuIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGZvciBjbmFtZSBvciBtaWRzLlxuLy8gVE9ETzogdXNlIFVVSURzIGluc3RlYWQ/IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2plZC85ODI4ODNcblNEUFV0aWxzLmdlbmVyYXRlSWRlbnRpZmllciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDEyKTtcbn07XG5cbi8vIFRoZSBSVENQIENOQU1FIHVzZWQgYnkgYWxsIHBlZXJjb25uZWN0aW9ucyBmcm9tIHRoZSBzYW1lIEpTLlxuU0RQVXRpbHMubG9jYWxDTmFtZSA9IFNEUFV0aWxzLmdlbmVyYXRlSWRlbnRpZmllcigpO1xuXG4vLyBTcGxpdHMgU0RQIGludG8gbGluZXMsIGRlYWxpbmcgd2l0aCBib3RoIENSTEYgYW5kIExGLlxuU0RQVXRpbHMuc3BsaXRMaW5lcyA9IGZ1bmN0aW9uKGJsb2IpIHtcbiAgcmV0dXJuIGJsb2IudHJpbSgpLnNwbGl0KCdcXG4nKS5tYXAobGluZSA9PiBsaW5lLnRyaW0oKSk7XG59O1xuLy8gU3BsaXRzIFNEUCBpbnRvIHNlc3Npb25wYXJ0IGFuZCBtZWRpYXNlY3Rpb25zLiBFbnN1cmVzIENSTEYuXG5TRFBVdGlscy5zcGxpdFNlY3Rpb25zID0gZnVuY3Rpb24oYmxvYikge1xuICBjb25zdCBwYXJ0cyA9IGJsb2Iuc3BsaXQoJ1xcbm09Jyk7XG4gIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQsIGluZGV4KSA9PiAoaW5kZXggPiAwID9cbiAgICAnbT0nICsgcGFydCA6IHBhcnQpLnRyaW0oKSArICdcXHJcXG4nKTtcbn07XG5cbi8vIFJldHVybnMgdGhlIHNlc3Npb24gZGVzY3JpcHRpb24uXG5TRFBVdGlscy5nZXREZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKGJsb2IpIHtcbiAgY29uc3Qgc2VjdGlvbnMgPSBTRFBVdGlscy5zcGxpdFNlY3Rpb25zKGJsb2IpO1xuICByZXR1cm4gc2VjdGlvbnMgJiYgc2VjdGlvbnNbMF07XG59O1xuXG4vLyBSZXR1cm5zIHRoZSBpbmRpdmlkdWFsIG1lZGlhIHNlY3Rpb25zLlxuU0RQVXRpbHMuZ2V0TWVkaWFTZWN0aW9ucyA9IGZ1bmN0aW9uKGJsb2IpIHtcbiAgY29uc3Qgc2VjdGlvbnMgPSBTRFBVdGlscy5zcGxpdFNlY3Rpb25zKGJsb2IpO1xuICBzZWN0aW9ucy5zaGlmdCgpO1xuICByZXR1cm4gc2VjdGlvbnM7XG59O1xuXG4vLyBSZXR1cm5zIGxpbmVzIHRoYXQgc3RhcnQgd2l0aCBhIGNlcnRhaW4gcHJlZml4LlxuU0RQVXRpbHMubWF0Y2hQcmVmaXggPSBmdW5jdGlvbihibG9iLCBwcmVmaXgpIHtcbiAgcmV0dXJuIFNEUFV0aWxzLnNwbGl0TGluZXMoYmxvYikuZmlsdGVyKGxpbmUgPT4gbGluZS5pbmRleE9mKHByZWZpeCkgPT09IDApO1xufTtcblxuLy8gUGFyc2VzIGFuIElDRSBjYW5kaWRhdGUgbGluZS4gU2FtcGxlIGlucHV0OlxuLy8gY2FuZGlkYXRlOjcwMjc4NjM1MCAyIHVkcCA0MTgxOTkwMiA4LjguOC44IDYwNzY5IHR5cCByZWxheSByYWRkciA4LjguOC44XG4vLyBycG9ydCA1NTk5NlwiXG4vLyBJbnB1dCBjYW4gYmUgcHJlZml4ZWQgd2l0aCBhPS5cblNEUFV0aWxzLnBhcnNlQ2FuZGlkYXRlID0gZnVuY3Rpb24obGluZSkge1xuICBsZXQgcGFydHM7XG4gIC8vIFBhcnNlIGJvdGggdmFyaWFudHMuXG4gIGlmIChsaW5lLmluZGV4T2YoJ2E9Y2FuZGlkYXRlOicpID09PSAwKSB7XG4gICAgcGFydHMgPSBsaW5lLnN1YnN0cmluZygxMikuc3BsaXQoJyAnKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDEwKS5zcGxpdCgnICcpO1xuICB9XG5cbiAgY29uc3QgY2FuZGlkYXRlID0ge1xuICAgIGZvdW5kYXRpb246IHBhcnRzWzBdLFxuICAgIGNvbXBvbmVudDogezE6ICdydHAnLCAyOiAncnRjcCd9W3BhcnRzWzFdXSB8fCBwYXJ0c1sxXSxcbiAgICBwcm90b2NvbDogcGFydHNbMl0udG9Mb3dlckNhc2UoKSxcbiAgICBwcmlvcml0eTogcGFyc2VJbnQocGFydHNbM10sIDEwKSxcbiAgICBpcDogcGFydHNbNF0sXG4gICAgYWRkcmVzczogcGFydHNbNF0sIC8vIGFkZHJlc3MgaXMgYW4gYWxpYXMgZm9yIGlwLlxuICAgIHBvcnQ6IHBhcnNlSW50KHBhcnRzWzVdLCAxMCksXG4gICAgLy8gc2tpcCBwYXJ0c1s2XSA9PSAndHlwJ1xuICAgIHR5cGU6IHBhcnRzWzddLFxuICB9O1xuXG4gIGZvciAobGV0IGkgPSA4OyBpIDwgcGFydHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBzd2l0Y2ggKHBhcnRzW2ldKSB7XG4gICAgICBjYXNlICdyYWRkcic6XG4gICAgICAgIGNhbmRpZGF0ZS5yZWxhdGVkQWRkcmVzcyA9IHBhcnRzW2kgKyAxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdycG9ydCc6XG4gICAgICAgIGNhbmRpZGF0ZS5yZWxhdGVkUG9ydCA9IHBhcnNlSW50KHBhcnRzW2kgKyAxXSwgMTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RjcHR5cGUnOlxuICAgICAgICBjYW5kaWRhdGUudGNwVHlwZSA9IHBhcnRzW2kgKyAxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1ZnJhZyc6XG4gICAgICAgIGNhbmRpZGF0ZS51ZnJhZyA9IHBhcnRzW2kgKyAxXTsgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGNhbmRpZGF0ZS51c2VybmFtZUZyYWdtZW50ID0gcGFydHNbaSArIDFdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IC8vIGV4dGVuc2lvbiBoYW5kbGluZywgaW4gcGFydGljdWxhciB1ZnJhZy4gRG9uJ3Qgb3ZlcndyaXRlLlxuICAgICAgICBpZiAoY2FuZGlkYXRlW3BhcnRzW2ldXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2FuZGlkYXRlW3BhcnRzW2ldXSA9IHBhcnRzW2kgKyAxXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbmRpZGF0ZTtcbn07XG5cbi8vIFRyYW5zbGF0ZXMgYSBjYW5kaWRhdGUgb2JqZWN0IGludG8gU0RQIGNhbmRpZGF0ZSBhdHRyaWJ1dGUuXG4vLyBUaGlzIGRvZXMgbm90IGluY2x1ZGUgdGhlIGE9IHByZWZpeCFcblNEUFV0aWxzLndyaXRlQ2FuZGlkYXRlID0gZnVuY3Rpb24oY2FuZGlkYXRlKSB7XG4gIGNvbnN0IHNkcCA9IFtdO1xuICBzZHAucHVzaChjYW5kaWRhdGUuZm91bmRhdGlvbik7XG5cbiAgY29uc3QgY29tcG9uZW50ID0gY2FuZGlkYXRlLmNvbXBvbmVudDtcbiAgaWYgKGNvbXBvbmVudCA9PT0gJ3J0cCcpIHtcbiAgICBzZHAucHVzaCgxKTtcbiAgfSBlbHNlIGlmIChjb21wb25lbnQgPT09ICdydGNwJykge1xuICAgIHNkcC5wdXNoKDIpO1xuICB9IGVsc2Uge1xuICAgIHNkcC5wdXNoKGNvbXBvbmVudCk7XG4gIH1cbiAgc2RwLnB1c2goY2FuZGlkYXRlLnByb3RvY29sLnRvVXBwZXJDYXNlKCkpO1xuICBzZHAucHVzaChjYW5kaWRhdGUucHJpb3JpdHkpO1xuICBzZHAucHVzaChjYW5kaWRhdGUuYWRkcmVzcyB8fCBjYW5kaWRhdGUuaXApO1xuICBzZHAucHVzaChjYW5kaWRhdGUucG9ydCk7XG5cbiAgY29uc3QgdHlwZSA9IGNhbmRpZGF0ZS50eXBlO1xuICBzZHAucHVzaCgndHlwJyk7XG4gIHNkcC5wdXNoKHR5cGUpO1xuICBpZiAodHlwZSAhPT0gJ2hvc3QnICYmIGNhbmRpZGF0ZS5yZWxhdGVkQWRkcmVzcyAmJlxuICAgICAgY2FuZGlkYXRlLnJlbGF0ZWRQb3J0KSB7XG4gICAgc2RwLnB1c2goJ3JhZGRyJyk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLnJlbGF0ZWRBZGRyZXNzKTtcbiAgICBzZHAucHVzaCgncnBvcnQnKTtcbiAgICBzZHAucHVzaChjYW5kaWRhdGUucmVsYXRlZFBvcnQpO1xuICB9XG4gIGlmIChjYW5kaWRhdGUudGNwVHlwZSAmJiBjYW5kaWRhdGUucHJvdG9jb2wudG9Mb3dlckNhc2UoKSA9PT0gJ3RjcCcpIHtcbiAgICBzZHAucHVzaCgndGNwdHlwZScpO1xuICAgIHNkcC5wdXNoKGNhbmRpZGF0ZS50Y3BUeXBlKTtcbiAgfVxuICBpZiAoY2FuZGlkYXRlLnVzZXJuYW1lRnJhZ21lbnQgfHwgY2FuZGlkYXRlLnVmcmFnKSB7XG4gICAgc2RwLnB1c2goJ3VmcmFnJyk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLnVzZXJuYW1lRnJhZ21lbnQgfHwgY2FuZGlkYXRlLnVmcmFnKTtcbiAgfVxuICByZXR1cm4gJ2NhbmRpZGF0ZTonICsgc2RwLmpvaW4oJyAnKTtcbn07XG5cbi8vIFBhcnNlcyBhbiBpY2Utb3B0aW9ucyBsaW5lLCByZXR1cm5zIGFuIGFycmF5IG9mIG9wdGlvbiB0YWdzLlxuLy8gU2FtcGxlIGlucHV0OlxuLy8gYT1pY2Utb3B0aW9uczpmb28gYmFyXG5TRFBVdGlscy5wYXJzZUljZU9wdGlvbnMgPSBmdW5jdGlvbihsaW5lKSB7XG4gIHJldHVybiBsaW5lLnN1YnN0cmluZygxNCkuc3BsaXQoJyAnKTtcbn07XG5cbi8vIFBhcnNlcyBhIHJ0cG1hcCBsaW5lLCByZXR1cm5zIFJUQ1J0cENvZGRlY1BhcmFtZXRlcnMuIFNhbXBsZSBpbnB1dDpcbi8vIGE9cnRwbWFwOjExMSBvcHVzLzQ4MDAwLzJcblNEUFV0aWxzLnBhcnNlUnRwTWFwID0gZnVuY3Rpb24obGluZSkge1xuICBsZXQgcGFydHMgPSBsaW5lLnN1YnN0cmluZyg5KS5zcGxpdCgnICcpO1xuICBjb25zdCBwYXJzZWQgPSB7XG4gICAgcGF5bG9hZFR5cGU6IHBhcnNlSW50KHBhcnRzLnNoaWZ0KCksIDEwKSwgLy8gd2FzOiBpZFxuICB9O1xuXG4gIHBhcnRzID0gcGFydHNbMF0uc3BsaXQoJy8nKTtcblxuICBwYXJzZWQubmFtZSA9IHBhcnRzWzBdO1xuICBwYXJzZWQuY2xvY2tSYXRlID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTsgLy8gd2FzOiBjbG9ja3JhdGVcbiAgcGFyc2VkLmNoYW5uZWxzID0gcGFydHMubGVuZ3RoID09PSAzID8gcGFyc2VJbnQocGFydHNbMl0sIDEwKSA6IDE7XG4gIC8vIGxlZ2FjeSBhbGlhcywgZ290IHJlbmFtZWQgYmFjayB0byBjaGFubmVscyBpbiBPUlRDLlxuICBwYXJzZWQubnVtQ2hhbm5lbHMgPSBwYXJzZWQuY2hhbm5lbHM7XG4gIHJldHVybiBwYXJzZWQ7XG59O1xuXG4vLyBHZW5lcmF0ZXMgYSBydHBtYXAgbGluZSBmcm9tIFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSBvclxuLy8gUlRDUnRwQ29kZWNQYXJhbWV0ZXJzLlxuU0RQVXRpbHMud3JpdGVSdHBNYXAgPSBmdW5jdGlvbihjb2RlYykge1xuICBsZXQgcHQgPSBjb2RlYy5wYXlsb2FkVHlwZTtcbiAgaWYgKGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwdCA9IGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlO1xuICB9XG4gIGNvbnN0IGNoYW5uZWxzID0gY29kZWMuY2hhbm5lbHMgfHwgY29kZWMubnVtQ2hhbm5lbHMgfHwgMTtcbiAgcmV0dXJuICdhPXJ0cG1hcDonICsgcHQgKyAnICcgKyBjb2RlYy5uYW1lICsgJy8nICsgY29kZWMuY2xvY2tSYXRlICtcbiAgICAgIChjaGFubmVscyAhPT0gMSA/ICcvJyArIGNoYW5uZWxzIDogJycpICsgJ1xcclxcbic7XG59O1xuXG4vLyBQYXJzZXMgYSBleHRtYXAgbGluZSAoaGVhZGVyZXh0ZW5zaW9uIGZyb20gUkZDIDUyODUpLiBTYW1wbGUgaW5wdXQ6XG4vLyBhPWV4dG1hcDoyIHVybjppZXRmOnBhcmFtczpydHAtaGRyZXh0OnRvZmZzZXRcbi8vIGE9ZXh0bWFwOjIvc2VuZG9ubHkgdXJuOmlldGY6cGFyYW1zOnJ0cC1oZHJleHQ6dG9mZnNldFxuU0RQVXRpbHMucGFyc2VFeHRtYXAgPSBmdW5jdGlvbihsaW5lKSB7XG4gIGNvbnN0IHBhcnRzID0gbGluZS5zdWJzdHJpbmcoOSkuc3BsaXQoJyAnKTtcbiAgcmV0dXJuIHtcbiAgICBpZDogcGFyc2VJbnQocGFydHNbMF0sIDEwKSxcbiAgICBkaXJlY3Rpb246IHBhcnRzWzBdLmluZGV4T2YoJy8nKSA+IDAgPyBwYXJ0c1swXS5zcGxpdCgnLycpWzFdIDogJ3NlbmRyZWN2JyxcbiAgICB1cmk6IHBhcnRzWzFdLFxuICAgIGF0dHJpYnV0ZXM6IHBhcnRzLnNsaWNlKDIpLmpvaW4oJyAnKSxcbiAgfTtcbn07XG5cbi8vIEdlbmVyYXRlcyBhbiBleHRtYXAgbGluZSBmcm9tIFJUQ1J0cEhlYWRlckV4dGVuc2lvblBhcmFtZXRlcnMgb3Jcbi8vIFJUQ1J0cEhlYWRlckV4dGVuc2lvbi5cblNEUFV0aWxzLndyaXRlRXh0bWFwID0gZnVuY3Rpb24oaGVhZGVyRXh0ZW5zaW9uKSB7XG4gIHJldHVybiAnYT1leHRtYXA6JyArIChoZWFkZXJFeHRlbnNpb24uaWQgfHwgaGVhZGVyRXh0ZW5zaW9uLnByZWZlcnJlZElkKSArXG4gICAgICAoaGVhZGVyRXh0ZW5zaW9uLmRpcmVjdGlvbiAmJiBoZWFkZXJFeHRlbnNpb24uZGlyZWN0aW9uICE9PSAnc2VuZHJlY3YnXG4gICAgICAgID8gJy8nICsgaGVhZGVyRXh0ZW5zaW9uLmRpcmVjdGlvblxuICAgICAgICA6ICcnKSArXG4gICAgICAnICcgKyBoZWFkZXJFeHRlbnNpb24udXJpICtcbiAgICAgIChoZWFkZXJFeHRlbnNpb24uYXR0cmlidXRlcyA/ICcgJyArIGhlYWRlckV4dGVuc2lvbi5hdHRyaWJ1dGVzIDogJycpICtcbiAgICAgICdcXHJcXG4nO1xufTtcblxuLy8gUGFyc2VzIGEgZm10cCBsaW5lLCByZXR1cm5zIGRpY3Rpb25hcnkuIFNhbXBsZSBpbnB1dDpcbi8vIGE9Zm10cDo5NiB2YnI9b247Y25nPW9uXG4vLyBBbHNvIGRlYWxzIHdpdGggdmJyPW9uOyBjbmc9b25cblNEUFV0aWxzLnBhcnNlRm10cCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrdjtcbiAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoJyAnKSArIDEpLnNwbGl0KCc7Jyk7XG4gIGZvciAobGV0IGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHtcbiAgICBrdiA9IHBhcnRzW2pdLnRyaW0oKS5zcGxpdCgnPScpO1xuICAgIHBhcnNlZFtrdlswXS50cmltKCldID0ga3ZbMV07XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbi8vIEdlbmVyYXRlcyBhIGZtdHAgbGluZSBmcm9tIFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSBvciBSVENSdHBDb2RlY1BhcmFtZXRlcnMuXG5TRFBVdGlscy53cml0ZUZtdHAgPSBmdW5jdGlvbihjb2RlYykge1xuICBsZXQgbGluZSA9ICcnO1xuICBsZXQgcHQgPSBjb2RlYy5wYXlsb2FkVHlwZTtcbiAgaWYgKGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwdCA9IGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlO1xuICB9XG4gIGlmIChjb2RlYy5wYXJhbWV0ZXJzICYmIE9iamVjdC5rZXlzKGNvZGVjLnBhcmFtZXRlcnMpLmxlbmd0aCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKGNvZGVjLnBhcmFtZXRlcnMpLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgaWYgKGNvZGVjLnBhcmFtZXRlcnNbcGFyYW1dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1zLnB1c2gocGFyYW0gKyAnPScgKyBjb2RlYy5wYXJhbWV0ZXJzW3BhcmFtXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbGluZSArPSAnYT1mbXRwOicgKyBwdCArICcgJyArIHBhcmFtcy5qb2luKCc7JykgKyAnXFxyXFxuJztcbiAgfVxuICByZXR1cm4gbGluZTtcbn07XG5cbi8vIFBhcnNlcyBhIHJ0Y3AtZmIgbGluZSwgcmV0dXJucyBSVENQUnRjcEZlZWRiYWNrIG9iamVjdC4gU2FtcGxlIGlucHV0OlxuLy8gYT1ydGNwLWZiOjk4IG5hY2sgcnBzaVxuU0RQVXRpbHMucGFyc2VSdGNwRmIgPSBmdW5jdGlvbihsaW5lKSB7XG4gIGNvbnN0IHBhcnRzID0gbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCcgJykgKyAxKS5zcGxpdCgnICcpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IHBhcnRzLnNoaWZ0KCksXG4gICAgcGFyYW1ldGVyOiBwYXJ0cy5qb2luKCcgJyksXG4gIH07XG59O1xuXG4vLyBHZW5lcmF0ZSBhPXJ0Y3AtZmIgbGluZXMgZnJvbSBSVENSdHBDb2RlY0NhcGFiaWxpdHkgb3IgUlRDUnRwQ29kZWNQYXJhbWV0ZXJzLlxuU0RQVXRpbHMud3JpdGVSdGNwRmIgPSBmdW5jdGlvbihjb2RlYykge1xuICBsZXQgbGluZXMgPSAnJztcbiAgbGV0IHB0ID0gY29kZWMucGF5bG9hZFR5cGU7XG4gIGlmIChjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcHQgPSBjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZTtcbiAgfVxuICBpZiAoY29kZWMucnRjcEZlZWRiYWNrICYmIGNvZGVjLnJ0Y3BGZWVkYmFjay5sZW5ndGgpIHtcbiAgICAvLyBGSVhNRTogc3BlY2lhbCBoYW5kbGluZyBmb3IgdHJyLWludD9cbiAgICBjb2RlYy5ydGNwRmVlZGJhY2suZm9yRWFjaChmYiA9PiB7XG4gICAgICBsaW5lcyArPSAnYT1ydGNwLWZiOicgKyBwdCArICcgJyArIGZiLnR5cGUgK1xuICAgICAgKGZiLnBhcmFtZXRlciAmJiBmYi5wYXJhbWV0ZXIubGVuZ3RoID8gJyAnICsgZmIucGFyYW1ldGVyIDogJycpICtcbiAgICAgICAgICAnXFxyXFxuJztcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbGluZXM7XG59O1xuXG4vLyBQYXJzZXMgYSBSRkMgNTU3NiBzc3JjIG1lZGlhIGF0dHJpYnV0ZS4gU2FtcGxlIGlucHV0OlxuLy8gYT1zc3JjOjM3MzU5Mjg1NTkgY25hbWU6c29tZXRoaW5nXG5TRFBVdGlscy5wYXJzZVNzcmNNZWRpYSA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3Qgc3AgPSBsaW5lLmluZGV4T2YoJyAnKTtcbiAgY29uc3QgcGFydHMgPSB7XG4gICAgc3NyYzogcGFyc2VJbnQobGluZS5zdWJzdHJpbmcoNywgc3ApLCAxMCksXG4gIH07XG4gIGNvbnN0IGNvbG9uID0gbGluZS5pbmRleE9mKCc6Jywgc3ApO1xuICBpZiAoY29sb24gPiAtMSkge1xuICAgIHBhcnRzLmF0dHJpYnV0ZSA9IGxpbmUuc3Vic3RyaW5nKHNwICsgMSwgY29sb24pO1xuICAgIHBhcnRzLnZhbHVlID0gbGluZS5zdWJzdHJpbmcoY29sb24gKyAxKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJ0cy5hdHRyaWJ1dGUgPSBsaW5lLnN1YnN0cmluZyhzcCArIDEpO1xuICB9XG4gIHJldHVybiBwYXJ0cztcbn07XG5cbi8vIFBhcnNlIGEgc3NyYy1ncm91cCBsaW5lIChzZWUgUkZDIDU1NzYpLiBTYW1wbGUgaW5wdXQ6XG4vLyBhPXNzcmMtZ3JvdXA6c2VtYW50aWNzIDEyIDM0XG5TRFBVdGlscy5wYXJzZVNzcmNHcm91cCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZygxMykuc3BsaXQoJyAnKTtcbiAgcmV0dXJuIHtcbiAgICBzZW1hbnRpY3M6IHBhcnRzLnNoaWZ0KCksXG4gICAgc3NyY3M6IHBhcnRzLm1hcChzc3JjID0+IHBhcnNlSW50KHNzcmMsIDEwKSksXG4gIH07XG59O1xuXG4vLyBFeHRyYWN0cyB0aGUgTUlEIChSRkMgNTg4OCkgZnJvbSBhIG1lZGlhIHNlY3Rpb24uXG4vLyBSZXR1cm5zIHRoZSBNSUQgb3IgdW5kZWZpbmVkIGlmIG5vIG1pZCBsaW5lIHdhcyBmb3VuZC5cblNEUFV0aWxzLmdldE1pZCA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBtaWQgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPW1pZDonKVswXTtcbiAgaWYgKG1pZCkge1xuICAgIHJldHVybiBtaWQuc3Vic3RyaW5nKDYpO1xuICB9XG59O1xuXG4vLyBQYXJzZXMgYSBmaW5nZXJwcmludCBsaW5lIGZvciBEVExTLVNSVFAuXG5TRFBVdGlscy5wYXJzZUZpbmdlcnByaW50ID0gZnVuY3Rpb24obGluZSkge1xuICBjb25zdCBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDE0KS5zcGxpdCgnICcpO1xuICByZXR1cm4ge1xuICAgIGFsZ29yaXRobTogcGFydHNbMF0udG9Mb3dlckNhc2UoKSwgLy8gYWxnb3JpdGhtIGlzIGNhc2Utc2Vuc2l0aXZlIGluIEVkZ2UuXG4gICAgdmFsdWU6IHBhcnRzWzFdLnRvVXBwZXJDYXNlKCksIC8vIHRoZSBkZWZpbml0aW9uIGlzIHVwcGVyLWNhc2UgaW4gUkZDIDQ1NzIuXG4gIH07XG59O1xuXG4vLyBFeHRyYWN0cyBEVExTIHBhcmFtZXRlcnMgZnJvbSBTRFAgbWVkaWEgc2VjdGlvbiBvciBzZXNzaW9ucGFydC5cbi8vIEZJWE1FOiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBmdW5jdGlvbnMgdGhpcyBzaG91bGQgb25seVxuLy8gICBnZXQgdGhlIGZpbmdlcnByaW50IGxpbmUgYXMgaW5wdXQuIFNlZSBhbHNvIGdldEljZVBhcmFtZXRlcnMuXG5TRFBVdGlscy5nZXREdGxzUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpIHtcbiAgY29uc3QgbGluZXMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24gKyBzZXNzaW9ucGFydCxcbiAgICAnYT1maW5nZXJwcmludDonKTtcbiAgLy8gTm90ZTogYT1zZXR1cCBsaW5lIGlzIGlnbm9yZWQgc2luY2Ugd2UgdXNlIHRoZSAnYXV0bycgcm9sZSBpbiBFZGdlLlxuICByZXR1cm4ge1xuICAgIHJvbGU6ICdhdXRvJyxcbiAgICBmaW5nZXJwcmludHM6IGxpbmVzLm1hcChTRFBVdGlscy5wYXJzZUZpbmdlcnByaW50KSxcbiAgfTtcbn07XG5cbi8vIFNlcmlhbGl6ZXMgRFRMUyBwYXJhbWV0ZXJzIHRvIFNEUC5cblNEUFV0aWxzLndyaXRlRHRsc1BhcmFtZXRlcnMgPSBmdW5jdGlvbihwYXJhbXMsIHNldHVwVHlwZSkge1xuICBsZXQgc2RwID0gJ2E9c2V0dXA6JyArIHNldHVwVHlwZSArICdcXHJcXG4nO1xuICBwYXJhbXMuZmluZ2VycHJpbnRzLmZvckVhY2goZnAgPT4ge1xuICAgIHNkcCArPSAnYT1maW5nZXJwcmludDonICsgZnAuYWxnb3JpdGhtICsgJyAnICsgZnAudmFsdWUgKyAnXFxyXFxuJztcbiAgfSk7XG4gIHJldHVybiBzZHA7XG59O1xuXG4vLyBQYXJzZXMgYT1jcnlwdG8gbGluZXMgaW50b1xuLy8gICBodHRwczovL3Jhd2dpdC5jb20vYWJvYmEvZWRnZXJ0Yy9tYXN0ZXIvbXNvcnRjLXJzNC5odG1sI2RpY3Rpb25hcnktcnRjc3J0cHNkZXNwYXJhbWV0ZXJzLW1lbWJlcnNcblNEUFV0aWxzLnBhcnNlQ3J5cHRvTGluZSA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZyg5KS5zcGxpdCgnICcpO1xuICByZXR1cm4ge1xuICAgIHRhZzogcGFyc2VJbnQocGFydHNbMF0sIDEwKSxcbiAgICBjcnlwdG9TdWl0ZTogcGFydHNbMV0sXG4gICAga2V5UGFyYW1zOiBwYXJ0c1syXSxcbiAgICBzZXNzaW9uUGFyYW1zOiBwYXJ0cy5zbGljZSgzKSxcbiAgfTtcbn07XG5cblNEUFV0aWxzLndyaXRlQ3J5cHRvTGluZSA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHtcbiAgcmV0dXJuICdhPWNyeXB0bzonICsgcGFyYW1ldGVycy50YWcgKyAnICcgK1xuICAgIHBhcmFtZXRlcnMuY3J5cHRvU3VpdGUgKyAnICcgK1xuICAgICh0eXBlb2YgcGFyYW1ldGVycy5rZXlQYXJhbXMgPT09ICdvYmplY3QnXG4gICAgICA/IFNEUFV0aWxzLndyaXRlQ3J5cHRvS2V5UGFyYW1zKHBhcmFtZXRlcnMua2V5UGFyYW1zKVxuICAgICAgOiBwYXJhbWV0ZXJzLmtleVBhcmFtcykgK1xuICAgIChwYXJhbWV0ZXJzLnNlc3Npb25QYXJhbXMgPyAnICcgKyBwYXJhbWV0ZXJzLnNlc3Npb25QYXJhbXMuam9pbignICcpIDogJycpICtcbiAgICAnXFxyXFxuJztcbn07XG5cbi8vIFBhcnNlcyB0aGUgY3J5cHRvIGtleSBwYXJhbWV0ZXJzIGludG9cbi8vICAgaHR0cHM6Ly9yYXdnaXQuY29tL2Fib2JhL2VkZ2VydGMvbWFzdGVyL21zb3J0Yy1yczQuaHRtbCNydGNzcnRwa2V5cGFyYW0qXG5TRFBVdGlscy5wYXJzZUNyeXB0b0tleVBhcmFtcyA9IGZ1bmN0aW9uKGtleVBhcmFtcykge1xuICBpZiAoa2V5UGFyYW1zLmluZGV4T2YoJ2lubGluZTonKSAhPT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHBhcnRzID0ga2V5UGFyYW1zLnN1YnN0cmluZyg3KS5zcGxpdCgnfCcpO1xuICByZXR1cm4ge1xuICAgIGtleU1ldGhvZDogJ2lubGluZScsXG4gICAga2V5U2FsdDogcGFydHNbMF0sXG4gICAgbGlmZVRpbWU6IHBhcnRzWzFdLFxuICAgIG1raVZhbHVlOiBwYXJ0c1syXSA/IHBhcnRzWzJdLnNwbGl0KCc6JylbMF0gOiB1bmRlZmluZWQsXG4gICAgbWtpTGVuZ3RoOiBwYXJ0c1syXSA/IHBhcnRzWzJdLnNwbGl0KCc6JylbMV0gOiB1bmRlZmluZWQsXG4gIH07XG59O1xuXG5TRFBVdGlscy53cml0ZUNyeXB0b0tleVBhcmFtcyA9IGZ1bmN0aW9uKGtleVBhcmFtcykge1xuICByZXR1cm4ga2V5UGFyYW1zLmtleU1ldGhvZCArICc6J1xuICAgICsga2V5UGFyYW1zLmtleVNhbHQgK1xuICAgIChrZXlQYXJhbXMubGlmZVRpbWUgPyAnfCcgKyBrZXlQYXJhbXMubGlmZVRpbWUgOiAnJykgK1xuICAgIChrZXlQYXJhbXMubWtpVmFsdWUgJiYga2V5UGFyYW1zLm1raUxlbmd0aFxuICAgICAgPyAnfCcgKyBrZXlQYXJhbXMubWtpVmFsdWUgKyAnOicgKyBrZXlQYXJhbXMubWtpTGVuZ3RoXG4gICAgICA6ICcnKTtcbn07XG5cbi8vIEV4dHJhY3RzIGFsbCBTREVTIHBhcmFtZXRlcnMuXG5TRFBVdGlscy5nZXRDcnlwdG9QYXJhbWV0ZXJzID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uLCBzZXNzaW9ucGFydCkge1xuICBjb25zdCBsaW5lcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiArIHNlc3Npb25wYXJ0LFxuICAgICdhPWNyeXB0bzonKTtcbiAgcmV0dXJuIGxpbmVzLm1hcChTRFBVdGlscy5wYXJzZUNyeXB0b0xpbmUpO1xufTtcblxuLy8gUGFyc2VzIElDRSBpbmZvcm1hdGlvbiBmcm9tIFNEUCBtZWRpYSBzZWN0aW9uIG9yIHNlc3Npb25wYXJ0LlxuLy8gRklYTUU6IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGlzIHNob3VsZCBvbmx5XG4vLyAgIGdldCB0aGUgaWNlLXVmcmFnIGFuZCBpY2UtcHdkIGxpbmVzIGFzIGlucHV0LlxuU0RQVXRpbHMuZ2V0SWNlUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpIHtcbiAgY29uc3QgdWZyYWcgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24gKyBzZXNzaW9ucGFydCxcbiAgICAnYT1pY2UtdWZyYWc6JylbMF07XG4gIGNvbnN0IHB3ZCA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiArIHNlc3Npb25wYXJ0LFxuICAgICdhPWljZS1wd2Q6JylbMF07XG4gIGlmICghKHVmcmFnICYmIHB3ZCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHVzZXJuYW1lRnJhZ21lbnQ6IHVmcmFnLnN1YnN0cmluZygxMiksXG4gICAgcGFzc3dvcmQ6IHB3ZC5zdWJzdHJpbmcoMTApLFxuICB9O1xufTtcblxuLy8gU2VyaWFsaXplcyBJQ0UgcGFyYW1ldGVycyB0byBTRFAuXG5TRFBVdGlscy53cml0ZUljZVBhcmFtZXRlcnMgPSBmdW5jdGlvbihwYXJhbXMpIHtcbiAgbGV0IHNkcCA9ICdhPWljZS11ZnJhZzonICsgcGFyYW1zLnVzZXJuYW1lRnJhZ21lbnQgKyAnXFxyXFxuJyArXG4gICAgICAnYT1pY2UtcHdkOicgKyBwYXJhbXMucGFzc3dvcmQgKyAnXFxyXFxuJztcbiAgaWYgKHBhcmFtcy5pY2VMaXRlKSB7XG4gICAgc2RwICs9ICdhPWljZS1saXRlXFxyXFxuJztcbiAgfVxuICByZXR1cm4gc2RwO1xufTtcblxuLy8gUGFyc2VzIHRoZSBTRFAgbWVkaWEgc2VjdGlvbiBhbmQgcmV0dXJucyBSVENSdHBQYXJhbWV0ZXJzLlxuU0RQVXRpbHMucGFyc2VSdHBQYXJhbWV0ZXJzID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0ge1xuICAgIGNvZGVjczogW10sXG4gICAgaGVhZGVyRXh0ZW5zaW9uczogW10sXG4gICAgZmVjTWVjaGFuaXNtczogW10sXG4gICAgcnRjcDogW10sXG4gIH07XG4gIGNvbnN0IGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICBjb25zdCBtbGluZSA9IGxpbmVzWzBdLnNwbGl0KCcgJyk7XG4gIGRlc2NyaXB0aW9uLnByb2ZpbGUgPSBtbGluZVsyXTtcbiAgZm9yIChsZXQgaSA9IDM7IGkgPCBtbGluZS5sZW5ndGg7IGkrKykgeyAvLyBmaW5kIGFsbCBjb2RlY3MgZnJvbSBtbGluZVszLi5dXG4gICAgY29uc3QgcHQgPSBtbGluZVtpXTtcbiAgICBjb25zdCBydHBtYXBsaW5lID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgoXG4gICAgICBtZWRpYVNlY3Rpb24sICdhPXJ0cG1hcDonICsgcHQgKyAnICcpWzBdO1xuICAgIGlmIChydHBtYXBsaW5lKSB7XG4gICAgICBjb25zdCBjb2RlYyA9IFNEUFV0aWxzLnBhcnNlUnRwTWFwKHJ0cG1hcGxpbmUpO1xuICAgICAgY29uc3QgZm10cHMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChcbiAgICAgICAgbWVkaWFTZWN0aW9uLCAnYT1mbXRwOicgKyBwdCArICcgJyk7XG4gICAgICAvLyBPbmx5IHRoZSBmaXJzdCBhPWZtdHA6PHB0PiBpcyBjb25zaWRlcmVkLlxuICAgICAgY29kZWMucGFyYW1ldGVycyA9IGZtdHBzLmxlbmd0aCA/IFNEUFV0aWxzLnBhcnNlRm10cChmbXRwc1swXSkgOiB7fTtcbiAgICAgIGNvZGVjLnJ0Y3BGZWVkYmFjayA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KFxuICAgICAgICBtZWRpYVNlY3Rpb24sICdhPXJ0Y3AtZmI6JyArIHB0ICsgJyAnKVxuICAgICAgICAubWFwKFNEUFV0aWxzLnBhcnNlUnRjcEZiKTtcbiAgICAgIGRlc2NyaXB0aW9uLmNvZGVjcy5wdXNoKGNvZGVjKTtcbiAgICAgIC8vIHBhcnNlIEZFQyBtZWNoYW5pc21zIGZyb20gcnRwbWFwIGxpbmVzLlxuICAgICAgc3dpdGNoIChjb2RlYy5uYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnUkVEJzpcbiAgICAgICAgY2FzZSAnVUxQRkVDJzpcbiAgICAgICAgICBkZXNjcmlwdGlvbi5mZWNNZWNoYW5pc21zLnB1c2goY29kZWMubmFtZS50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDogLy8gb25seSBSRUQgYW5kIFVMUEZFQyBhcmUgcmVjb2duaXplZCBhcyBGRUMgbWVjaGFuaXNtcy5cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1leHRtYXA6JykuZm9yRWFjaChsaW5lID0+IHtcbiAgICBkZXNjcmlwdGlvbi5oZWFkZXJFeHRlbnNpb25zLnB1c2goU0RQVXRpbHMucGFyc2VFeHRtYXAobGluZSkpO1xuICB9KTtcbiAgY29uc3Qgd2lsZGNhcmRSdGNwRmIgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXJ0Y3AtZmI6KiAnKVxuICAgIC5tYXAoU0RQVXRpbHMucGFyc2VSdGNwRmIpO1xuICBkZXNjcmlwdGlvbi5jb2RlY3MuZm9yRWFjaChjb2RlYyA9PiB7XG4gICAgd2lsZGNhcmRSdGNwRmIuZm9yRWFjaChmYj0+IHtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGNvZGVjLnJ0Y3BGZWVkYmFjay5maW5kKGV4aXN0aW5nRmVlZGJhY2sgPT4ge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdGZWVkYmFjay50eXBlID09PSBmYi50eXBlICYmXG4gICAgICAgICAgZXhpc3RpbmdGZWVkYmFjay5wYXJhbWV0ZXIgPT09IGZiLnBhcmFtZXRlcjtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFkdXBsaWNhdGUpIHtcbiAgICAgICAgY29kZWMucnRjcEZlZWRiYWNrLnB1c2goZmIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgLy8gRklYTUU6IHBhcnNlIHJ0Y3AuXG4gIHJldHVybiBkZXNjcmlwdGlvbjtcbn07XG5cbi8vIEdlbmVyYXRlcyBwYXJ0cyBvZiB0aGUgU0RQIG1lZGlhIHNlY3Rpb24gZGVzY3JpYmluZyB0aGUgY2FwYWJpbGl0aWVzIC9cbi8vIHBhcmFtZXRlcnMuXG5TRFBVdGlscy53cml0ZVJ0cERlc2NyaXB0aW9uID0gZnVuY3Rpb24oa2luZCwgY2Fwcykge1xuICBsZXQgc2RwID0gJyc7XG5cbiAgLy8gQnVpbGQgdGhlIG1saW5lLlxuICBzZHAgKz0gJ209JyArIGtpbmQgKyAnICc7XG4gIHNkcCArPSBjYXBzLmNvZGVjcy5sZW5ndGggPiAwID8gJzknIDogJzAnOyAvLyByZWplY3QgaWYgbm8gY29kZWNzLlxuICBzZHAgKz0gJyAnICsgKGNhcHMucHJvZmlsZSB8fCAnVURQL1RMUy9SVFAvU0FWUEYnKSArICcgJztcbiAgc2RwICs9IGNhcHMuY29kZWNzLm1hcChjb2RlYyA9PiB7XG4gICAgaWYgKGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb2RlYy5wcmVmZXJyZWRQYXlsb2FkVHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvZGVjLnBheWxvYWRUeXBlO1xuICB9KS5qb2luKCcgJykgKyAnXFxyXFxuJztcblxuICBzZHAgKz0gJ2M9SU4gSVA0IDAuMC4wLjBcXHJcXG4nO1xuICBzZHAgKz0gJ2E9cnRjcDo5IElOIElQNCAwLjAuMC4wXFxyXFxuJztcblxuICAvLyBBZGQgYT1ydHBtYXAgbGluZXMgZm9yIGVhY2ggY29kZWMuIEFsc28gZm10cCBhbmQgcnRjcC1mYi5cbiAgY2Fwcy5jb2RlY3MuZm9yRWFjaChjb2RlYyA9PiB7XG4gICAgc2RwICs9IFNEUFV0aWxzLndyaXRlUnRwTWFwKGNvZGVjKTtcbiAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVGbXRwKGNvZGVjKTtcbiAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVSdGNwRmIoY29kZWMpO1xuICB9KTtcbiAgbGV0IG1heHB0aW1lID0gMDtcbiAgY2Fwcy5jb2RlY3MuZm9yRWFjaChjb2RlYyA9PiB7XG4gICAgaWYgKGNvZGVjLm1heHB0aW1lID4gbWF4cHRpbWUpIHtcbiAgICAgIG1heHB0aW1lID0gY29kZWMubWF4cHRpbWU7XG4gICAgfVxuICB9KTtcbiAgaWYgKG1heHB0aW1lID4gMCkge1xuICAgIHNkcCArPSAnYT1tYXhwdGltZTonICsgbWF4cHRpbWUgKyAnXFxyXFxuJztcbiAgfVxuXG4gIGlmIChjYXBzLmhlYWRlckV4dGVuc2lvbnMpIHtcbiAgICBjYXBzLmhlYWRlckV4dGVuc2lvbnMuZm9yRWFjaChleHRlbnNpb24gPT4ge1xuICAgICAgc2RwICs9IFNEUFV0aWxzLndyaXRlRXh0bWFwKGV4dGVuc2lvbik7XG4gICAgfSk7XG4gIH1cbiAgLy8gRklYTUU6IHdyaXRlIGZlY01lY2hhbmlzbXMuXG4gIHJldHVybiBzZHA7XG59O1xuXG4vLyBQYXJzZXMgdGhlIFNEUCBtZWRpYSBzZWN0aW9uIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mXG4vLyBSVENSdHBFbmNvZGluZ1BhcmFtZXRlcnMuXG5TRFBVdGlscy5wYXJzZVJ0cEVuY29kaW5nUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBlbmNvZGluZ1BhcmFtZXRlcnMgPSBbXTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBTRFBVdGlscy5wYXJzZVJ0cFBhcmFtZXRlcnMobWVkaWFTZWN0aW9uKTtcbiAgY29uc3QgaGFzUmVkID0gZGVzY3JpcHRpb24uZmVjTWVjaGFuaXNtcy5pbmRleE9mKCdSRUQnKSAhPT0gLTE7XG4gIGNvbnN0IGhhc1VscGZlYyA9IGRlc2NyaXB0aW9uLmZlY01lY2hhbmlzbXMuaW5kZXhPZignVUxQRkVDJykgIT09IC0xO1xuXG4gIC8vIGZpbHRlciBhPXNzcmM6Li4uIGNuYW1lOiwgaWdub3JlIFBsYW5CLW1zaWRcbiAgY29uc3Qgc3NyY3MgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXNzcmM6JylcbiAgICAubWFwKGxpbmUgPT4gU0RQVXRpbHMucGFyc2VTc3JjTWVkaWEobGluZSkpXG4gICAgLmZpbHRlcihwYXJ0cyA9PiBwYXJ0cy5hdHRyaWJ1dGUgPT09ICdjbmFtZScpO1xuICBjb25zdCBwcmltYXJ5U3NyYyA9IHNzcmNzLmxlbmd0aCA+IDAgJiYgc3NyY3NbMF0uc3NyYztcbiAgbGV0IHNlY29uZGFyeVNzcmM7XG5cbiAgY29uc3QgZmxvd3MgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXNzcmMtZ3JvdXA6RklEJylcbiAgICAubWFwKGxpbmUgPT4ge1xuICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZygxNykuc3BsaXQoJyAnKTtcbiAgICAgIHJldHVybiBwYXJ0cy5tYXAocGFydCA9PiBwYXJzZUludChwYXJ0LCAxMCkpO1xuICAgIH0pO1xuICBpZiAoZmxvd3MubGVuZ3RoID4gMCAmJiBmbG93c1swXS5sZW5ndGggPiAxICYmIGZsb3dzWzBdWzBdID09PSBwcmltYXJ5U3NyYykge1xuICAgIHNlY29uZGFyeVNzcmMgPSBmbG93c1swXVsxXTtcbiAgfVxuXG4gIGRlc2NyaXB0aW9uLmNvZGVjcy5mb3JFYWNoKGNvZGVjID0+IHtcbiAgICBpZiAoY29kZWMubmFtZS50b1VwcGVyQ2FzZSgpID09PSAnUlRYJyAmJiBjb2RlYy5wYXJhbWV0ZXJzLmFwdCkge1xuICAgICAgbGV0IGVuY1BhcmFtID0ge1xuICAgICAgICBzc3JjOiBwcmltYXJ5U3NyYyxcbiAgICAgICAgY29kZWNQYXlsb2FkVHlwZTogcGFyc2VJbnQoY29kZWMucGFyYW1ldGVycy5hcHQsIDEwKSxcbiAgICAgIH07XG4gICAgICBpZiAocHJpbWFyeVNzcmMgJiYgc2Vjb25kYXJ5U3NyYykge1xuICAgICAgICBlbmNQYXJhbS5ydHggPSB7c3NyYzogc2Vjb25kYXJ5U3NyY307XG4gICAgICB9XG4gICAgICBlbmNvZGluZ1BhcmFtZXRlcnMucHVzaChlbmNQYXJhbSk7XG4gICAgICBpZiAoaGFzUmVkKSB7XG4gICAgICAgIGVuY1BhcmFtID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbmNQYXJhbSkpO1xuICAgICAgICBlbmNQYXJhbS5mZWMgPSB7XG4gICAgICAgICAgc3NyYzogcHJpbWFyeVNzcmMsXG4gICAgICAgICAgbWVjaGFuaXNtOiBoYXNVbHBmZWMgPyAncmVkK3VscGZlYycgOiAncmVkJyxcbiAgICAgICAgfTtcbiAgICAgICAgZW5jb2RpbmdQYXJhbWV0ZXJzLnB1c2goZW5jUGFyYW0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGlmIChlbmNvZGluZ1BhcmFtZXRlcnMubGVuZ3RoID09PSAwICYmIHByaW1hcnlTc3JjKSB7XG4gICAgZW5jb2RpbmdQYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgc3NyYzogcHJpbWFyeVNzcmMsXG4gICAgfSk7XG4gIH1cblxuICAvLyB3ZSBzdXBwb3J0IGJvdGggYj1BUyBhbmQgYj1USUFTIGJ1dCBpbnRlcnByZXQgQVMgYXMgVElBUy5cbiAgbGV0IGJhbmR3aWR0aCA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2I9Jyk7XG4gIGlmIChiYW5kd2lkdGgubGVuZ3RoKSB7XG4gICAgaWYgKGJhbmR3aWR0aFswXS5pbmRleE9mKCdiPVRJQVM6JykgPT09IDApIHtcbiAgICAgIGJhbmR3aWR0aCA9IHBhcnNlSW50KGJhbmR3aWR0aFswXS5zdWJzdHJpbmcoNyksIDEwKTtcbiAgICB9IGVsc2UgaWYgKGJhbmR3aWR0aFswXS5pbmRleE9mKCdiPUFTOicpID09PSAwKSB7XG4gICAgICAvLyB1c2UgZm9ybXVsYSBmcm9tIEpTRVAgdG8gY29udmVydCBiPUFTIHRvIFRJQVMgdmFsdWUuXG4gICAgICBiYW5kd2lkdGggPSBwYXJzZUludChiYW5kd2lkdGhbMF0uc3Vic3RyaW5nKDUpLCAxMCkgKiAxMDAwICogMC45NVxuICAgICAgICAgIC0gKDUwICogNDAgKiA4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFuZHdpZHRoID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbmNvZGluZ1BhcmFtZXRlcnMuZm9yRWFjaChwYXJhbXMgPT4ge1xuICAgICAgcGFyYW1zLm1heEJpdHJhdGUgPSBiYW5kd2lkdGg7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGVuY29kaW5nUGFyYW1ldGVycztcbn07XG5cbi8vIHBhcnNlcyBodHRwOi8vZHJhZnQub3J0Yy5vcmcvI3J0Y3J0Y3BwYXJhbWV0ZXJzKlxuU0RQVXRpbHMucGFyc2VSdGNwUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBydGNwUGFyYW1ldGVycyA9IHt9O1xuXG4gIC8vIEdldHMgdGhlIGZpcnN0IFNTUkMuIE5vdGUgdGhhdCB3aXRoIFJUWCB0aGVyZSBtaWdodCBiZSBtdWx0aXBsZVxuICAvLyBTU1JDcy5cbiAgY29uc3QgcmVtb3RlU3NyYyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c3NyYzonKVxuICAgIC5tYXAobGluZSA9PiBTRFBVdGlscy5wYXJzZVNzcmNNZWRpYShsaW5lKSlcbiAgICAuZmlsdGVyKG9iaiA9PiBvYmouYXR0cmlidXRlID09PSAnY25hbWUnKVswXTtcbiAgaWYgKHJlbW90ZVNzcmMpIHtcbiAgICBydGNwUGFyYW1ldGVycy5jbmFtZSA9IHJlbW90ZVNzcmMudmFsdWU7XG4gICAgcnRjcFBhcmFtZXRlcnMuc3NyYyA9IHJlbW90ZVNzcmMuc3NyYztcbiAgfVxuXG4gIC8vIEVkZ2UgdXNlcyB0aGUgY29tcG91bmQgYXR0cmlidXRlIGluc3RlYWQgb2YgcmVkdWNlZFNpemVcbiAgLy8gY29tcG91bmQgaXMgIXJlZHVjZWRTaXplXG4gIGNvbnN0IHJzaXplID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1ydGNwLXJzaXplJyk7XG4gIHJ0Y3BQYXJhbWV0ZXJzLnJlZHVjZWRTaXplID0gcnNpemUubGVuZ3RoID4gMDtcbiAgcnRjcFBhcmFtZXRlcnMuY29tcG91bmQgPSByc2l6ZS5sZW5ndGggPT09IDA7XG5cbiAgLy8gcGFyc2VzIHRoZSBydGNwLW11eCBhdHRy0ZZidXRlLlxuICAvLyBOb3RlIHRoYXQgRWRnZSBkb2VzIG5vdCBzdXBwb3J0IHVubXV4ZWQgUlRDUC5cbiAgY29uc3QgbXV4ID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1ydGNwLW11eCcpO1xuICBydGNwUGFyYW1ldGVycy5tdXggPSBtdXgubGVuZ3RoID4gMDtcblxuICByZXR1cm4gcnRjcFBhcmFtZXRlcnM7XG59O1xuXG5TRFBVdGlscy53cml0ZVJ0Y3BQYXJhbWV0ZXJzID0gZnVuY3Rpb24ocnRjcFBhcmFtZXRlcnMpIHtcbiAgbGV0IHNkcCA9ICcnO1xuICBpZiAocnRjcFBhcmFtZXRlcnMucmVkdWNlZFNpemUpIHtcbiAgICBzZHAgKz0gJ2E9cnRjcC1yc2l6ZVxcclxcbic7XG4gIH1cbiAgaWYgKHJ0Y3BQYXJhbWV0ZXJzLm11eCkge1xuICAgIHNkcCArPSAnYT1ydGNwLW11eFxcclxcbic7XG4gIH1cbiAgaWYgKHJ0Y3BQYXJhbWV0ZXJzLnNzcmMgIT09IHVuZGVmaW5lZCAmJiBydGNwUGFyYW1ldGVycy5jbmFtZSkge1xuICAgIHNkcCArPSAnYT1zc3JjOicgKyBydGNwUGFyYW1ldGVycy5zc3JjICtcbiAgICAgICcgY25hbWU6JyArIHJ0Y3BQYXJhbWV0ZXJzLmNuYW1lICsgJ1xcclxcbic7XG4gIH1cbiAgcmV0dXJuIHNkcDtcbn07XG5cblxuLy8gcGFyc2VzIGVpdGhlciBhPW1zaWQ6IG9yIGE9c3NyYzouLi4gbXNpZCBsaW5lcyBhbmQgcmV0dXJuc1xuLy8gdGhlIGlkIG9mIHRoZSBNZWRpYVN0cmVhbSBhbmQgTWVkaWFTdHJlYW1UcmFjay5cblNEUFV0aWxzLnBhcnNlTXNpZCA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBsZXQgcGFydHM7XG4gIGNvbnN0IHNwZWMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPW1zaWQ6Jyk7XG4gIGlmIChzcGVjLmxlbmd0aCA9PT0gMSkge1xuICAgIHBhcnRzID0gc3BlY1swXS5zdWJzdHJpbmcoNykuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4ge3N0cmVhbTogcGFydHNbMF0sIHRyYWNrOiBwYXJ0c1sxXX07XG4gIH1cbiAgY29uc3QgcGxhbkIgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXNzcmM6JylcbiAgICAubWFwKGxpbmUgPT4gU0RQVXRpbHMucGFyc2VTc3JjTWVkaWEobGluZSkpXG4gICAgLmZpbHRlcihtc2lkUGFydHMgPT4gbXNpZFBhcnRzLmF0dHJpYnV0ZSA9PT0gJ21zaWQnKTtcbiAgaWYgKHBsYW5CLmxlbmd0aCA+IDApIHtcbiAgICBwYXJ0cyA9IHBsYW5CWzBdLnZhbHVlLnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIHtzdHJlYW06IHBhcnRzWzBdLCB0cmFjazogcGFydHNbMV19O1xuICB9XG59O1xuXG4vLyBTQ1RQXG4vLyBwYXJzZXMgZHJhZnQtaWV0Zi1tbXVzaWMtc2N0cC1zZHAtMjYgZmlyc3QgYW5kIGZhbGxzIGJhY2tcbi8vIHRvIGRyYWZ0LWlldGYtbW11c2ljLXNjdHAtc2RwLTA1XG5TRFBVdGlscy5wYXJzZVNjdHBEZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBtbGluZSA9IFNEUFV0aWxzLnBhcnNlTUxpbmUobWVkaWFTZWN0aW9uKTtcbiAgY29uc3QgbWF4U2l6ZUxpbmUgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPW1heC1tZXNzYWdlLXNpemU6Jyk7XG4gIGxldCBtYXhNZXNzYWdlU2l6ZTtcbiAgaWYgKG1heFNpemVMaW5lLmxlbmd0aCA+IDApIHtcbiAgICBtYXhNZXNzYWdlU2l6ZSA9IHBhcnNlSW50KG1heFNpemVMaW5lWzBdLnN1YnN0cmluZygxOSksIDEwKTtcbiAgfVxuICBpZiAoaXNOYU4obWF4TWVzc2FnZVNpemUpKSB7XG4gICAgbWF4TWVzc2FnZVNpemUgPSA2NTUzNjtcbiAgfVxuICBjb25zdCBzY3RwUG9ydCA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c2N0cC1wb3J0OicpO1xuICBpZiAoc2N0cFBvcnQubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3J0OiBwYXJzZUludChzY3RwUG9ydFswXS5zdWJzdHJpbmcoMTIpLCAxMCksXG4gICAgICBwcm90b2NvbDogbWxpbmUuZm10LFxuICAgICAgbWF4TWVzc2FnZVNpemUsXG4gICAgfTtcbiAgfVxuICBjb25zdCBzY3RwTWFwTGluZXMgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXNjdHBtYXA6Jyk7XG4gIGlmIChzY3RwTWFwTGluZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHBhcnRzID0gc2N0cE1hcExpbmVzWzBdXG4gICAgICAuc3Vic3RyaW5nKDEwKVxuICAgICAgLnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvcnQ6IHBhcnNlSW50KHBhcnRzWzBdLCAxMCksXG4gICAgICBwcm90b2NvbDogcGFydHNbMV0sXG4gICAgICBtYXhNZXNzYWdlU2l6ZSxcbiAgICB9O1xuICB9XG59O1xuXG4vLyBTQ1RQXG4vLyBvdXRwdXRzIHRoZSBkcmFmdC1pZXRmLW1tdXNpYy1zY3RwLXNkcC0yNiB2ZXJzaW9uIHRoYXQgYWxsIGJyb3dzZXJzXG4vLyBzdXBwb3J0IGJ5IG5vdyByZWNlaXZpbmcgaW4gdGhpcyBmb3JtYXQsIHVubGVzcyB3ZSBvcmlnaW5hbGx5IHBhcnNlZFxuLy8gYXMgdGhlIGRyYWZ0LWlldGYtbW11c2ljLXNjdHAtc2RwLTA1IGZvcm1hdCAoaW5kaWNhdGVkIGJ5IHRoZSBtLWxpbmVcbi8vIHByb3RvY29sIG9mIERUTFMvU0NUUCAtLSB3aXRob3V0IFVEUC8gb3IgVENQLylcblNEUFV0aWxzLndyaXRlU2N0cERlc2NyaXB0aW9uID0gZnVuY3Rpb24obWVkaWEsIHNjdHApIHtcbiAgbGV0IG91dHB1dCA9IFtdO1xuICBpZiAobWVkaWEucHJvdG9jb2wgIT09ICdEVExTL1NDVFAnKSB7XG4gICAgb3V0cHV0ID0gW1xuICAgICAgJ209JyArIG1lZGlhLmtpbmQgKyAnIDkgJyArIG1lZGlhLnByb3RvY29sICsgJyAnICsgc2N0cC5wcm90b2NvbCArICdcXHJcXG4nLFxuICAgICAgJ2M9SU4gSVA0IDAuMC4wLjBcXHJcXG4nLFxuICAgICAgJ2E9c2N0cC1wb3J0OicgKyBzY3RwLnBvcnQgKyAnXFxyXFxuJyxcbiAgICBdO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IFtcbiAgICAgICdtPScgKyBtZWRpYS5raW5kICsgJyA5ICcgKyBtZWRpYS5wcm90b2NvbCArICcgJyArIHNjdHAucG9ydCArICdcXHJcXG4nLFxuICAgICAgJ2M9SU4gSVA0IDAuMC4wLjBcXHJcXG4nLFxuICAgICAgJ2E9c2N0cG1hcDonICsgc2N0cC5wb3J0ICsgJyAnICsgc2N0cC5wcm90b2NvbCArICcgNjU1MzVcXHJcXG4nLFxuICAgIF07XG4gIH1cbiAgaWYgKHNjdHAubWF4TWVzc2FnZVNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgIG91dHB1dC5wdXNoKCdhPW1heC1tZXNzYWdlLXNpemU6JyArIHNjdHAubWF4TWVzc2FnZVNpemUgKyAnXFxyXFxuJyk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn07XG5cbi8vIEdlbmVyYXRlIGEgc2Vzc2lvbiBJRCBmb3IgU0RQLlxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtcnRjd2ViLWpzZXAtMjAjc2VjdGlvbi01LjIuMVxuLy8gcmVjb21tZW5kcyB1c2luZyBhIGNyeXB0b2dyYXBoaWNhbGx5IHJhbmRvbSArdmUgNjQtYml0IHZhbHVlXG4vLyBidXQgcmlnaHQgbm93IHRoaXMgc2hvdWxkIGJlIGFjY2VwdGFibGUgYW5kIHdpdGhpbiB0aGUgcmlnaHQgcmFuZ2VcblNEUFV0aWxzLmdlbmVyYXRlU2Vzc2lvbklkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKCkuc3Vic3RyKDIsIDIyKTtcbn07XG5cbi8vIFdyaXRlIGJvaWxlciBwbGF0ZSBmb3Igc3RhcnQgb2YgU0RQXG4vLyBzZXNzSWQgYXJndW1lbnQgaXMgb3B0aW9uYWwgLSBpZiBub3Qgc3VwcGxpZWQgaXQgd2lsbFxuLy8gYmUgZ2VuZXJhdGVkIHJhbmRvbWx5XG4vLyBzZXNzVmVyc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gMlxuLy8gc2Vzc1VzZXIgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvICd0aGlzaXNhZGFwdGVyb3J0YydcblNEUFV0aWxzLndyaXRlU2Vzc2lvbkJvaWxlcnBsYXRlID0gZnVuY3Rpb24oc2Vzc0lkLCBzZXNzVmVyLCBzZXNzVXNlcikge1xuICBsZXQgc2Vzc2lvbklkO1xuICBjb25zdCB2ZXJzaW9uID0gc2Vzc1ZlciAhPT0gdW5kZWZpbmVkID8gc2Vzc1ZlciA6IDI7XG4gIGlmIChzZXNzSWQpIHtcbiAgICBzZXNzaW9uSWQgPSBzZXNzSWQ7XG4gIH0gZWxzZSB7XG4gICAgc2Vzc2lvbklkID0gU0RQVXRpbHMuZ2VuZXJhdGVTZXNzaW9uSWQoKTtcbiAgfVxuICBjb25zdCB1c2VyID0gc2Vzc1VzZXIgfHwgJ3RoaXNpc2FkYXB0ZXJvcnRjJztcbiAgLy8gRklYTUU6IHNlc3MtaWQgc2hvdWxkIGJlIGFuIE5UUCB0aW1lc3RhbXAuXG4gIHJldHVybiAndj0wXFxyXFxuJyArXG4gICAgICAnbz0nICsgdXNlciArICcgJyArIHNlc3Npb25JZCArICcgJyArIHZlcnNpb24gK1xuICAgICAgICAnIElOIElQNCAxMjcuMC4wLjFcXHJcXG4nICtcbiAgICAgICdzPS1cXHJcXG4nICtcbiAgICAgICd0PTAgMFxcclxcbic7XG59O1xuXG4vLyBHZXRzIHRoZSBkaXJlY3Rpb24gZnJvbSB0aGUgbWVkaWFTZWN0aW9uIG9yIHRoZSBzZXNzaW9ucGFydC5cblNEUFV0aWxzLmdldERpcmVjdGlvbiA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbiwgc2Vzc2lvbnBhcnQpIHtcbiAgLy8gTG9vayBmb3Igc2VuZHJlY3YsIHNlbmRvbmx5LCByZWN2b25seSwgaW5hY3RpdmUsIGRlZmF1bHQgdG8gc2VuZHJlY3YuXG4gIGNvbnN0IGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgc3dpdGNoIChsaW5lc1tpXSkge1xuICAgICAgY2FzZSAnYT1zZW5kcmVjdic6XG4gICAgICBjYXNlICdhPXNlbmRvbmx5JzpcbiAgICAgIGNhc2UgJ2E9cmVjdm9ubHknOlxuICAgICAgY2FzZSAnYT1pbmFjdGl2ZSc6XG4gICAgICAgIHJldHVybiBsaW5lc1tpXS5zdWJzdHJpbmcoMik7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBGSVhNRTogV2hhdCBzaG91bGQgaGFwcGVuIGhlcmU/XG4gICAgfVxuICB9XG4gIGlmIChzZXNzaW9ucGFydCkge1xuICAgIHJldHVybiBTRFBVdGlscy5nZXREaXJlY3Rpb24oc2Vzc2lvbnBhcnQpO1xuICB9XG4gIHJldHVybiAnc2VuZHJlY3YnO1xufTtcblxuU0RQVXRpbHMuZ2V0S2luZCA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBsaW5lcyA9IFNEUFV0aWxzLnNwbGl0TGluZXMobWVkaWFTZWN0aW9uKTtcbiAgY29uc3QgbWxpbmUgPSBsaW5lc1swXS5zcGxpdCgnICcpO1xuICByZXR1cm4gbWxpbmVbMF0uc3Vic3RyaW5nKDIpO1xufTtcblxuU0RQVXRpbHMuaXNSZWplY3RlZCA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICByZXR1cm4gbWVkaWFTZWN0aW9uLnNwbGl0KCcgJywgMilbMV0gPT09ICcwJztcbn07XG5cblNEUFV0aWxzLnBhcnNlTUxpbmUgPSBmdW5jdGlvbihtZWRpYVNlY3Rpb24pIHtcbiAgY29uc3QgbGluZXMgPSBTRFBVdGlscy5zcGxpdExpbmVzKG1lZGlhU2VjdGlvbik7XG4gIGNvbnN0IHBhcnRzID0gbGluZXNbMF0uc3Vic3RyaW5nKDIpLnNwbGl0KCcgJyk7XG4gIHJldHVybiB7XG4gICAga2luZDogcGFydHNbMF0sXG4gICAgcG9ydDogcGFyc2VJbnQocGFydHNbMV0sIDEwKSxcbiAgICBwcm90b2NvbDogcGFydHNbMl0sXG4gICAgZm10OiBwYXJ0cy5zbGljZSgzKS5qb2luKCcgJyksXG4gIH07XG59O1xuXG5TRFBVdGlscy5wYXJzZU9MaW5lID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGNvbnN0IGxpbmUgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdvPScpWzBdO1xuICBjb25zdCBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDIpLnNwbGl0KCcgJyk7XG4gIHJldHVybiB7XG4gICAgdXNlcm5hbWU6IHBhcnRzWzBdLFxuICAgIHNlc3Npb25JZDogcGFydHNbMV0sXG4gICAgc2Vzc2lvblZlcnNpb246IHBhcnNlSW50KHBhcnRzWzJdLCAxMCksXG4gICAgbmV0VHlwZTogcGFydHNbM10sXG4gICAgYWRkcmVzc1R5cGU6IHBhcnRzWzRdLFxuICAgIGFkZHJlc3M6IHBhcnRzWzVdLFxuICB9O1xufTtcblxuLy8gYSB2ZXJ5IG5haXZlIGludGVycHJldGF0aW9uIG9mIGEgdmFsaWQgU0RQLlxuU0RQVXRpbHMuaXNWYWxpZFNEUCA9IGZ1bmN0aW9uKGJsb2IpIHtcbiAgaWYgKHR5cGVvZiBibG9iICE9PSAnc3RyaW5nJyB8fCBibG9iLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBsaW5lcyA9IFNEUFV0aWxzLnNwbGl0TGluZXMoYmxvYik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobGluZXNbaV0ubGVuZ3RoIDwgMiB8fCBsaW5lc1tpXS5jaGFyQXQoMSkgIT09ICc9Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBUT0RPOiBjaGVjayB0aGUgbW9kaWZpZXIgYSBiaXQgbW9yZS5cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEV4cG9zZSBwdWJsaWMgbWV0aG9kcy5cbmlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICBtb2R1bGUuZXhwb3J0cyA9IFNEUFV0aWxzO1xufVxuIiwidmFyIGlzUHJvZHVjdGlvbiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbic7XG5mdW5jdGlvbiB3YXJuaW5nKGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoIWlzUHJvZHVjdGlvbikge1xuICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGV4dCA9IFwiV2FybmluZzogXCIgKyBtZXNzYWdlO1xuXG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS53YXJuKHRleHQpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aHJvdyBFcnJvcih0ZXh0KTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdhcm5pbmc7XG4iLCJpbXBvcnQgeyBQaXhlbFN0cmVhbWluZywgV2ViUnRjUGxheWVyQ29udHJvbGxlciB9IGZyb20gXCJAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41XCI7XG5pbXBvcnQgeyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSBmcm9tIFwiLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFVybEJ1aWxkZXIoaW5wdXQ6ICgpID0+IHN0cmluZywgdXJsRmxhZ3M/OiBzdHJpbmcpIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChkZWNvZGVVUklDb21wb25lbnQoaW5wdXQoKSkpO1xuICBjb25zdCBwYXJhbXMgPSB1cmwuc2VhcmNoUGFyYW1zO1xuXG4gIGxldCBmbGFncyA9IHVybEZsYWdzO1xuICBpZiAoZmxhZ3MpIHtcbiAgICBpZiAoZmxhZ3Muc3RhcnRzV2l0aChcIj9cIikpIGZsYWdzID0gZmxhZ3Muc3Vic3RyaW5nKDEpO1xuICAgIGZsYWdzLnNwbGl0KFwiJlwiKS5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHZhbC5zcGxpdChcIj1cIik7XG4gICAgICAvLyBFbnN1cmUgdGhlIHZhbHVlIGlzIGVuY29kZWRcbiAgICAgIHBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG59XG5cbi8vIEhhY2tcbmV4cG9ydCBmdW5jdGlvbiBBcHBseVVybEhhY2soKSB7XG4gIGNvbnN0IHNldFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIgPSBQaXhlbFN0cmVhbWluZy5wcm90b3R5cGVbXCJzZXRXZWJSdGNQbGF5ZXJDb250cm9sbGVyXCJdO1xuICBQaXhlbFN0cmVhbWluZy5wcm90b3R5cGVbXCJzZXRXZWJSdGNQbGF5ZXJDb250cm9sbGVyXCJdID0gZnVuY3Rpb24gc2V0V2ViUnRjUGxheWVyQ29udHJvbGxlck92ZXJyaWRlKFxuICAgIHRoaXM6IEFyY3dhcmVQaXhlbFN0cmVhbWluZyxcbiAgICB3ZWJSdGNQbGF5ZXJDb250cm9sbGVyOiBXZWJSdGNQbGF5ZXJDb250cm9sbGVyXG4gICk6IHZvaWQge1xuICAgIC8qKiBUaGUgZGVmYXVsdCB1cmwgYnVpbGRlciB3aWxsIHNpbXBseSBhZGQgYSBxdWVyeS1wYXJhbWV0ZXIgd2l0aG91dCBjaGVja2luZyB0aGUgaW5pdGlhbCB1cmwuXG4gICAgICogVG8gZml4IHRoYXQgaWYgdGhlIHVybCBhbHJlYWR5IGNvbWVzIHdpdGggcXVlcnktcGFyYW1ldGVycyB0aGUgb3V0cHV0IGhhcyB0byBiZSByZXdyaXR0ZW4uICovXG4gICAgY29uc3Qgc2lnbmFsbGluZ1VybEJ1aWxkZXIgPSB3ZWJSdGNQbGF5ZXJDb250cm9sbGVyLnNpZ25hbGxpbmdVcmxCdWlsZGVyO1xuICAgIHdlYlJ0Y1BsYXllckNvbnRyb2xsZXIuc2lnbmFsbGluZ1VybEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gVXJsQnVpbGRlcihzaWduYWxsaW5nVXJsQnVpbGRlciwgdGhpcy5jb25maWcudXJsRmxhZ3MpO1xuICAgIH07XG5cbiAgICBzZXRXZWJSdGNQbGF5ZXJDb250cm9sbGVyLmNhbGwodGhpcywgd2ViUnRjUGxheWVyQ29udHJvbGxlcik7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlcyB9IGZyb20gXCJAYXJjd2FyZS1jbG91ZC9zaGFyZWQtcGl4ZWxzdHJlYW1pbmctd2Vic2RrXCI7XG5pbXBvcnQge1xuICBTZXR0aW5nRmxhZyxcbiAgU2V0dGluZ1RleHQsXG4gIFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIsXG4gIENvbmZpZyxcbiAgRmxhZ3MsXG59IGZyb20gXCJAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41XCI7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvbixcbiAgU2V0dGluZ1VJRmxhZyxcbiAgU2V0dGluZ1VJVGV4dCxcbiAgVUlPcHRpb25zLFxuICBQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGUsXG59IGZyb20gXCJAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41XCI7XG5pbXBvcnQgeyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSBmcm9tIFwiLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmltcG9ydCB7IEFyY3dhcmVTdHlsZXMgfSBmcm9tIFwiLi9zdHlsZXMvQXJjd2FyZVBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZXNcIjtcbmltcG9ydCB7IEF1ZGlvQnV0dG9uIH0gZnJvbSBcIi4vdWkvQXVkaW9CdXR0b25cIjtcbmltcG9ydCB7IE1pY0J1dHRvbiB9IGZyb20gXCIuL3VpL01pY0J1dHRvblwiO1xuaW1wb3J0IHsgU3RvcEJ1dHRvbiB9IGZyb20gXCIuL3VpL1N0b3BCdXR0b25cIjtcblxuY29uc3QgREVCVUcgPSBmYWxzZTtcblxuY29uc3QgVGV4dEtleVJlZ2V4ID0gL14oXFxbJyhbYS16QS1aIDAtOS1fXSspJ1xcXSApLztcblxuZnVuY3Rpb24gZmluZEVsZW1lbnRCeVRleHRDb250ZW50KHJvb3Q6IEhUTUxFbGVtZW50IHwgbnVsbCwgc2VsZWN0b3I6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IG1hdGNoID0gVGV4dEtleVJlZ2V4LmV4ZWMoc2VsZWN0b3IpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYWN0dWFsU2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKG1hdGNoWzFdLCBcIlwiKTtcbiAgY29uc3QgdGV4dCA9IG1hdGNoWzJdLnRyaW0oKTtcblxuICBjb25zdCBlbGVtZW50cyA9IChyb290IHx8IGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihhY3R1YWxTZWxlY3Rvcik7XG4gIGxldCByZXN1bHQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRUZXh0OiBzdHJpbmcgPSBlbGVtZW50Py5pbm5lckhUTUwudHJpbSgpO1xuICAgIGlmICghcmVzdWx0ICYmIGVsZW1lbnQ/LmlubmVySFRNTD8uaW5jbHVkZXMoYD4ke3RleHR9PGApKSB7XG4gICAgICByZXN1bHQgPSBlbGVtZW50O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IHJlbW92YWxzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHtcbiAgLy8gSXMgbm90IHVzZWQgYnkgQXJjd2FyZSBzeXN0ZW0gLSBtYXkgbmVlZCBhZGRpdGlvbmFsIGNoZWNraW5nLlxuICBcIiNTdHJlYW1lcklkXCI6IHRydWUsXG4gIC8vIFNpZ25hbGxpbmctU2VydmVyXG4gIFwiI3NzXCI6IHRydWUsXG4gIC8vIElzIG5vdCB3b3JraW5nIHdpdGggb3VyIEFGSyBTZXR1cC5cbiAgXCIjVGltZW91dElmSWRsZVwiOiB0cnVlLFxuICAvLyBPZmZlclRvUmVjZWl2ZSBuZWVkcyB0byBiZSBlbmFibGVkIGluIEFyY3dhcmUgY2xvdWQgZW52aXJvbm1lbnQuXG4gIFwiI09mZmVyVG9SZWNlaXZlXCI6IHRydWUsXG4gIC8vIFNGVSBjYW4ndCBiZSBoYW5kbGVkIGluIGNsb3VkIGVudmlyb25tZW50LlxuICBcIiNwcmVmZXJTRlVcIjogdHJ1ZSxcbiAgLy8gU1RVTiAvIFRVUk4gY2FuJ3QgYmUgaGFuZGxlZCBpbiBjbG91ZCBlbnZpcm9ubWVudC5cbiAgXCIjRm9yY2VUVVJOXCI6IHRydWUsXG4gIC8vIEFyY3dhcmUgVUkgZG9lcyBub3Qgc3VwcG9ydCBMaWdodCBvciBEYXJrIG1vZGUuXG4gIFwiI0xpZ2h0TW9kZVwiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBVc2VNaWMgc2V0dGluZyBzaG91bGQgYmUgZGlzYWJsZWQsIHNpbmNlIHRoZSB3b24ndCB3b3JrIHdpdGggNC4yNyBhbnl3YXkuXG4gIFwiI1VzZU1pY1wiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBNYXRjaFZpZXdwb3J0UmVzIHNldHRpbmcgc2hvdWxkIGJlIGRpc2FibGVkLCBzaW5jZSB3ZSBoYXZlIGEgY3VzdG9tIG1ldGhvZCBmb3IgdGhhdC5cbiAgXCIjTWF0Y2hWaWV3cG9ydFJlc1wiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBIb3ZlcmluZ01vdXNlIHNldHRpbmcgc2hvdWxkIGJlIGRpc2FibGVkLCBzaW5jZSB3ZSBoYXZlIGEgY3VzdG9tIG1ldGhvZCBmb3IgdGhhdC5cbiAgXCIjSG92ZXJpbmdNb3VzZVwiOiB0cnVlLFxuICAvLyBBRksgSWRsZSB0aW1lLlxuICBcIlsnQUZLIHRpbWVvdXQnXSBkaXYuc2V0dGluZy5mb3JtLWdyb3VwOm5vdChbaWRdKVwiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBlbmNvZGVyIHNldHRpbmdzIHNob3VsZCBiZSBkaXNhYmxlZCwgc2luY2UgdGhlIHdvbid0IHdvcmsgd2l0aCA0LjI3IGFueXdheS5cbiAgXCJbJ0VuY29kZXInXSBzZWN0aW9uLnNldHRpbmdzQ29udGFpbmVyOm5vdChbaWRdKVwiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBXZWJSVEMgc2V0dGluZ3Mgc2hvdWxkIGJlIGRpc2FibGVkLCBzaW5jZSB0aGUgd29uJ3Qgd29yayB3aXRoIDQuMjcgYW55d2F5LlxuICBcIlsnV2ViUlRDJ10gc2VjdGlvbi5zZXR0aW5nc0NvbnRhaW5lcjpub3QoW2lkXSlcIjogdHJ1ZSxcbiAgLy8gQnkgZGVmYXVsdCB0aGUgVUkgc2V0dGluZ3Mgc2hvdWxkIGJlIGRpc2FibGVkLCBzaW5jZSB3ZSBoYXZlIGEgY3VzdG9tIG1ldGhvZCBmb3IgdGhlbS5cbiAgXCJbJ1VJJ10gc2VjdGlvbi5zZXR0aW5nc0NvbnRhaW5lcjpub3QoW2lkXSlcIjogdHJ1ZSxcbiAgLy8gSGlkZSBvcHRpb24gb2Ygc3RhcnQgYXVkaW8gbXV0ZWQgb3Igbm90XG4gIFwiI1N0YXJ0VmlkZW9NdXRlZFwiOiB0cnVlLFxufTtcblxuaWYgKERFQlVHKVxuICBPYmplY3Qua2V5cyhyZW1vdmFscykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVtb3ZhbHNba2V5XSA9IGZhbHNlO1xuICB9KTtcblxuZnVuY3Rpb24gcmVtb3ZlKGtleTogc3RyaW5nLCBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsKSB7XG4gIGlmIChyZW1vdmFsc1trZXldID09PSB0cnVlKSB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIH1cbiAgfSBlbHNlIGlmIChERUJVRykge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LnN0eWxlLmNvbG9yID0gXCJyZWRcIjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFyY3dhcmVBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHtcbiAgc3RhdGljIEZsYWdzID0gY2xhc3Mge1xuICAgIHN0YXRpYyBub1Nlc3Npb24gPSBcIm5vU2Vzc2lvblwiIGFzIGNvbnN0O1xuICB9O1xuXG4gIHB1YmxpYyBvdmVycmlkZSBzdHJlYW06IEFyY3dhcmVQaXhlbFN0cmVhbWluZztcbiAgcHJpdmF0ZSB2aWRlb0VsZW1lbnRQYXJlbnQ6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSByZXNwb25zZUNhbGxiYWNrOiAoKHJlc3BvbnNlOiBzdHJpbmcpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2ViUnRjQ29udHJvbGxlcjogV2ViUnRjUGxheWVyQ29udHJvbGxlcjtcblxuICBvdmVycmlkZSBnZXQgcm9vdEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBzdXBlci5yb290RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgQXJjd2FyZVNlY3Rpb246IEhUTUxFbGVtZW50ID0gdGhpcy5jb25maWdVSS5idWlsZFNlY3Rpb25XaXRoSGVhZGluZyhcbiAgICB0aGlzLnNldHRpbmdzUGFuZWwuc2V0dGluZ3NDb250ZW50RWxlbWVudCxcbiAgICBcIkFyY3dhcmUgQ2xvdWRcIlxuICApO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFVJT3B0aW9ucyAmIHsgc3RyZWFtOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuc3RyZWFtID0gb3B0aW9ucz8uc3RyZWFtO1xuICAgIHRoaXMuZW1pdFVJSW50ZXJhY3Rpb24gPSB0aGlzLmVtaXRVSUludGVyYWN0aW9uLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLmFkanVzdFNldHRpbmdzUGFuZWwoKTtcbiAgICB0aGlzLmNyZWF0ZUF1ZGlvVG9nZ2xlQnV0dG9uKCk7XG4gICAgdGhpcy5jcmVhdGVNaWNUb2dnbGVCdXR0b24oKTtcbiAgICB0aGlzLmNyZWF0ZVN0b3BCdXR0b24oKTtcbiAgICB0aGlzLmFwcGx5QXJjd2FyZVN0eWxlcygpO1xuXG4gICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzPy5zdHJlYW0/LnZpZGVvRWxlbWVudFBhcmVudDtcbiAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSB0aGlzPy52aWRlb0VsZW1lbnRQYXJlbnQ/LnBhcmVudEVsZW1lbnQ7XG4gICAgdGhpcy53ZWJSdGNDb250cm9sbGVyID0gdGhpcz8uc3RyZWFtPy5bXCJfd2ViUnRjQ29udHJvbGxlclwiXTtcbiAgICBcbiAgICB0aGlzLmFkZExvdmVMZXR0ZXJoYW5kbGVyKClcblxuICAgIHRoaXM/LnN0cmVhbT8uYWRkUmVzcG9uc2VFdmVudExpc3RlbmVyKFwidWUtcmVzcG9uc2VcIiwgKHJlc3BvbnNlKSA9PiB0aGlzPy5hcHBsaWNhdGlvblJlc3BvbnNlKHJlc3BvbnNlKSk7XG5cbiAgICB0aGlzPy5zdHJlYW0/LnNlc3Npb25JZEhhbmRsZXI/LmFkZCgoc2Vzc2lvbklkKSA9PiB7XG4gICAgICB0aGlzPy5zdGF0c1BhbmVsPy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KFwic2Vzc2lvbklkXCIsIFwiU2Vzc2lvbklkXCIsIHNlc3Npb25JZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzPy5zdHJlYW0/LnZpZGVvSW5pdGlhbGl6ZWRIYW5kbGVyPy5hZGQoKCkgPT4ge1xuICAgICAgdGhpcz8uY3VycmVudE92ZXJsYXk/LmhpZGUoKTtcbiAgICAgIGlmICh0aGlzPy5zdHJlYW0/LnN0cmVhbUluZm8pIHRoaXM/LmF1dG9QbGF5SGFuZGxlcih0aGlzPy5zdHJlYW0/LnN0cmVhbUluZm8pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdWlIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgLy8gUmVtb3ZlIGZ1bGxzY3JlZW4gVUkgRGVmYXVsdCBidXR0b25zIGZyb20gRE9NXG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJmdWxsc2NyZWVuQnV0dG9uXCIsIFwiI2Z1bGxzY3JlZW4tYnRuXCIpO1xuICAgICAgdGhpcz8udWlEZWZhdWx0QnV0dG9uVmlzaWJpbHR5KFwic2V0dGluZ3NCdXR0b25cIiwgXCIjc2V0dGluZ3NCdG5cIik7XG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJpbmZvQnV0dG9uXCIsIFwiI3N0YXRzQnRuXCIpO1xuICAgICAgdGhpcz8udWlEZWZhdWx0QnV0dG9uVmlzaWJpbHR5KFwiYXVkaW9CdXR0b25cIiwgXCIjYXVkaW9CdG5cIik7XG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJzdG9wQnV0dG9uXCIsIFwiI3N0b3BCdG5cIik7XG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJjb25uZWN0aW9uU3RyZW5ndGhJY29uXCIsIFwiI2Nvbm5lY3Rpb25cIik7XG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJtaWNCdXR0b25cIiwgXCIjbWljQnRuXCIpO1xuXG4gICAgICB0aGlzLnVpRWxlbWVudHNWaXNpYmlsaXR5KHRydWUpO1xuICAgIH07XG5cbiAgICAvLyBFaXRoZXIgb24gc3RyZWFtSW5mb1xuICAgIC8vIHRoaXM/LnN0cmVhbS5zdHJlYW1JbmZvSGFuZGxlci5hZGQodWlIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIC8vIE9yIG9uIGluaXRpYWxpemUuXG4gICAgdGhpcz8uc3RyZWFtPy52aWRlb0luaXRpYWxpemVkSGFuZGxlcj8uYWRkKHVpSGFuZGxlci5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMudWlFbGVtZW50c1Zpc2liaWxpdHkoZmFsc2UpO1xuICAgIHRoaXMuYWRkVGV4dFRvQ29ubmVjdE92ZXJsYXkoKTtcbiAgICB0aGlzLnByZXZlbnREZWZhdWx0S2V5Ym9hcmRFdmVudHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMb3ZlTGV0dGVyaGFuZGxlcigpXG4gIHtcbiAgICB0aGlzPy5zdHJlYW0/LmxvdmVMZXR0ZXJIYW5kbGVyPy5hZGQoKGxvdmVMZXR0ZXIpID0+IHtcbiAgICAgIGlmICh0aGlzPy5wbGF5T3ZlcmxheSAmJiBsb3ZlTGV0dGVyICYmIHRoaXM/LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaW5mb092ZXJsYXkgPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiI2luZm9PdmVybGF5XCIpO1xuICAgICAgICBpZiAoaW5mb092ZXJsYXkpIHtcbiAgICAgICAgICBpbmZvT3ZlcmxheT8uY2xhc3NMaXN0Py5yZW1vdmUoXCJoaWRkZW5TdGF0ZVwiKTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gaW5mb092ZXJsYXk/LnF1ZXJ5U2VsZWN0b3IoXCIjbWVzc2FnZU92ZXJsYXlJbm5lclwiKTtcbiAgICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgbWVzc2FnZS5pbm5lckhUTUwgPSBsb3ZlTGV0dGVyPy5yZWFzb24/LnJlcGxhY2UoXCJMTDogXCIsIFwiXCIpO1xuICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5wbGF5T3ZlcmxheS50ZXh0RWxlbWVudC5pbm5lclRleHQgPSBsb3ZlTGV0dGVyLnJlYXNvbi5yZXBsYWNlKFwiTEw6IFwiLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZXQncyBhbmQgcmVzZXRzIGhpZGRlbiBzdGF0ZSBvZiBcImFkZGl0aW9uYWxcIiBVSSBFbGVtZW50cy5cbiAgICogRm9yIGV4YW1wbGUgYnV0dG9ucyBvciBjb25uZWN0aW9uIGljb24uXG4gICAqIFRoZXNlIHdpbGwgZmFkZSBpbiB0aHJvdWdoIGNzcyBhbmltYXRpb24gdXBvbiB0aGUgdmlkZW9Jbml0aWFsaXplZCBldmVudC5cbiAgICogQXQgdGhpcyBwb2ludCBpbiB0aW1lIHRoZSBzdHJlYW1JbmZvIGlzIGFscmVhZHkgcHJvY2Vzc2VkLlxuICAgKi9cbiAgcHJpdmF0ZSB1aUVsZW1lbnRzVmlzaWJpbGl0eShzdGF0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcz8ucGFyZW50RWxlbWVudD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIjY29udHJvbHNcIik7XG4gICAgaWYgKGNvbnRyb2xzKSB7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgY29udHJvbHM/LmNsYXNzTGlzdD8ucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgICAgICBjb250cm9scz8uY2xhc3NMaXN0Py5hZGQoXCJ2aXNpYmxlXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udHJvbHM/LmNsYXNzTGlzdD8ucmVtb3ZlKFwidmlzaWJsZVwiKTtcbiAgICAgICAgY29udHJvbHM/LmNsYXNzTGlzdD8uYWRkKFwiaGlkZGVuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcIiNjb25uZWN0aW9uXCIpO1xuICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgY29ubmVjdGlvbj8uY2xhc3NMaXN0Py5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgICAgIGNvbm5lY3Rpb24/LmNsYXNzTGlzdD8uYWRkKFwidmlzaWJsZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbm5lY3Rpb24/LmNsYXNzTGlzdD8ucmVtb3ZlKFwidmlzaWJsZVwiKTtcbiAgICAgICAgY29ubmVjdGlvbj8uY2xhc3NMaXN0Py5hZGQoXCJoaWRkZW5cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RTZXR0aW5nc1BhbmVsKCkge1xuICAgIC8vIE1ha2UgQXJjd2FyZSBDbG91ZCBzZXR0aW5ncyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc2V0dGluZ3MgcGFuZWwuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcz8uQXJjd2FyZVNlY3Rpb24/LnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50Py5yZW1vdmVDaGlsZCh0aGlzPy5BcmN3YXJlU2VjdGlvbik7XG4gICAgICBwYXJlbnQ/Lmluc2VydEJlZm9yZSh0aGlzPy5BcmN3YXJlU2VjdGlvbiwgcGFyZW50Py5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYWxsIHRoZSBzZXR0aW5ncyBzcGVjaWZpZWQgYnkgXCJyZW1vdmFsc1wiIG9iamVjdC5cbiAgICBjb25zdCBTZXR0aW5nc0NvbnRlbnQgPSB0aGlzPy5zZXR0aW5nc1BhbmVsPy5zZXR0aW5nc0NvbnRlbnRFbGVtZW50O1xuICAgIGlmIChTZXR0aW5nc0NvbnRlbnQpIHtcbiAgICAgIFNldHRpbmdzQ29udGVudC5zdHlsZS5taW5XaWR0aCA9IFwiNDAwcHhcIjtcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVtb3ZhbHMpIHtcbiAgICAgICAgaWYgKFRleHRLZXlSZWdleC50ZXN0KGtleSkpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZmluZEVsZW1lbnRCeVRleHRDb250ZW50KFNldHRpbmdzQ29udGVudCwga2V5KTtcbiAgICAgICAgICByZW1vdmUoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gU2V0dGluZ3NDb250ZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGtleSk7XG4gICAgICAgICAgcmVtb3ZlKGtleSwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVuYW1pbmcgdGhlIFwiUmVzdGFydCBTdHJlYW1cIiBidXR0b24gdG8gXCJSZWNvbm5lY3QgdG8gU3RyZWFtXCIuXG4gICAgICBjb25zdCByZXN0YXJ0U3RyZWFtQnV0dG9uID0gZmluZEVsZW1lbnRCeVRleHRDb250ZW50KFNldHRpbmdzQ29udGVudCwgXCJbJ1Jlc3RhcnQgU3RyZWFtJ10gc2VjdGlvbiA+IGRpdi5zZXR0aW5nXCIpO1xuICAgICAgaWYgKHJlc3RhcnRTdHJlYW1CdXR0b24pIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSByZXN0YXJ0U3RyZWFtQnV0dG9uPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcImRpdlwiKTtcbiAgICAgICAgaWYgKGxhYmVsKSBsYWJlbC50ZXh0Q29udGVudCA9IFwiUmVjb25uZWN0IHRvIFN0cmVhbVwiO1xuICAgICAgICBjb25zdCBidXR0b24gPSByZXN0YXJ0U3RyZWFtQnV0dG9uPy5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwibGFiZWwgPiBpbnB1dFwiKTtcbiAgICAgICAgaWYgKGJ1dHRvbikgYnV0dG9uLnZhbHVlID0gXCJyZWNvbm5lY3RcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgZGlzY2xhaW1lclxuICAgIHtcbiAgICAgIGNvbnN0IGRpc2NsYWltZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZGlzY2xhaW1lcj8uY2xhc3NMaXN0Py5hZGQoXCJzZXR0aW5nXCIpO1xuICAgICAgZGlzY2xhaW1lci50ZXh0Q29udGVudCA9IFwiS2VlcCBpbiBtaW5kLCB0aGVzZSBzZXR0aW5ncyB3aWxsIGJlIGFwcGxpZWQgaW4geW91ciBjdXJyZW50IHNlc3Npb24gb25seS5cIjtcbiAgICAgIGRpc2NsYWltZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9IFwiMTVweFwiO1xuICAgICAgdGhpcz8uQXJjd2FyZVNlY3Rpb24/LmFwcGVuZENoaWxkKGRpc2NsYWltZXIpO1xuICAgIH1cblxuICAgIC8vIEFkZCBkaXNhYmxlIFNlc3Npb25JZCBidXR0b24uXG4gICAgdGhpcz8uQXJjd2FyZVNlY3Rpb24/LmFwcGVuZENoaWxkKFxuICAgICAgbmV3IFNldHRpbmdVSUZsYWcoXG4gICAgICAgIG5ldyBTZXR0aW5nRmxhZyhcbiAgICAgICAgICBBcmN3YXJlQXBwbGljYXRpb24/LkZsYWdzPy5ub1Nlc3Npb24sXG4gICAgICAgICAgXCJEaXNhYmxlIFNlc3Npb25JZFwiLFxuICAgICAgICAgIFwiRGlzYWJsZSBzZXNzaW9uSWQgYmFzZWQgcmVjb25uZWN0aW9uLlwiLFxuICAgICAgICAgIHRoaXM/LnN0cmVhbT8uc2Vzc2lvbj8ubm9TZXNzaW9uLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKVxuICAgICAgKS5yb290RWxlbWVudFxuICAgICk7XG5cbiAgICAvLyBBZGQgcmVwaHJhc2luZyBvZiBzaWduYWxsaW5nIFVybC5cbiAgICB0aGlzPy5BcmN3YXJlU2VjdGlvbj8uYXBwZW5kQ2hpbGQoXG4gICAgICBuZXcgU2V0dGluZ1VJVGV4dChcbiAgICAgICAgbmV3IFNldHRpbmdUZXh0KFxuICAgICAgICAgIFwic2lnbmFsbGluZy11cmxcIixcbiAgICAgICAgICBcIlNpZ25hbGxpbmcgVVJMXCIsXG4gICAgICAgICAgXCJTaWduYWxsaW5nIFVSTFwiLFxuICAgICAgICAgIGAke3RoaXM/LnN0cmVhbT8uY29uZmlnPy5nZXRUZXh0U2V0dGluZ1ZhbHVlKFwic3NcIil9PyR7dGhpcz8uc3RyZWFtPy5jb25maWc/LnVybEZsYWdzPy5zbGljZSgxKX1gLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgIClcbiAgICAgICkucm9vdEVsZW1lbnRcbiAgICApO1xuXG4gICAgaWYgKERFQlVHKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KFwiI3NldHRpbmdzQnRuXCIpPy5jbGljaygpO1xuICAgICAgfSwgMjAwMCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUF1ZGlvVG9nZ2xlQnV0dG9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGF1ZGlvQnV0dG9uID0gbmV3IEF1ZGlvQnV0dG9uKHRoaXM/LnN0cmVhbSk7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcz8uc3RyZWFtPy52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgY29uc3QgcGxheWVyVUkgPSB2aWRlb0VsZW1lbnRQYXJlbnQhLnBhcmVudEVsZW1lbnQ7XG4gICAgLy8gQXBwZW5kIHRoZSBidXR0b24gdG8gdGhlIHZpZGVvRWxlbWVudFBhcmVudFxuICAgIGlmIChwbGF5ZXJVSSkge1xuICAgICAgY29uc3QgdWlGZWF0dXJlcyA9IHBsYXllclVJPy5xdWVyeVNlbGVjdG9yKFwiI3VpRmVhdHVyZXNcIik7XG4gICAgICBpZiAodWlGZWF0dXJlcykge1xuICAgICAgICBjb25zdCB1aUNvbnRyb2xzID0gdWlGZWF0dXJlcz8ucXVlcnlTZWxlY3RvcihcIiNjb250cm9sc1wiKTtcbiAgICAgICAgaWYgKHVpQ29udHJvbHMpIHtcbiAgICAgICAgICB1aUNvbnRyb2xzPy5hcHBlbmRDaGlsZChhdWRpb0J1dHRvbj8uZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pY1RvZ2dsZUJ1dHRvbigpOiB2b2lkIHtcbiAgICBjb25zdCBtaWNCdXR0b24gPSBuZXcgTWljQnV0dG9uKHRoaXM/LnN0cmVhbSk7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcz8uc3RyZWFtPy52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgY29uc3QgcGxheWVyVUkgPSB2aWRlb0VsZW1lbnRQYXJlbnQhLnBhcmVudEVsZW1lbnQ7XG4gICAgLy8gQXBwZW5kIHRoZSBidXR0b24gdG8gdGhlIHZpZGVvRWxlbWVudFBhcmVudFxuICAgIGlmIChwbGF5ZXJVSSkge1xuICAgICAgY29uc3QgdWlGZWF0dXJlcyA9IHBsYXllclVJPy5xdWVyeVNlbGVjdG9yKFwiI3VpRmVhdHVyZXNcIik7XG4gICAgICBpZiAodWlGZWF0dXJlcykge1xuICAgICAgICBjb25zdCB1aUNvbnRyb2xzID0gdWlGZWF0dXJlcz8ucXVlcnlTZWxlY3RvcihcIiNjb250cm9sc1wiKTtcbiAgICAgICAgaWYgKHVpQ29udHJvbHMpIHtcbiAgICAgICAgICB1aUNvbnRyb2xzPy5hcHBlbmRDaGlsZChtaWNCdXR0b24/LmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdG9wQnV0dG9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0cmVhbT8uY29uZmlnPy5zZXR0aW5ncz8uc3RvcEJ1dHRvbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgc3RvcEJ1dHRvbiA9IG5ldyBTdG9wQnV0dG9uKHRoaXM/LnN0cmVhbSk7XG4gICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzPy5zdHJlYW0/LnZpZGVvRWxlbWVudFBhcmVudDtcbiAgICAgIGNvbnN0IHBsYXllclVJID0gdmlkZW9FbGVtZW50UGFyZW50IS5wYXJlbnRFbGVtZW50O1xuICAgICAgLy8gQXBwZW5kIHRoZSBidXR0b24gdG8gdGhlIHZpZGVvRWxlbWVudFBhcmVudFxuICAgICAgaWYgKHBsYXllclVJKSB7XG4gICAgICAgIGNvbnN0IHVpRmVhdHVyZXMgPSBwbGF5ZXJVST8ucXVlcnlTZWxlY3RvcihcIiN1aUZlYXR1cmVzXCIpO1xuICAgICAgICBpZiAodWlGZWF0dXJlcykge1xuICAgICAgICAgIGNvbnN0IHVpQ29udHJvbHMgPSB1aUZlYXR1cmVzPy5xdWVyeVNlbGVjdG9yKFwiI2NvbnRyb2xzXCIpO1xuICAgICAgICAgIGlmICh1aUNvbnRyb2xzKSB7XG4gICAgICAgICAgICB1aUNvbnRyb2xzPy5hcHBlbmRDaGlsZChzdG9wQnV0dG9uPy5lbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVpRGVmYXVsdEJ1dHRvblZpc2liaWx0eShidXR0b25UeXBlOiBrZXlvZiB0eXBlb2YgdGhpcy5zdHJlYW0uY29uZmlnLnNldHRpbmdzLCBpZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXM/LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXM/LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoaWQpO1xuICAgICAgaWYgKHRoaXM/LnN0cmVhbT8uY29uZmlnPy5zZXR0aW5nc1tidXR0b25UeXBlXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGJ1dHRvbikge1xuICAgICAgICAgIGJ1dHRvbj8ucmVtb3ZlKCk7XG4gICAgICAgICAgY29uc3QgdWlGZWF0dXJlc0VsZW1lbnQgPSB0aGlzLnVpRmVhdHVyZXNFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IHN0YXRzUGFuZWwgPSB1aUZlYXR1cmVzRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3N0YXRzLXBhbmVsXCIpO1xuICAgICAgICAgIGNvbnN0IHNldHRpbmdzUGFuZWwgPSB1aUZlYXR1cmVzRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3NldHRpbmdzLXBhbmVsXCIpO1xuICAgICAgICAgIGlmICh1aUZlYXR1cmVzRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKGJ1dHRvblR5cGUgPT09IFwiaW5mb0J1dHRvblwiKSB7XG4gICAgICAgICAgICAgIHN0YXRzUGFuZWw/LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1dHRvblR5cGUgPT09IFwic2V0dGluZ3NCdXR0b25cIikge1xuICAgICAgICAgICAgICBzZXR0aW5nc1BhbmVsPy5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzSU9TID0gL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yPy51c2VyQWdlbnQpO1xuICAgICAgaWYgKGJ1dHRvblR5cGUgPT09IFwiZnVsbHNjcmVlbkJ1dHRvblwiICYmIGlzSU9TICYmIGJ1dHRvbikge1xuICAgICAgICBidXR0b24/LnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJldmVudERlZmF1bHRLZXlib2FyZEV2ZW50cygpIHtcbiAgICBpZiAodGhpcy52aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFwia2V5ZG93blwiLFxuICAgICAgICBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiIHx8IGV2ZW50LmtleSA9PT0gXCIgXCIgfHwgZXZlbnQua2V5ID09PSBcIlNwYWNlYmFyXCIpIHtcbiAgICAgICAgICAgIC8vIFByZXZlbnQgdGhlIGRlZmF1bHQgYWN0aW9uIGFuZCBzdG9wIHByb3BhZ2F0aW9uXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApOyAvLyBVc2UgY2FwdHVyaW5nIGluc3RlYWQgb2YgYnViYmxpbmdcblxuICAgICAgY29uc3QgYnV0dG9ucyA9IHRoaXMudWlGZWF0dXJlc0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcImJ1dHRvblwiKTtcbiAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIiBcIiB8fCBldmVudC5rZXkgPT09IFwiU3BhY2ViYXJcIikge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGJ1dHRvbi5ibHVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXV0b1BsYXlIYW5kbGVyKHN0cmVhbUluZm86IE1lc3NhZ2VzLlN0cmVhbUluZm8pIHtcbiAgICBjb25zdCB7IHZpZGVvUGxheWVyIH0gPSB0aGlzPy53ZWJSdGNDb250cm9sbGVyO1xuICAgIGNvbnN0IGF1dG9QbGF5ID0gc3RyZWFtSW5mbz8uc3RyZWFtSW5mbz8uYXV0b1BsYXk7XG4gICAgY29uc3QgaXNQYXVzZWQgPSB2aWRlb1BsYXllcj8uaXNQYXVzZWQoKTtcbiAgICBpZiAoYXV0b1BsYXkgJiYgaXNQYXVzZWQpIHtcbiAgICAgIGlmICh2aWRlb1BsYXllcikge1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB2aWRlb1BsYXllcj8uZ2V0VmlkZW9FbGVtZW50KCk7XG4gICAgICAgIGlmICh2aWRlb0VsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdmlkZW9FbGVtZW50Py5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5T3ZlcmxheSA9IHBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIjcGxheU92ZXJsYXlcIik7XG4gICAgICAgICAgICBpZiAocGxheU92ZXJsYXkpIHBsYXlPdmVybGF5Py5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmlkZW9FbGVtZW50Py5wbGF5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogUmVxdWVzdCBhIHJlc3BvbnNlIGZyb20geW91IFVFIEFwcGxpY2F0aW9uLlxuICAgKiBUaGUgcmV0dXJuZWQgcmVzcG9uc2UgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgeW91ciBVRSBBcHBsaWNhdGlvbi5cbiAgICogSXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhcHBsaWNhdGlvbiwgc3VjaCBhczpcbiAgICogLSBhIHN0YXRlIHRvIHVwZGF0ZSB5b3VyIGN1c3RvbSB1aVxuICAgKiAtIGdldCB0aGUgdXJsIHRvIHRoZSBwZGYgaXQgdXBsb2FkZWQgdG8gc29tZSByZW1vdGUgc2VydmljZSBvZiB5b3Vyc1xuICAgKiAtIHRoZSBpZCBvZiB0aGUgc2F2ZS1nYW1lXG4gICAqIC4uIGFueXRoaW5nIGVsc2UgeW91IGNvdWxkIGltYWdpbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0QXBwbGljYXRpb25SZXNwb25zZShjYWxsYmFjazogKHJlc3BvbnNlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzPy5zdHJlYW0/LmFkZFJlc3BvbnNlRXZlbnRMaXN0ZW5lcihcInVlLXJlc3BvbnNlXCIsIChyZXNwb25zZSkgPT4ge1xuICAgICAgY2FsbGJhY2socmVzcG9uc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGxpY2F0aW9uUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzPy5yZXNwb25zZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzPy5yZXNwb25zZUNhbGxiYWNrKHJlc3BvbnNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5QXJjd2FyZVN0eWxlcygpIHtcbiAgICBjb25zdCBQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzID0gbmV3IFBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZShBcmN3YXJlU3R5bGVzKTtcbiAgICBQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzPy5hcHBseVN0eWxlU2hlZXQoKTtcbiAgfVxuXG4gIC8qKiBFbWl0IGFuIGV2ZW50IHRvd2FyZHMgdGhlIFVFIEFwcGxpY2F0aW9uLlxuICAgKiBNYWlubHkgdXNlZCB0byBidWJibGUgZXZlbnRzIGxpa2UgYSBidXR0b24gcHJlc3Mgb3Igb3RoZXIgY29tbWFuZCBpbnB1dHMgdG93YXJkcyB0aGUgVUUgQXBwbGljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZW1pdFVJSW50ZXJhY3Rpb24oZGVzY3JpcHRvcjogb2JqZWN0IHwgc3RyaW5nKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIHRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI/LmVtaXRVSUludGVyYWN0aW9uKGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZXMgYSBoZWxwZXIgdGV4dCBmb3IgdGhlIENvbm5lY3Rpb24gT3ZlcmxheVxuICBwcml2YXRlIGFkZFRleHRUb0Nvbm5lY3RPdmVybGF5KCkge1xuICAgIGlmICghdGhpcz8uc3RyZWFtPy5jb25maWc/LmluaXRpYWxTZXR0aW5ncz8uQXV0b0Nvbm5lY3QpIHtcbiAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICBjb25zdCBjb25uZWN0T3ZlcmxheSA9IHRoaXM/LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIjY29ubmVjdE92ZXJsYXlcIik7XG4gICAgICAgIGlmIChjb25uZWN0T3ZlcmxheSkge1xuICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb25UZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICBjb25uZWN0aW9uVGV4dC5jbGFzc05hbWUgPSBcImNvbm5lY3Rpb24tdGV4dFwiO1xuICAgICAgICAgIGNvbm5lY3RPdmVybGF5LmFwcGVuZENoaWxkKGNvbm5lY3Rpb25UZXh0KTtcblxuICAgICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgICAgdGl0bGUuY2xhc3NOYW1lID0gXCJ0aXRsZVwiO1xuICAgICAgICAgIHRpdGxlLnRleHRDb250ZW50ID0gXCJDbGljayBvbiB0aGUgYnV0dG9uIGJlbG93IHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzdHJlYW1pbmcuXCI7XG4gICAgICAgICAgY29ubmVjdGlvblRleHQuYXBwZW5kQ2hpbGQodGl0bGUpO1xuXG4gICAgICAgICAgY29uc3Qgc3VidGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICAgICAgICBzdWJ0aXRsZS5jbGFzc05hbWUgPSBcInN1YnRpdGxlXCI7XG4gICAgICAgICAgc3VidGl0bGUudGV4dENvbnRlbnQgPVxuICAgICAgICAgICAgXCJBZnRlciBjbGlja2luZyB0aGUgYnV0dG9uLCBpdCBtYXkgdGFrZSBhIGZldyBzZWNvbmRzIGZvciB0aGUgY29ubmVjdGlvbiB0byBzdGFydC4gRG9uJ3Qgd29ycnkgaWYgeW91IGRvbid0IHNlZSBhbiBpbW1lZGlhdGUgcmVhY3Rpb24uXCI7XG5cbiAgICAgICAgICBjb25uZWN0aW9uVGV4dC5hcHBlbmRDaGlsZChzdWJ0aXRsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBDb25maWcsIEZsYWdzLCBMb2dnZXIsIENvbmZpZ1BhcmFtcywgb3ZlcnJpZGVMb2dnZXIgfSBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gXCIuL2RvbWFpbi9TZXNzaW9uXCI7XG5pbXBvcnQgeyBBcmN3YXJlU2V0dGluZ3NTY2hlbWEsIFNldHRpbmdzIH0gZnJvbSBcIi4vZG9tYWluL0FyY3dhcmVTZXR0aW5nc1NjaGVtYVwiO1xuXG4vKiogRGVmYXVsdCBhcmN3YXJlIHNpZ25hbGxpbmcgZW5kcG9pbnQuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFVybCA9IGB3c3M6Ly9zaWduYWxsaW5nLWNsaWVudC5yYWduYXJvay5hcmN3YXJlLmNsb3VkYCBhcyBjb25zdDtcblxuLy8gVGhlIGJlbG93IExvZ2dlciBvdmVycmlkZXMgY2FuIGxpa2VseSBiZSByZW1vdmVkIGFzIFBTSW5mcmEgNS41IGxvZ2dlciBzdXBwb3J0cyBzZXR0aW5nIGxvZyB2ZXJib3NpdHlcbi8vIGFuZCB0aGVzZSBvdmVycmlkZXMgYXJlIG1hdGNoaW5nIHRoZSBkZWZhdWx0IGxvZ2dpbmcgYmVoYXZpb3VyIGFueXdheSAoZXhjZXB0IGluZm8pLlxuLypMb2dnZXIuSW5mbyA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgLy8gY29uc29sZS5pbmZvKG1lc3NhZ2UpO1xufTtcbkxvZ2dlci5XYXJuaW5nID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG59O1xuTG9nZ2VyLkVycm9yID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICBpZiAobWVzc2FnZT8uc3RhcnRzV2l0aChcInVuaGFuZGxlZCBTdGF0IFR5cGVcIikpIHJldHVybjtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbn07Ki9cbkxvZ2dlci5Jbml0TG9nZ2luZygyLCBmYWxzZSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJjd2FyZUNvbmZpZ1BhcmFtcyBleHRlbmRzIENvbmZpZ1BhcmFtcyB7XG4gIHNldHRpbmdzOiBTZXR0aW5ncztcbn1cblxuZXhwb3J0IGNsYXNzIEFyY3dhcmVDb25maWcgZXh0ZW5kcyBDb25maWcge1xuICAvKipcbiAgICogQ2FuIGJlIHVzZWQgdG8gZmV0Y2ggcHJvamVjdElkIGFuZCBzaGFyZUlkIGZyb20gdGhlIGN1cnJlbnQgdXJsLlxuICAgKiBFeGFtcGxlOlxuICAgKiAvc29tZXRoaW5nLzpwcm9qZWN0SWQvOnNoYXJlSWQvc29tZXRoaW5nP3NvbWV0aGluZyA9PiB7IHByb2plY3RJZCwgc2hhcmVJZCB9XG4gICAqIC86cHJvamVjdElkID0+IHsgcHJvamVjdElkIH1cbiAgICogLzpzaGFyZUlkID0+IHsgc2hhcmVJZCB9XG4gICAqIC86c2hhcmVJZC86cHJvamVjdElkID0+IHsgcHJvamVjdElkLCBzaGFyZUlkIH1cbiAgICpcbiAgICogVGhlIHByb2plY3RJZCBtdXN0IGJlIHV1aWR2NC5cbiAgICogVGhlIHNoYXJlSWQgbXVzdCBiZSBcInNoYXJlSWQtXCIgcHJlZml4ZWQuXG4gICAqXG4gICAqIFVzYWdlOlxuICAgKiAvLyBUaGlzIHdpbGwgc3ByZWFkIHRoZSBwcm9qZWN0SWQgYW5kIHRoZSBzaGFyZUlkIGludG8gdGhlIHNldHRpbmdzLiBEZWZpbmUgYW55dGhpbmcgeW91IHdhbnQgdG8gb3ZlcnJpZGUgYWZ0ZXIgdGhlIHNwcmVhZCBvcGVyYXRpb24uXG4gICAqIG5ldyBBcmN3YXJlQ29uZmlnKHsgc2V0dGluZ3M6IHsgLi4uQXJjd2FyZUNvbmZpZy5QaWNrSWRzT2ZVcmwoKSB9IH0pO1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBQaWNrSWRzT2ZVcmwoKTogUGljazxTZXR0aW5ncywgXCJzaGFyZUlkXCIgfCBcInByb2plY3RJZFwiPiB7XG4gICAgY29uc3QgeyBwYXRobmFtZSB9ID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgY29uc3Qgc2VjdGlvbnMgPSBwYXRobmFtZS5zcGxpdChcIi9cIik7XG4gICAgY29uc3QgcHJvamVjdElkID0gc2VjdGlvbnMuZmluZCgoc2VjdGlvbikgPT4gei5zdHJpbmcoKS51dWlkKCkuc2FmZVBhcnNlKHNlY3Rpb24pLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IHNoYXJlSWQgPSBzZWN0aW9ucy5maW5kKChzZWN0aW9uKSA9PiB6LnN0cmluZygpLnN0YXJ0c1dpdGgoXCJzaGFyZS1cIikuc2FmZVBhcnNlKHNlY3Rpb24pLnN1Y2Nlc3MpO1xuICAgIHJldHVybiB7XG4gICAgICBwcm9qZWN0SWQsXG4gICAgICBzaGFyZUlkXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uOiBTZXNzaW9uO1xuXG4gIHB1YmxpYyByZWFkb25seSBzZXR0aW5nczogU2V0dGluZ3M7XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbFNldHRpbmdzO1xuXG4gIHB1YmxpYyByZWFkb25seSBWRVJTSU9OID0gXCIxLjIuMTNcIjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEFyY3dhcmVDb25maWdQYXJhbXMpIHtcbiAgICBjb25zdCBkZlRva2VuID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoXG4gICAgICAuc2xpY2UoMSlcbiAgICAgIC5zcGxpdChcIiZcIilcbiAgICAgIC5maW5kKChxcCkgPT4gcXAuc3RhcnRzV2l0aChcImRmLVwiKSk7XG4gICAgaWYgKCFkZlRva2VuICYmICFjb25maWcuc2V0dGluZ3Muc2hhcmVJZCAmJiAhY29uZmlnLnNldHRpbmdzLnByb2plY3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaGFyZUlkIG9yIFByb2plY3RJZCBtdXN0IGJlIHNwZWNpZmllZC5gKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBzZXR0aW5ncyBpbnB1dC5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEFyY3dhcmVTZXR0aW5nc1NjaGVtYS5wYXJzZShjb25maWcuc2V0dGluZ3MpO1xuXG4gICAgLy8gU2V0dXAgYXJjd2FyZSBkZWZhdWx0IHNldHRpbmdzLlxuICAgIGlmICghY29uZmlnLmluaXRpYWxTZXR0aW5ncykgY29uZmlnLmluaXRpYWxTZXR0aW5ncyA9IHt9O1xuICAgIGlmICghY29uZmlnLmluaXRpYWxTZXR0aW5ncz8uaGFzT3duUHJvcGVydHkoXCJBdXRvQ29ubmVjdFwiKSkgY29uZmlnLmluaXRpYWxTZXR0aW5ncy5BdXRvQ29ubmVjdCA9IGZhbHNlO1xuICAgIC8vIGlmICghY29uZmlnLmluaXRpYWxTZXR0aW5ncz8uaGFzT3duUHJvcGVydHkoXCJIb3ZlcmluZ01vdXNlXCIpKSBjb25maWcuaW5pdGlhbFNldHRpbmdzLkhvdmVyaW5nTW91c2UgPSB0cnVlO1xuICAgIGlmICghY29uZmlnLmluaXRpYWxTZXR0aW5ncz8uaGFzT3duUHJvcGVydHkoXCJBRktUaW1lb3V0XCIpKSBjb25maWcuaW5pdGlhbFNldHRpbmdzLkFGS1RpbWVvdXQgPSA2MDA7XG4gICAgaWYgKCFjb25maWcuaW5pdGlhbFNldHRpbmdzLnNzKSBjb25maWcuaW5pdGlhbFNldHRpbmdzLnNzID0gRGVmYXVsdFVybDtcblxuICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMuc2Vzc2lvbiA9IG5ldyBTZXNzaW9uKCk7XG4gICAgdGhpcy5faW5pdGlhbFNldHRpbmdzID0gY29uZmlnLmluaXRpYWxTZXR0aW5ncztcblxuICAgIC8vIFNldHVwIGFyY3dhcmUgZGVmYXVsdCBzZXR0aW5ncy5cblxuICAgIHRoaXMuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuQUZLRGV0ZWN0aW9uLCB0cnVlKTtcblxuICAgIC8vIElNUE9SVEFOVCBOT1RFOiBUaGUgZmVhdHVyZSBCcm93c2VyU2VuZE9mZmVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUFNJbmZyYSA1LjUuXG4gICAgLy8gVGhlIG9mZmVyIGlzIG5vdyBleHBlY3RlZCB0byBjb21lIGZyb20gVUUuIEVuc3VyZSB0aGF0IHlvdXIgc2lnbmFsbGluZyBzZXJ2ZXIgc3VwcG9ydHMgdGhpcyBiZWhhdmlvdXIuXG5cbiAgICAvL3RoaXMuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuQnJvd3NlclNlbmRPZmZlciwgdHJ1ZSk7XG4gIH1cblxuICAvKiogU2V0dXAgY29ubmVjdGlvbiBzdHJpbmcuICovXG4gIHB1YmxpYyBnZXQgdXJsRmxhZ3MoKTogc3RyaW5nIHtcbiAgICBsZXQgZmxhZ3MgPSBcIlwiO1xuXG4gICAgLy8gU2V0dXAgY29ubmVjdGlvbiB2aWEgc2hhcmVJZC5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaGFyZUlkKSBmbGFncyArPSBgJnNoPSR7dGhpcy5zZXR0aW5ncy5zaGFyZUlkfWA7XG4gICAgLy8gQWRkaXRpb25hbGx5IHNldHVwIHRoZSBwcm9qZWN0SWQgcHJvcGVydHkgaWYgdGhlIHNoYXJlSWQgaXMgc2V0IHVwIHdpdGggbXVsdGlwbGUgcHJvamVjdHMuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MucHJvamVjdElkKSBmbGFncyArPSBgJnA9JHt0aGlzLnNldHRpbmdzLnByb2plY3RJZH1gO1xuXG4gICAgLy8gU2V0dXAgZGlyZWN0IHNlc3Npb24gY29ubmVjdGlvbi5cbiAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3Muc2Vzc2lvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZmxhZ3MgKz0gYCZzPSR7dGhpcy5zZXR0aW5ncy5zZXNzaW9ufWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNldHVwIHNlc3Npb24gcmVjb25uZWN0LlxuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5zZXNzaW9uLmlkO1xuICAgICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgICBmbGFncyArPSBgJnM9JHtzZXNzaW9uSWR9YDtcbiAgICAgICAgLy8gSWYgYSBzZXNzaW9uSWQgaXMgZmV0Y2hlZCBvdXQgb2YgdGhlIFNlc3Npb24gY2xhc3MsIGl0J3MgYSByZWNvbm5lY3Rpb24gYXR0ZW1wdC5cbiAgICAgICAgZmxhZ3MgKz0gYCZyPXRydWVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldHVwIGJ5cGFzcyBmbGFnLlxuICAgIGlmICh0aGlzLnNldHRpbmdzLmJ5cGFzcykgZmxhZ3MgKz0gYCZiPXRydWVgO1xuXG4gICAgLy8gU2V0dXAgYXV0aGVudGljYXRpb24gdG9rZW4gZm9yIHBsYXRmb3JtIGludGVybmFsIHByZXZpZXdpbmcuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MudG9rZW4pIGZsYWdzICs9IGAmdD0ke3RoaXMuc2V0dGluZ3MudG9rZW59YDtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcblxuICAgIC8vIEZldGNoIHJJZCBwYXJhbWV0ZXIgZnJvbSB0aGUgdXJsIGFuZCBwYXNzIGl0IHRvIHRoZSBjb25uZWN0aW9uIHN0cmluZy5cbiAgICBjb25zdCBySWQgPSBxdWVyeS5nZXQoXCJySWRcIikgPz8gdW5kZWZpbmVkO1xuICAgIGlmIChySWQpIGZsYWdzICs9IGAmcklkPSR7cklkfWA7XG5cbiAgICAvLyBTZXR1cCBEaXJlY3RGbG93LlxuICAgIGNvbnN0IGRmVG9rZW4gPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hcbiAgICAgIC5zbGljZSgxKVxuICAgICAgLnNwbGl0KFwiJlwiKVxuICAgICAgLmZpbmQoKHFwKSA9PiBxcC5zdGFydHNXaXRoKFwiZGYtXCIpKTtcbiAgICBpZiAoZGZUb2tlbikgZmxhZ3MgKz0gYCYke2RmVG9rZW59YDtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnN0YXJ0SGVpZ2h0ICYmIHRoaXMuc2V0dGluZ3Muc3RhcnRIZWlnaHQgPiAyMDApIGZsYWdzICs9IGAmaD0ke3RoaXMuc2V0dGluZ3Muc3RhcnRIZWlnaHR9YDtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnN0YXJ0V2lkdGggJiYgdGhpcy5zZXR0aW5ncy5zdGFydFdpZHRoID4gMjAwKSBmbGFncyArPSBgJnc9JHt0aGlzLnNldHRpbmdzLnN0YXJ0V2lkdGh9YDtcblxuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5pdGlhbFNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbml0aWFsU2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgbW9kaWZ5SW5pdGlhbFNldHRpbmdzKG1vdXNlTG9jazogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUsIG1vdXNlTG9jayk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFyY3dhcmVDb25maWcsIEFyY3dhcmVDb25maWdQYXJhbXMsIERlZmF1bHRVcmwgfSBmcm9tIFwiLi9BcmN3YXJlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSBmcm9tIFwiLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmltcG9ydCB7IEFyY3dhcmVBcHBsaWNhdGlvbiB9IGZyb20gXCIuL0FyY3dhcmVBcHBsaWNhdGlvblwiO1xuaW1wb3J0IHsgV2Vic29ja2V0U3RhdGUgfSBmcm9tIFwiLi9kb21haW4vQ29ubmVjdGlvbklkZW50aWZpZXJcIjtcblxudHlwZSBEZWVwUGFydGlhbDxUPiA9IFQgZXh0ZW5kcyBGdW5jdGlvbiA/IFQgOiBUIGV4dGVuZHMgb2JqZWN0ID8geyBbUCBpbiBrZXlvZiBUXT86IERlZXBQYXJ0aWFsPFRbUF0+IH0gOiBUO1xuXG5sZXQgZ2xvYmFsUGl4ZWxTdHJlYW1pbmc6IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB8IG51bGwgPSBudWxsO1xubGV0IGdsb2JhbENvbmZpZzogQXJjd2FyZUNvbmZpZyB8IG51bGwgPSBudWxsO1xubGV0IGdsb2JhbEFwcGxpY2F0aW9uOiBBcmN3YXJlQXBwbGljYXRpb24gfCBudWxsID0gbnVsbDtcbmxldCBwcmV2aW91c1NoYXJlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xubGV0IHByZXZpb3VzUHJvamVjdElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIEFyY3dhcmVJbml0KFxuICB7IHNoYXJlSWQsIHByb2plY3RJZCB9OiB7IHNoYXJlSWQ/OiBzdHJpbmc7IHByb2plY3RJZD86IHN0cmluZyB9LFxuICBjb25maWd1cmF0aW9uPzogRGVlcFBhcnRpYWw8QXJjd2FyZUNvbmZpZ1BhcmFtcz4sXG4gIGZvcmNlUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgaWYgKHNoYXJlSWQgJiYgIXNoYXJlSWQuc3RhcnRzV2l0aChcInNoYXJlLVwiKSkgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHNoYXJlSWQtZm9ybWF0OiAnJHtzaGFyZUlkfScuYCk7XG5cbiAgaWYgKHNoYXJlSWQgJiYgcHJldmlvdXNTaGFyZUlkICE9PSBzaGFyZUlkKSB7XG4gICAgZ2xvYmFsQ29uZmlnID0gbnVsbDtcbiAgICBnbG9iYWxQaXhlbFN0cmVhbWluZyA9IG51bGw7XG4gICAgZ2xvYmFsQXBwbGljYXRpb24gPSBudWxsO1xuICAgIHByZXZpb3VzU2hhcmVJZCA9IHNoYXJlSWQ7XG4gIH1cbiAgaWYgKHByb2plY3RJZCAmJiBwcmV2aW91c1Byb2plY3RJZCAhPT0gcHJvamVjdElkKSB7XG4gICAgZ2xvYmFsQ29uZmlnID0gbnVsbDtcbiAgICBnbG9iYWxQaXhlbFN0cmVhbWluZyA9IG51bGw7XG4gICAgZ2xvYmFsQXBwbGljYXRpb24gPSBudWxsO1xuICAgIHByZXZpb3VzUHJvamVjdElkID0gcHJvamVjdElkO1xuICB9XG4gIGlmIChmb3JjZVJlZnJlc2gpIHtcbiAgICBnbG9iYWxDb25maWcgPSBudWxsO1xuICAgIGdsb2JhbFBpeGVsU3RyZWFtaW5nID0gbnVsbDtcbiAgICBnbG9iYWxBcHBsaWNhdGlvbiA9IG51bGw7XG4gICAgY29uc29sZS5pbmZvKFwiQXJjd2FyZUluaXQ6IEZvcmNlZCByZS1pbml0aWFsaXphdGlvblwiKTtcbiAgfVxuXG4gIGlmIChnbG9iYWxQaXhlbFN0cmVhbWluZyAmJiBnbG9iYWxDb25maWcgJiYgZ2xvYmFsQXBwbGljYXRpb24pIHtcbiAgICBjb25zb2xlLndhcm4oXCJBcmN3YXJlSW5pdDogUmV0dXJuaW5nIGV4aXN0aW5nIGluc3RhbmNlIHRvIHByZXZlbnQgbXVsdGlwbGUgV2ViU29ja2V0IGNvbm5lY3Rpb25zLlwiKTtcblxuICAgIHJldHVybiB7XG4gICAgICBDb25maWc6IGdsb2JhbENvbmZpZyxcbiAgICAgIFBpeGVsU3RyZWFtaW5nOiBnbG9iYWxQaXhlbFN0cmVhbWluZyxcbiAgICAgIEFwcGxpY2F0aW9uOiBnbG9iYWxBcHBsaWNhdGlvblxuICAgIH07XG4gIH1cblxuICBjb25zdCBDb25maWcgPSBuZXcgQXJjd2FyZUNvbmZpZyh7XG4gICAgdXNlVXJsUGFyYW1zOiBjb25maWd1cmF0aW9uPy51c2VVcmxQYXJhbXMgPT09IHRydWUsXG4gICAgaW5pdGlhbFNldHRpbmdzOiB7XG4gICAgICBzczogRGVmYXVsdFVybCxcbiAgICAgIEF1dG9Db25uZWN0OiBmYWxzZSxcbiAgICAgIFN0YXJ0VmlkZW9NdXRlZDogdHJ1ZSxcbiAgICAgIEF1dG9QbGF5VmlkZW86IHRydWUsXG4gICAgICBLZXlib2FyZElucHV0OiB0cnVlLFxuICAgICAgTW91c2VJbnB1dDogdHJ1ZSxcbiAgICAgIEdhbWVwYWRJbnB1dDogdHJ1ZSxcbiAgICAgIFRvdWNoSW5wdXQ6IHRydWUsXG4gICAgICBYUkNvbnRyb2xsZXJJbnB1dDogdHJ1ZSxcbiAgICAgIFVzZU1pYzogdHJ1ZSxcbiAgICAgIFN1cHByZXNzQnJvd3NlcktleXM6IHRydWUsXG4gICAgICBGYWtlTW91c2VXaXRoVG91Y2hlczogZmFsc2UsXG4gICAgICBGb3JjZU1vbm9BdWRpbzogZmFsc2UsXG4gICAgICBIb3ZlcmluZ01vdXNlOiB0cnVlLFxuICAgICAgLi4uY29uZmlndXJhdGlvbj8uaW5pdGlhbFNldHRpbmdzXG4gICAgfSxcbiAgICBzZXR0aW5nczoge1xuICAgICAgc2hhcmVJZCxcbiAgICAgIHByb2plY3RJZCxcbiAgICAgIGZ1bGxzY3JlZW5CdXR0b246IHRydWUsXG4gICAgICBhdWRpb0J1dHRvbjogdHJ1ZSxcbiAgICAgIHN0b3BCdXR0b246IGZhbHNlLFxuICAgICAgaW5mb0J1dHRvbjogZmFsc2UsXG4gICAgICBtaWNCdXR0b246IGZhbHNlLFxuICAgICAgc2V0dGluZ3NCdXR0b246IGZhbHNlLFxuICAgICAgY29ubmVjdGlvblN0cmVuZ3RoSWNvbjogZmFsc2UsXG4gICAgICBjb25uZWN0aW9uSWRlbnRpZmllckxvZ2dpbmdEaXNhYmxlZDogdW5kZWZpbmVkLFxuICAgICAgZXJyb3JIYW5kbGVyOiB1bmRlZmluZWQsXG4gICAgICBsb3ZlTGV0dGVySGFuZGxlcjogdW5kZWZpbmVkLFxuICAgICAgbG92ZUxldHRlckxvZ2dpbmc6IHVuZGVmaW5lZCxcbiAgICAgIHF1ZXVlSGFuZGxlcjogdW5kZWZpbmVkLFxuICAgICAgc2Vzc2lvbklkSGFuZGxlcjogdW5kZWZpbmVkLFxuICAgICAgc3RhcnRIZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgIHN0YXJ0V2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgIC4uLmNvbmZpZ3VyYXRpb24/LnNldHRpbmdzXG4gICAgfVxuICB9KTtcblxuICBjb25zdCBQaXhlbFN0cmVhbWluZyA9IG5ldyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcoQ29uZmlnKTtcbiAgY29uc3QgQXBwbGljYXRpb24gPSBuZXcgQXJjd2FyZUFwcGxpY2F0aW9uKHsgc3RyZWFtOiBQaXhlbFN0cmVhbWluZyB9KTtcblxuICAvLyBTdG9yZSBnbG9iYWxseSB0byBwcmV2ZW50IG11bHRpcGxlIGluc3RhbmNlc1xuICBnbG9iYWxDb25maWcgPSBDb25maWc7XG4gIGdsb2JhbFBpeGVsU3RyZWFtaW5nID0gUGl4ZWxTdHJlYW1pbmc7XG4gIGdsb2JhbEFwcGxpY2F0aW9uID0gQXBwbGljYXRpb247XG5cbiAgcmV0dXJuIHtcbiAgICBDb25maWcsXG4gICAgUGl4ZWxTdHJlYW1pbmcsXG4gICAgQXBwbGljYXRpb25cbiAgfTtcbn1cbiIsImltcG9ydCB7IE1lc3NhZ2VzIH0gZnJvbSBcIkBhcmN3YXJlLWNsb3VkL3NoYXJlZC1waXhlbHN0cmVhbWluZy13ZWJzZGtcIjtcbmltcG9ydCB7XG4gIEFnZ3JlZ2F0ZWRTdGF0cyxcbiAgQmFzZU1lc3NhZ2UsXG4gIEZsYWdzLFxuICBMb2dnZXIsXG4gIE51bWVyaWNQYXJhbWV0ZXJzLFxuICBQaXhlbFN0cmVhbWluZyxcbiAgV2ViU29ja2V0VHJhbnNwb3J0LFxuICBQaXhlbFN0cmVhbWluZ092ZXJyaWRlc1xufSBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuXG5pbXBvcnQgeyB6LCBab2RUeXBlIH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgQXJjd2FyZUNvbmZpZyB9IGZyb20gXCIuL0FyY3dhcmVDb25maWdcIjtcbmltcG9ydCB7IEFwcGx5VXJsSGFjayB9IGZyb20gXCIuL0FwcGx5VXJsSGFja1wiO1xuaW1wb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSBcIi4vZG9tYWluL0V2ZW50SGFuZGxlclwiO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gXCIuL2RvbWFpbi9TZXNzaW9uXCI7XG5pbXBvcnQgeyBTdGF0cyB9IGZyb20gXCIuL2RvbWFpbi9TdGF0c1wiO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCIuL2RvbWFpbi9kZWJvdW5jZVwiO1xuaW1wb3J0IHsgTG92ZUxldHRlcnMgfSBmcm9tIFwiLi91aS9Mb3ZlTGV0dGVyc1wiO1xuaW1wb3J0IHsgQXJjd2FyZUxvZ29Mb2FkZXIgfSBmcm9tIFwiLi91aS9BcmN3YXJlTG9nb0xvYWRlclwiO1xuaW1wb3J0IHsgTWljcm9waG9uZU92ZXJsYXkgfSBmcm9tIFwiLi91aS9NaWNyb3Bob25lT3ZlcmxheVwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbklkZW50aWZpZXIsIFdlYnNvY2tldFN0YXRlIH0gZnJvbSBcIi4vZG9tYWluL0Nvbm5lY3Rpb25JZGVudGlmaWVyXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgZXh0ZW5kcyBQaXhlbFN0cmVhbWluZyB7XG4gIC8qKiBPdmVycmlkZSBkZWZhdWx0IGNvbmZpZyB3aXRoIEFyY3dhcmVDb25maWcuICovXG4gIHB1YmxpYyBvdmVycmlkZSBjb25maWc6IEFyY3dhcmVDb25maWc7XG4gIHB1YmxpYyBzdHJlYW1JbmZvPzogTWVzc2FnZXMuU3RyZWFtSW5mbztcbiAgcHVibGljIGxvdmVMZXR0ZXJzQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBsb3ZlTGV0dGVyc0xpc3Q6IHN0cmluZ1tdO1xuICBwcml2YXRlIGxvdmVMZXR0ZXJzUXVldWU6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaXNQcm9jZXNzaW5nUXVldWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBtaWNyb3Bob25lT3ZlcmxheTogTWljcm9waG9uZU92ZXJsYXk7XG5cbiAgLyoqIFJldHVybnMgYSBsaXN0IG9mIFdlYlNvY2tldFN0YXRlcyBvZiBhbGwgUGl4ZWxTdHJlYW1pbmcgSW5zdGFuY2VzIGdlbmVyYXRlZC4gKi9cbiAgcHVibGljIGdldCBXZWJzb2NrZXRTdGF0ZXMoKSB7XG4gICAgcmV0dXJuIENvbm5lY3Rpb25JZGVudGlmaWVyLkluc3RhbmNlLkdldFdlYlNvY2tldFN0YXRlcygpO1xuICB9XG5cbiAgLyoqIENvdW50cyBhbGwgYWN0aXZlIFBpeGVsU3RyZWFtaW5nIEluc3RhbmNlcyBnZW5lcmF0ZWQuIChDT05ORUNUSU5HICYgQ09OTkVDVEVEKSAqL1xuICBwdWJsaWMgZ2V0IEFjdGl2ZUluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gQ29ubmVjdGlvbklkZW50aWZpZXIuSW5zdGFuY2UuQWN0aXZlSW5zdGFuY2VzO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhpcyBQaXhlbFN0cmVhbWluZyBJbnN0YW5jZXMgd2Vic29ja2V0IHN0YXRlLiAqL1xuICBwdWJsaWMgZ2V0IHdlYnNvY2tldFN0YXRlKCk6IFdlYnNvY2tldFN0YXRlIHtcbiAgICBsZXQgc3RhdGU6IGFueSA9ICh0aGlzLndlYlJ0Y0NvbnRyb2xsZXI/LnRyYW5zcG9ydCBhcyBXZWJTb2NrZXRUcmFuc3BvcnQpPy53ZWJTb2NrZXQ/LnJlYWR5U3RhdGU7XG4gICAgcmV0dXJuIHN0YXRlICE9PSB1bmRlZmluZWQgPyAoc3RhdGUgYXMgV2Vic29ja2V0U3RhdGUpIDogV2ViU29ja2V0LkNMT1NFRDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQXJjd2FyZUNvbmZpZywgb3ZlcnJpZGVzPzogUGl4ZWxTdHJlYW1pbmdPdmVycmlkZXMpIHtcbiAgICAvKiogQXMgc29vbiBhcyB1cHN0cmVhbSBpcyBmaXhlZCwgd2UgZ290IHRvIGFkanVzdCB0aGUgdXJsIGJ1aWxkaW5nIHByb2Nlc3MuICovXG4gICAgQXBwbHlVcmxIYWNrKCk7XG5cbiAgICBzdXBlcihjb25maWcsIG92ZXJyaWRlcyk7XG5cbiAgICAvKiogVGhlb3JldGljYWxseSB0aGlzIGNhbGwgc2hvdWxkIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBzaWduYWxsaW5nIHVybCwgYnV0IHRoaXMgd291bGQgbm90IHdvcmsgYXQgYWxsLCBpZiBjb25maWcgaXMgc2V0dXAgZm9yIFwiQXV0b0Nvbm5lY3Q9dHJ1ZVwiXG4gICAgICogSW5zdGVhZCB3ZSB1c2UgQXBwbHlVcmxIYWNrKCk7XG4gICAgICovXG4gICAgLy8gdGhpcy5zZXRTaWduYWxsaW5nVXJsQnVpbGRlcigoKSA9PiB7XG4gICAgLy8gICBjb25zdCByZWdleCA9IC8oPzw9XFw/LiopXFw/L2c7XG4gICAgLy8gICBjb25zdCBzaWduYWxsaW5nU2VydmVyVXJsID0gdGhpcy5jb25maWcuZ2V0VGV4dFNldHRpbmdWYWx1ZShUZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsKTtcbiAgICAvLyAgIHJldHVybiBzaWduYWxsaW5nU2VydmVyVXJsICsgXCI/XCIgKyB0aGlzLmNvbmZpZy51cmxGbGFncztcbiAgICAvLyB9KTtcblxuICAgIC8vIFNldCBvdmVycmlkZSBjb25maWcuXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5sb3ZlTGV0dGVyc0xpc3QgPSBbXTtcbiAgICB0aGlzLm1pY3JvcGhvbmVPdmVybGF5ID0gbmV3IE1pY3JvcGhvbmVPdmVybGF5KHRoaXMpO1xuXG4gICAgLy8gdGhpcy5sb3ZlTGV0dGVyc0NvbnRhaW5lciA9IG51bGw7XG5cbiAgICB0aGlzLndyYXBXZWJTb2NrZXRPbkNsb3NlSGFuZGxlcigpO1xuXG4gICAgLy8gQmluZCB0aGUgZXZlbnQgbGlzdGVuZXIgZnVuY3Rpb24gdG8gdGhlIGNsYXNzIGluc3RhbmNlXG4gICAgdGhpcy5oYW5kbGVSZXNvbHV0aW9uQ2hhbmdlID0gdGhpcy5oYW5kbGVSZXNvbHV0aW9uQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBSZWdpc3RlciBtZXNzYWdlIGhhbmRsZXJzLlxuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXCJsZXR0ZXJcIiwgTWVzc2FnZXMuWkxvdmVMZXR0ZXIsIHRoaXMub25Mb3ZlTGV0dGVyKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFwic3RyZWFtSW5mb1wiLCBNZXNzYWdlcy5aU3RyZWFtSW5mbywgdGhpcy5vblN0cmVhbUluZm8pO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXCJzZXNzaW9uSWRcIiwgTWVzc2FnZXMuWlNlc3Npb25JZCwgdGhpcy5vblNlc3Npb25JZCk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcImVycm9yXCIsIE1lc3NhZ2VzLlpFcnJvck1lc3NhZ2UsIHRoaXMub25FcnJvcik7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcInBpbmdcIiwgTWVzc2FnZXMuWlBpbmcsIHRoaXMub25QaW5nKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFwicXVldWVcIiwgTWVzc2FnZXMuWlF1ZXVlLCB0aGlzLm9uUXVldWUpO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXCJ2ZXJzaW9uXCIsIE1lc3NhZ2VzLlpWZXJzaW9uLCB0aGlzLm9uVmVyc2lvbik7XG5cbiAgICAvLyBDcmVhdGUgYSBkZWJvdW5jZWQgdmVyc2lvbiBvZiB0aGUgaGFuZGxlUmVzb2x1dGlvbkNoYW5nZSBmdW5jdGlvblxuICAgIGNvbnN0IGRlYm91bmNlZFJlc29sdXRpb25DaGFuZ2UgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTtcbiAgICB9LCAwKTtcblxuICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVycy5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ2aWRlb0luaXRpYWxpemVkXCIsIHRoaXMub25WaWRlb0luaXRpYWxpemVkLmJpbmQodGhpcykpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcInN0YXRzUmVjZWl2ZWRcIiwgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLnNlbmRTdGF0cyhldmVudC5kYXRhLmFnZ3JlZ2F0ZWRTdGF0cyk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdGhlIHdpbmRvdyByZXNpemUgZXZlbnQgbGlzdGVuZXJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBkZWJvdW5jZWRSZXNvbHV0aW9uQ2hhbmdlKTtcblxuICAgIHRoaXMud2ViUnRjQ29udHJvbGxlci5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFxuICAgICAgMCwgLy8gTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLFxuICAgICAgXCJUZXh0Ym94RW50cnlcIixcbiAgICAgIChtZXNzYWdlRGF0YT86IHVua25vd24pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcihcbiAgICAgICAgICAgICdUZXh0Ym94RW50cnknLFxuICAgICAgICAgICAgbWVzc2FnZURhdGEgYXMgQXJyYXk8bnVtYmVyIHwgc3RyaW5nPlxuICAgICAgICAgIClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUb1N0cmVhbWVyLlRleHRib3hFbnRyeWAsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuaW5pdExvdmVMZXR0ZXJzQ29udGFpbmVyKCk7XG4gICAgdGhpcy5jcmVhdGVNaWNyb3Bob25lT3ZlcmxheSgpO1xuXG4gICAgLy8gU2V0IHByZSBjb25maWd1cmVkIGhhbmRsZXJzLlxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXR0aW5ncy5lcnJvckhhbmRsZXIpIHRoaXMuZXJyb3JIYW5kbGVyLmFkZCh0aGlzLmNvbmZpZy5zZXR0aW5ncy5lcnJvckhhbmRsZXIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXR0aW5ncy5xdWV1ZUhhbmRsZXIpIHRoaXMucXVldWVIYW5kbGVyLmFkZCh0aGlzLmNvbmZpZy5zZXR0aW5ncy5xdWV1ZUhhbmRsZXIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXR0aW5ncy5zZXNzaW9uSWRIYW5kbGVyKSB0aGlzLnNlc3Npb25JZEhhbmRsZXIuYWRkKHRoaXMuY29uZmlnLnNldHRpbmdzLnNlc3Npb25JZEhhbmRsZXIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXR0aW5ncy5sb3ZlTGV0dGVySGFuZGxlcikgdGhpcy5sb3ZlTGV0dGVySGFuZGxlci5hZGQodGhpcy5jb25maWcuc2V0dGluZ3MubG92ZUxldHRlckhhbmRsZXIpO1xuXG4gICAgQ29ubmVjdGlvbklkZW50aWZpZXIuSW5zdGFuY2UucmVnaXN0ZXIodGhpcyk7XG5cbiAgICB0aGlzLnJlbW92ZVhSSWNvbklmRGlzYWJsZWQoKTtcblxuICAgIHRoaXMuaGFuZGxlTW91c2VMb2NrKCk7XG4gIH1cblxuICAvKiogR2V0dGVyIGZvciB0aGUgc2Vzc2lvbiBvYmplY3QuICovXG4gIHB1YmxpYyBnZXQgc2Vzc2lvbigpOiBTZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc2Vzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiAqICogKiAqICogKlxuICAgKiAgTGlzdGVuICAgKlxuICAgKiAqICogKiAqICogKlxuICAgKi9cbiAgLyoqIE9uIHZlcnNpb24gcmVxdWVzdGVkLCB0aGUgdmVyc2lvbiBvZiB0aGUgV2ViU0RLIHdvdWxkIGJlIHJldHVybmVkLiAqL1xuICBwcml2YXRlIG9uVmVyc2lvbihtZXNzYWdlOiBNZXNzYWdlcy5WZXJzaW9uKSB7XG4gICAgdGhpcy5zZW5kKHsgdHlwZTogXCJ2ZXJzaW9uXCIsIHZlcnNpb246IHRoaXMuY29uZmlnLlZFUlNJT04gfSk7XG4gIH1cblxuICAvKiogT24gcGluZyB0aGUgc2Vzc2lvbiBjcmVhdGlvbiB0aW1lc3RhbXAgd2lsbCBiZSB1cGRhdGVkLiAqL1xuICBwcml2YXRlIG9uUGluZyhtZXNzYWdlOiBNZXNzYWdlcy5QaW5nKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoXCJIb3ZlcmluZ01vdXNlXCIpICE9PSAhdGhpcz8uc3RyZWFtSW5mbz8uc3RyZWFtSW5mby5tZXRhPy5tb3VzZUxvY2spXG4gICAgICB0aGlzLmhhbmRsZU1vdXNlTG9jaygpO1xuICAgIGlmICh0aGlzLnNlc3Npb24uY3VycmVudCkgdGhpcy5zZXNzaW9uLnNldCh0aGlzLnNlc3Npb24uY3VycmVudCk7XG4gIH1cblxuICAvKiogSGFuZGxlIGluY29taW5nIGNvbmZpZ3VyYXRpb25zLiAqL1xuICAvLyBwdWJsaWMgcmVhZG9ubHkgc3RyZWFtSW5mb0hhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPG5ldmVyPigpO1xuICBwcml2YXRlIG9uU3RyZWFtSW5mbyhzdHJlYW1JbmZvOiBNZXNzYWdlcy5TdHJlYW1JbmZvKSB7XG4gICAgTG9nZ2VyLkluZm8oYFN0cmVhbUluZm8gcmVjZWl2ZWQuYCk7XG5cbiAgICAvLyBTYXZlIHRoZSBzdHJlYW1JbmZvIHRvIHRoZSBpbnN0YW5jZSB2YXJpYWJsZVxuICAgIHRoaXMuc3RyZWFtSW5mbyA9IHN0cmVhbUluZm87XG5cbiAgICAvLyBCeSBzZXR0aW5nIHRoaXMgaGlkZGVuIGZsYWcsIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBzdHJlYW1JbmZvIGNhbiBiZSBjdXQgb2ZmLlxuICAgIC8vIEN1dHRpbmcgb2YgdGhlIHN0cmVhbUluZm8gY2FuIGxlYWQgdG8gdW53YW50ZWQgYmVoYXZpb3IsIHRoZXJlZm9yZSBpdCdzIG5vdCBhZHZlcnRpc2VkLlxuICAgIGlmICghKHRoaXMuY29uZmlnPy5zZXR0aW5ncyBhcyB7IFwiZG8tbm90LWV2YWwtc3RyZWFtSW5mb1wiPzogdHJ1ZSB9KT8uW1wiZG8tbm90LWV2YWwtc3RyZWFtSW5mb1wiXSkge1xuICAgICAgY29uc3QgeyBhZmsgfSA9IHN0cmVhbUluZm8uc3RyZWFtSW5mbztcbiAgICAgIGlmIChhZmspIHtcbiAgICAgICAgdGhpcy5jb25maWcuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuQUZLRGV0ZWN0aW9uLCBhZmsuZW5hYmxlZCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLkFGS1RpbWVvdXRTZWNzLCBhZmsud2FybiArIGFmay5lcnJvcik7XG4gICAgICAgIC8vIEhhY2tcbiAgICAgICAgY29uc3QgeyBhZmtDb250cm9sbGVyIH0gPSB0aGlzLndlYlJ0Y0NvbnRyb2xsZXI7XG4gICAgICAgIGFma0NvbnRyb2xsZXIuY291bnREb3duID0gYWZrLmFjdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVsZXZhbnQgc2V0dGluZ3MgbmVlZCB0byBiZSBpbnRlcnByZXRlZCB3aGVuIHRoZXkgY29tZSB0aHJvdWdoIHRoZSBzdHJlYW1JbmZvIHRvIHRoZSBjbGllbnQuXG4gICAgICBpZiAoc3RyZWFtSW5mby5zdHJlYW1JbmZvLndlYlNka1NldHRpbmdzPy5pbml0KSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldFNldHRpbmdzKHN0cmVhbUluZm8uc3RyZWFtSW5mby53ZWJTZGtTZXR0aW5ncy5pbml0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmVhbUluZm8uc3RyZWFtSW5mby53ZWJTZGtTZXR0aW5ncz8uY29uZikge1xuICAgICAgICBPYmplY3QuZW50cmllcyhzdHJlYW1JbmZvLnN0cmVhbUluZm8ud2ViU2RrU2V0dGluZ3MuY29uZikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3QgayA9IGtleSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jb25maWcuc2V0dGluZ3M7XG4gICAgICAgICAgdGhpcy5jb25maWcuc2V0dGluZ3Nba10gPSB2YWx1ZSBhcyBuZXZlcjtcblxuICAgICAgICAgIGlmIChrZXkgPT09IFwiY29ubmVjdGlvbklkZW50aWZpZXJMb2dnaW5nRGlzYWJsZWRcIiAmJiB2YWx1ZSA9PT0gdHJ1ZSkgQ29ubmVjdGlvbklkZW50aWZpZXIuSW5zdGFuY2UuZGlzYWJsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZU1vdXNlTG9jaygpO1xuICAgIHRoaXMuaW5qZWN0Q3VzdG9tVUkoKTtcblxuICAgIC8vIEV2ZW50SGFuZGxlci5FbWl0KHRoaXMuc3RyZWFtSW5mb0hhbmRsZXIsIHVuZGVmaW5lZCBhcyBuZXZlcik7XG4gIH1cblxuICAvLyBFeHRlcm5hbGl6ZWRcblxuICAvKiogT24gcGluZyB0aGUgc2Vzc2lvbiBjcmVhdGlvbiB0aW1lc3RhbXAgd2lsbCBiZSB1cGRhdGVkLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcXVldWVIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcjxNZXNzYWdlcy5RdWV1ZT4oKTtcbiAgcHJpdmF0ZSBvblF1ZXVlKG1lc3NhZ2U6IE1lc3NhZ2VzLlF1ZXVlKSB7XG4gICAgTG9nZ2VyLkluZm8oYFF1ZXVlSW5mbyByZWNlaXZlZC5gKTtcbiAgICBFdmVudEhhbmRsZXIuRW1pdCh0aGlzLnF1ZXVlSGFuZGxlciwgbWVzc2FnZSk7XG4gIH1cblxuICAvKiogRXJyb3IgcmVjZWl2ZXIuICovXG4gIHB1YmxpYyByZWFkb25seSBlcnJvckhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPE1lc3NhZ2VzLkVycm9yTWVzc2FnZT4oKTtcbiAgcHJpdmF0ZSBvbkVycm9yKGVycm9yOiBNZXNzYWdlcy5FcnJvck1lc3NhZ2UpIHtcbiAgICBMb2dnZXIuRXJyb3IoZXJyb3IudHlwZSk7XG4gICAgRXZlbnRIYW5kbGVyLkVtaXQodGhpcy5lcnJvckhhbmRsZXIsIGVycm9yKTtcbiAgfVxuXG4gIC8qKiBMb3ZlTGV0dGVyICovXG4gIHB1YmxpYyByZWFkb25seSBsb3ZlTGV0dGVySGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXI8TWVzc2FnZXMuTG92ZUxldHRlcj4oKTtcbiAgcHJpdmF0ZSBvbkxvdmVMZXR0ZXIobG92ZUxldHRlcjogTWVzc2FnZXMuTG92ZUxldHRlcikge1xuICAgIC8vIExvZ2dlci5JbmZvKExvZ2dlci5HZXRTdGFja1RyYWNlKCksIGxvdmVMZXR0ZXIucmVhc29uKTtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0dGluZ3MubG92ZUxldHRlckxvZ2dpbmcpIGNvbnNvbGUuaW5mbyhsb3ZlTGV0dGVyLnJlYXNvbik7XG4gICAgRXZlbnRIYW5kbGVyLkVtaXQodGhpcy5sb3ZlTGV0dGVySGFuZGxlciwgbG92ZUxldHRlcik7XG4gICAgdGhpcy5wdXNoTGV0dGVyKGxvdmVMZXR0ZXIucmVhc29uKTtcbiAgfVxuXG4gIC8qKiBTZXNzaW9uSWQgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25JZEhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBvblNlc3Npb25JZChtZXNzYWdlOiBNZXNzYWdlcy5TZXNzaW9uSWQpIHtcbiAgICBMb2dnZXIuSW5mbyhtZXNzYWdlLnNlc3Npb25JZCk7XG4gICAgLy8gY29uc29sZS5pbmZvKGBTZXNzaW9uOiAke21lc3NhZ2Uuc2Vzc2lvbklkfWApO1xuICAgIHRoaXMuc2Vzc2lvbi5zZXQobWVzc2FnZS5zZXNzaW9uSWQpO1xuXG4gICAgRXZlbnRIYW5kbGVyLkVtaXQodGhpcy5zZXNzaW9uSWRIYW5kbGVyLCBtZXNzYWdlLnNlc3Npb25JZCk7XG4gIH1cblxuICAvKiogVmlkZW9Jbml0aWFsaXplZCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmlkZW9Jbml0aWFsaXplZEhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPG5ldmVyPigpO1xuICBwcml2YXRlIG9uVmlkZW9Jbml0aWFsaXplZCgpOiB2b2lkIHtcbiAgICAvKiogVGhlIHZpZGVvSW5pdGlhbGl6ZWQgZXZlbnQgaXMgaW1wb3J0YW50IGZvciB0aGUgQXJjd2FyZSBDbG91ZCBCQWNrZW5kLCBzaW5jZSB3aXRob3V0IHRoYXQgZXZlbnQgdGhlIGluc3RhbmNlIHdpbGwgYmUgY2xlYW5lZCB1cCAoa2lsbGVkKS4gKi9cbiAgICB0aGlzLmhhbmRsZU1vdXNlTG9jaygpO1xuICAgIHRoaXMuc2VuZCh7IHR5cGU6IFwib25WaWRlb0luaXRpYWxpemVkXCIgfSk7XG4gICAgRXZlbnRIYW5kbGVyLkVtaXQodGhpcy52aWRlb0luaXRpYWxpemVkSGFuZGxlciwgdW5kZWZpbmVkIGFzIG5ldmVyKTtcbiAgICB0aGlzLmhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTtcbiAgICB0aGlzLmhhbmRsZVJlbW92ZUxvdmVMZXR0ZXJzKCk7XG4gICAgdGhpcy5taWNyb3Bob25lT3ZlcmxheS50b2dnbGVWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICB0aGlzLmFwcGx5UmVzb2x1dGlvbklmUGxheWluZygpO1xuICAgIHRoaXMucmVtb3ZlWFJJY29uSWZEaXNhYmxlZCgpO1xuICB9XG5cbiAgLy8gSW50ZXJuYWxcbiAgLyoqIFdlYlNvY2tldCBDbG9zZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2Vic29ja2V0T25DbG9zZUhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPENsb3NlRXZlbnQ+KCk7XG5cbiAgLyoqIEFkZGluZyBhIHpvZC1zYWZlIGhhbmRsZXIuICovXG4gIHByaXZhdGUgYWRkTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIHsgdHlwZT86IHN0cmluZyB9PihcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgem9kOiBab2RUeXBlPFQ+LFxuICAgIGJvdW5kTWV0aG9kOiAodGhpczogdGhpcywgcGF5bG9hZDogei5pbmZlcjx0eXBlb2Ygem9kPikgPT4gdm9pZFxuICApIHtcbiAgICB0aGlzLnNpZ25hbGxpbmdQcm90b2NvbC5hZGRMaXN0ZW5lcih0eXBlLCAocGF5bG9hZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB6b2Quc2FmZVBhcnNlKHBheWxvYWQpO1xuICAgICAgaWYgKHBhcnNlZC5zdWNjZXNzKSBib3VuZE1ldGhvZC5jYWxsKHRoaXMsIHBhcnNlZC5kYXRhKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGNhc3QgaGFzIHRvIGJlIGRvbmUsIHNpbmNlIEZyb250ZW5kIGRvZXMgbm90IHVzZSB0eXBlc2NyaXB0LXN0cmljdCBzZXR0aW5nLlxuICAgICAgICBjb25zdCBwYXJzZWRFcnJvciA9IHBhcnNlZCBhcyB1bmtub3duIGFzIHouU2FmZVBhcnNlRXJyb3I8VD47XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIG1lc3NhZ2UgY29udGVudC4gRXZlbnQ6JyR7dHlwZX0nLCBab2RFcnJvcjogJHtwYXJzZWRFcnJvci5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBMb2dnZXIuRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICogKiAqICogKlxuICAgKiAgU2VuZCAgICpcbiAgICogKiAqICogKiAqXG4gICAqL1xuICBwcml2YXRlIHNlbmRTdGF0cyhzdGF0czogQWdncmVnYXRlZFN0YXRzKSB7XG4gICAgY29uc3QgbWVzc2FnZTogTWVzc2FnZXMuU3RhdHMgPSB7IHR5cGU6IFwic3RhdHNcIiwgc3RhdHM6IFN0YXRzKHN0YXRzKSB9O1xuICAgIC8vIFRoaXMgY2FzdCBoYXMgdG8gYmUgZG9uZSwgc2luY2UgRnJvbnRlbmQgZG9lcyBub3QgdXNlIHR5cGVzY3JpcHQtc3RyaWN0IHNldHRpbmcuXG4gICAgdGhpcy5zZW5kKG1lc3NhZ2UgYXMgeyB0eXBlOiBzdHJpbmcgfSk7XG4gIH1cblxuICBwcml2YXRlIHNlbmQ8VCBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+KG1lc3NhZ2U6IFQpOiB2b2lkO1xuICBwcml2YXRlIHNlbmQ8SyBleHRlbmRzIGtleW9mIHR5cGVvZiBNZXNzYWdlcy5TZW5kPihtZXNzYWdlOiB7IHR5cGU6IEsgfSAmIHouaW5mZXI8KHR5cGVvZiBNZXNzYWdlcy5TZW5kKVtLXT4pOiB2b2lkO1xuICBwcml2YXRlIHNlbmQ8VCBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0sIEsgZXh0ZW5kcyBrZXlvZiB0eXBlb2YgTWVzc2FnZXMuU2VuZD4oXG4gICAgbWVzc2FnZTogVCB8ICh7IHR5cGU6IEsgfSAmIHouaW5mZXI8KHR5cGVvZiBNZXNzYWdlcy5TZW5kKVtLXT4pXG4gICkge1xuICAgIGlmIChNZXNzYWdlcy5TZW5kW21lc3NhZ2UudHlwZSBhcyBLXSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gTWVzc2FnZXMuU2VuZFttZXNzYWdlLnR5cGUgYXMgS10hLnNhZmVQYXJzZShtZXNzYWdlKTtcbiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgdGhpcy5zaWduYWxsaW5nUHJvdG9jb2wuc2VuZE1lc3NhZ2UocmVzdWx0LmRhdGEgYXMgQmFzZU1lc3NhZ2UpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgY2FzdCBoYXMgdG8gYmUgZG9uZSwgc2luY2UgRnJvbnRlbmQgZG9lcyBub3QgdXNlIHR5cGVzY3JpcHQtc3RyaWN0IHNldHRpbmcuXG4gICAgICAgIGNvbnN0IHBhcnNlZEVycm9yID0gcmVzdWx0IGFzIHVua25vd24gYXMgei5TYWZlUGFyc2VFcnJvcjxUPjtcbiAgICAgICAgTG9nZ2VyLkVycm9yKGBGYWlsZWQgdG8gc2VuZC4gJHtwYXJzZWRFcnJvci5lcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaWduYWxsaW5nUHJvdG9jb2wuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCkge1xuICAgIC8vIEdldCB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSBzdHJlYW1JbmZvIGlmIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcz8uc3RyZWFtSW5mbyB8fCAhdGhpcz8ud2ViUnRjQ29udHJvbGxlciB8fCAhdGhpcz8ud2ViUnRjQ29udHJvbGxlcj8udmlkZW9QbGF5ZXI/LmdldFZpZGVvRWxlbWVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEdldCB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSBzdHJlYW1JbmZvIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IHJlc29sdXRpb24gPSB0aGlzPy5zdHJlYW1JbmZvPy5zdHJlYW1JbmZvPy5yZXNvbHV0aW9uO1xuICAgIGNvbnN0IHVucmVhbFZlcnNpb24gPSB0aGlzPy5zdHJlYW1JbmZvPy5zdHJlYW1JbmZvPy5tZXRhPy52ZXJzaW9uO1xuICAgIC8vIENoZWNrIGlmIHJlc29sdXRpb24uZHluYW1pYyBpcyB0cnVlXG4gICAgaWYgKHJlc29sdXRpb24gJiYgcmVzb2x1dGlvbj8uZHluYW1pYykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdmlkZW9QbGF5ZXIgfSA9IHRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI7XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHZpZGVvUGxheWVyPy5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgYnJvd3NlcldpZHRoID0gdmlkZW9FbGVtZW50UGFyZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgY29uc3QgYnJvd3NlckhlaWdodCA9IHZpZGVvRWxlbWVudFBhcmVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgIC8vIERlZmluZSBtYXhpbXVtIGFsbG93ZWQgcmVzb2x1dGlvblxuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHJlc29sdXRpb24/LndpZHRoO1xuICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSByZXNvbHV0aW9uPy5oZWlnaHQ7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGJyb3dzZXIgdmlld3BvcnRcbiAgICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSBicm93c2VyV2lkdGghIC8gYnJvd3NlckhlaWdodCE7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiB0aGUgYXNwZWN0IHJhdGlvXG4gICAgICAgIGxldCBsaW1pdGVkV2lkdGgsIGxpbWl0ZWRIZWlnaHQ7XG4gICAgICAgIGlmIChhc3BlY3RSYXRpbyA+IG1heFdpZHRoIC8gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgLy8gV2lkdGggaXMgdGhlIGxpbWl0aW5nIGZhY3RvclxuICAgICAgICAgIGxpbWl0ZWRXaWR0aCA9IG1heFdpZHRoO1xuICAgICAgICAgIGxpbWl0ZWRIZWlnaHQgPSBtYXhXaWR0aCAvIGFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEhlaWdodCBpcyB0aGUgbGltaXRpbmcgZmFjdG9yXG4gICAgICAgICAgbGltaXRlZEhlaWdodCA9IG1heEhlaWdodDtcbiAgICAgICAgICBsaW1pdGVkV2lkdGggPSBtYXhIZWlnaHQgKiBhc3BlY3RSYXRpbztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWRlb1BsYXllcikge1xuICAgICAgICAgIC8vIENoZWNrIFVucmVhbCBFbmdpbmUgdmVyc2lvblxuICAgICAgICAgIGlmICghdW5yZWFsVmVyc2lvbiB8fCB1bnJlYWxWZXJzaW9uPy5zdGFydHNXaXRoKFwiNC4yN1wiKSkge1xuICAgICAgICAgICAgLy8gVXNlIHRoZSBhc3BlY3QgcmF0aW8gbGltaXRlZCByZXNvbHV0aW9uIGZvciB0aGUgci5zZXRyZXMgY29tbWFuZFxuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHsgQ29uc29sZTogYHIuc2V0cmVzICR7TWF0aC5yb3VuZChsaW1pdGVkV2lkdGgpfXgke01hdGgucm91bmQobGltaXRlZEhlaWdodCl9d2AgfTtcbiAgICAgICAgICAgIHRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI/LmVtaXRVSUludGVyYWN0aW9uKGRlc2NyaXB0b3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIGFzcGVjdCByYXRpbyBsaW1pdGVkIHJlc29sdXRpb24gZm9yIHRoZSBvbk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uQ2FsbGJhY2tcbiAgICAgICAgICAgIHZpZGVvUGxheWVyLm9uTWF0Y2hWaWV3cG9ydFJlc29sdXRpb25DYWxsYmFjayhNYXRoLnJvdW5kKGxpbWl0ZWRXaWR0aCksIE1hdGgucm91bmQobGltaXRlZEhlaWdodCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVJlc29sdXRpb25JZlBsYXlpbmcoKSB7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcz8ud2ViUnRjQ29udHJvbGxlcj8udmlkZW9QbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCk7XG4gICAgaWYgKHZpZGVvRWxlbWVudCkge1xuICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwbGF5aW5nXCIsICgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcz8uaGFuZGxlUmVzb2x1dGlvbkNoYW5nZSgpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVQbGF5ZXIoKSB7XG4gICAgLy90aGlzLnNpZ25hbGxpbmdQcm90b2NvbC5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1vdXNlTG9jaygpIHtcbiAgICB0aGlzPy5jb25maWc/Lm1vZGlmeUluaXRpYWxTZXR0aW5ncyghdGhpcz8uc3RyZWFtSW5mbz8uc3RyZWFtSW5mby5tZXRhPy5tb3VzZUxvY2spO1xuICB9XG5cbiAgcHVibGljIGluaXRMb3ZlTGV0dGVyc0NvbnRhaW5lcigpIHtcbiAgICBjb25zdCBsb2dvTG9hZGVyID0gbmV3IEFyY3dhcmVMb2dvTG9hZGVyKCk7XG4gICAgaWYgKCF0aGlzLmxvdmVMZXR0ZXJzQ29udGFpbmVyKSB7XG4gICAgICBjb25zdCBsb3ZlTGV0dGVyc0NvbnRhaW5lciA9IGRvY3VtZW50Py5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgY29uc3QgeyB2aWRlb1BsYXllciB9ID0gdGhpcz8ud2ViUnRjQ29udHJvbGxlcjtcbiAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpO1xuICAgICAgbG92ZUxldHRlcnNDb250YWluZXI/LmNsYXNzTGlzdD8uYWRkKFwibG92ZS1sZXR0ZXJzLWJveC1yb290XCIpO1xuICAgICAgdmlkZW9FbGVtZW50UGFyZW50Py5hcHBlbmRDaGlsZChsb3ZlTGV0dGVyc0NvbnRhaW5lcik7XG4gICAgICBjb25zdCBsZXR0ZXJzQmxvY2sgPSBkb2N1bWVudD8uY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGxldHRlcnNCbG9jay5pZCA9IFwibGV0dGVycy1ibG9ja1wiO1xuICAgICAgY29uc3QgbGV0dGVyc1dyYXBwZXIgPSBkb2N1bWVudD8uY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGxldHRlcnNXcmFwcGVyLmlkID0gXCJsZXR0ZXJzLXdyYXBwZXJcIjtcbiAgICAgIGlmIChsb3ZlTGV0dGVyc0NvbnRhaW5lcikge1xuICAgICAgICBsZXR0ZXJzQmxvY2s/LmFwcGVuZENoaWxkKGxvZ29Mb2FkZXI/LmFyY3dhcmVMb2dvTG9hZGVyKTtcbiAgICAgICAgbG92ZUxldHRlcnNDb250YWluZXI/LmFwcGVuZENoaWxkKGxldHRlcnNCbG9jayk7XG4gICAgICAgIGxldHRlcnNCbG9jaz8uYXBwZW5kQ2hpbGQobGV0dGVyc1dyYXBwZXIpO1xuICAgICAgfVxuXG4gICAgICBsZXR0ZXJzQmxvY2suaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIGlmIChsZXR0ZXJzQmxvY2spIHtcbiAgICAgICAgbGV0dGVyc0Jsb2NrPy5hcHBlbmRDaGlsZChsb2dvTG9hZGVyPy5hcmN3YXJlTG9nb0xvYWRlcik7XG4gICAgICAgIGxldHRlcnNCbG9jaz8uYXBwZW5kQ2hpbGQobGV0dGVyc1dyYXBwZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHVzaExldHRlcihsZXR0ZXI6IHN0cmluZykge1xuICAgIC8vIEFkZCB0aGUgbGV0dGVyIHRvIHRoZSBxdWV1ZVxuICAgIHRoaXM/LmxvdmVMZXR0ZXJzUXVldWU/LnB1c2gobGV0dGVyKTtcblxuICAgIC8vIElmIG5vdCBhbHJlYWR5IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzdGFydCBwcm9jZXNzaW5nXG4gICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZ1F1ZXVlKSB7XG4gICAgICB0aGlzPy5wcm9jZXNzTG92ZUxldHRlclF1ZXVlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcHJvY2Vzc0xvdmVMZXR0ZXJRdWV1ZSgpIHtcbiAgICAvLyBTZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgcXVldWVcbiAgICB0aGlzLmlzUHJvY2Vzc2luZ1F1ZXVlID0gdHJ1ZTtcbiAgICAvLyBUYWtlIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIHF1ZXVlXG4gICAgY29uc3QgbGV0dGVyID0gdGhpcy5sb3ZlTGV0dGVyc1F1ZXVlLnNoaWZ0KCk7XG4gICAgaWYgKGxldHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRMb3ZlTGV0dGVyOiBzdHJpbmcgPSBsZXR0ZXI/LnJlcGxhY2UoL0xMOiB8XFwuJC9nLCBcIlwiKTtcbiAgICAgIHRoaXM/LmxvdmVMZXR0ZXJzTGlzdD8ucHVzaChmb3JtYXR0ZWRMb3ZlTGV0dGVyKTtcbiAgICAgIGNvbnN0IGxvdmVMZXR0ZXJzQm94ID0gbmV3IExvdmVMZXR0ZXJzKCk7XG4gICAgICBsb3ZlTGV0dGVyc0JveD8uYWRkTGV0dGVyKGZvcm1hdHRlZExvdmVMZXR0ZXIsIHRoaXM/LmxvdmVMZXR0ZXJzTGlzdD8ubGVuZ3RoKTtcbiAgICAgIC8vIFByb2Nlc3MgdGhlIG5leHQgaXRlbSBpbiB0aGUgcXVldWUgYWZ0ZXIgYSBkZWxheVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xvdmVMZXR0ZXJRdWV1ZSgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgcmVzZXQgdGhlIGZsYWdcbiAgICAgIHRoaXMuaXNQcm9jZXNzaW5nUXVldWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbW92ZUxvdmVMZXR0ZXJzKCkge1xuICAgIGNvbnN0IGxvdmVMZXR0ZXJzQ29udGFpbmVyID0gZG9jdW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIubG92ZS1sZXR0ZXJzLWJveC1yb290XCIpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGxvdmVMZXR0ZXJzQ29udGFpbmVyKSB7XG4gICAgICAgIGxvdmVMZXR0ZXJzQ29udGFpbmVyPy5jbGFzc0xpc3Q/LmFkZChcImZhZGUtb3V0XCIpO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGxvdmVMZXR0ZXJzQ29udGFpbmVyICYmIGxvdmVMZXR0ZXJzQ29udGFpbmVyPy5wYXJlbnROb2RlKSB7XG4gICAgICAgIGxvdmVMZXR0ZXJzQ29udGFpbmVyPy5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZChsb3ZlTGV0dGVyc0NvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfSwgMTYwMCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlQXVkaW8odmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50LCBlbmFibGVkOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBzdHJlYW1Db250cm9sbGVyIH0gPSB0aGlzLndlYlJ0Y0NvbnRyb2xsZXI7XG4gICAgaWYgKHZpZGVvRWxlbWVudCkge1xuICAgICAgdmlkZW9FbGVtZW50Lm11dGVkID0gZW5hYmxlZDtcbiAgICAgIGlmIChzdHJlYW1Db250cm9sbGVyKSB7XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuYXVkaW9FbGVtZW50Lm11dGVkID0gZW5hYmxlZDtcbiAgICAgICAgaWYgKHZpZGVvRWxlbWVudD8uY3VycmVudFRpbWUgPiAwICYmICF2aWRlb0VsZW1lbnQ/LnBhdXNlZCAmJiBzdHJlYW1Db250cm9sbGVyPy5hdWRpb0VsZW1lbnQ/LnBhdXNlZClcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyPy5hdWRpb0VsZW1lbnQ/LnBsYXkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pY3JvcGhvbmVPdmVybGF5KCkge1xuICAgIHRoaXM/Lm1pY3JvcGhvbmVPdmVybGF5Py5jcmVhdGVPdmVybGF5KCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlTWljKGVuYWJsZTogYm9vbGVhbiwgaXNEZWZhdWx0OiBib29sZWFuKSB7XG4gICAgdGhpcz8uY29uZmlnPy5zZXRGbGFnRW5hYmxlZChGbGFncy5Vc2VNaWMsIGVuYWJsZSk7XG4gICAgaWYgKCFpc0RlZmF1bHQpIHtcbiAgICAgIHRoaXM/Lm1pY3JvcGhvbmVPdmVybGF5Py50b2dnbGVNZXNzYWdlKGVuYWJsZSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcz8ubWljcm9waG9uZU92ZXJsYXk/LnRvZ2dsZVZpc2liaWxpdHkodHJ1ZSk7XG4gICAgICB9LCAyMDApO1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd3JhcFdlYlNvY2tldE9uQ2xvc2VIYW5kbGVyKCkge1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICB0aGlzLndlYlJ0Y0NvbnRyb2xsZXI/LnRyYW5zcG9ydD8uYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIChldmVudCkgPT4ge1xuICAgICAgRXZlbnRIYW5kbGVyLkVtaXQoc2VsZi53ZWJzb2NrZXRPbkNsb3NlSGFuZGxlciwgZXZlbnQgYXMgQ2xvc2VFdmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25TdHJlYW1pbmdTdGF0ZUNoYW5nZShjYWxsYmFjazogKGlzU3RyZWFtaW5nOiBib29sZWFuKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gTGlzdGVuIHRvIHZpZGVvIGVsZW1lbnQgZXZlbnRzXG4gICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcz8ud2ViUnRjQ29udHJvbGxlcj8udmlkZW9QbGF5ZXI/LmdldFZpZGVvRWxlbWVudCgpO1xuICAgIHZpZGVvRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcihcInBsYXlcIiwgKCkgPT4gY2FsbGJhY2sodHJ1ZSkpO1xuICAgIHZpZGVvRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcihcInBhdXNlXCIsICgpID0+IGNhbGxiYWNrKGZhbHNlKSk7XG4gICAgdmlkZW9FbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKFwiZW5kZWRcIiwgKCkgPT4gY2FsbGJhY2soZmFsc2UpKTtcblxuICAgIC8vIExpc3RlbiB0byBXZWJTb2NrZXQgZXZlbnRzXG4gICAgdGhpcy53ZWJSdGNDb250cm9sbGVyPy50cmFuc3BvcnQuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgKCkgPT4ge1xuICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy53ZWJSdGNDb250cm9sbGVyPy50cmFuc3BvcnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlWFJJY29uSWZEaXNhYmxlZCgpIHtcbiAgICBpZiAoIXRoaXM/LmNvbmZpZz8uaW5pdGlhbFNldHRpbmdzPy5YUkNvbnRyb2xsZXJJbnB1dCkge1xuICAgICAgdGhpcz8uY29uZmlnPy5zZXRGbGFnRW5hYmxlZChGbGFncy5YUkNvbnRyb2xsZXJJbnB1dCwgZmFsc2UpO1xuICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICAgIGlmICh0aGlzPy52aWRlb0VsZW1lbnRQYXJlbnQ/LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB4ckJ0biA9IHRoaXM/LnZpZGVvRWxlbWVudFBhcmVudD8ucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3hyQnRuXCIpO1xuICAgICAgICAgIHhyQnRuPy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0Q3VzdG9tVUkoKSB7XG4gICAgY29uc3QgY3VzdG9tVUkgPSBkb2N1bWVudD8uZ2V0RWxlbWVudEJ5SWQoXCJzdHJlYW0tdWlcIik7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcz8udmlkZW9FbGVtZW50UGFyZW50Py5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChjdXN0b21VSSAmJiB2aWRlb0VsZW1lbnRQYXJlbnQpIHZpZGVvRWxlbWVudFBhcmVudD8uYXBwZW5kQ2hpbGQoY3VzdG9tVUkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgTWVzc2FnZXMgfSBmcm9tIFwiQGFyY3dhcmUtY2xvdWQvc2hhcmVkLXBpeGVsc3RyZWFtaW5nLXdlYnNka1wiO1xuXG4vKiogQXJjd2FyZSBTZXR0aW5ncy4gKi9cbmV4cG9ydCBjb25zdCBBcmN3YXJlU2V0dGluZ3NTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8qKiBPdmVyd3JpdGVzIHRoZSBTZXNzaW9uLVRvb2wgYW5kIHVzZXMgdGhlIHByb3ZpZGVkIHNlc3Npb24gaW5zdGVhZC4gKi9cbiAgc2Vzc2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvKiogQ2FuIGJlIHVzZWQgdG8gYmUgYWRkZWQgdG8gdGhlIHJlcXVlc3QgaW4gb3JkZXIgdG8gdmVyaWZ5IGFjY2VzcyB0byBwcml2YXRlIHByb2plY3RzLlxuICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuID0+IFByZXZpZXcgcGFnZS5cbiAgICovXG4gIHRva2VuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIC8qKiBAZGVwcmVjYXRlZCBpbiB0aGVyZSBmb3IgbGVnYWN5IHVzZS4gQ2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRva2VuIGlzIHByb3ZpZGVkLiAqL1xuICBieXBhc3M6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIC8vIC8qKiBDb25maWd1cmUgRGlyZWN0RmxvdyBUb2tlbi4gKi9cbiAgLy8gZGlyZWN0Rmxvdzogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvKiogSGFuZGxlciBmb3Igc2VydmVyIHNpZGUgZXJyb3IgbWVzc2FnZXMuICovXG4gIGVycm9ySGFuZGxlcjogei5mdW5jdGlvbigpLmFyZ3MoTWVzc2FnZXMuWkVycm9yTWVzc2FnZSkucmV0dXJucyh6LnZvaWQoKSkub3B0aW9uYWwoKSxcbiAgLyoqIEhhbmRsZXIgZm9yIHF1ZXVlIGV2ZW50cy4gKi9cbiAgcXVldWVIYW5kbGVyOiB6LmZ1bmN0aW9uKCkuYXJncyhNZXNzYWdlcy5aUXVldWUpLnJldHVybnMoei52b2lkKCkpLm9wdGlvbmFsKCksXG4gIC8qKiBIYW5kbGVyIGZvciBzZXNzaW9uSWQgbWVzc2FnZS4gKi9cbiAgc2Vzc2lvbklkSGFuZGxlcjogei5mdW5jdGlvbigpLmFyZ3Moei5zdHJpbmcoKSkucmV0dXJucyh6LnZvaWQoKSkub3B0aW9uYWwoKSxcbiAgLyoqIEhhbmRsZXIgZm9yIGxvdmUgbGV0dGVycy5cbiAgICogXCJMb3ZlTGV0dGVyc1wiIGFyZSBzZW5kIGZyb20gYmFja2VuZCB0byB0aGUgU0RLIHRvIHN0YXRlIHdoYXQgcGhhc2UgdGhlIGNvbm5lY3Rpb24gY3VycmVudGx5IGlzIGluLiAqL1xuICBsb3ZlTGV0dGVySGFuZGxlcjogei5mdW5jdGlvbigpLmFyZ3MoTWVzc2FnZXMuWkxvdmVMZXR0ZXIpLnJldHVybnMoei52b2lkKCkpLm9wdGlvbmFsKCksXG4gIC8qKiBTaG93IG9yIGhpZGUgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uLiAqL1xuICBmdWxsc2NyZWVuQnV0dG9uOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogU2hvdyBvciBoaWRlIHRoZSBzZXR0aW5ncyBidXR0b24uICovXG4gIHNldHRpbmdzQnV0dG9uOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogU2hvdyBvciBoaWRlIHRoZSBpbmZvIGJ1dHRvbi4gKi9cbiAgaW5mb0J1dHRvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgYXVkaW8gYnV0dG9uLiAqL1xuICBhdWRpb0J1dHRvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgbWljcm9waG9uZSBidXR0b24uICovXG4gIG1pY0J1dHRvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgbWljcm9waG9uZSBidXR0b24uICovXG4gIHN0b3BCdXR0b246IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIC8qKiBTaG93IG9yIGhpZGUgdGhlIGNvbm5lY3Rpb25TdHJlbmd0aEljb24gYnV0dG9uLiAqL1xuICBjb25uZWN0aW9uU3RyZW5ndGhJY29uOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBTaGFyZUlkLCB1c2VkIGZvciBzaGFyaW5nIHlvdXIgcHJvamVjdC5cbiAgICogVXNpbmcgQXJjd2FyZUluaXQgd2lsbCBzZXQgdGhpcyByZXF1aXJlZCBwcm9wZXJ0eSBmb3IgeW91LiAqL1xuICBzaGFyZUlkOiB6LnN0cmluZygpLnN0YXJ0c1dpdGgoXCJzaGFyZS1cIikub3B0aW9uYWwoKSxcbiAgLyoqIElkIG9mIHlvdXIgcHJvamVjdCwgb25seSByZXF1aXJlZCBpZiB5b3VyIHNoYXJlSWQgcmVmZXJzIHRvIG11bHRpcGxlIHByb2plY3RzLlxuICAgKiBVc2luZyBBcmN3YXJlSW5pdCB3aWxsIHNldCB0aGlzIHJlcXVpcmVkIHByb3BlcnR5IGZvciB5b3UuICovXG4gIHByb2plY3RJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBFbmFibGUvRGlzYWJsZSBMb3ZlTGV0dGVyIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUuICovXG4gIGxvdmVMZXR0ZXJMb2dnaW5nOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogRW5hYmxlL0Rpc2FibGUgQ29ubmVjdGlvbiBJZGVudGlmaWVyIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUuICovXG4gIGNvbm5lY3Rpb25JZGVudGlmaWVyTG9nZ2luZ0Rpc2FibGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogV2lkdGggd2l0aCB3aGljaCBpbnN0YW5jZSBzaG91bGQgYmUgc3RhcnRlZCAqL1xuICBzdGFydFdpZHRoOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIC8qKiBIZWlnaHQgd2l0aCB3aGljaCBpbnN0YW5jZSBzaG91bGQgYmUgc3RhcnRlZCAqL1xuICBzdGFydEhlaWdodDogei5udW1iZXIoKS5vcHRpb25hbCgpXG59KTtcblxuZXhwb3J0IHR5cGUgU2V0dGluZ3MgPSB6LmluZmVyPHR5cGVvZiBBcmN3YXJlU2V0dGluZ3NTY2hlbWE+O1xuIiwiaW1wb3J0IHsgQXJjd2FyZVBpeGVsU3RyZWFtaW5nIH0gZnJvbSBcIi4uL0FyY3dhcmVQaXhlbFN0cmVhbWluZ1wiO1xuXG5leHBvcnQgZW51bSBXZWJzb2NrZXRTdGF0ZSB7XG4gIC8vIFNvY2tldCBoYXMgYmVlbiBjcmVhdGVkLiBUaGUgY29ubmVjdGlvbiBpcyBub3QgeWV0IG9wZW4uXG4gIENPTk5FQ1RJTkcgPSAwLFxuICAvLyBUaGUgY29ubmVjdGlvbiBpcyBvcGVuIGFuZCByZWFkeSB0byBjb21tdW5pY2F0ZS5cbiAgT1BFTiA9IDEsXG4gIC8vIFRoZSBjb25uZWN0aW9uIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNsb3NpbmcuXG4gIENMT1NJTkcgPSAyLFxuICAvLyBUaGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgb3IgY291bGRuJ3QgYmUgb3BlbmVkLlxuICBDTE9TRUQgPSAzLFxufVxuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbklkZW50aWZpZXIge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQ29ubmVjdGlvbklkZW50aWZpZXI7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCkge1xuICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBDb25uZWN0aW9uSWRlbnRpZmllcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcnZhbDogYW55O1xuXG4gIHByaXZhdGUgYXBzOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBnZXQgV2Vic29ja2V0U3RhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLmFwcy5tYXAoKHBzKSA9PiBwcy53ZWJzb2NrZXRTdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgcmVnaXN0ZXIocHM6IEFyY3dhcmVQaXhlbFN0cmVhbWluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcHMuaW5jbHVkZXMocHMpKSB7XG4gICAgICB0aGlzLmFwcy5wdXNoKHBzKTtcblxuICAgICAgaWYgKHBzLmNvbmZpZy5zZXR0aW5ncz8uY29ubmVjdGlvbklkZW50aWZpZXJMb2dnaW5nRGlzYWJsZWQpIHRoaXMuZGlzYWJsZSgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaW50ZXJ2YWwpIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aGlzLmNvbm5lY3Rpb25XYXRjaGVyLmJpbmQodGhpcyksIDEwICogMTAwMCk7XG4gIH1cblxuICBwdWJsaWMgR2V0V2ViU29ja2V0U3RhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLmFwcy5tYXAoKHBzKSA9PiBwcy53ZWJzb2NrZXRTdGF0ZSk7XG4gIH1cblxuICBwdWJsaWMgQWN0aXZlSW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLkdldFdlYlNvY2tldFN0YXRlcygpLmZpbHRlcigoc3RhdGUpID0+IHN0YXRlIDw9IFdlYnNvY2tldFN0YXRlLk9QRU4pLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlZCA9IHRydWU7XG4gIHB1YmxpYyBkaXNhYmxlKCkge1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHBlcmlvZGljYWxseSB0ZWxsIHRoZSBkZXZlbG9wZXIgdGhlIGFtb3VudCBvZiBjb25uZWN0ZWQgaW5zdGFuY2VzLlxuICAgKiBUaGlzIHdheSB0aGUgZGV2ZWxvcGVyIGNhbiBmaWd1cmUgb3V0LCB3aGVuIHRoZXkgbWVzc2VkIHVwIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlcmUncyBzaGFkb3cgaW5zdGFuY2VzIHN0aWxsIHJ1bm5pbmcuXG4gICAqIE9yIHdoZW4gdGhleSBhY2NpZGVudGFsbHkgc2V0IHVwIG11bHRpcGxlIGNvbm5lY3Rpb25zIVxuICAgKiBUaGluZ3MgbGlrZSB0aGF0IGNhbiBoYXBwZW4sIGZvciBleGFtcGxlIGlmIHRoZSBSZWFjdC51c2VFZmZlY3Qgd2FzIG5vdCBzZXR1cCBwZXJmZWN0bHkhXG4gICAqL1xuICBwcml2YXRlIGNvbm5lY3Rpb25XYXRjaGVyKCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKSByZXR1cm47XG4gICAgY29uc3QgYWN0aXZlU3RhdGVzID0gdGhpcy5HZXRXZWJTb2NrZXRTdGF0ZXMoKS5maWx0ZXIoKHN0YXRlKSA9PiBzdGF0ZSA8PSBXZWJzb2NrZXRTdGF0ZS5PUEVOKTtcblxuICAgIGlmIChhY3RpdmVTdGF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zb2xlLmxvZyhgUGl4ZWxTdHJlYW1pbmcgSW5zdGFuY2UgaXMgY29ubmVjdGVkLmApO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZlU3RhdGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKGAke2FjdGl2ZVN0YXRlcy5sZW5ndGh9IFBpeGVsU3RyZWFtaW5nIEluc3RhbmNlcyBhcmUgY29ubmVjdGVkIWApO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqIEEgaGVscGVyIGNsYXNzIHRvIHNwcmVhZCB0aGUgZXZlbnQgdG8gYWRkaXRpb25hbCBldmVudCBoYW5kbGVycyBhZGRlZCBmcm9tIGV4dGVybmFsIHNvdXJjZXMuICovXG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyPFR5cGU+IHtcbiAgcHJpdmF0ZSBjYWxsYmFja3M6IEFycmF5PChhcmc6IFR5cGUpID0+IHZvaWQ+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBhZGRlZCBjYWxsYmFjayBvbiBzdWNjZXNzIG9yIG51bGwsIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLiAqL1xuICBwdWJsaWMgYWRkPENhbGxiYWNrIGV4dGVuZHMgKGFyZzogVHlwZSkgPT4gdm9pZD4oY2FsbGJhY2s6IENhbGxiYWNrKTogQ2FsbGJhY2sgfCBudWxsIHtcbiAgICBjb25zdCBjYiA9IHRoaXMuY2FsbGJhY2tzLmZpbmQoKGNiKSA9PiBjYiA9PT0gY2FsbGJhY2spO1xuICAgIGlmIChjYikgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgY2FsbGJhY2sgaGFzIGJlZW4gZm91bmQgYW5kIHJlbW92ZWQgYW5kIGZhbHNlIGlmIG5vdC4gKi9cbiAgcHVibGljIHJlbW92ZTxDYWxsYmFjayBleHRlbmRzIChhcmc6IFR5cGUpID0+IHZvaWQ+KGNhbGxiYWNrOiBDYWxsYmFjayk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNiID0gdGhpcy5jYWxsYmFja3MuZmluZCgoY2IpID0+IGNiID09PSBjYWxsYmFjayk7XG4gICAgaWYgKGNiKSB0aGlzLmNhbGxiYWNrcy5zcGxpY2UodGhpcy5jYWxsYmFja3MuaW5kZXhPZihjYiksIDEpO1xuICAgIHJldHVybiAhIWNiO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgQXJyYXk8KGFyZzogVHlwZSkgPT4gdm9pZD4oKTtcbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgZXZlbnQtZGF0YSBmb3IgZWFjaCBvZiB0aGUgZXhpc3RpbmcgaGFuZGxlcnMuICovXG4gIHB1YmxpYyBzdGF0aWMgRW1pdDxUeXBlPihoYW5kbGVyOiBFdmVudEhhbmRsZXI8VHlwZT4sIGV2ZW50OiBUeXBlKTogdm9pZCB7XG4gICAgaGFuZGxlci5jYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKGV2ZW50KSk7XG4gIH1cbn1cbiIsImltcG9ydCBhZGRTZWNvbmRzIGZyb20gJ2RhdGUtZm5zL2FkZFNlY29uZHMnO1xuaW1wb3J0IGlzQmVmb3JlIGZyb20gJ2RhdGUtZm5zL2lzQmVmb3JlJztcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmNvbnN0IFpTZXNzaW9uID0gelxuICAub2JqZWN0KHtcbiAgICBpZDogei5zdHJpbmcoKS5taW4oMSksXG4gICAgY3JlYXRlZDogelxuICAgICAgLmRhdGUoKVxuICAgICAgLm9yKHouc3RyaW5nKCkpXG4gICAgICAudHJhbnNmb3JtKChhcmcpID0+IG5ldyBEYXRlKGFyZykpLFxuICAgIGV4cGlyZTogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBaT3B0aW9ucyA9IHoub2JqZWN0KHtcbiAgbG9jYWxTdG9yYWdlS2V5OiB6LnN0cmluZygpLm1pbigzKS5kZWZhdWx0KFwicHhzc1wiKSxcbiAga2VlcFNlc3Npb246IHpcbiAgICAubnVtYmVyKClcbiAgICAuaW50KClcbiAgICAubWluKDMpXG4gICAgLyoqIERlZmF1bHQga2VlcCBpcyAxMCwgc2luY2UgdGhpcyBpcyBob3cgbG9uZyBpbnN0YW5jZXMgd2lsbCBiZSBrZXB0IGFsaXZlIGJ5IGRlZmF1bHQuICovXG4gICAgLmRlZmF1bHQoMTApLFxufSk7XG5cbnR5cGUgT3B0aW9ucyA9IHouaW5mZXI8dHlwZW9mIFpPcHRpb25zPjtcblxuLyoqIFRoZSBzZXNzaW9uSWQgaXMgc3RvcmVkIGluIHRoZSBsb2NhbFN0b3JhZ2UgdG8gYWxsb3cgZm9yIHJlY29ubmVjdGlvbiBhbmRcbiAqIHRvIHByZXZlbnQgc3BhbW1pbmcgc3RhcnQgcmVxdWVzdHMgb2YgaW5zdGFuY2VzLCB3aGVuIHNtYXNoaW5nIEY1LlxuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbiB7XG4gIHByaXZhdGUgX2N1cnJlbnQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBnZXQgY3VycmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbm9TZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmhhcyhcIm5vU2Vzc2lvblwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gSWYgdGhlIHF1ZXJ5LXBhcmFtZXRlciBcIm5vU2Vzc2lvblwiIG9yIFwibm9zZXNzaW9uXCIgaXMgc2V0LCBpdCB3aWxsIGJlIHNraXBwZWQuXG4gICAgaWYgKHRoaXMubm9TZXNzaW9uKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHNlc3Npb25TdHJpbmcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkpO1xuICAgIC8vIE5vIHNlc3Npb24geWV0IHNldC5cbiAgICBpZiAoc2Vzc2lvblN0cmluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gWlNlc3Npb24uc2FmZVBhcnNlKEpTT04ucGFyc2Uoc2Vzc2lvblN0cmluZykpO1xuICAgIC8vIENsZWFyIHRoZSBzZXNzaW9uIGlmIGl0J3Mgbm90IHZhbGlkLlxuICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMudW5zZXQoKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb24gPSBwYXJzZWQuZGF0YTtcbiAgICBjb25zdCBleHBpcmF0aW9uVGltZSA9IGFkZFNlY29uZHMobmV3IERhdGUoc2Vzc2lvbi5jcmVhdGVkKSwgdGhpcy5vcHRpb25zLmtlZXBTZXNzaW9uKTtcbiAgICBpZiAoaXNCZWZvcmUoZXhwaXJhdGlvblRpbWUsIG5ldyBEYXRlKCkpKSB7XG4gICAgICB0aGlzLnVuc2V0KCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIHNlc3Npb25JZC5cbiAgICByZXR1cm4gc2Vzc2lvbi5pZDtcbiAgfVxuXG4gIHByaXZhdGUgb3B0aW9uczogT3B0aW9ucztcblxuICBwcml2YXRlIGdldCBsb2NhbFN0b3JhZ2VLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb2NhbFN0b3JhZ2VLZXk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IFpPcHRpb25zLnBhcnNlKG9wdGlvbnMgfHwge30pO1xuICB9XG5cbiAgLyoqIFNldCdzIHRoZSBzZXNzaW9uIHdpdGggY3JlYXRpb24gZGF0ZSBmb3IgdGhlIGdpdmVuIHN0b3JhZ2Uga2V5IHRvIHRoZSBsb2NhbFN0b3JhZ2UuICovXG4gIHB1YmxpYyBzZXQoc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBaU2Vzc2lvbi5zaGFwZS5pZC5wYXJzZShzZXNzaW9uSWQpO1xuICAgIHRoaXMuX2N1cnJlbnQgPSBzZXNzaW9uSWQ7XG5cbiAgICBjb25zdCBzZXNzaW9uOiB6LmluZmVyPHR5cGVvZiBaU2Vzc2lvbj4gPSB7XG4gICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSxcbiAgICAgIGV4cGlyZTogZmFsc2UsXG4gICAgfTtcblxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbikpO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgYSBzZXNzaW9uIGZyb20gdGhlIGxvY2FsU3RvcmFnZS4gKi9cbiAgcHVibGljIHVuc2V0KCk6IHZvaWQge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1lc3NhZ2VzIH0gZnJvbSBcIkBhcmN3YXJlLWNsb3VkL3NoYXJlZC1waXhlbHN0cmVhbWluZy13ZWJzZGtcIjtcbmltcG9ydCB7IEFnZ3JlZ2F0ZWRTdGF0cywgQ2FuZGlkYXRlUGFpclN0YXRzIH0gZnJvbSBcIkBlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFN0YXRzKHN0YXRzOiBBZ2dyZWdhdGVkU3RhdHMpIHtcbiAgY29uc3QgcmVzdWx0ID0gTWVzc2FnZXMuWlN0YXRzLnNoYXBlLnN0YXRzLnBhcnNlKHtcbiAgICAvKipcbiAgICAgKiBPdGhlciBrbm93biBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIGNvZGVjczogc3RhdHMuY29kZWNzLFxuICAgIGNhbmRpZGF0ZVBhaXI6IHN0YXRzLmNhbmRpZGF0ZVBhaXJzLFxuICAgIGxvY2FsQ2FuZGlkYXRlczogc3RhdHMubG9jYWxDYW5kaWRhdGVzLFxuICAgIHJlbW90ZUNhbmRpZGF0ZXM6IHN0YXRzLnJlbW90ZUNhbmRpZGF0ZXMsXG4gICAgRGF0YUNoYW5uZWxTdGF0czogc3RhdHMuZGF0YWNoYW5uZWxTdGF0cyxcblxuICAgIC8vIFJlY2VpdmVkIChsYXN0KSBmb3IgdGlja2V0XG4gICAgYnl0ZXNSZWNlaXZlZDogZm9yY2VOdW1iZXIoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuYnl0ZXNSZWNlaXZlZCksXG4gICAgLy8gUGFja2V0cyBMb3N0IChsYXN0KSBmb3IgdGlja2V0XG4gICAgcGFja2V0c0xvc3Q6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLnBhY2tldHNMb3N0KSxcbiAgICAvLyBWaWRlbyByZXNvbHV0aW9uOiBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChwb3J0cmFpdCkgYW5kIGhpZ2hlc3QgbG93ZXN0IGF2ZXJhZ2UgKGxhbmRzY2FwZSkgZm9yIHRpY2tldFxuICAgIGZyYW1lV2lkdGg6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lV2lkdGghKSxcbiAgICAvLyBWaWRlbyByZXNvbHV0aW9uOiBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChwb3J0cmFpdCkgYW5kIGhpZ2hlc3QgbG93ZXN0IGF2ZXJhZ2UgKGxhbmRzY2FwZSkgZm9yIHRpY2tldFxuICAgIGZyYW1lSGVpZ2h0OiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZUhlaWdodCEpLFxuICAgIC8vIEZyYW1lcyBkZWNvZGVkIChMYXN0KSBmb3IgdGlja2V0XG4gICAgZnJhbWVzRGVjb2RlZDogZm9yY2VOdW1iZXIoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzRGVjb2RlZCEpLFxuICAgIC8vIEZyYW1lcmF0ZSAobG93IC8gaGlnaCwgYXZnKSBmb3IgdGlja2V0XG4gICAgZnJhbWVzUGVyU2Vjb25kOiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNQZXJTZWNvbmQhKSxcbiAgICAvLyBmcmFtZXMgZHJvcHBlZCAobGFzdCkgZm9yIHRpY2tldFxuICAgIGZyYW1lc0Ryb3BwZWQ6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0Ryb3BwZWQhKSxcbiAgICAvLyBWaWRlb2NvZGVjIChvbmNlKSBmb3IgdGlja2V0XG4gICAgdmlkZW9Db2RlYzogc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuY29kZWNJZCxcbiAgICAvLyBhdWRpb2NvZGVjIChvbmNlKSBmb3IgdGlja2V0XG4gICAgYXVkaW9Db2RlYzogc3RhdHMuaW5ib3VuZEF1ZGlvU3RhdHMuY29kZWNJZCxcbiAgICAvLyBicm93c2VyIHR5cGUgYW5kIHZlcnNpb24gZm9yIHRpY2tldCAoYXJjd2FyZSAvIGFkZGl0aW9uKVxuICAgIGJyb3dzZXJJbmZvOiB7XG4gICAgICAvLyB0byBiZSByZWNlaXZlZCFcbiAgICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgIHBsYXRmb3JtOiAobmF2aWdhdG9yIGFzIGFueSkub3NjcHUgfHwgbmF2aWdhdG9yLnBsYXRmb3JtIHx8IG51bGwsIC8vIG5hdmlnYXRvci5vc2NwdSxcbiAgICAgIGxhbmd1YWdlOiBuYXZpZ2F0b3IubGFuZ3VhZ2UsXG4gICAgfSxcbiAgICAvLyBOZXQgUlRUIChsb3csIGhpZ2gsIGF2ZylcbiAgICAvLyBCRUdJTiBUVyBDSEFOR0VcbiAgICBjdXJyZW50UlRUOiBjYWxjUlRUKHN0YXRzLmNhbmRpZGF0ZVBhaXJzKSxcbiAgICAvLyBFTkQgVFcgQ0hBTkdFXG4gICAgLy8gRHVyYXRpb24gKGxhc3QpXG4gICAgc2Vzc2lvblJ1blRpbWU6IHN0YXRzLnNlc3Npb25TdGF0cy5ydW5UaW1lLFxuICAgIC8vIENvbnRyb2xzIHN0cmVhbSBpbnB1dCAoPz8pXG4gICAgY29udHJvbHNTdHJlYW1JbnB1dDogc3RhdHMuc2Vzc2lvblN0YXRzLmNvbnRyb2xzU3RyZWFtSW5wdXQsXG4gICAgLy8gdmlkZW8gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAobG93IC8gaGlnaCAvIGF2ZyBpZiBhcHBsaWNhYmxlKVxuICAgIHZpZGVvRW5jb2RlckF2Z1FQOiBmb3JjZU51bWJlcihzdGF0cy5zZXNzaW9uU3RhdHMudmlkZW9FbmNvZGVyQXZnUVApLFxuICAgIC8vIFZpZGVvIGJpdHJhdGUgKG1pbiAvIG1heCAvIGF2ZylcbiAgICB2aWRlb0JpdHJhdGU6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUhKSxcbiAgICAvLyBBdWRpbyBiaXRyYXRlIChtaW4gLyBtYXggLyBhdmcpXG4gICAgYXVkaW9CaXRyYXRlOiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kQXVkaW9TdGF0cy5iaXRyYXRlISksXG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgY2FuZGlkYXRlIHBhaXJzIHRoaXMgZnVuY3Rpb24gd2lsbCBmaW5kIHRoZSBoaWdoZXN0IFJUVCBmb3IgdGhlIHNlbGVjdGVkIHBhaXJcbiAqIEBwYXJhbSBwYWlycyAtIEFuIGFycmF5IG9mIGNhbmRpZGF0ZSBwYWlyc1xuICogQHJldHVybnMgVGhlIGhpZ2hlc3Qgcm91bmQgdHJpcCB0aW1lIG9mIGEgc2VsZWN0ZWQgY2FuZGlkYXRlIHBhaXJcbiAqL1xuZnVuY3Rpb24gY2FsY1JUVChwYWlyczogQ2FuZGlkYXRlUGFpclN0YXRzW10pOiBOdW1iZXIge1xuXG4gIGxldCBydHQgPSAwO1xuICBwYWlycy5mb3JFYWNoKChwYWlyOiBDYW5kaWRhdGVQYWlyU3RhdHMpID0+IHtcblxuICAgIGlmIChwYWlyLnNlbGVjdGVkICYmIHBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUgPiBydHQpIHtcbiAgICAgIHJ0dCA9IHBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWU7XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBydHQ7XG59XG5cbi8qKlxuICogVGFrZXMgYSBudW1iZXIgYW5kIGZvcmNlcyBpdCB0byByZXR1cm4gYSBudW1iZXIuIElmIHRoZSB2YWx1ZSBwYXNzZWQgaW4gaXMgTmFOLCAwIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gdmFsdWUgLSBBIG51bWJlclxuICogQHJldHVybnMgVGhlIG51bWJlciBwYXNzZWQgaW4gYXMgdmFsdWUgb3IgMCBpZiB2bGF1ZSB3YXMgTmFOXG4gKi9cbmZ1bmN0aW9uIGZvcmNlTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBOdW1iZXIge1xuICByZXR1cm4gaXNOYU4odmFsdWUpID8gMCA6IHZhbHVlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2U8VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD4oXG4gIGZ1bmM6IFQsXG4gIHdhaXQ6IG51bWJlclxuKTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IHZvaWQge1xuICBsZXQgdGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pIHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGZ1bmMoLi4uYXJncyksIHdhaXQpO1xuICB9O1xufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vQXJjd2FyZUFwcGxpY2F0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9BcmN3YXJlQ29uZmlnXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0FyY3dhcmVJbml0XCI7XG5leHBvcnQgdHlwZSAqIGZyb20gXCIuL01lc3NhZ2VUeXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVzL0FyY3dhcmVQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzXCI7XG4iLCJleHBvcnQgY29uc3QgQXJjd2FyZVN0eWxlcyA9IHtcbiAgY3VzdG9tU3R5bGVzOiB7XG4gICAgXCI6cm9vdFwiOiB7XG4gICAgICBcIi0tY29sb3IwXCI6IFwiIzE4MTgxQSAhaW1wb3J0YW50XCIsXG4gICAgICBcIi0tY29sb3IxXCI6IFwiIzAwMDAwMFwiLFxuICAgICAgXCItLWNvbG9yMlwiOiBcIiNGRkZGRkZcIixcbiAgICAgIFwiLS1jb2xvcjNcIjogXCIjREFGNjkzICFpbXBvcnRhbnRcIixcbiAgICAgIFwiLS1jb2xvcjRcIjogXCIjMzViMzUwXCIsXG4gICAgICBcIi0tY29sb3I1XCI6IFwiI2ZmYWIwMFwiLFxuICAgICAgXCItLWNvbG9yNlwiOiBcIiM4NTg1ODggIWltcG9ydGFudFwiLFxuICAgICAgXCItLWNvbG9yN1wiOiBcIiNCNUI1QjcgIWltcG9ydGFudFwiLFxuICAgICAgXCItLWNvbG9yOFwiOiBcIiM0MTAwOGNcIixcbiAgICAgIFwiLS1jb2xvcjlcIjogXCIjM2UwMDcwXCIsXG4gICAgICBcIi0tY29sb3IxMFwiOiBcIiMyZTAwNTJcIixcbiAgICAgIFwiLS1jb2xvcjExXCI6IFwicmdiYSg2NSwwLDEzOSwxKSAhaW1wb3J0YW50XCIsXG4gICAgICBcIi0tY29sb3IxMlwiOiBcIiMyMjIyMjQgIWltcG9ydGFudFwiLFxuICAgICAgXCItLWNvbG9yMTNcIjogXCIjZjBmMGYyICFpbXBvcnRhbnRcIixcbiAgICAgIFwiLS1jb2xvckJveFNoYWRvd1wiOiBcInJnYmEoMCwgMCwgMCwgMC4yMCkgIWltcG9ydGFudFwiLFxuICAgIH0sXG4gICAgXCIjcGxheWVyVUkgKlwiOiB7XG4gICAgICBmb250RmFtaWx5OiBcInN5c3RlbS11aVwiLFxuICAgIH0sXG4gICAgXCIjc2hhcmVkLXN0cmVhbS1jb250YWluZXJcIjoge1xuICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICB9LFxuICAgIFwiI3NoYXJlZC1zdHJlYW0tY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhclwiOiB7XG4gICAgICB3aWR0aDogXCIxMHB4XCIsXG4gICAgfSxcbiAgICBcIiNzaGFyZWQtc3RyZWFtLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2tcIjoge1xuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjEzKVwiLFxuICAgICAgb3BhY2l0eTogXCIwLjVcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIzMHB4XCIsXG4gICAgICBib3JkZXJUb3A6IFwiMjBweCBzb2xpZCB2YXIoLS1jb2xvcjApXCIsXG4gICAgICBib3JkZXJSaWdodDogXCI1cHggc29saWQgdmFyKC0tY29sb3IwKVwiLFxuICAgICAgYm9yZGVyQm90dG9tOiBcIjIwcHggc29saWQgdmFyKC0tY29sb3IwKVwiLFxuICAgICAgYm9yZGVyTGVmdDogXCI1cHggc29saWQgdmFyKC0tY29sb3IwKVwiLFxuICAgIH0sXG4gICAgXCIjc2hhcmVkLXN0cmVhbS1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlXCI6IHtcbiAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICB9LFxuICAgIFwiI3NoYXJlZC1zdHJlYW0tY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYlwiOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWNvbG9yMTMpXCIsXG4gICAgICB3aWR0aDogXCI4cHhcIixcbiAgICAgIGJvcmRlclJpZ2h0OiBcIjJweCBzb2xpZCB2YXIoLS1jb2xvcjApXCIsXG4gICAgICBib3JkZXJMZWZ0OiBcIjJweCBzb2xpZCB2YXIoLS1jb2xvcjApXCIsXG4gICAgICB0cmFuc2l0aW9uOiBcImFsbCBlYXNlLWluLW91dCAwLjNzXCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiN3B4XCIsXG4gICAgfSxcbiAgICBcIiNzaGFyZWQtc3RyZWFtLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJcIjoge1xuICAgICAgdHJhbnNpdGlvbjogXCJhbGwgZWFzZS1pbi1vdXQgMC4zc1wiLFxuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjMpXCIsXG4gICAgfSxcbiAgICBcIiNwbGF5ZXJVSSwgI3ZpZGVvRWxlbWVudFBhcmVudFwiOiB7XG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgIG1heFdpZHRoOiBcIjEwMCVcIixcbiAgICAgIG1heEhlaWdodDogXCIxMDAlXCIsXG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICBtYXJnaW46IFwiYXV0b1wiLFxuICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgIHBvaW50ZXJFdmVudHM6IFwiYWxsXCIsXG4gICAgfSxcbiAgICBcIiNzdHJlYW1pbmdWaWRlb1wiOiB7XG4gICAgICBtYXhXaWR0aDogXCIxMDAlXCIsXG4gICAgICBtYXhIZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgIGJhY2tncm91bmQ6IFwiIzE4MTgxQVwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyAjY29udHJvbHNcIjoge1xuICAgICAgdG9wOiBcImF1dG9cIixcbiAgICAgIGxlZnQ6IFwiYXV0b1wiLFxuICAgICAgYm90dG9tOiBcIjEwcHhcIixcbiAgICAgIHJpZ2h0OiBcIjIwcHhcIixcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW4tcmV2ZXJzZVwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyAjY29ubmVjdGlvblwiOiB7XG4gICAgICBib3R0b206IFwiNXB4XCIsXG4gICAgICBsZWZ0OiBcIjEwcHhcIixcbiAgICAgIHdpZHRoOiBcIjIuNXJlbVwiLFxuICAgICAgaGVpaGd0OiBcIjIuNXJlbVwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyBidXR0b25cIjoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBcInZhcigtLWNvbG9yMTIpXCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgICAgIHdpZHRoOiBcIjQ1cHhcIixcbiAgICAgIGhlaWdodDogXCI0NXB4XCIsXG4gICAgICBwYWRkaW5nOiBcIjAuNXJlbVwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJyb3dcIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGJveFNoYWRvdzogXCIwcHggMHB4IDI0cHggMHB4IHZhcigtLWNvbG9yQm94U2hhZG93KVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjNweFwiLFxuICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIiN1aUZlYXR1cmVzIGJ1dHRvbjpob3ZlciwgI3VpRmVhdHVyZXMgYnV0dG9uOmFjdGl2ZVwiOiB7XG4gICAgICBwYWRkaW5nOiBcIjAgIWltcG9ydGFudFwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgYnV0dG9uICNhdWRpb0ljb25NdXRlZCwgI3VpRmVhdHVyZXMgYnV0dG9uICNhdWRpb0ljb25Vbm11dGVkLCAjdWlGZWF0dXJlcyBidXR0b24gI21pY0ljb25NdXRlZCwgI3VpRmVhdHVyZXMgYnV0dG9uICNtaWNJY29uVW5tdXRlZFwiOlxuICAgICAge1xuICAgICAgICB3aWR0aDogXCIzMXB4XCIsXG4gICAgICAgIGhlaWdodDogXCIyOHB4XCIsXG4gICAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgYnV0dG9uICNtYXhpbWl6ZUljb24sICN1aUZlYXR1cmVzIGJ1dHRvbiAjbWluaW1pemVJY29uXCI6IHtcbiAgICAgIHdpZHRoOiBcIjI1cHhcIixcbiAgICAgIGhlaWdodDogXCIyNXB4XCIsXG4gICAgfSxcbiAgICBcIiNzdG9wSWNvbiwgI3BsYXlJY29uXCI6IHtcbiAgICAgIHdpZHRoOiBcIjMwcHhcIixcbiAgICAgIGhlaWdodDogXCIzMHB4XCIsXG4gICAgfSxcbiAgICBcIiN1aUZlYXR1cmVzIGJ1dHRvbiAudG9vbHRpcHRleHRcIjoge1xuICAgICAgcmlnaHQ6IFwiMTI1JVwiLFxuICAgICAgbGVmdDogXCJhdXRvXCIsXG4gICAgICBib3hTaGFkb3c6IFwiMHB4IDBweCAyNHB4IDBweCB2YXIoLS1jb2xvckJveFNoYWRvdylcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIzcHhcIixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1jb2xvcjEyKVwiLFxuICAgICAgd2lkdGg6IFwiOTVweFwiLFxuICAgICAgdmlzaWJpbGl0eTogXCJoaWRkZW4haW1wb3J0YW50XCIsXG4gICAgfSxcbiAgICBcIkBtZWRpYSAoaG92ZXI6IGhvdmVyKSBhbmQgKHBvaW50ZXI6IGZpbmUpXCI6IHtcbiAgICAgIFwiI3VpRmVhdHVyZXMgYnV0dG9uOmhvdmVyIC50b29sdGlwdGV4dFwiOiB7XG4gICAgICAgIHZpc2liaWxpdHk6IFwidmlzaWJsZSFpbXBvcnRhbnRcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcIiNjb250cm9scz4qXCI6IHtcbiAgICAgIG1hcmdpbkJvdHRvbTogXCIwLjVyZW1cIixcbiAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgIGxpbmVIZWlnaHQ6IFwiMS43NXJlbVwiLFxuICAgICAgcGFkZGluZzogXCIwLjVyZW1cIixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1jb2xvcjEyKVwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyAjc2V0dGluZ3NJY29uLCAjdWlGZWF0dXJlcyAjc3RhdHNJY29uXCI6IHtcbiAgICAgIHdpZHRoOiBcIjI3cHhcIixcbiAgICAgIGhlaWdodDogXCIyN3B4XCIsXG4gICAgfSxcbiAgICBcIi5zdmdJY29uXCI6IHtcbiAgICAgIGZpbGw6IFwidmFyKC0tY29sb3IxMylcIixcbiAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgYnV0dG9uOmhvdmVyIC5zdmdJY29uLCAjdWlGZWF0dXJlcyBidXR0b246YWN0aXZlIC5zdmdJY29uXCI6IHtcbiAgICAgIGZpbGw6IFwidmFyKC0tY29sb3IxMilcIixcbiAgICB9LFxuICAgIFwiLnRnbC1zd2l0Y2ggLnRnbC1zbGlkZXIsIC50Z2wtZmxhdDpjaGVja2VkKy50Z2wtc2xpZGVyXCI6IHtcbiAgICAgIGJvcmRlcjogXCIzcHggc29saWQgdHJhbnNwYXJlbnRcIixcbiAgICB9LFxuICAgIFwiLnRnbC1zd2l0Y2ggLnRnbC1zbGlkZXJcIjoge1xuICAgICAgYmFja2dyb3VuZDogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIi50Z2wtc3dpdGNoIC50Z2wtc2xpZGVyOjpiZWZvcmVcIjoge1xuICAgICAgY29udGVudDogXCInJ1wiLFxuICAgICAgZGlzcGxheTogXCJibG9ja1wiLFxuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjYpXCIsXG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgaGVpZ2h0OiBcIjUwJVwiLFxuICAgICAgd2lkdGg6IFwiOTAlXCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiNXB4XCIsXG4gICAgICBtYXJnaW46IFwiYXV0b1wiLFxuICAgICAgdG9wOiBcIjBcIixcbiAgICAgIGJvdHRvbTogXCIwXCIsXG4gICAgICBsZWZ0OiBcIjBcIixcbiAgICAgIHJpZ2h0OiBcIjBcIixcbiAgICB9LFxuICAgIFwiLnRnbC1zd2l0Y2ggLnRnbC1zbGlkZXI6OmFmdGVyXCI6IHtcbiAgICAgIGhlaWdodDogXCIxM3B4XCIsXG4gICAgICB3aWR0aDogXCIxM3B4XCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiNTAlXCIsXG4gICAgICB0b3A6IFwiLTJweFwiLFxuICAgICAgbGVmdDogXCItMSVcIixcbiAgICB9LFxuICAgIFwiLnRnbC1mbGF0OmNoZWNrZWQrLnRnbC1zbGlkZXI6YWZ0ZXJcIjoge1xuICAgICAgbGVmdDogXCI2MiVcIixcbiAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tY29sb3IzKVwiLFxuICAgIH0sXG4gICAgXCIuZm9ybS1jb250cm9sXCI6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCB2YXIoLS1jb2xvcjEzKVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxuICAgICAgY29sb3I6IFwidmFyKC0tY29sb3IxMylcIixcbiAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICBmb250RmFtaWx5OiBcImluaGVyaXRcIixcbiAgICAgIHBhZGRpbmc6IFwiNXB4IDE1cHggXCIsXG4gICAgfSxcbiAgICBcIi5idG4tZmxhdFwiOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWNvbG9yMylcIixcbiAgICAgIGNvbG9yOiBcInZhcigtLWNvbG9yMTIpXCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgcGFkZGluZzogXCI3cHggNTBweFwiLFxuICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCI0cHhcIixcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwidXBwZXJjYXNlXCIsXG4gICAgICBtaW5XaWR0aDogXCIxNzVweFwiLFxuICAgIH0sXG4gICAgXCIuYnRuLWZsYXQ6ZGlzYWJsZWRcIjoge1xuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjcpXCIsXG4gICAgICBib3JkZXJDb2xvcjogXCJ2YXIoLS1jb2xvcjMpXCIsXG4gICAgICBjb2xvcjogXCJ2YXIoLS1jb2xvcjMpXCIsXG4gICAgICBjdXJzb3I6IFwiZGVmYXVsdFwiLFxuICAgIH0sXG4gICAgXCIuYnRuLWZsYXQ6Zm9jdXNcIjoge1xuICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIi5hcmN3YXJlLWxvZ28tbG9hZGVyXCI6IHtcbiAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICB3aWR0aDogXCIxMi41JVwiLFxuICAgICAgaGVpZ2h0OiBcIjEyLjUlXCIsXG4gICAgfSxcbiAgICBcIiNwbGF5T3ZlcmxheSBpbWcjcGxheUJ1dHRvblwiOiB7XG4gICAgICB3aWR0aDogXCI1JVwiLFxuICAgIH0sXG4gICAgXCIjZGlzY29ubmVjdE92ZXJsYXksICNlcnJvck92ZXJsYXlcIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJpbml0aWFsXCIsXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICBmb250U2l6ZTogXCIyMHB4XCIsXG4gICAgICBsaW5lSGVpZ2h0OiAyLjUsXG4gICAgfSxcbiAgICBcIiNkaXNjb25uZWN0T3ZlcmxheSAuY2xpY2thYmxlU3RhdGVcIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJpbml0aWFsXCIsXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICBjb2xvcjogXCIjREFGNjkzXCIsXG4gICAgICBwYWRkaW5nOiBcIjVweFwiLFxuICAgICAgZm9udFNpemU6IFwiMThweFwiLFxuICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjREFGNjkzXCIsXG4gICAgICBtYXJnaW46IFwiMjVweCBhdXRvIDBcIixcbiAgICAgIHdpZHRoOiBcIjE4MHB4XCIsXG4gICAgfSxcbiAgICBcIiNhZmtPdmVybGF5XCI6IHtcbiAgICAgIGJhY2tncm91bmQ6IFwibm9uZVwiLFxuICAgICAgdHJhbnNpdGlvbjogXCJhbGwgZWFzZS1pbi1vdXQgMC41c1wiLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHBvaW50ZXJFdmVudHM6IFwiaW5pdGlhbFwiLFxuICAgIH0sXG4gICAgXCIjYWZrT3ZlcmxheUlubmVyXCI6IHtcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgYmFja2dyb3VuZDogXCIjMTgxODFBXCIsXG4gICAgICBwYWRkaW5nOiBcIjIwcHggMTBweCAzMHB4XCIsXG4gICAgICBmb250U2l6ZTogXCIxOHB4XCIsXG4gICAgICB3aWR0aDogXCIzNjBweFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgbGluZUhlaWdodDogMi41LFxuICAgIH0sXG4gICAgXCIjYWZrT3ZlcmxheUlubmVyIGNlbnRlcjo6Zmlyc3QtbGluZVwiOiB7XG4gICAgICB0ZXh0VHJhbnNmb3JtOiBcInVwcGVyY2FzZVwiLFxuICAgICAgY29sb3I6IFwiI0ZGODQ2MVwiLFxuICAgICAgZm9udFdlaWdodDogXCJib2xkXCIsXG4gICAgICBmb250U2l6ZTogXCIyNHB4XCIsXG4gICAgfSxcbiAgICBcIiNhZmtPdmVybGF5SW5uZXIgI2Fma0NvdW50RG93bk51bWJlclwiOiB7XG4gICAgICBjb2xvcjogXCIjREFGNjkzXCIsXG4gICAgICBmb250U2l6ZTogXCIyNnB4XCIsXG4gICAgICBsaW5lSGVpZ2h0OiBcIjIycHhcIixcbiAgICB9LFxuICAgIFwiI2Fma092ZXJsYXlJbm5lciBjZW50ZXIgLnJldHJ5LWJ1dHRvblwiOiB7XG4gICAgICB0ZXh0VHJhbnNmb3JtOiBcImluaXRpYWxcIixcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIGNvbG9yOiBcIiNEQUY2OTNcIixcbiAgICAgIHBhZGRpbmc6IFwiNXB4XCIsXG4gICAgICBmb250U2l6ZTogXCIxOHB4XCIsXG4gICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNEQUY2OTNcIixcbiAgICAgIG1hcmdpbjogXCIyNXB4IGF1dG8gMFwiLFxuICAgICAgd2lkdGg6IFwiMTgwcHhcIixcbiAgICB9LFxuICAgIFwiI2Nvbm5lY3RPdmVybGF5ICNjb25uZWN0QnV0dG9uXCI6IHtcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgY29sb3I6IFwiI0RBRjY5M1wiLFxuICAgICAgcGFkZGluZzogXCI1cHggNXB4IDhweFwiLFxuICAgICAgZm9udFNpemU6IFwiMThweFwiLFxuICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjREFGNjkzXCIsXG4gICAgICBtYXJnaW46IFwiMjVweCBhdXRvIDBcIixcbiAgICAgIHdpZHRoOiBcIjE4MHB4XCIsXG4gICAgfSxcblxuICAgIFwiI2Nvbm5lY3RPdmVybGF5IC5jb25uZWN0aW9uLXRleHRcIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJpbml0aWFsXCIsXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICBtYXJnaW46IFwiMjVweCBhdXRvIDBcIixcbiAgICB9LFxuICAgIFwiI2Nvbm5lY3RPdmVybGF5IC5jb25uZWN0aW9uLXRleHQgLnRpdGxlXCI6IHtcbiAgICAgIGNvbG9yOiBcIiNmZmZmZmZcIixcbiAgICAgIGZvbnRTaXplOiBcIjE4cHhcIixcbiAgICAgIG1hcmdpbjogXCI1cHggMFwiLFxuICAgIH0sXG4gICAgXCIjY29ubmVjdE92ZXJsYXkgLmNvbm5lY3Rpb24tdGV4dCAuc3VidGl0bGVcIjoge1xuICAgICAgY29sb3I6IFwiI2ZmZmZmZlwiLFxuICAgICAgb3BhY2l0eTogMC41LFxuICAgICAgZm9udFNpemU6IFwiMTJweFwiLFxuICAgICAgbWFyZ2luOiBcIjEwcHggMFwiLFxuICAgIH0sXG4gICAgXCIjaW5mb092ZXJsYXkuaGlkZGVuU3RhdGVcIjoge1xuICAgICAgZGlzcGxheTogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIiNkaXNjb25uZWN0T3ZlcmxheSwgI3BsYXlPdmVybGF5LCAjZXJyb3JPdmVybGF5LCAjbWljcm9waG9uZU92ZXJsYXksICNjb25uZWN0T3ZlcmxheVwiOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBcIiMxODE4MUFcIixcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgdHJhbnNpdGlvbjogXCJhbGwgZWFzZS1pbi1vdXQgMC41c1wiLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHBvaW50ZXJFdmVudHM6IFwiaW5pdGlhbFwiLFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXlcIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJpbml0aWFsXCIsXG4gICAgICBwYWRkaW5nOiBcIjIwcHggMzBweFwiLFxuICAgICAgZm9udFNpemU6IFwiMTRweFwiLFxuICAgICAgaGVpZ2h0OiBcIjIzMHB4XCIsXG4gICAgICB3aWR0aDogXCIzNjBweFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgbGluZUhlaWdodDogMS4yNSxcbiAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICBtYXJnaW46IFwiYXV0b1wiLFxuICAgICAgdG9wOiBcIjBcIixcbiAgICAgIGJvdHRvbTogXCIwXCIsXG4gICAgICBsZWZ0OiBcIjBcIixcbiAgICAgIHJpZ2h0OiBcIjBcIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICB6SW5kZXg6IDk5OTk5LFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXkgLnRpdGxlXCI6IHtcbiAgICAgIGZvbnRTaXplOiBcIjI0cHhcIixcbiAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICBtYXJnaW5Cb3R0b206IFwiMjBweFwiLFxuICAgICAgY29sb3I6IFwiI0YwRjBGMlwiLFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXkgLnRpdGxlOmFmdGVyXCI6IHtcbiAgICAgIGNvbnRlbnQ6IFwiJydcIixcbiAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICBhbmltYXRpb246IFwiZG90dHkgc3RlcHMoMSxlbmQpIDFzIGluZmluaXRlXCIsXG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXkgcFwiOiB7XG4gICAgICBtYXJnaW46IDAsXG4gICAgICBjb2xvcjogXCIjODU4NTg4XCIsXG4gICAgfSxcbiAgICBcIiNtaWNyb3Bob25lT3ZlcmxheSBzdmdcIjoge1xuICAgICAgaGVpZ2h0OiBcIjY1cHhcIixcbiAgICAgIG1hcmdpbkJvdHRvbTogXCIxNXB4XCIsXG4gICAgICBtYXJnaW5Ub3A6IFwiLTVweFwiLFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXkgLnN2Z0ljb25cIjoge1xuICAgICAgZmlsbDogXCIjREFGNjkzXCIsXG4gICAgfSxcbiAgICBcIiNkaXNjb25uZWN0T3ZlcmxheS5oaWRkZW5TdGF0ZSwgI3BsYXlPdmVybGF5LmhpZGRlblN0YXRlLCAjZXJyb3JPdmVybGF5LmhpZGRlblN0YXRlLCAjYWZrT3ZlcmxheS5oaWRkZW5TdGF0ZSwgI21pY3JvcGhvbmVPdmVybGF5LmhpZGRlblN0YXRlXCI6XG4gICAgICB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgICAgfSxcbiAgICBcIiNkaXNjb25uZWN0T3ZlcmxheS5taWMtb3ZlcmxheS1pcy12aXNpYmxlLCAjZXJyb3JPdmVybGF5Lm1pYy1vdmVybGF5LWlzLXZpc2libGUsICNpbmZvT3ZlcmxheS5taWMtb3ZlcmxheS1pcy12aXNpYmxlXCI6XG4gICAgICB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgICAgfSxcbiAgICBcIiNpbmZvT3ZlcmxheS5oaWRkZW5TdGF0ZSwgI2Nvbm5lY3RPdmVybGF5LmhpZGRlblN0YXRlXCI6IHtcbiAgICAgIGRpc3BsYXk6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIjY29ubmVjdE92ZXJsYXlcIjoge1xuICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtbi1yZXZlcnNlXCIsXG4gICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgfSxcbiAgICBcIiNpbmZvT3ZlcmxheVwiOiB7XG4gICAgICBkaXNwbGF5OiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiLmxvdmUtbGV0dGVycy1ib3gtcm9vdFwiOiB7XG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgY29sb3I6IFwiI2ZmZmZmZlwiLFxuICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgIGJhY2tncm91bmQ6IFwiIzE4MTgxQVwiLFxuICAgICAgekluZGV4OiAxLFxuICAgIH0sXG4gICAgXCIubG92ZS1sZXR0ZXJzLWJveC1yb290LmZhZGUtb3V0XCI6IHtcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICB0cmFuc2l0aW9uOiBcIm9wYWNpdHkgMC41c1wiLFxuICAgIH0sXG4gICAgXCIjbGV0dGVycy1ibG9ja1wiOiB7XG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbWFyZ2luOiBcImF1dG9cIixcbiAgICAgIGNvbG9yOiBcIiNmZmZmZmZcIixcbiAgICAgIHpJbmRleDogNCxcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGZvbnRTaXplOiBcIjE2cHhcIixcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgIH0sXG4gICAgXCIjbGV0dGVycy13cmFwcGVyXCI6IHtcbiAgICAgIGhlaWdodDogXCI3N3B4XCIsXG4gICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAganVzdGlmeUNvbnRlbnQ6IFwiZmxleC1lbmRcIixcbiAgICAgIG1hcmdpblRvcDogXCIxMHB4XCIsXG4gICAgICBwYWRkaW5nQm90dG9tOiBcIjJweFwiLFxuICAgIH0sXG4gICAgXCIjbGV0dGVycy13cmFwcGVyIHBcIjoge1xuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgbGluZUhlaWdodDogMS4yNSxcbiAgICAgIGZvbnRTaXplOiBcIjE2cHhcIixcbiAgICB9LFxuICAgIFwiLmxldHRlci1hbmltYXRpb246bnRoLWxhc3Qtb2YtdHlwZSgxKTo6YWZ0ZXJcIjoge1xuICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgIGFuaW1hdGlvbjogXCJkb3R0eSBzdGVwcygxLGVuZCkgMXMgaW5maW5pdGVcIixcbiAgICAgIGNvbnRlbnQ6IFwiJydcIixcbiAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgfSxcbiAgICBcIi5sZXR0ZXItYW5pbWF0aW9uXCI6IHtcbiAgICAgIHRyYW5zaXRpb246IFwiYWxsIDAuNXMgZWFzZS1pbi1vdXRcIixcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogXCJib3R0b21cIixcbiAgICAgIG1hcmdpbjogXCIwIGF1dG9cIixcbiAgICB9LFxuXG4gICAgXCIubGV0dGVyLWFuaW1hdGlvbi1lbnRlclwiOiB7XG4gICAgICBhbmltYXRpb246IFwiZmFkZUluVXAgMC43NXMgZWFzZS1vdXRcIixcbiAgICB9LFxuICAgIFwiLmxldHRlci1hbmltYXRpb24tZXhpdFwiOiB7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgc2NhbGU6IDAuOSxcbiAgICAgIHRyYW5zaXRpb246IFwiYWxsIGVhc2UtaW4tb3V0IDFzXCIsXG4gICAgICBtYXJnaW46IDAsXG4gICAgfSxcbiAgICBcIkBrZXlmcmFtZXMgZG90dHlcIjoge1xuICAgICAgXCIwJVwiOiB7IGNvbnRlbnQ6IFwiJydcIiB9LFxuICAgICAgXCIyNSVcIjogeyBjb250ZW50OiBcIicuJ1wiIH0sXG4gICAgICBcIjUwJVwiOiB7IGNvbnRlbnQ6IFwiJy4uJ1wiIH0sXG4gICAgICBcIjc1JVwiOiB7IGNvbnRlbnQ6IFwiJy4uLidcIiB9LFxuICAgICAgXCIxMDAlXCI6IHsgY29udGVudDogXCInJ1wiIH0sXG4gICAgfSxcbiAgICBcIkBrZXlmcmFtZXMgZmFkZUluVXBcIjoge1xuICAgICAgZnJvbToge1xuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICB0cmFuc2Zvcm06IFwiIHRyYW5zbGF0ZVkoNXB4KVwiLFxuICAgICAgICBzY2FsZTogMC45LFxuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKDApXCIsXG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgfSxcbiAgICB9LFxuICAgIFwiLmhpZGRlblwiOiB7XG4gICAgICBkaXNwbGF5OiBcIm5vbmVcIixcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgfSxcbiAgICBcIi52aXNpYmxlXCI6IHtcbiAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgIG9wYWNpdHk6IDEsXG4gICAgICB0cmFuc2l0aW9uOiBcIm9wYWNpdHkgMXMgZWFzZS1vdXRcIixcbiAgICB9LFxuICB9LFxufTtcbiIsImV4cG9ydCBjbGFzcyBBcmN3YXJlTG9nb0xvYWRlciB7XG4gIHB1YmxpYyBhcmN3YXJlTG9nb0xvYWRlcjogSFRNTERpdkVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hcmN3YXJlTG9nb0xvYWRlciA9IHRoaXMuY3JlYXRlQXJjd2FyZUxvZ29Mb2FkZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXJjd2FyZUxvZ29Mb2FkZXIoKTogSFRNTERpdkVsZW1lbnQge1xuICAgIGNvbnN0IGFyY3dhcmVMb2dvTG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBhcmN3YXJlTG9nb0xvYWRlci5jbGFzc0xpc3QuYWRkKFwiYXJjd2FyZS1sb2dvLWxvYWRlclwiKTtcbiAgICBhcmN3YXJlTG9nb0xvYWRlci5pbm5lckhUTUwgPSB0aGlzLmdldFN2ZygpO1xuICAgIHJldHVybiBhcmN3YXJlTG9nb0xvYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3ZnKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxzdmcgd2lkdGg9XCI0MlwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCA0MiA4MFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHN0eWxlPlxuICAgICAgICAgIEBrZXlmcmFtZXMgcmlwcGxlLTEtZG93biB7XG4gICAgICAgICAgICAwJSwgNTAlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDYwJSwgMTAwJSB7IHRyYW5zbGF0ZTogMCA1cHg7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGtleWZyYW1lcyByaXBwbGUtMS11cCB7XG4gICAgICAgICAgICAwJSwgNTAlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDYwJSwgMTAwJSB7IHRyYW5zbGF0ZTogMCAtNXB4OyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBrZXlmcmFtZXMgcmlwcGxlLTItZG93biB7XG4gICAgICAgICAgICAwJSwgNTUlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDY1JSwgMTAwJSB7IHRyYW5zbGF0ZTogMCA1cHg7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGtleWZyYW1lcyByaXBwbGUtMy1kb3duIHtcbiAgICAgICAgICAgIDAlLCA2MCUgeyB0cmFuc2xhdGU6IDAgMDsgfVxuICAgICAgICAgICAgNzAlLCAxMDAlIHsgdHJhbnNsYXRlOiAwIDVweDsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBAa2V5ZnJhbWVzIHJpcHBsZS0zLXVwIHtcbiAgICAgICAgICAgIDAlLCA2MCUgeyB0cmFuc2xhdGU6IDAgMDsgfVxuICAgICAgICAgICAgNzAlLCAxMDAlIHsgdHJhbnNsYXRlOiAwIC01cHg7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGtleWZyYW1lcyByaXBwbGUtNC11cCB7XG4gICAgICAgICAgICAwJSwgNjUlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDc1JSwgMTAwJSB7IHRyYW5zbGF0ZTogMCAtNXB4OyB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLnJpcHBsZS0xLWRvd24geyBhbmltYXRpb246IHJpcHBsZS0xLWRvd24gMC42cyBpbmZpbml0ZSBhbHRlcm5hdGU7IH1cbiAgICAgICAgICAucmlwcGxlLTEtdXAgICB7IGFuaW1hdGlvbjogcmlwcGxlLTEtdXAgMC42cyBpbmZpbml0ZSBhbHRlcm5hdGU7IH1cbiAgICAgICAgICAucmlwcGxlLTItZG93biB7IGFuaW1hdGlvbjogcmlwcGxlLTItZG93biAwLjZzIGluZmluaXRlIGFsdGVybmF0ZTsgfVxuICAgICAgICAgIC5yaXBwbGUtMy1kb3duIHsgYW5pbWF0aW9uOiByaXBwbGUtMy1kb3duIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlOyB9XG4gICAgICAgICAgLnJpcHBsZS0zLXVwICAgeyBhbmltYXRpb246IHJpcHBsZS0zLXVwIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlOyB9XG4gICAgICAgICAgLnJpcHBsZS00LXVwICAgeyBhbmltYXRpb246IHJpcHBsZS00LXVwIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlOyB9XG4gICAgICAgIDwvc3R5bGU+XG5cbiAgICAgICAgPGcgY2xhc3M9XCJyaXBwbGUtMS1kb3duXCIgZmlsbD1cIiNmMWYxZjFcIj5cbiAgICAgICAgICA8cmVjdCB5PVwiMzhcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCIyMlwiIC8+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgY2xhc3M9XCJyaXBwbGUtMS11cFwiIGZpbGw9XCIjZjFmMWYxXCI+XG4gICAgICAgICAgPHJlY3QgeT1cIjEwXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiMjJcIiAvPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnIGNsYXNzPVwicmlwcGxlLTItZG93blwiIGZpbGw9XCIjZjFmMWYxXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjEyXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiMzJcIiAvPlxuICAgICAgICAgIDxyZWN0IHg9XCIxMlwiIHk9XCIzOFwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjIyXCIgLz5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyBjbGFzcz1cInJpcHBsZS0zLWRvd25cIiBmaWxsPVwiI2YxZjFmMVwiPlxuICAgICAgICAgIDxyZWN0IHg9XCIyNFwiIHk9XCIzOFwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjIyXCIgLz5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyBjbGFzcz1cInJpcHBsZS0zLXVwXCIgZmlsbD1cIiNmMWYxZjFcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiMjRcIiB5PVwiMTBcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCIyMlwiIC8+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgY2xhc3M9XCJyaXBwbGUtNC11cFwiIGZpbGw9XCIjZjFmMWYxXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjM2XCIgeT1cIjEwXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiMjJcIiAvPlxuICAgICAgICAgIDxyZWN0IHg9XCIzNlwiIHk9XCIzOFwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjMyXCIgLz5cbiAgICAgICAgPC9nPlxuICAgICAgPC9zdmc+XG4gICAgYDtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIEF1ZGlvSWNvbiB7XG4gIHB1YmxpYyBhdWRpb0ljb25Vbm11dGVkOiBTVkdFbGVtZW50O1xuICBwdWJsaWMgYXVkaW9JY29uTXV0ZWQ6IFNWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hdWRpb0ljb25Vbm11dGVkID0gdGhpcy5jcmVhdGVBdWRpb0ljb25Vbm11dGVkKCk7XG4gICAgdGhpcy5hdWRpb0ljb25NdXRlZCA9IHRoaXMuY3JlYXRlQXVkaW9JY29uTXV0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXVkaW9JY29uVW5tdXRlZCgpOiBTVkdFbGVtZW50IHtcbiAgICBjb25zdCBhdWRpb0ljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInN2Z1wiKTtcbiAgICBhdWRpb0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBcImF1ZGlvSWNvblVubXV0ZWRcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjMxcHhcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjI4cHhcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidmlld0JveFwiLCBcIjAgMCAzMSAyOFwiKTtcblxuICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgIHN2Z0dyb3VwPy5jbGFzc0xpc3Q/LmFkZChcInN2Z0ljb25cIik7XG4gICAgYXVkaW9JY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcblxuICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgxLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMjEuMDAwOCwwLjA3MjAzMThDMjAuNTU2LC0wLjExNzgxMSwyMC4wMzc5LDAuMDgwNTU2OSwxOS44NDM1LDAuNTE0ODI3QzE5LjY0OTIsMC45NDkwOTgsMTkuODUyMiwxLjQ1NTEyLDIwLjI5NywxLjY0NDlDMjUuMTIzMywzLjcwNDM0LDI4LjI0Miw4LjM1NzYxLDI4LjI0MjIsMTMuNDk5OEMyOC4yNDIyLDE4LjY0MjMsMjUuMTIzNCwyMy4yOTU3LDIwLjI5NjYsMjUuMzU1MUMxOS44NTE4LDI1LjU0NDgsMTkuNjQ4OCwyNi4wNTA4LDE5Ljg0MzEsMjYuNDg1MkMxOS45ODc0LDI2LjgwNzcsMjAuMzEwMiwyNywyMC42NDksMjdDMjAuNzY2NCwyNywyMC44ODU5LDI2Ljk3NjksMjEuMDAwNCwyNi45MjhDMjYuNDY3NCwyNC41OTU0LDMwLDE5LjMyNDYsMzAsMTMuNDk5N0MyOS45OTk4LDcuNjc1MzEsMjYuNDY3NCwyLjQwNDYyLDIxLjAwMDgsMC4wNzIwMzE4WlwiXG4gICAgKTtcblxuICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgyLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMjEuMjM1MSw2LjY5NDM0QzIwLjg3MzUsNi4zNzgyMiwyMC4zMTc5LDYuNDA4MiwxOS45OTQxLDYuNzYxMzRDMTkuNjcwMyw3LjExNDU0LDE5LjcwMSw3LjY1NzA2LDIwLjA2MjcsNy45NzMyNEMyMS42NzEyLDkuMzc5MzIsMjIuNTkzNywxMS4zOTM3LDIyLjU5MzcsMTMuNUMyMi41OTM3LDE1LjYwNjIsMjEuNjcxMSwxNy42MjA2LDIwLjA2MjcsMTkuMDI2N0MxOS43MDEsMTkuMzQyOCwxOS42NzAzLDE5Ljg4NTQsMTkuOTk0MSwyMC4yMzg2QzIwLjE2NzcsMjAuNDI3OSwyMC40MDc5LDIwLjUyNDQsMjAuNjQ5MiwyMC41MjQ0QzIwLjg1NzksMjAuNTI0NCwyMS4wNjc0LDIwLjQ1MjIsMjEuMjM1MSwyMC4zMDU2QzIzLjIxNTcsMTguNTc0NCwyNC4zNTE1LDE2LjA5MzcsMjQuMzUxNSwxMy40OTk5QzI0LjM1MTUsMTAuOTA2MSwyMy4yMTU2LDguNDI1NTMsMjEuMjM1MSw2LjY5NDM0WlwiXG4gICAgKTtcblxuICAgIGNvbnN0IHBhdGgzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgzLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMTUuMzk3MywyLjE2Mjc3QzE1LjEwMTgsMi4wMTY1OCwxNC43NDczLDIuMDQ1MDIsMTQuNDgwMywyLjIzNjIzTDcuNjUxNzYsNy4xMjU5OEgwLjg3ODkwNkMwLjM5MzUxNiw3LjEyNTk4LDAsNy41MTAyNCwwLDcuOTg0MjJWMTkuMDE1NUMwLDE5LjQ4OTUsMC4zOTM1MTYsMTkuODczOCwwLjg3ODkwNiwxOS44NzM4SDcuNjUxN0wxNC40ODAyLDI0Ljc2MzdDMTQuNjMzOSwyNC44NzM3LDE0LjgxNjQsMjQuOTI5OCwxNS4wMDAxLDI0LjkyOThDMTUuMTM1NiwyNC45Mjk4LDE1LjI3MTgsMjQuODk5MiwxNS4zOTczLDI0LjgzNzFDMTUuNjkyNywyNC42OTA5LDE1Ljg3ODksMjQuMzk1LDE1Ljg3ODksMjQuMDcxNlYyLjkyODJDMTUuODc4OSwyLjYwNDgyLDE1LjY5MjcsMi4zMDg4NCwxNS4zOTczLDIuMTYyNzdaTTE0LjEyMSwyMi4zNzc4TDguNDU5MTgsMTguMzIzNEM4LjMwODQyLDE4LjIxNTQsOC4xMjYzNywxOC4xNTcyLDcuOTM5MzksMTguMTU3MkgxLjc1NzgxVjguODQyNDZINy45MzkzOUM4LjEyNjMxLDguODQyNDYsOC4zMDg0Miw4Ljc4NDIyLDguNDU5MTIsOC42NzYzNkwxNC4xMjEsNC42MjE5N1YyMi4zNzc4WlwiXG4gICAgKTtcblxuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcbiAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMik7XG4gICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDMpO1xuXG4gICAgcmV0dXJuIGF1ZGlvSWNvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXVkaW9JY29uTXV0ZWQoKTogU1ZHRWxlbWVudCB7XG4gICAgY29uc3QgYXVkaW9JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgXCJhdWRpb0ljb25NdXRlZFwiKTtcbiAgICBhdWRpb0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMzFweFwiKTtcbiAgICBhdWRpb0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMjhweFwiKTtcbiAgICBhdWRpb0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ2aWV3Qm94XCIsIFwiMCAtMSAzMSAyOFwiKTtcblxuICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgIHN2Z0dyb3VwLmNsYXNzTGlzdD8uYWRkKFwic3ZnSWNvblwiKTtcbiAgICBhdWRpb0ljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuXG4gICAgY29uc3QgcGF0aDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG4gICAgcGF0aDEuc2V0QXR0cmlidXRlTlMoXG4gICAgICBudWxsLFxuICAgICAgXCJkXCIsXG4gICAgICBcIk0xNi4zNTAxLDAuODI5Mjg2QzE2LjA0NiwwLjY3ODc5OSwxNS42ODExLDAuNzA4MDcyLDE1LjQwNjIsMC45MDQ5MTJMOC4zNzY4MSw1LjkzODQ4SDEuNDA0NzZDMC45MDUwOSw1LjkzODQ4LDAuNSw2LjMzNDA0LDAuNSw2LjgyMTk2VjE4LjE3NzdDMC41LDE4LjY2NTcsMC45MDUwOSwxOS4wNjEyLDEuNDA0NzYsMTkuMDYxMkg4LjM3Njc1TDE1LjQwNjEsMjQuMDk0OUMxNS41NjQzLDI0LjIwODIsMTUuNzUyMiwyNC4yNjU5LDE1Ljk0MTIsMjQuMjY1OUMxNi4wODA4LDI0LjI2NTksMTYuMjIxLDI0LjIzNDQsMTYuMzUwMSwyNC4xNzA1QzE2LjY1NDIsMjQuMDIsMTYuODQ1OSwyMy43MTU0LDE2Ljg0NTksMjMuMzgyNVYxLjYxNzI0QzE2Ljg0NTksMS4yODQzNCwxNi42NTQyLDAuOTc5NjU1LDE2LjM1MDEsMC44MjkyODZaTTE1LjAzNjQsMjEuNjM4OUw5LjIwNzk4LDE3LjQ2NTJDOS4wNTI3OCwxNy4zNTQxLDguODY1MzgsMTcuMjk0Miw4LjY3MjksMTcuMjk0MkgyLjMwOTUxVjcuNzA1NDRIOC42NzI5QzguODY1MzIsNy43MDU0NCw5LjA1Mjc4LDcuNjQ1NDgsOS4yMDc5Miw3LjUzNDQ2TDE1LjAzNjQsMy4zNjA4MlYyMS42Mzg5WlwiXG4gICAgKTtcblxuICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgyLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMjUuMjc5OSwxMS43NjM0TDIxLjg0NDIsOC4zMjc0OEMyMS42MjA2LDguMTAzOTksMjEuNjIwNiw3Ljc0MjY0LDIxLjg0NDIsNy41MTkxNUMyMi4wNjc2LDcuMjk1NjYsMjIuNDI5LDcuMjk1NjYsMjIuNjUyNSw3LjUxOTE1TDI2LjA4ODMsMTAuOTU1TDI5LjUyNCw3LjUxOTE1QzI5Ljc0NzYsNy4yOTU2NiwzMC4xMDg4LDcuMjk1NjYsMzAuMzMyMyw3LjUxOTE1QzMwLjU1NTksNy43NDI2NCwzMC41NTU5LDguMTAzOTksMzAuMzMyMyw4LjMyNzQ4TDI2Ljg5NjYsMTEuNzYzNEwzMC4zMzIzLDE1LjE5OTJDMzAuNTU1OSwxNS40MjI3LDMwLjU1NTksMTUuNzg0MSwzMC4zMzIzLDE2LjAwNzZDMzAuMjIwOSwxNi4xMTkxLDMwLjA3NDUsMTYuMTc1MSwyOS45MjgxLDE2LjE3NTFDMjkuNzgxOCwxNi4xNzUxLDI5LjYzNTUsMTYuMTE5MSwyOS41MjQsMTYuMDA3NkwyNi4wODgzLDEyLjU3MTdMMjIuNjUyNSwxNi4wMDc2QzIyLjU0MSwxNi4xMTkxLDIyLjM5NDcsMTYuMTc1MSwyMi4yNDgzLDE2LjE3NTFDMjIuMTAyLDE2LjE3NTEsMjEuOTU1NiwxNi4xMTkxLDIxLjg0NDIsMTYuMDA3NkMyMS42MjA2LDE1Ljc4NDEsMjEuNjIwNiwxNS40MjI3LDIxLjg0NDIsMTUuMTk5MkwyNS4yNzk5LDExLjc2MzRaXCJcbiAgICApO1xuXG4gICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgyKTtcblxuICAgIHJldHVybiBhdWRpb0ljb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB9IGZyb20gXCIuLi8uLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmltcG9ydCB7IEF1ZGlvSWNvbiB9IGZyb20gXCIuL0F1ZGlvSWNvblwiO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9CdXR0b24ge1xuICBwcml2YXRlIGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIHByaXZhdGUgc3RyZWFtOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmc7XG4gIHByaXZhdGUgYXVkaW9JY29uOiBBdWRpb0ljb247XG4gIHByaXZhdGUgdG9vbHRpcFRleHQ6IEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5zZXRBdWRpb011dGVkQnlEZWZhdWx0KCk7XG4gICAgdGhpcy5idXR0b24gPSB0aGlzLmNyZWF0ZUJ1dHRvbigpO1xuICAgIHRoaXMuYXVkaW9JY29uID0gbmV3IEF1ZGlvSWNvbigpO1xuICAgIHRoaXMudG9vbHRpcFRleHQgPSB0aGlzLmNyZWF0ZVRvb2x0aXBUZXh0KCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwVGV4dCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy5hdWRpb0ljb24uYXVkaW9JY29uTXV0ZWQpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvblVubXV0ZWQpO1xuICAgIHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvblVubXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnRvZ2dsZUF1ZGlvLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQmluZCB0aGUgb25Wb2x1bWVDaGFuZ2UgbWV0aG9kIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlXG4gICAgdGhpcy5vblZvbHVtZUNoYW5nZSA9IHRoaXMub25Wb2x1bWVDaGFuZ2UuYmluZCh0aGlzKTtcblxuICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHRoaXMuc3RyZWFtW1wid2ViUnRjQ29udHJvbGxlclwiXS52aWRlb1BsYXllcltcInZpZGVvRWxlbWVudFwiXTtcbiAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZvbHVtZWNoYW5nZVwiLCB0aGlzLm9uVm9sdW1lQ2hhbmdlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBdWRpb011dGVkQnlEZWZhdWx0KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudDtcbiAgICBpZiAodmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB2aWRlb0VsZW1lbnRQYXJlbnQucXVlcnlTZWxlY3RvcihcInZpZGVvXCIpO1xuICAgICAgaWYgKHZpZGVvRWxlbWVudCkge1xuICAgICAgICB0aGlzLnN0cmVhbS50b2dnbGVBdWRpbyh2aWRlb0VsZW1lbnQsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnV0dG9uKCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbj8uc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJhdWRpb0J0blwiKTtcbiAgICBidXR0b24/LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgYnV0dG9uPy5jbGFzc0xpc3Q/LmFkZChcIlVpVG9vbFwiKTtcbiAgICByZXR1cm4gYnV0dG9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sdGlwVGV4dCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgdG9vbHRpcFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICB0b29sdGlwVGV4dD8uY2xhc3NMaXN0Py5hZGQoXCJ0b29sdGlwdGV4dFwiKTtcbiAgICB0b29sdGlwVGV4dC5pbm5lckhUTUwgPSBcIk11dGUvVW5tdXRlXCI7XG4gICAgcmV0dXJuIHRvb2x0aXBUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVBdWRpbygpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgaWYgKHZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdmlkZW9FbGVtZW50UGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCJ2aWRlb1wiKTtcbiAgICAgIGlmICh2aWRlb0VsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgbXV0ZWQgPSAhdmlkZW9FbGVtZW50Lm11dGVkO1xuICAgICAgICB0aGlzLnN0cmVhbS50b2dnbGVBdWRpbyh2aWRlb0VsZW1lbnQsIG11dGVkKTtcbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0ljb24obXV0ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQXVkaW9JY29uKG11dGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKG11dGVkKSB7XG4gICAgICB0aGlzLmF1ZGlvSWNvbi5hdWRpb0ljb25Vbm11dGVkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvbk11dGVkLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvbk11dGVkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvblVubXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmJ1dHRvbjtcbiAgfVxuXG4gIHByaXZhdGUgb25Wb2x1bWVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxNZWRpYUVsZW1lbnQ7XG4gICAgdGhpcy51cGRhdGVBdWRpb0ljb24odmlkZW9FbGVtZW50Lm11dGVkKTtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIExvdmVMZXR0ZXJzIHtcbiAgbG92ZUxldHRlcnNSb290OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb3ZlTGV0dGVyc1Jvb3QgPSBudWxsO1xuICB9XG5cbiAgYWRkTGV0dGVyKGxldHRlcjogc3RyaW5nLCBsaXN0TGVuZ3RoOiBudW1iZXIpIHtcbiAgICBjb25zdCBsZXR0ZXJzQmxvY2sgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2xldHRlcnMtd3JhcHBlclwiKTtcblxuICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICBwLnRleHRDb250ZW50ID0gbGV0dGVyO1xuICAgIHA/LmNsYXNzTGlzdD8uYWRkKFwibGV0dGVyLWFuaW1hdGlvblwiLCBcImxldHRlci1hbmltYXRpb24tZW50ZXJcIik7XG5cbiAgICBpZiAobGV0dGVyc0Jsb2NrKSB7XG4gICAgICBsZXR0ZXJzQmxvY2suYXBwZW5kQ2hpbGQocCk7XG4gICAgICB0aGlzLnVwZGF0ZU9wYWNpdHkobGlzdExlbmd0aCk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBwPy5jbGFzc0xpc3Q/LnJlbW92ZShcImxldHRlci1hbmltYXRpb24tZW50ZXJcIik7XG4gICAgICBwPy5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVkXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVPcGFjaXR5KGxpc3RMZW5ndGgpO1xuICAgICAgfSk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICB1cGRhdGVPcGFjaXR5KGxpc3RMZW5ndGg6IG51bWJlcikge1xuICAgIGNvbnN0IGxldHRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiI2xldHRlcnMtYmxvY2sgcFwiKTtcbiAgICBjb25zdCBtYXhPcGFjaXR5ID0gMC42O1xuICAgIGNvbnN0IG1pbk9wYWNpdHkgPSAwO1xuICAgIGNvbnN0IG11bHRpcGx5Q29lZmljaWVudCA9IDEuMiAvIGxldHRlcnMubGVuZ3RoO1xuXG4gICAgbGV0dGVycy5mb3JFYWNoKChsZXR0ZXIsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBodG1sTGV0dGVyID0gbGV0dGVyIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgcmV2ZXJzZUluZGV4ID0gbGV0dGVycy5sZW5ndGggLSAxIC0gaW5kZXg7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gbWF4T3BhY2l0eSAtIHJldmVyc2VJbmRleCAqIG11bHRpcGx5Q29lZmljaWVudCAqIChtYXhPcGFjaXR5IC0gbWluT3BhY2l0eSk7XG4gICAgICBpZiAobGlzdExlbmd0aCAhPT0gaW5kZXggKyAxKSB7XG4gICAgICAgIGh0bWxMZXR0ZXIuc3R5bGUub3BhY2l0eSA9IE1hdGgubWF4KG1pbk9wYWNpdHksIG9wYWNpdHkpLnRvU3RyaW5nKCk7XG4gICAgICAgIGh0bWxMZXR0ZXI/LmNsYXNzTGlzdD8uYWRkKFwibGV0dGVyLWFuaW1hdGlvbi1leGl0XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHRtbExldHRlci5zdHlsZS5vcGFjaXR5ID0gXCIxXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjVcIjtcbmltcG9ydCB7IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB9IGZyb20gXCIuLi8uLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmltcG9ydCB7IE1pY0ljb24gfSBmcm9tIFwiLi4vTWljSWNvblwiO1xuXG5leHBvcnQgY2xhc3MgTWljQnV0dG9uIHtcbiAgcHJpdmF0ZSBidXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICBwcml2YXRlIHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nO1xuICBwcml2YXRlIG1pY0ljb246IE1pY0ljb247XG4gIHByaXZhdGUgdG9vbHRpcFRleHQ6IEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5zZXRNaWNNdXRlZEJ5RGVmYXVsdCgpO1xuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5jcmVhdGVCdXR0b24oKTtcbiAgICB0aGlzLm1pY0ljb24gPSBuZXcgTWljSWNvbigpO1xuICAgIHRoaXMudG9vbHRpcFRleHQgPSB0aGlzLmNyZWF0ZVRvb2x0aXBUZXh0KCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwVGV4dCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy5taWNJY29uLm1pY0ljb25NdXRlZCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy5taWNJY29uLm1pY0ljb25Vbm11dGVkKTtcbiAgICB0aGlzLm1pY0ljb24ubWljSWNvblVubXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnRvZ2dsZU1pYy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TWljTXV0ZWRCeURlZmF1bHQoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy5zdHJlYW0udmlkZW9FbGVtZW50UGFyZW50O1xuICAgIGlmICh2aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHZpZGVvRWxlbWVudFBhcmVudC5xdWVyeVNlbGVjdG9yKFwidmlkZW9cIik7XG4gICAgICBpZiAodmlkZW9FbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLnRvZ2dsZU1pYyhmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCdXR0b24oKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImlkXCIsIFwibWljQnRuXCIpO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbj8uY2xhc3NMaXN0Py5hZGQoXCJVaVRvb2xcIik7XG4gICAgcmV0dXJuIGJ1dHRvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVG9vbHRpcFRleHQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgdG9vbHRpcFRleHQ/LmNsYXNzTGlzdD8uYWRkKFwidG9vbHRpcHRleHRcIik7XG4gICAgdG9vbHRpcFRleHQuaW5uZXJIVE1MID0gXCJNaWMgb24vb2ZmXCI7XG4gICAgcmV0dXJuIHRvb2x0aXBUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVNaWMoKTogdm9pZCB7XG4gICAgY29uc3QgbWljRmxhZyA9IHRoaXM/LnN0cmVhbT8uY29uZmlnPy5pc0ZsYWdFbmFibGVkKEZsYWdzLlVzZU1pYyk7XG4gICAgdGhpcy5zdHJlYW0udG9nZ2xlTWljKCFtaWNGbGFnLCBmYWxzZSk7XG4gICAgdGhpcy51cGRhdGVNaWNJY29uKCFtaWNGbGFnKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWljSWNvbihtaWNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIW1pY0FjdGl2ZSkge1xuICAgICAgdGhpcy5taWNJY29uLm1pY0ljb25Vbm11dGVkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIHRoaXMubWljSWNvbi5taWNJY29uTXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5taWNJY29uLm1pY0ljb25NdXRlZC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB0aGlzLm1pY0ljb24ubWljSWNvblVubXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmJ1dHRvbjtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIE1pY0ljb24ge1xuICBwdWJsaWMgbWljSWNvblVubXV0ZWQ6IFNWR0VsZW1lbnQ7XG4gIHB1YmxpYyBtaWNJY29uTXV0ZWQ6IFNWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5taWNJY29uVW5tdXRlZCA9IHRoaXMuY3JlYXRlTWljSWNvblVubXV0ZWQoKTtcbiAgICB0aGlzLm1pY0ljb25NdXRlZCA9IHRoaXMuY3JlYXRlTWljSWNvbk11dGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pY0ljb25Vbm11dGVkKCk6IFNWR0VsZW1lbnQge1xuICAgIGNvbnN0IG1pY0ljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInN2Z1wiKTtcbiAgICBtaWNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgXCJtaWNJY29uVW5tdXRlZFwiKTtcbiAgICBtaWNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjI0cHhcIik7XG4gICAgbWljSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIyNHB4XCIpO1xuICAgIG1pY0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ2aWV3Qm94XCIsIFwiMCAtMSAyNCAyNFwiKTtcblxuICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgIHN2Z0dyb3VwPy5jbGFzc0xpc3Q/LmFkZChcInN2Z0ljb25cIik7XG4gICAgbWljSWNvbi5hcHBlbmRDaGlsZChzdmdHcm91cCk7XG5cbiAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgIG51bGwsXG4gICAgICBcImRcIixcbiAgICAgIFwiTTEyIDE0YzEuNjYsMCwyLjk5LTEuMzQsMi45OS0zTDE1LDVjMC0xLjY2LTEuMzQtMy0zLTNTOSwzLjM0LDksNXY2YzAsMS42NiwxLjM0LDMsMywzem01LjMtM2MwLDMtMi41NCw1LjEtNS4zLDUuMVM2LjcsMTQsNi43LDExSDVjMCwzLjQxLDIuNzIsNi4yMyw2LDYuNzJWMjFoMnYtMy4yOGMzLjI4LS40OCw2LTMuMyw2LTYuNzJoLTEuN3pcIlxuICAgICk7XG4gICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuXG4gICAgcmV0dXJuIG1pY0ljb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pY0ljb25NdXRlZCgpOiBTVkdFbGVtZW50IHtcbiAgICBjb25zdCBtaWNJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgbWljSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIFwibWljSWNvbk11dGVkXCIpO1xuICAgIG1pY0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMjRweFwiKTtcbiAgICBtaWNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjI0cHhcIik7XG4gICAgbWljSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInZpZXdCb3hcIiwgXCIwIC0xIDI0IDI0XCIpO1xuXG4gICAgY29uc3Qgc3ZnR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgc3ZnR3JvdXA/LmNsYXNzTGlzdD8uYWRkKFwic3ZnSWNvblwiKTtcbiAgICBtaWNJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcblxuICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgxLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMTksMTFoLTEuN2MwLC43NC0uMTYsMS40My0uNDMsMi4wNWwxLjIzLDEuMjNjLjU2LS45OC45LTIuMDkuOS0zLjI4em0tNC4wMi4xN2MwLS4wNi4wMi0uMTEuMDItLjE3VjVjMC0xLjY2LTEuMzQtMy0zLTNTOSwzLjM0LDksNXYuMThsNS45OCw1Ljk5ek00LjI3LDMsMyw0LjI3bDYuMDEsNi4wMVYxMWMwLDEuNjYsMS4zMywzLDIuOTksMywuMjIsMCwuNDQtLjAzLjY1LS4wOGwxLjY2LDEuNjZjLS43MS4zMy0xLjUuNTItMi4zMS41Mi0yLjc2LDAtNS4zLTIuMS01LjMtNS4xSDVjMCwzLjQxLDIuNzIsNi4yMyw2LDYuNzJWMjFoMnYtMy4yOGMuOTEtLjEzLDEuNzctLjQ1LDIuNTQtLjlMMTkuNzMsMjEsMjEsMTkuNzMsNC4yNywzelwiXG4gICAgKTtcblxuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcblxuICAgIHJldHVybiBtaWNJY29uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNaWNJY29uIH0gZnJvbSBcIi4uL01pY0ljb25cIjtcbmltcG9ydCB7IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB9IGZyb20gXCIuLi8uLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcblxuZXhwb3J0IGNsYXNzIE1pY3JvcGhvbmVPdmVybGF5IHtcbiAgcHJpdmF0ZSBvdmVybGF5OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSBtaWNJY29uOiBNaWNJY29uO1xuICBwcml2YXRlIHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5taWNJY29uID0gbmV3IE1pY0ljb24oKTtcbiAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBzdHJlYW0/LnZpZGVvRWxlbWVudFBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXkpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMub3ZlcmxheSk7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgb3ZlcmxheSBlbGVtZW50XG4gICAgICB0aGlzLm92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGhpcy5vdmVybGF5LmlkID0gXCJtaWNyb3Bob25lT3ZlcmxheVwiO1xuICAgICAgdGhpcy5vdmVybGF5Py5jbGFzc0xpc3Q/LmFkZChcImhpZGRlblN0YXRlXCIpO1xuXG4gICAgICAvLyBBcHBlbmQgdGhlIGljb25zIHRvIHRoZSBvdmVybGF5XG4gICAgICB0aGlzLm92ZXJsYXkuYXBwZW5kQ2hpbGQodGhpcy5taWNJY29uLm1pY0ljb25Vbm11dGVkKTtcbiAgICAgIHRoaXMub3ZlcmxheS5hcHBlbmRDaGlsZCh0aGlzLm1pY0ljb24ubWljSWNvbk11dGVkKTtcbiAgICAgIHRoaXMubWljSWNvbi5taWNJY29uTXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHRpdGxlIGRpdiBlbGVtZW50XG4gICAgICBjb25zdCB0aXRsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0aXRsZURpdi5jbGFzc05hbWUgPSBcInRpdGxlXCI7XG4gICAgICB0aXRsZURpdi50ZXh0Q29udGVudCA9IFwiRW5hYmxpbmcgbWljcm9waG9uZS4uLlwiOyAvLyBEZWZhdWx0IHRleHRcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBwYXJhZ3JhcGggZWxlbWVudFxuICAgICAgY29uc3QgcGFyYWdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICBwYXJhZ3JhcGgudGV4dENvbnRlbnQgPVxuICAgICAgICBcIlBsZWFzZSBjaGVjayB5b3VyIGJyb3dzZXIncyBwcm9tcHQgdG8gYWxsb3cgbWljcm9waG9uZSBhY2Nlc3MuIFlvdSBtYXkgYWxzbyBuZWVkIHRvIHJlLWVuYWJsZSB0aGUgc291bmQuXCI7IC8vIERlZmF1bHQgdGV4dFxuXG4gICAgICAvLyBBcHBlbmQgdGhlIHRpdGxlIGFuZCBwYXJhZ3JhcGggdG8gdGhlIG92ZXJsYXlcbiAgICAgIHRoaXMub3ZlcmxheS5hcHBlbmRDaGlsZCh0aXRsZURpdik7XG4gICAgICB0aGlzLm92ZXJsYXkuYXBwZW5kQ2hpbGQocGFyYWdyYXBoKTtcblxuICAgICAgLy8gQXBwZW5kIHRoZSBvdmVybGF5IHRvIHRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMub3ZlcmxheSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZU1lc3NhZ2UoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXkpIHtcbiAgICAgICAgLy8gRmluZCB0aGUgdGl0bGUgYW5kIHBhcmFncmFwaCBlbGVtZW50c1xuICAgICAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSB0aGlzLm92ZXJsYXkucXVlcnlTZWxlY3RvcihcIi50aXRsZVwiKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoRWxlbWVudCA9IHRoaXMub3ZlcmxheS5xdWVyeVNlbGVjdG9yKFwicFwiKTtcblxuICAgICAgICB0aGlzLm1pY0ljb24ubWljSWNvbk11dGVkLnN0eWxlLmRpc3BsYXkgPSBlbmFibGVkID8gXCJub25lXCIgOiBcImJsb2NrXCI7XG4gICAgICAgIHRoaXMubWljSWNvbi5taWNJY29uVW5tdXRlZC5zdHlsZS5kaXNwbGF5ID0gZW5hYmxlZCA/IFwiYmxvY2tcIiA6IFwibm9uZVwiO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgdGl0bGUgYW5kIHBhcmFncmFwaCB0ZXh0XG4gICAgICAgIGlmICh0aXRsZUVsZW1lbnQpIHRpdGxlRWxlbWVudC50ZXh0Q29udGVudCA9IGVuYWJsZWQgPyBcIkVuYWJsaW5nIG1pY3JvcGhvbmVcIiA6IFwiRGlzYWJsaW5nIG1pY3JvcGhvbmVcIjtcbiAgICAgICAgaWYgKHBhcmFncmFwaEVsZW1lbnQpXG4gICAgICAgICAgcGFyYWdyYXBoRWxlbWVudC50ZXh0Q29udGVudCA9IGVuYWJsZWRcbiAgICAgICAgICAgID8gXCJQbGVhc2UgY2hlY2sgeW91ciBicm93c2VyJ3MgcHJvbXB0IHRvIGFsbG93IG1pY3JvcGhvbmUgYWNjZXNzLiBZb3UgbWF5IGFsc28gbmVlZCB0byByZS1lbmFibGUgdGhlIHNvdW5kLlwiXG4gICAgICAgICAgICA6IFwiUGxlYXNlIHdhaXQuIFlvdSBtYXkgbmVlZCB0byByZS1lbmFibGUgdGhlIHNvdW5kLlwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVWaXNpYmlsaXR5KHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbmZvT3ZlcmxheSA9IHRoaXM/LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIjaW5mb092ZXJsYXlcIik7XG4gICAgICBjb25zdCBkaXNjb25uZWN0T3ZlcmxheSA9IHRoaXM/LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIjZGlzY29ubmVjdE92ZXJsYXlcIik7XG4gICAgICBjb25zdCBlcnJvck92ZXJsYXkgPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiI2Vycm9yT3ZlcmxheVwiKTtcblxuICAgICAgY29uc3QgY2xhc3NOYW1lID0gXCJtaWMtb3ZlcmxheS1pcy12aXNpYmxlXCI7XG5cbiAgICAgIGlmICh0aGlzLm92ZXJsYXkgJiYgaW5mb092ZXJsYXkgJiYgZGlzY29ubmVjdE92ZXJsYXkgJiYgZXJyb3JPdmVybGF5KSB7XG4gICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgaW5mb092ZXJsYXk/LmNsYXNzTGlzdD8uYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgICAgZGlzY29ubmVjdE92ZXJsYXk/LmNsYXNzTGlzdD8uYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgICAgZXJyb3JPdmVybGF5Py5jbGFzc0xpc3Q/LmFkZChjbGFzc05hbWUpO1xuICAgICAgICAgIHRoaXM/Lm92ZXJsYXk/LmNsYXNzTGlzdD8ucmVtb3ZlKFwiaGlkZGVuU3RhdGVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcz8ub3ZlcmxheT8uY2xhc3NMaXN0Py5hZGQoXCJoaWRkZW5TdGF0ZVwiKTtcbiAgICAgICAgICBpbmZvT3ZlcmxheT8uY2xhc3NMaXN0Py5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgICBkaXNjb25uZWN0T3ZlcmxheT8uY2xhc3NMaXN0Py5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgICBlcnJvck92ZXJsYXk/LmNsYXNzTGlzdD8ucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBQbGF5SWNvbiB7XG4gIHB1YmxpYyBwbGF5SWNvbjogU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBsYXlJY29uID0gdGhpcy5jcmVhdGVQbGF5SWNvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQbGF5SWNvbigpOiBTVkdFbGVtZW50IHtcbiAgICBjb25zdCBwbGF5SWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xuICAgIHBsYXlJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgXCJwbGF5SWNvblwiKTtcbiAgICBwbGF5SWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIyNHB4XCIpO1xuICAgIHBsYXlJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjI0cHhcIik7XG4gICAgcGxheUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ2aWV3Qm94XCIsIFwiMCAwIDI0IDI0XCIpO1xuXG4gICAgY29uc3Qgc3ZnR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgc3ZnR3JvdXA/LmNsYXNzTGlzdD8uYWRkKFwic3ZnSWNvblwiKTtcbiAgICBwbGF5SWNvbi5hcHBlbmRDaGlsZChzdmdHcm91cCk7XG5cbiAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgXCJNOCA1djE0bDExLTd6XCIpO1xuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcblxuICAgIHJldHVybiBwbGF5SWNvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXJjd2FyZVBpeGVsU3RyZWFtaW5nIH0gZnJvbSBcIi4uLy4uL0FyY3dhcmVQaXhlbFN0cmVhbWluZ1wiO1xuaW1wb3J0IHsgU3RvcEljb24gfSBmcm9tIFwiLi4vU3RvcEljb25cIjtcbmltcG9ydCB7IFBsYXlJY29uIH0gZnJvbSBcIi4uL1BsYXlJY29uXCI7XG5cbmV4cG9ydCBjbGFzcyBTdG9wQnV0dG9uIHtcbiAgcHJpdmF0ZSBidXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICBwcml2YXRlIHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nO1xuICBwcml2YXRlIHN0b3BJY29uOiBTdG9wSWNvbjtcbiAgcHJpdmF0ZSBwbGF5SWNvbjogUGxheUljb247XG4gIHByaXZhdGUgdG9vbHRpcFRleHQ6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGlzU3RyZWFtaW5nOiBib29sZWFuID0gdHJ1ZTsgLy8gQXNzdW1pbmcgc3RyZWFtaW5nIHN0YXJ0cyBieSBkZWZhdWx0XG5cbiAgY29uc3RydWN0b3Ioc3RyZWFtOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcpIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLmJ1dHRvbiA9IHRoaXMuY3JlYXRlQnV0dG9uKCk7XG4gICAgdGhpcy5zdG9wSWNvbiA9IG5ldyBTdG9wSWNvbigpO1xuICAgIHRoaXMucGxheUljb24gPSBuZXcgUGxheUljb24oKTtcbiAgICB0aGlzLnRvb2x0aXBUZXh0ID0gdGhpcy5jcmVhdGVUb29sdGlwVGV4dCgpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcFRleHQpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMuc3RvcEljb24uc3RvcEljb24pO1xuICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnRvZ2dsZVN0cmVhbWluZy5iaW5kKHRoaXMpKTtcbiAgICBzdHJlYW0ub25TdHJlYW1pbmdTdGF0ZUNoYW5nZSh0aGlzLnVwZGF0ZUJ1dHRvblN0YXRlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCdXR0b24oKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uPy5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInN0b3BCdG5cIik7XG4gICAgYnV0dG9uPy5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbj8uY2xhc3NMaXN0Py5hZGQoXCJVaVRvb2xcIik7XG4gICAgcmV0dXJuIGJ1dHRvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVG9vbHRpcFRleHQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgdG9vbHRpcFRleHQ/LmNsYXNzTGlzdD8uYWRkKFwidG9vbHRpcHRleHRcIik7XG4gICAgdG9vbHRpcFRleHQuaW5uZXJIVE1MID0gXCJEaXNjb25uZWN0XCI7XG4gICAgcmV0dXJuIHRvb2x0aXBUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVTdHJlYW1pbmcoKTogdm9pZCB7XG4gICAgdGhpcy5pc1N0cmVhbWluZyA9ICF0aGlzLmlzU3RyZWFtaW5nO1xuICAgIHRoaXMudXBkYXRlQnV0dG9uSWNvbigpO1xuICAgIGlmICh0aGlzLmlzU3RyZWFtaW5nKSB7XG4gICAgICB0aGlzLnN0cmVhbS5yZWNvbm5lY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdHJlYW0uZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQnV0dG9uSWNvbigpOiB2b2lkIHtcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggaWNvbiArIHRvb2x0aXAgc2hvdWxkIGJlIGN1cnJlbnRseSBkaXNwbGF5ZWRcbiAgICBjb25zdCBjdXJyZW50SWNvbiA9IHRoaXMuaXNTdHJlYW1pbmcgPyB0aGlzLnN0b3BJY29uLnN0b3BJY29uIDogdGhpcy5wbGF5SWNvbi5wbGF5SWNvbjtcbiAgICBjb25zdCBjdXJyZW50VG9vbHRpcFRleHQgPSB0aGlzLmlzU3RyZWFtaW5nID8gXCJEaXNjb25uZWN0XCIgOiBcIlJlY29ubmVjdFwiO1xuXG4gICAgLy8gVXBkYXRlIHRvb2x0aXAgdGV4dFxuICAgIHRoaXMudG9vbHRpcFRleHQuaW5uZXJIVE1MID0gY3VycmVudFRvb2x0aXBUZXh0O1xuICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgY2hpbGQgaWYgaXQgZXhpc3RzXG4gICAgaWYgKHRoaXMuYnV0dG9uLmZpcnN0Q2hpbGQpIHtcbiAgICAgIHRoaXMuYnV0dG9uLnJlbW92ZUNoaWxkKHRoaXMuYnV0dG9uLmNoaWxkcmVuWzFdKTtcbiAgICB9XG4gICAgLy8gQXBwZW5kIHRoZSBuZXcgaWNvblxuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKGN1cnJlbnRJY29uKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWxlbWVudCgpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCdXR0b25TdGF0ZShpc1N0cmVhbWluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNTdHJlYW1pbmcgPSBpc1N0cmVhbWluZztcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvbkljb24oKTtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFN0b3BJY29uIHtcbiAgcHVibGljIHN0b3BJY29uOiBTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RvcEljb24gPSB0aGlzLmNyZWF0ZVN0b3BJY29uKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0b3BJY29uKCk6IFNWR0VsZW1lbnQge1xuICAgIGNvbnN0IHN0b3BJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgc3RvcEljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBcInN0b3BJY29uXCIpO1xuICAgIHN0b3BJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjI0cHhcIik7XG4gICAgc3RvcEljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMjRweFwiKTtcbiAgICBzdG9wSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInZpZXdCb3hcIiwgXCIwIC0xIDI0IDI0XCIpO1xuXG4gICAgY29uc3Qgc3ZnR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgc3ZnR3JvdXA/LmNsYXNzTGlzdD8uYWRkKFwic3ZnSWNvblwiKTtcbiAgICBzdG9wSWNvbj8uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuXG4gICAgY29uc3QgcGF0aDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG4gICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIFwiTTYgNmgxMnYxMkg2elwiKTtcbiAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMSk7XG5cbiAgICByZXR1cm4gc3RvcEljb247XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2xpYlwiO1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IFpFcnJvck1lc3NhZ2UgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcImVycm9yXCIpLFxuICBjb2RlOiB6Lm51bWJlcigpLmludCgpLFxuICByZWFzb246IHouc3RyaW5nKCksXG4gIHZlcmJvc2l0eTogei5udW1iZXIoKSxcbn0pO1xuZXhwb3J0IHR5cGUgRXJyb3JNZXNzYWdlID0gei5pbmZlcjx0eXBlb2YgWkVycm9yTWVzc2FnZT47XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgWkxvdmVMZXR0ZXIgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcImxldHRlclwiKSxcbiAgcmVhc29uOiB6LnN0cmluZygpLnN0YXJ0c1dpdGgoXCJMTDogXCIpLFxuICBjb2RlOiB6Lm51bWJlcigpLFxuICB2ZXJib3NpdHk6IHoubnVtYmVyKCksXG59KTtcbmV4cG9ydCB0eXBlIExvdmVMZXR0ZXIgPSB6LmluZmVyPHR5cGVvZiBaTG92ZUxldHRlcj47XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgWlBpbmcgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInBpbmdcIiksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdGltZTogei5udW1iZXIoKVxufSk7XG5leHBvcnQgdHlwZSBQaW5nID0gei5pbmZlcjx0eXBlb2YgWlBpbmc+O1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IFpRdWV1ZSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKFwicXVldWVcIiksXG4gIHF1ZXVlOiB6Lm9iamVjdCh7XG4gICAgLyoqIFRpY2tldC5faWQgLSB3aWxsIG5vdCBiZSBleHBvc2VkIHRvIGZyb250ZW5kLiAqL1xuICAgIC8vIF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgLyoqIFBvc2l0aW9uIGluIHF1ZXVlICh6ZXJvIGJhc2VkKS4gKi9cbiAgICBpbmRleDogei5udW1iZXIoKS5pbnQoKS5vcHRpb25hbCgpLFxuICAgIC8qKiBMZW5ndGggb2YgdGhlIHF1ZXVlLiAqL1xuICAgIHF1ZXVlTGVuZ3RoOiB6Lm51bWJlcigpLmludCgpLm9wdGlvbmFsKCksXG4gICAgLyoqIEFscmVhZHkgd2FpdGVkIGZvci4gKi9cbiAgICB3YWl0ZWQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAvKiogQmFzZWQgb24gQXZlcmFnZSBXYXRjaCBUaW1lLFxuICAgICAqIHdlIGNhbGN1bGF0ZSBhbiBhdmVyYWdlIGludGVydmFsIG9mIGV4cGVjdGVkIGNvbm5lY3Rpb24gY2xvc2luZ3MgYW5kIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgY29uY3VycmVudCBzZXNzaW9ucyxcbiAgICAgKiB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBlc3RpbWF0ZWQgdGltZSB1bnRpbCBhbm90aGVyIHNsb3Qgd2lsbCBiZSBmcmVlZCB1cC4gKi9cbiAgICBlc3RpbWF0ZWRXYWl0VGltZTogei5udW1iZXIoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksXG4gICAgLyoqIFRoZSBhdmVyYWdlIHRpbWUgYWxsIGN1cnJlbnQgc2Vzc2lvbnMuXG4gICAgICogKEhvdyBsb25nIGRpZCBpdCBhY3R1YWxseSB0YWtlIHRob3NlIHRoYXQgd2FpdGVkIGZvciB0aGVtIHRoYXQgcmVjZWl2ZWQgYSBjb25uZWN0aW9uIHRvIHRoZSBjdXJyZW50bHkgcnVubmluZyBpbnN0YW5jZXMuKVxuICAgICAqL1xuICAgIGF2ZXJhZ2VXYWl0VGltZTogei5udW1iZXIoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksXG4gICAgLyoqIFR5cGUgb2YgYWxsIHRpbWUtdmFsdWVzIGluIHRoZSBxdWUuICovXG4gICAgdmFsdWVUeXBlOiB6LmVudW0oW1wibWlsbGlzZWNvbmRzXCIsIFwic2Vjb25kc1wiLCBcIm1pbnV0ZXNcIiwgXCJob3Vyc1wiLCBcImRheXNcIl0pLFxuICB9KSxcbn0pO1xuZXhwb3J0IHR5cGUgUXVldWUgPSB6LmluZmVyPHR5cGVvZiBaUXVldWU+O1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IFpTZXNzaW9uSWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInNlc3Npb25JZFwiKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBTZXNzaW9uSWQgPSB6LmluZmVyPHR5cGVvZiBaU2Vzc2lvbklkPjtcbiIsImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGVkU3RhdHMgfSBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuXG5leHBvcnQgY29uc3QgWlN0YXRzID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJzdGF0c1wiKSxcbiAgc3RhdHM6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIC8qKlxuICAgICAgICogT3RoZXIga25vd24gcHJvcGVydGllcy5cbiAgICAgICAqL1xuICAgICAgY29kZWNzOiB6LmN1c3RvbTxBZ2dyZWdhdGVkU3RhdHNbXCJjb2RlY3NcIl0+KCksXG4gICAgICBjYW5kaWRhdGVQYWlyOiB6LmN1c3RvbTxBZ2dyZWdhdGVkU3RhdHNbXCJjYW5kaWRhdGVQYWlyc1wiXT4oKSxcbiAgICAgIGxvY2FsQ2FuZGlkYXRlczogei5jdXN0b208QWdncmVnYXRlZFN0YXRzW1wibG9jYWxDYW5kaWRhdGVzXCJdPigpLFxuICAgICAgcmVtb3RlQ2FuZGlkYXRlczogei5jdXN0b208QWdncmVnYXRlZFN0YXRzW1wicmVtb3RlQ2FuZGlkYXRlc1wiXT4oKSxcbiAgICAgIERhdGFDaGFubmVsU3RhdHM6IHouY3VzdG9tPEFnZ3JlZ2F0ZWRTdGF0c1tcImRhdGFjaGFubmVsU3RhdHNcIl0+KCksXG5cblxuICAgICAgLy8gUmVjZWl2ZWQgKGxhc3QpIGZvciB0aWNrZXRcbiAgICAgIGJ5dGVzUmVjZWl2ZWQ6IHoubnVtYmVyKCksXG4gICAgICAvLyBQYWNrZXRzIExvc3QgKGxhc3QpIGZvciB0aWNrZXRcbiAgICAgIHBhY2tldHNMb3N0OiB6Lm51bWJlcigpLFxuICAgICAgLy8gVmlkZW8gcmVzb2x1dGlvbjogaGlnaGVzdCBsb3dlc3QgYXZlcmFnZSAocG9ydHJhaXQpIGFuZCBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChsYW5kc2NhcGUpIGZvciB0aWNrZXRcbiAgICAgIGZyYW1lV2lkdGg6IHoubnVtYmVyKCksXG4gICAgICAvLyBWaWRlbyByZXNvbHV0aW9uOiBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChwb3J0cmFpdCkgYW5kIGhpZ2hlc3QgbG93ZXN0IGF2ZXJhZ2UgKGxhbmRzY2FwZSkgZm9yIHRpY2tldFxuICAgICAgZnJhbWVIZWlnaHQ6IHoubnVtYmVyKCksXG4gICAgICAvLyBGcmFtZXMgZGVjb2RlZCAoTGFzdCkgZm9yIHRpY2tldFxuICAgICAgZnJhbWVzRGVjb2RlZDogei5udW1iZXIoKSxcbiAgICAgIC8vIEZyYW1lcmF0ZSAobG93IC8gaGlnaCwgYXZnKSBmb3IgdGlja2V0XG4gICAgICBmcmFtZXNQZXJTZWNvbmQ6IHoubnVtYmVyKCksXG4gICAgICAvLyBmcmFtZXMgZHJvcHBlZCAobGFzdCkgZm9yIHRpY2tldFxuICAgICAgZnJhbWVzRHJvcHBlZDogei5udW1iZXIoKSxcbiAgICAgIC8vIFZpZGVvY29kZWMgKG9uY2UpIGZvciB0aWNrZXRcbiAgICAgIHZpZGVvQ29kZWM6IHouc3RyaW5nKCksXG4gICAgICAvLyBhdWRpb2NvZGVjIChvbmNlKSBmb3IgdGlja2V0XG4gICAgICBhdWRpb0NvZGVjOiB6LnN0cmluZygpLFxuICAgICAgLy8gYnJvd3NlciB0eXBlIGFuZCB2ZXJzaW9uIGZvciB0aWNrZXQgKGFyY3dhcmUgLyBhZGRpdGlvbilcbiAgICAgIGJyb3dzZXJJbmZvOiB6XG4gICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgIHVzZXJBZ2VudDogei5zdHJpbmcoKSxcbiAgICAgICAgICBwbGF0Zm9ybTogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICAgIGxhbmd1YWdlOiB6LnN0cmluZygpLFxuICAgICAgICB9KVxuICAgICAgICAucGFzc3Rocm91Z2goKVxuICAgICAgICAucGFydGlhbCgpLFxuICAgICAgLy8gTmV0IFJUVCAobG93LCBoaWdoLCBhdmcpXG4gICAgICBjdXJyZW50UlRUOiB6Lm51bWJlcigpLFxuICAgICAgLy8gRHVyYXRpb24gKGxhc3QpXG4gICAgICBzZXNzaW9uUnVuVGltZTogei5zdHJpbmcoKSxcbiAgICAgIC8vIENvbnRyb2xzIHN0cmVhbSBpbnB1dCAoPz8pXG4gICAgICBjb250cm9sc1N0cmVhbUlucHV0OiB6LnN0cmluZygpLnJlZmluZSgoYXJnKSA9PiBhcmcgPT09IFwidHJ1ZVwiIHx8IGFyZyA9PT0gXCJmYWxzZVwiKSxcbiAgICAgIC8vIHZpZGVvIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKGxvdyAvIGhpZ2ggLyBhdmcgaWYgYXBwbGljYWJsZSlcbiAgICAgIHZpZGVvRW5jb2RlckF2Z1FQOiB6Lm51bWJlcigpLFxuICAgICAgLy8gVmlkZW8gYml0cmF0ZSAobWluIC8gbWF4IC8gYXZnKVxuICAgICAgdmlkZW9CaXRyYXRlOiB6Lm51bWJlcigpLFxuICAgICAgLy8gQXVkaW8gYml0cmF0ZSAobWluIC8gbWF4IC8gYXZnKVxuICAgICAgYXVkaW9CaXRyYXRlOiB6Lm51bWJlcigpLFxuICAgIH0pXG4gICAgLnBhc3N0aHJvdWdoKClcbiAgICAucGFydGlhbCgpLFxufSk7XG5leHBvcnQgdHlwZSBTdGF0cyA9IHouaW5mZXI8dHlwZW9mIFpTdGF0cz47XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgV2ViU2RrU2V0dGluZ3MgfSBmcm9tIFwiLi9XZWJTZGtTZXR0aW5nc1wiO1xuXG5leHBvcnQgY29uc3QgWlN0cmVhbUluZm8gPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInN0cmVhbUluZm9cIiksXG4gIHN0cmVhbUluZm86IHoub2JqZWN0KHtcbiAgICBndWlkOiB6LnN0cmluZygpLFxuICAgIGF1dG9QbGF5OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIHRvdWNoQ2FwYWJsZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICByZXNvbHV0aW9uOiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgd2lkdGg6IHoubnVtYmVyKCkuaW50KCkubm9ubmVnYXRpdmUoKSxcbiAgICAgICAgaGVpZ2h0OiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gICAgICAgIGR5bmFtaWM6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgIGZpeGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpXG4gICAgICB9KVxuICAgICAgLm9wdGlvbmFsKCksXG4gICAgbWV0YTogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIGZyaWVuZGx5TmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICBpc1RyaWFsOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICBtb3VzZUxvY2s6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgIHBvd2VyZWRCeTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgdmVyc2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICB9KVxuICAgICAgLm9wdGlvbmFsKCksXG4gICAgd2ViU2RrU2V0dGluZ3M6IFdlYlNka1NldHRpbmdzLm9wdGlvbmFsKCksXG4gICAgYWZrOiB6XG4gICAgICAub2JqZWN0KFxuICAgICAgICB7XG4gICAgICAgICAgZW5hYmxlZDogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJFbmFibGVzIC8gRGlzYWJsZXMgQUZLIGZ1bmN0aW9uYWxpdHkuXCIpLFxuICAgICAgICAgIHdhcm46IHpcbiAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAubm9ubmVnYXRpdmUoKVxuICAgICAgICAgICAgLmRlc2NyaWJlKFwiVGltZSBpbiBzZWNvbmRzLCBhZnRlciBsYXN0IGludGVyYWN0aW9uLCB3aGVuIHRoZSBmaXJzdCB3YXJuaW5nIHdpbGwgYmUgdHJpZ2dlcmVkLlwiKSxcbiAgICAgICAgICBlcnJvcjogelxuICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgIC5ub25uZWdhdGl2ZSgpXG4gICAgICAgICAgICAuZGVzY3JpYmUoXCJUaW1lIGluIHNlY29uZHMsIGFmdGVyIHdhcm4gdHJpZ2dlciwgd2hlbiBhIG1vcmUgcHVzaHkgd2FybmluZyB3aWxsIGJlIHRyaWdnZXJlZC5cIiksXG4gICAgICAgICAgYWN0aW9uOiB6XG4gICAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAgIC5pbnQoKVxuICAgICAgICAgICAgLm5vbm5lZ2F0aXZlKClcbiAgICAgICAgICAgIC5kZXNjcmliZShcIlRpbWUgaW4gc2Vjb25kcywgYWZ0ZXIgZXJyb3IgdHJpZ2dlciwgdGhlIGFjdHVhbCBkaXNjb25uZWN0aW9uIGFjdGlvbiB3aWxsIHRha2UgcGxhY2UuXCIpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwiQUZLIHN0YW5kcyBmb3IgJ2F3YXkgZnJvbSBrZXlib2FyZCcgYW5kIGRlc2NyaWJlcyBhIHRpbWVvdXQgYmFzZWQgb24gYWN0aXZpdHkgb2YgdGhlIGFjdHVhbCBwcm9qZWN0LiBBbGwgZXhlY3V0aW9uIG9mIHRoZXNlIHNldHRpbmdzIGFyZSBwcm9uZSB0byBmcm9udGVuZCBhbmQgdGhlcmVmb3JlIG5vIGZ1bGwgc2VjdXJpdHkgbWVhc3VyZSBmb3IgYWJ1c2UhIFRoZXNlIHNldHRpbmdzIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBzaGFyZUlkLCBidXQgd291bGQgb3ZlcndyaXRlIHRoZSBzZXR0aW5ncyBnaXZlbiB0aHJvdWdoIGZyb250ZW5kIGNvbmZpZ3VyYXRpb24uXCJcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLm9wdGlvbmFsKClcbiAgfSlcbn0pO1xuZXhwb3J0IHR5cGUgU3RyZWFtSW5mbyA9IHouaW5mZXI8dHlwZW9mIFpTdHJlYW1JbmZvPjtcbiIsImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBaVmVyc2lvbiA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKFwidmVyc2lvblwiKSxcbiAgdmVyc2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBWZXJzaW9uID0gei5pbmZlcjx0eXBlb2YgWlZlcnNpb24+O1xuIiwiaW1wb3J0IHsgWm9kVHlwZSwgeiB9IGZyb20gXCJ6b2RcIjtcblxuY29uc3QgZGlzYWJsZWREaXNjbGFpbWVyID1cbiAgXCJEaXNhYmxlZDogVG8gcHVyY2hhc2UgdGhpcyBvcHRpb24sIHBsZWFzZSBjb250YWN0IG91ciBzYWxlcyBkZXBhcnRtZW50IGJ5IGNsaWNraW5nIHRoZSAnQ3JlYXRlIFN1cHBvcnQgVGlja2V0JyBidXR0b24gb24gdGhlIEhlbHAgQ2VudGVyIHBhZ2UuXCI7XG5cbmV4cG9ydCBjb25zdCBXZWJTZGtTZXR0aW5ncyA9IHpcbiAgLm9iamVjdCh7XG4gICAgY29uZjogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIGZ1bGxzY3JlZW5CdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiRnVsbC1TY3JlZW4gQnV0dG9ufFwiLFxuICAgICAgICAgICAgICBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIEVuYWJsZS9EaXNhYmxlIHRoZSBmdWxsLXNjcmVlbiBidXR0b24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogUGxlYXNlIGJlIGF3YXJlIHRoYXQgaU9TIChpUGhvbmUgZGV2aWNlcykgZG9lcyBub3Qgc3VwcG9ydCBmdWxsLXNjcmVlbiBtb2RlLCBhbmQgYXMgYSByZXN1bHQsIHRoZSBidXR0b24gd2lsbCBub3QgYmUgZGlzcGxheWVkIG9uIHRoZXNlIGRldmljZXMuXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIHN0b3BCdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiU3RvcCBCdXR0b258XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgRW5hYmxlL0Rpc2FibGUgdGhlIHN0b3Agb3ZlcmxheS1idXR0b24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogTWFudWFsbHkgc3RvcHMgdGhlIGNvbm5lY3Rpb24uXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIERlZmF1bHQ6IGZhbHNlLCBmb3IgY2xlYW5lciBVSS5cbiAgICAgICAgYXVkaW9CdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIkF1ZGlvIEJ1dHRvbnxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSBFbmFibGUvRGlzYWJsZSB0aGUgYXVkaW8gb3ZlcmxheS1idXR0b24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogRGlzcGxheXMgdGhlIGF1ZGlvIGJ1dHRvbiBpZiB5b3VyIFVucmVhbCBFbmdpbmUgYXBwbGljYXRpb24gaW5jbHVkZXMgYXVkaW8uXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIEV2ZW4gdGhvdWdoIGl0J3MgZGVmYXVsdGVkIHRvIGZhbHNlLCBpdCBjYW4gc3RpbGwgYmUgZW5hYmxlZCB3aGlsZSBiZWluZyBmYWxzZSBieSB1c2luZyB0aGUgXCJpXCIgcXVlcnkgcGFyYW1ldGVyOiBodHRwczovL3NvbWUtdXJsLz9pXG4gICAgICAgIGluZm9CdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgLmRlc2NyaWJlKFtcIkluZm8gQnV0dG9ufFwiLCBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIHRoZSBpbmZvIG92ZXJsYXktYnV0dG9uLlwiXS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBtaWNCdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIk1pYyBCdXR0b258XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgRW5hYmxlL0Rpc2FibGUgdGhlIG1pY3JvcGhvbmUgb3ZlcmxheS1idXR0b24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogRW5hYmxlcyB1c2VycyB0byBpbnRlcmFjdCB3aXRoIHRoZSBVbnJlYWwgRW5naW5lIGFwcGxpY2F0aW9uIHVzaW5nIGEgbWljcm9waG9uZSwgd2hpY2ggbXVzdCBiZSBtYW51YWxseSBlbmFibGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBzZXR0aW5nc0J1dHRvbjogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgICAuZGVzY3JpYmUoW1wiU2V0dGluZ3MgQnV0dG9ufFwiLCBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIHRoZSBzZXR0aW5ncyBvdmVybGF5LWJ1dHRvbi5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgY29ubmVjdGlvblN0cmVuZ3RoSWNvbjogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXCJDb25uZWN0aW9uIFN0cmVuZ3RofFwiLCBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIHRoZSBjb25uZWN0aW9uIHN0cmVuZ3RoIG92ZXJsYXktaWNvbi5cIl0uam9pbihcIlxcblwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAub3B0aW9uYWwoKSxcblxuICAgICAgICAvLyBlcnJvckhhbmRsZXI6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gbG92ZUxldHRlckhhbmRsZXI6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gbG92ZUxldHRlckxvZ2dpbmc6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gRW5hYmxlZCBieSBkZWZhdWx0LlxuICAgICAgICAvLyBjb25uZWN0aW9uSWRlbnRpZmllckxvZ2dpbmdEaXNhYmxlZDogemF0KHouYm9vbGVhbigpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBxdWV1ZUhhbmRsZXI6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gc2Vzc2lvbklkSGFuZGxlcjogemF0KHouYm9vbGVhbigpKS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIGluaXQ6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICAvLyBJbnB1dFxuICAgICAgICBLZXlib2FyZElucHV0OiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIktleWJvYXJkIElucHV0fFwiLFxuICAgICAgICAgICAgICBcIk92ZXJyaWRlICdLZXlib2FyZElucHV0JyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IEFsbG93cyBrZXlib2FyZCBpbnB1dCBldmVudHMuXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIE1vdXNlSW5wdXQ6IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiTW91c2UgSW5wdXR8XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgJ01vdXNlSW5wdXQnIHByb3BlcnR5IG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogQWxsb3dzIG1vdXNlIGlucHV0IGV2ZW50cy5cIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgR2FtZXBhZElucHV0OiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCJHYW1lIHBhZCBJbnB1dHxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSAnR2FtZXBhZElucHV0JyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IEFsbG93cyBpbnB1dCBldmVudHMgZnJvbSBnYW1lcGFkIGNvbnRyb2xsZXJzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBUb3VjaElucHV0OiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCJUb3VjaCBJbnB1dHxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSAnVG91Y2hJbnB1dCcgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi5cIixcbiAgICAgICAgICAgICAgXCJJbmZvOiBBbGxvd3MgdG91Y2ggZXZlbnRzIG9uIG1vYmlsZSBkZXZpY2VzIGFuZCB0YWJsZXRzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBYUkNvbnRyb2xsZXJJbnB1dDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiWFIgQ29udHJvbGxlciBJbnB1dHxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSAnWFJDb250cm9sbGVySW5wdXQnIHByb3BlcnR5IG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogQWxsb3dzIGlucHV0IGV2ZW50cyBmcm9tIFhSIGNvbnRyb2xsZXJzIGZvciB1c2Ugd2l0aCBBUiBhbmQgVlIgc2V0dXBzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICAvLyBVc2VNaWM6XG4gICAgICAgIC8vICAgei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiVXNlTWljfFwiLCBcIk92ZXJyaWRlIHVzZSBtaWMgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgLy8gIC5vcHRpb25hbCgpLFxuXG4gICAgICAgIEZha2VNb3VzZVdpdGhUb3VjaGVzOiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCJGYWtlIG1vdXNlIHdpdGggdG91Y2hlcyB8XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgJ0Zha2VNb3VzZVdpdGhUb3VjaGVzJyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLiBXaGVuIGVuYWJsZWQgdGhpcyBzZXR0aW5nIHdpbGwgY29udmVydCBzaW5nbGUtZmluZ2VyIHRvdWNoIGlucHV0IHRvIG1vdXNlIGlucHV0LlwiLFxuICAgICAgICAgICAgICBcIkluZm86IFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgYW5kIHRoZSB1c2VyIGlzIHZpZXdpbmcgdGhlIHN0cmVhbSBvbiBhIGRldmljZSB3aXRoIGEgdG91Y2ggc2NyZWVuIHN1Y2ggYXMgYSBzbWFydHBob25lIG9yIHRhYmxldCwgdGhpcyBzZXR0aW5nIGNhdXNlcyBzaW5nbGUtZmluZ2VyIHRvdWNoIGV2ZW50cyB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgVW5yZWFsIEVuZ2luZSBhcHBsaWNhdGlvbiBhcyBtb3VzZSBjbGlja3MgYW5kIGRyYWcgZXZlbnRzLiBFbmFibGluZyB0aGlzIHNldHRpbmcgY2FuIHByb3ZpZGUgdXNlcnMgb24gbW9iaWxlIGRldmljZXMgd2l0aCB0aGUgYWJpbGl0eSB0byBwYXJ0aWFsbHkgY29udHJvbCB5b3VyIFVucmVhbCBFbmdpbmUgYXBwbGljYXRpb24sIGV2ZW4gd2hlbiB0aGUgYXBwbGljYXRpb24ncyBpbnB1dCBjb250cm9sbGVyIGRvZXMgbm90IHNwZWNpZmljYWxseSBoYW5kbGUgdG91Y2ggaW5wdXQgZXZlbnRzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBGb3JjZU1vbm9BdWRpbzogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoW1wiRm9yY2UgbW9ubyBhdWRpb3xcIiwgXCJPdmVycmlkZSAnRm9yY2VNb25vQXVkaW8nIG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCJdLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIEhvdmVyaW5nTW91c2U6IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlc2NyaWJlKFtcIkhvdmVyaW5nIG1vdXNlfFwiLCBcIk92ZXJyaWRlICdIb3ZlcmluZ01vdXNlJyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiXS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICAvLyBNYXRjaFZpZXdwb3J0UmVzOiB6YXQoXG4gICAgICAgIC8vICAgelxuICAgICAgICAvLyAgICAgLmJvb2xlYW4oKVxuICAgICAgICAvLyAgICAgLmRlc2NyaWJlKFtcIk1hdGNoVmlld3BvcnRSZXN8XCIsIFwiT3ZlcnJpZGUgbWF0Y2ggdmlld3BvcnQgcmVzIHByb3BlcnR5IG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCJdLmpvaW4oXCJcXG5cIikpXG4gICAgICAgIC8vICkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gU3VwcHJlc3NCcm93c2VyS2V5czogemF0KFxuICAgICAgICAvLyAgIHpcbiAgICAgICAgLy8gICAgIC5ib29sZWFuKClcbiAgICAgICAgLy8gICAgIC5kZXNjcmliZShcbiAgICAgICAgLy8gICAgICAgW1wiU3VwcHJlc3NCcm93c2VyS2V5c3xcIiwgXCJPdmVycmlkZSBzdXBwcmVzcyBicm93c2VyIGtleXMgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi5cIl0uam9pbihcIlxcblwiKVxuICAgICAgICAvLyAgICAgKVxuICAgICAgICAvLyApLm9wdGlvbmFsKCksXG5cbiAgICAgICAgLy8gVGhlc2UgbWFrZSBubyBzZW5zZSwgc2luY2UgdGhlIGRhdGEgZmxvd3Mgb25seSB3aXRoIHRoZSBzdHJlYW1JbmZvXG4gICAgICAgIC8vIEF1dG9Db25uZWN0OiB6YXQoXG4gICAgICAgIC8vICAgei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSkuZGVzY3JpYmUoW1wiQXV0b0Nvbm5lY3R8XCIsIFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAvLyApLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIFN0YXJ0VmlkZW9NdXRlZDogemF0KFxuICAgICAgICAvLyAgIHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSkuZGVzY3JpYmUoW1wiU3RhcnRWaWRlb011dGVkfFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgLy8gKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBBdXRvUGxheVZpZGVvOiB6YXQoXG4gICAgICAgIC8vICAgei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKS5kZXNjcmliZShbXCJBdXRvUGxheVZpZGVvfFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgLy8gKS5vcHRpb25hbCgpLFxuXG4gICAgICAgIC8vIE5vIGVmZmVjdDpcbiAgICAgICAgLy8gRm9yY2VUVVJOOiB6YXQoei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiRm9yY2VUVVJOfFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIEFGS1RpbWVvdXQ6IHphdCh6Lm51bWJlcigpLmRlc2NyaWJlKFtcIkFGS1RpbWVvdXR8XCIsIFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gTWF4UVA6IHphdCh6Lm51bWJlcigpLmludCgpLm1pbigpLm1heCgpLmRlc2NyaWJlKFtcIlRvZG8gVGl0bGV8XCIsXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBNaW5RUDogemF0KHoubnVtYmVyKCkuaW50KCkubWluKCkubWF4KCkuZGVzY3JpYmUoW1wiVG9kbyBUaXRsZXxcIixcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIE9mZmVyVG9SZWNlaXZlOiB6YXQoei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiVG9kbyBUaXRsZXxcIixcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIFByZWZlcnJlZENvZGVjOiB6YXQoei5saXRlcmFsKCkuZGVzY3JpYmUoW1wiVG9kbyBUaXRsZXxcIixcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIHByZWZlclNGVTogemF0KHouYm9vbGVhbigpLmRlc2NyaWJlKFtcIlRvZG8gVGl0bGV8XCIsXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBTdHJlYW1lcklkOiB6YXQoei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiVG9kbyBUaXRsZXxcIixcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIFRpbWVvdXRJZklkbGU6IHphdCh6LmJvb2xlYW4oKS5kZXNjcmliZShbXCJUb2RvIFRpdGxlfFwiLFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcblxuICAgICAgICAvLyBEb24ndCBrbm93IHdoZXRoZXIgd2Ugd2FudCB0byBoYXZlIHRoYXQgb3Igbm90LlxuICAgICAgICAvLyBDb250cm9sc1F1YWxpdHk6IHphdCh6LmJvb2xlYW4oKS5kZXNjcmliZShbXCJDb250cm9sc1F1YWxpdHl8XCIsIFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gV2ViUlRDRlBTOiB6YXQoei5udW1iZXIoKS5kZXNjcmliZShbXCJXZWJSVENGUFN8XCIsIFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gV2ViUlRDTWF4Qml0cmF0ZTogemF0KHoubnVtYmVyKCkuZGVzY3JpYmUoW1wiV2ViUlRDTWF4Qml0cmF0ZXxcIiwgXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBXZWJSVENNaW5CaXRyYXRlOiB6YXQoei5udW1iZXIoKS5kZXNjcmliZShbXCJXZWJSVENNaW5CaXRyYXRlfFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICB9KVxuICAgICAgLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL0Vycm9yTWVzc2FnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTG92ZUxldHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vU2Vzc2lvbklkXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdHJlYW1JbmZvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdGF0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUGluZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUXVldWVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1ZlcnNpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL1dlYlNka1NldHRpbmdzXCI7XG5cbmltcG9ydCB7IFpTdGF0cyB9IGZyb20gXCIuL1N0YXRzXCI7XG5cbmV4cG9ydCBjb25zdCBTZW5kID0ge1xuICBzdGF0czogWlN0YXRzLFxufTtcblxuZXhwb3J0IHR5cGUgU2VuZCA9IFwib25WaWRlb0luaXRpYWxpemVkXCI7XG4iLCJleHBvcnQgKiBhcyBNZXNzYWdlcyBmcm9tIFwiLi9NZXNzYWdlc1wiO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnB1c2goXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMucHVzaChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3dzIGRvZXMgbm90IHdvcmsgaW4gdGhlIGJyb3dzZXIuIEJyb3dzZXIgY2xpZW50cyBtdXN0IHVzZSB0aGUgbmF0aXZlICcgK1xuICAgICAgJ1dlYlNvY2tldCBvYmplY3QnXG4gICk7XG59O1xuIiwiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChlKSB7XG4gIGlmICh2b2lkIDAgPT09IGUpIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgcmV0dXJuIGU7XG59XG5leHBvcnQgeyBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgdG9Qcm9wZXJ0eUtleSBmcm9tIFwiLi90b1Byb3BlcnR5S2V5LmpzXCI7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyhlLCByKSB7XG4gIGZvciAodmFyIHQgPSAwOyB0IDwgci5sZW5ndGg7IHQrKykge1xuICAgIHZhciBvID0gclt0XTtcbiAgICBvLmVudW1lcmFibGUgPSBvLmVudW1lcmFibGUgfHwgITEsIG8uY29uZmlndXJhYmxlID0gITAsIFwidmFsdWVcIiBpbiBvICYmIChvLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdG9Qcm9wZXJ0eUtleShvLmtleSksIG8pO1xuICB9XG59XG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoZSwgciwgdCkge1xuICByZXR1cm4gciAmJiBfZGVmaW5lUHJvcGVydGllcyhlLnByb3RvdHlwZSwgciksIHQgJiYgX2RlZmluZVByb3BlcnRpZXMoZSwgdCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6ICExXG4gIH0pLCBlO1xufVxuZXhwb3J0IHsgX2NyZWF0ZUNsYXNzIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHtcbiAgICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykge1xuICAgICAgdmFyIHQgPSBhcmd1bWVudHNbZV07XG4gICAgICBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbmV4cG9ydCB7IF9leHRlbmRzIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgc2V0UHJvdG90eXBlT2YgZnJvbSBcIi4vc2V0UHJvdG90eXBlT2YuanNcIjtcbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHQsIG8pIHtcbiAgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSwgdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSB0LCBzZXRQcm90b3R5cGVPZih0LCBvKTtcbn1cbmV4cG9ydCB7IF9pbmhlcml0c0xvb3NlIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShyLCBlKSB7XG4gIGlmIChudWxsID09IHIpIHJldHVybiB7fTtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgbiBpbiByKSBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSkge1xuICAgIGlmICgtMSAhPT0gZS5pbmRleE9mKG4pKSBjb250aW51ZTtcbiAgICB0W25dID0gcltuXTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmV4cG9ydCB7IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlIGFzIGRlZmF1bHQgfTsiLCJmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YodCwgZSkge1xuICByZXR1cm4gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uICh0LCBlKSB7XG4gICAgcmV0dXJuIHQuX19wcm90b19fID0gZSwgdDtcbiAgfSwgX3NldFByb3RvdHlwZU9mKHQsIGUpO1xufVxuZXhwb3J0IHsgX3NldFByb3RvdHlwZU9mIGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiLi90eXBlb2YuanNcIjtcbmZ1bmN0aW9uIHRvUHJpbWl0aXZlKHQsIHIpIHtcbiAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7XG4gIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAodm9pZCAwICE9PSBlKSB7XG4gICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKFwib2JqZWN0XCIgIT0gX3R5cGVvZihpKSkgcmV0dXJuIGk7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7XG59XG5leHBvcnQgeyB0b1ByaW1pdGl2ZSBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5pbXBvcnQgdG9QcmltaXRpdmUgZnJvbSBcIi4vdG9QcmltaXRpdmUuanNcIjtcbmZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkge1xuICB2YXIgaSA9IHRvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gXCJzeW1ib2xcIiA9PSBfdHlwZW9mKGkpID8gaSA6IGkgKyBcIlwiO1xufVxuZXhwb3J0IHsgdG9Qcm9wZXJ0eUtleSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX3R5cGVvZihvKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICByZXR1cm4gX3R5cGVvZiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIFwic3ltYm9sXCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvO1xuICB9IDogZnVuY3Rpb24gKG8pIHtcbiAgICByZXR1cm4gbyAmJiBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBvLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgbyAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2YgbztcbiAgfSwgX3R5cGVvZihvKTtcbn1cbmV4cG9ydCB7IF90eXBlb2YgYXMgZGVmYXVsdCB9OyIsInZhciB1dGlsO1xuKGZ1bmN0aW9uICh1dGlsKSB7XG4gICAgdXRpbC5hc3NlcnRFcXVhbCA9ICh2YWwpID0+IHZhbDtcbiAgICBmdW5jdGlvbiBhc3NlcnRJcyhfYXJnKSB7IH1cbiAgICB1dGlsLmFzc2VydElzID0gYXNzZXJ0SXM7XG4gICAgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIoX3gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0TmV2ZXIgPSBhc3NlcnROZXZlcjtcbiAgICB1dGlsLmFycmF5VG9FbnVtID0gKGl0ZW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIG9ialtpdGVtXSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICAgIHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzID0gKG9iaikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB1dGlsLm9iamVjdEtleXMob2JqKS5maWx0ZXIoKGspID0+IHR5cGVvZiBvYmpbb2JqW2tdXSAhPT0gXCJudW1iZXJcIik7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0ge307XG4gICAgICAgIGZvciAoY29uc3QgayBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkW2tdID0gb2JqW2tdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdFZhbHVlcyhmaWx0ZXJlZCk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdFZhbHVlcyA9IChvYmopID0+IHtcbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0S2V5cyhvYmopLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ialtlXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdEtleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09IFwiZnVuY3Rpb25cIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgPyAob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA6IChvYmplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9O1xuICAgIHV0aWwuZmluZCA9IChhcnIsIGNoZWNrZXIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgICAgICAgICAgaWYgKGNoZWNrZXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHV0aWwuaXNJbnRlZ2VyID0gdHlwZW9mIE51bWJlci5pc0ludGVnZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/ICh2YWwpID0+IE51bWJlci5pc0ludGVnZXIodmFsKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICYmIGlzRmluaXRlKHZhbCkgJiYgTWF0aC5mbG9vcih2YWwpID09PSB2YWw7XG4gICAgZnVuY3Rpb24gam9pblZhbHVlcyhhcnJheSwgc2VwYXJhdG9yID0gXCIgfCBcIikge1xuICAgICAgICByZXR1cm4gYXJyYXlcbiAgICAgICAgICAgIC5tYXAoKHZhbCkgPT4gKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgPyBgJyR7dmFsfSdgIDogdmFsKSlcbiAgICAgICAgICAgIC5qb2luKHNlcGFyYXRvcik7XG4gICAgfVxuICAgIHV0aWwuam9pblZhbHVlcyA9IGpvaW5WYWx1ZXM7XG4gICAgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIgPSAoXywgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG59KSh1dGlsIHx8ICh1dGlsID0ge30pKTtcbnZhciBvYmplY3RVdGlsO1xuKGZ1bmN0aW9uIChvYmplY3RVdGlsKSB7XG4gICAgb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyA9IChmaXJzdCwgc2Vjb25kKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5maXJzdCxcbiAgICAgICAgICAgIC4uLnNlY29uZCwgLy8gc2Vjb25kIG92ZXJ3cml0ZXMgZmlyc3RcbiAgICAgICAgfTtcbiAgICB9O1xufSkob2JqZWN0VXRpbCB8fCAob2JqZWN0VXRpbCA9IHt9KSk7XG5jb25zdCBab2RQYXJzZWRUeXBlID0gdXRpbC5hcnJheVRvRW51bShbXG4gICAgXCJzdHJpbmdcIixcbiAgICBcIm5hblwiLFxuICAgIFwibnVtYmVyXCIsXG4gICAgXCJpbnRlZ2VyXCIsXG4gICAgXCJmbG9hdFwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwiZGF0ZVwiLFxuICAgIFwiYmlnaW50XCIsXG4gICAgXCJzeW1ib2xcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgXCJ1bmRlZmluZWRcIixcbiAgICBcIm51bGxcIixcbiAgICBcImFycmF5XCIsXG4gICAgXCJvYmplY3RcIixcbiAgICBcInVua25vd25cIixcbiAgICBcInByb21pc2VcIixcbiAgICBcInZvaWRcIixcbiAgICBcIm5ldmVyXCIsXG4gICAgXCJtYXBcIixcbiAgICBcInNldFwiLFxuXSk7XG5jb25zdCBnZXRQYXJzZWRUeXBlID0gKGRhdGEpID0+IHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZDtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3RyaW5nO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4oZGF0YSkgPyBab2RQYXJzZWRUeXBlLm5hbiA6IFpvZFBhcnNlZFR5cGUubnVtYmVyO1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuYm9vbGVhbjtcbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbjtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuYmlnaW50O1xuICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5zeW1ib2w7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuYXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLm51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YS50aGVuICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGRhdGEudGhlbiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICAgICAgZGF0YS5jYXRjaCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBkYXRhLmNhdGNoID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5wcm9taXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBNYXAgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLm1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgU2V0ICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5zZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIERhdGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5kYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUub2JqZWN0O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUudW5rbm93bjtcbiAgICB9XG59O1xuXG5jb25zdCBab2RJc3N1ZUNvZGUgPSB1dGlsLmFycmF5VG9FbnVtKFtcbiAgICBcImludmFsaWRfdHlwZVwiLFxuICAgIFwiaW52YWxpZF9saXRlcmFsXCIsXG4gICAgXCJjdXN0b21cIixcbiAgICBcImludmFsaWRfdW5pb25cIixcbiAgICBcImludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvclwiLFxuICAgIFwiaW52YWxpZF9lbnVtX3ZhbHVlXCIsXG4gICAgXCJ1bnJlY29nbml6ZWRfa2V5c1wiLFxuICAgIFwiaW52YWxpZF9hcmd1bWVudHNcIixcbiAgICBcImludmFsaWRfcmV0dXJuX3R5cGVcIixcbiAgICBcImludmFsaWRfZGF0ZVwiLFxuICAgIFwiaW52YWxpZF9zdHJpbmdcIixcbiAgICBcInRvb19zbWFsbFwiLFxuICAgIFwidG9vX2JpZ1wiLFxuICAgIFwiaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXNcIixcbiAgICBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICAgIFwibm90X2Zpbml0ZVwiLFxuXSk7XG5jb25zdCBxdW90ZWxlc3NKc29uID0gKG9iaikgPT4ge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgIHJldHVybiBqc29uLnJlcGxhY2UoL1wiKFteXCJdKylcIjovZywgXCIkMTpcIik7XG59O1xuY2xhc3MgWm9kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoaXNzdWVzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaXNzdWVzID0gW107XG4gICAgICAgIHRoaXMuYWRkSXNzdWUgPSAoc3ViKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzc3VlcyA9IFsuLi50aGlzLmlzc3Vlcywgc3ViXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZGRJc3N1ZXMgPSAoc3VicyA9IFtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzc3VlcyA9IFsuLi50aGlzLmlzc3VlcywgLi4uc3Vic107XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFjdHVhbFByb3RvID0gbmV3LnRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBiYW4vYmFuXG4gICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgYWN0dWFsUHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fX3Byb3RvX18gPSBhY3R1YWxQcm90bztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5hbWUgPSBcIlpvZEVycm9yXCI7XG4gICAgICAgIHRoaXMuaXNzdWVzID0gaXNzdWVzO1xuICAgIH1cbiAgICBnZXQgZXJyb3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc3N1ZXM7XG4gICAgfVxuICAgIGZvcm1hdChfbWFwcGVyKSB7XG4gICAgICAgIGNvbnN0IG1hcHBlciA9IF9tYXBwZXIgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChpc3N1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpc3N1ZS5tZXNzYWdlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3VuaW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWUudW5pb25FcnJvcnMubWFwKHByb2Nlc3NFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9yZXR1cm5fdHlwZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcihpc3N1ZS5yZXR1cm5UeXBlRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfYXJndW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLmFyZ3VtZW50c0Vycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUucGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRFcnJvcnMuX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnIgPSBmaWVsZEVycm9ycztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGlzc3VlLnBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGlzc3VlLnBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbCA9IGkgPT09IGlzc3VlLnBhdGgubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGVybWluYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodHlwZW9mIGVsID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKHR5cGVvZiBlbCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc3QgZXJyb3JBcnJheTogYW55ID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBlcnJvckFycmF5Ll9lcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgZXJyb3JBcnJheTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyW2VsXS5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY3VycltlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHByb2Nlc3NFcnJvcih0aGlzKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkRXJyb3JzO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9XG4gICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmlzc3VlcywgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIsIDIpO1xuICAgIH1cbiAgICBnZXQgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgZmxhdHRlbihtYXBwZXIgPSAoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybUVycm9ycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLmlzc3Vlcykge1xuICAgICAgICAgICAgaWYgKHN1Yi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gPSBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gfHwgW107XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybUVycm9ycy5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBmb3JtRXJyb3JzLCBmaWVsZEVycm9ycyB9O1xuICAgIH1cbiAgICBnZXQgZm9ybUVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxhdHRlbigpO1xuICAgIH1cbn1cblpvZEVycm9yLmNyZWF0ZSA9IChpc3N1ZXMpID0+IHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihpc3N1ZXMpO1xuICAgIHJldHVybiBlcnJvcjtcbn07XG5cbmNvbnN0IGVycm9yTWFwID0gKGlzc3VlLCBfY3R4KSA9PiB7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgc3dpdGNoIChpc3N1ZS5jb2RlKSB7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZTpcbiAgICAgICAgICAgIGlmIChpc3N1ZS5yZWNlaXZlZCA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJSZXF1aXJlZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBFeHBlY3RlZCAke2lzc3VlLmV4cGVjdGVkfSwgcmVjZWl2ZWQgJHtpc3N1ZS5yZWNlaXZlZH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfbGl0ZXJhbDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KGlzc3VlLmV4cGVjdGVkLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlcil9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5czpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgVW5yZWNvZ25pemVkIGtleShzKSBpbiBvYmplY3Q6ICR7dXRpbC5qb2luVmFsdWVzKGlzc3VlLmtleXMsIFwiLCBcIil9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3I6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZGlzY3JpbWluYXRvciB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2VudW1fdmFsdWU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9LCByZWNlaXZlZCAnJHtpc3N1ZS5yZWNlaXZlZH0nYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2FyZ3VtZW50czpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBmdW5jdGlvbiBhcmd1bWVudHNgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfcmV0dXJuX3R5cGU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZnVuY3Rpb24gcmV0dXJuIHR5cGVgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkYXRlYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZzpcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUudmFsaWRhdGlvbiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChcImluY2x1ZGVzXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSBcIiR7aXNzdWUudmFsaWRhdGlvbi5pbmNsdWRlc31cImA7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXNzdWUudmFsaWRhdGlvbi5wb3NpdGlvbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGAke21lc3NhZ2V9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9ufWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXCJzdGFydHNXaXRoXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3Qgc3RhcnQgd2l0aCBcIiR7aXNzdWUudmFsaWRhdGlvbi5zdGFydHNXaXRofVwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoXCJlbmRzV2l0aFwiIGluIGlzc3VlLnZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoIFwiJHtpc3N1ZS52YWxpZGF0aW9uLmVuZHNXaXRofVwiYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUudmFsaWRhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudmFsaWRhdGlvbiAhPT0gXCJyZWdleFwiKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkICR7aXNzdWUudmFsaWRhdGlvbn1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLnRvb19zbWFsbDpcbiAgICAgICAgICAgIGlmIChpc3N1ZS50eXBlID09PSBcImFycmF5XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IFwiZXhhY3RseVwiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBtb3JlIHRoYW5gfSAke2lzc3VlLm1pbmltdW19IGVsZW1lbnQocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IFwiZXhhY3RseVwiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBvdmVyYH0gJHtpc3N1ZS5taW5pbXVtfSBjaGFyYWN0ZXIocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseSBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgZ3JlYXRlciB0aGFuIGB9JHtpc3N1ZS5taW5pbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImRhdGVcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHkgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGdyZWF0ZXIgdGhhbiBgfSR7bmV3IERhdGUoTnVtYmVyKGlzc3VlLm1pbmltdW0pKX1gO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS50b29fYmlnOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnR5cGUgPT09IFwiYXJyYXlcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IG1vc3RgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX0gZWxlbWVudChzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IG1vc3RgIDogYHVuZGVyYH0gJHtpc3N1ZS5tYXhpbXVtfSBjaGFyYWN0ZXIocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseWBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGxlc3MgdGhhbiBvciBlcXVhbCB0b2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX1gO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJiaWdpbnRcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEJpZ0ludCBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseWBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGxlc3MgdGhhbiBvciBlcXVhbCB0b2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX1gO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJkYXRlXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBEYXRlIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5YFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgc21hbGxlciB0aGFuYH0gJHtuZXcgRGF0ZShOdW1iZXIoaXNzdWUubWF4aW11bSkpfWA7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmN1c3RvbTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludGVyc2VjdGlvbiByZXN1bHRzIGNvdWxkIG5vdCBiZSBtZXJnZWRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAke2lzc3VlLm11bHRpcGxlT2Z9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5ub3RfZmluaXRlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IFwiTnVtYmVyIG11c3QgYmUgZmluaXRlXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBfY3R4LmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUpO1xuICAgIH1cbiAgICByZXR1cm4geyBtZXNzYWdlIH07XG59O1xuXG5sZXQgb3ZlcnJpZGVFcnJvck1hcCA9IGVycm9yTWFwO1xuZnVuY3Rpb24gc2V0RXJyb3JNYXAobWFwKSB7XG4gICAgb3ZlcnJpZGVFcnJvck1hcCA9IG1hcDtcbn1cbmZ1bmN0aW9uIGdldEVycm9yTWFwKCkge1xuICAgIHJldHVybiBvdmVycmlkZUVycm9yTWFwO1xufVxuXG5jb25zdCBtYWtlSXNzdWUgPSAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCBwYXRoLCBlcnJvck1hcHMsIGlzc3VlRGF0YSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gWy4uLnBhdGgsIC4uLihpc3N1ZURhdGEucGF0aCB8fCBbXSldO1xuICAgIGNvbnN0IGZ1bGxJc3N1ZSA9IHtcbiAgICAgICAgLi4uaXNzdWVEYXRhLFxuICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICB9O1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSBcIlwiO1xuICAgIGNvbnN0IG1hcHMgPSBlcnJvck1hcHNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gISFtKVxuICAgICAgICAuc2xpY2UoKVxuICAgICAgICAucmV2ZXJzZSgpO1xuICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gbWFwKGZ1bGxJc3N1ZSwgeyBkYXRhLCBkZWZhdWx0RXJyb3I6IGVycm9yTWVzc2FnZSB9KS5tZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5pc3N1ZURhdGEsXG4gICAgICAgIHBhdGg6IGZ1bGxQYXRoLFxuICAgICAgICBtZXNzYWdlOiBpc3N1ZURhdGEubWVzc2FnZSB8fCBlcnJvck1lc3NhZ2UsXG4gICAgfTtcbn07XG5jb25zdCBFTVBUWV9QQVRIID0gW107XG5mdW5jdGlvbiBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIGlzc3VlRGF0YSkge1xuICAgIGNvbnN0IGlzc3VlID0gbWFrZUlzc3VlKHtcbiAgICAgICAgaXNzdWVEYXRhOiBpc3N1ZURhdGEsXG4gICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCxcbiAgICAgICAgICAgIGdldEVycm9yTWFwKCksXG4gICAgICAgICAgICBlcnJvck1hcCwgLy8gdGhlbiBnbG9iYWwgZGVmYXVsdCBtYXBcbiAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgfSk7XG4gICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaChpc3N1ZSk7XG59XG5jbGFzcyBQYXJzZVN0YXR1cyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcInZhbGlkXCI7XG4gICAgfVxuICAgIGRpcnR5KCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSA9PT0gXCJ2YWxpZFwiKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiZGlydHlcIjtcbiAgICB9XG4gICAgYWJvcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlICE9PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcImFib3J0ZWRcIjtcbiAgICB9XG4gICAgc3RhdGljIG1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKSB7XG4gICAgICAgIGNvbnN0IGFycmF5VmFsdWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmIChzLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAocy5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGFycmF5VmFsdWUucHVzaChzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGFycmF5VmFsdWUgfTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIG1lcmdlT2JqZWN0QXN5bmMoc3RhdHVzLCBwYWlycykge1xuICAgICAgICBjb25zdCBzeW5jUGFpcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICBzeW5jUGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBhd2FpdCBwYWlyLmtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogYXdhaXQgcGFpci52YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBzeW5jUGFpcnMpO1xuICAgIH1cbiAgICBzdGF0aWMgbWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpIHtcbiAgICAgICAgY29uc3QgZmluYWxPYmplY3QgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHBhaXI7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBpZiAoa2V5LnZhbHVlICE9PSBcIl9fcHJvdG9fX1wiICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiB2YWx1ZS52YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiB8fCBwYWlyLmFsd2F5c1NldCkpIHtcbiAgICAgICAgICAgICAgICBmaW5hbE9iamVjdFtrZXkudmFsdWVdID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBmaW5hbE9iamVjdCB9O1xuICAgIH1cbn1cbmNvbnN0IElOVkFMSUQgPSBPYmplY3QuZnJlZXplKHtcbiAgICBzdGF0dXM6IFwiYWJvcnRlZFwiLFxufSk7XG5jb25zdCBESVJUWSA9ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiBcImRpcnR5XCIsIHZhbHVlIH0pO1xuY29uc3QgT0sgPSAodmFsdWUpID0+ICh7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZSB9KTtcbmNvbnN0IGlzQWJvcnRlZCA9ICh4KSA9PiB4LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCI7XG5jb25zdCBpc0RpcnR5ID0gKHgpID0+IHguc3RhdHVzID09PSBcImRpcnR5XCI7XG5jb25zdCBpc1ZhbGlkID0gKHgpID0+IHguc3RhdHVzID09PSBcInZhbGlkXCI7XG5jb25zdCBpc0FzeW5jID0gKHgpID0+IHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHggaW5zdGFuY2VvZiBQcm9taXNlO1xuXG52YXIgZXJyb3JVdGlsO1xuKGZ1bmN0aW9uIChlcnJvclV0aWwpIHtcbiAgICBlcnJvclV0aWwuZXJyVG9PYmogPSAobWVzc2FnZSkgPT4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2UgfSA6IG1lc3NhZ2UgfHwge307XG4gICAgZXJyb3JVdGlsLnRvU3RyaW5nID0gKG1lc3NhZ2UpID0+IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZSA6IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5tZXNzYWdlO1xufSkoZXJyb3JVdGlsIHx8IChlcnJvclV0aWwgPSB7fSkpO1xuXG5jbGFzcyBQYXJzZUlucHV0TGF6eVBhdGgge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgdmFsdWUsIHBhdGgsIGtleSkge1xuICAgICAgICB0aGlzLl9jYWNoZWRQYXRoID0gW107XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fcGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuX2tleSA9IGtleTtcbiAgICB9XG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGVkUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9rZXkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCAuLi50aGlzLl9rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsIHRoaXMuX2tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFBhdGg7XG4gICAgfVxufVxuY29uc3QgaGFuZGxlUmVzdWx0ID0gKGN0eCwgcmVzdWx0KSA9PiB7XG4gICAgaWYgKGlzVmFsaWQocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHQudmFsdWUgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Vycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuZnVuY3Rpb24gcHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcylcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIGNvbnN0IHsgZXJyb3JNYXAsIGludmFsaWRfdHlwZV9lcnJvciwgcmVxdWlyZWRfZXJyb3IsIGRlc2NyaXB0aW9uIH0gPSBwYXJhbXM7XG4gICAgaWYgKGVycm9yTWFwICYmIChpbnZhbGlkX3R5cGVfZXJyb3IgfHwgcmVxdWlyZWRfZXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdXNlIFwiaW52YWxpZF90eXBlX2Vycm9yXCIgb3IgXCJyZXF1aXJlZF9lcnJvclwiIGluIGNvbmp1bmN0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1hcC5gKTtcbiAgICB9XG4gICAgaWYgKGVycm9yTWFwKVxuICAgICAgICByZXR1cm4geyBlcnJvck1hcDogZXJyb3JNYXAsIGRlc2NyaXB0aW9uIH07XG4gICAgY29uc3QgY3VzdG9tTWFwID0gKGlzcywgY3R4KSA9PiB7XG4gICAgICAgIGlmIChpc3MuY29kZSAhPT0gXCJpbnZhbGlkX3R5cGVcIilcbiAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBjdHguZGF0YSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogcmVxdWlyZWRfZXJyb3IgIT09IG51bGwgJiYgcmVxdWlyZWRfZXJyb3IgIT09IHZvaWQgMCA/IHJlcXVpcmVkX2Vycm9yIDogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IGludmFsaWRfdHlwZV9lcnJvciAhPT0gbnVsbCAmJiBpbnZhbGlkX3R5cGVfZXJyb3IgIT09IHZvaWQgMCA/IGludmFsaWRfdHlwZV9lcnJvciA6IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICB9O1xuICAgIHJldHVybiB7IGVycm9yTWFwOiBjdXN0b21NYXAsIGRlc2NyaXB0aW9uIH07XG59XG5jbGFzcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcihkZWYpIHtcbiAgICAgICAgLyoqIEFsaWFzIG9mIHNhZmVQYXJzZUFzeW5jICovXG4gICAgICAgIHRoaXMuc3BhID0gdGhpcy5zYWZlUGFyc2VBc3luYztcbiAgICAgICAgdGhpcy5fZGVmID0gZGVmO1xuICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5wYXJzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNhZmVQYXJzZSA9IHRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGFyc2VBc3luYyA9IHRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNhZmVQYXJzZUFzeW5jID0gdGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNwYSA9IHRoaXMuc3BhLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVmaW5lID0gdGhpcy5yZWZpbmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZpbmVtZW50ID0gdGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3VwZXJSZWZpbmUgPSB0aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubnVsbGFibGUgPSB0aGlzLm51bGxhYmxlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubnVsbGlzaCA9IHRoaXMubnVsbGlzaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFycmF5ID0gdGhpcy5hcnJheS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnByb21pc2UgPSB0aGlzLnByb21pc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vciA9IHRoaXMub3IuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5hbmQgPSB0aGlzLmFuZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYnJhbmQgPSB0aGlzLmJyYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVmYXVsdCA9IHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNhdGNoID0gdGhpcy5jYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRlc2NyaWJlID0gdGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnBpcGUgPSB0aGlzLnBpcGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWFkb25seSA9IHRoaXMucmVhZG9ubHkuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc051bGxhYmxlID0gdGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaXNPcHRpb25hbCA9IHRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIF9nZXRUeXBlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBfZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCkge1xuICAgICAgICByZXR1cm4gKGN0eCB8fCB7XG4gICAgICAgICAgICBjb21tb246IGlucHV0LnBhcmVudC5jb21tb24sXG4gICAgICAgICAgICBkYXRhOiBpbnB1dC5kYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXRoOiBpbnB1dC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBpbnB1dC5wYXJlbnQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IG5ldyBQYXJzZVN0YXR1cygpLFxuICAgICAgICAgICAgY3R4OiB7XG4gICAgICAgICAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLFxuICAgICAgICAgICAgICAgIGRhdGE6IGlucHV0LmRhdGEsXG4gICAgICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKSxcbiAgICAgICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgICAgIHBhdGg6IGlucHV0LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBpbnB1dC5wYXJlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBfcGFyc2VTeW5jKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKGlzQXN5bmMocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY2hyb25vdXMgcGFyc2UgZW5jb3VudGVyZWQgcHJvbWlzZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX3BhcnNlQXN5bmMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2UoaW5wdXQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuICAgIHBhcnNlKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNhZmVQYXJzZShkYXRhLCBwYXJhbXMpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgc2FmZVBhcnNlKGRhdGEsIHBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgYXN5bmM6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5hc3luYykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGV4dHVhbEVycm9yTWFwOiBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuZXJyb3JNYXAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYXRoKSB8fCBbXSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VTeW5jKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVzdWx0KGN0eCwgcmVzdWx0KTtcbiAgICB9XG4gICAgYXN5bmMgcGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zYWZlUGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgYXN5bmMgc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgY29udGV4dHVhbEVycm9yTWFwOiBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYXRoKSB8fCBbXSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWF5YmVBc3luY1Jlc3VsdCA9IHRoaXMuX3BhcnNlKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAoaXNBc3luYyhtYXliZUFzeW5jUmVzdWx0KVxuICAgICAgICAgICAgPyBtYXliZUFzeW5jUmVzdWx0XG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShtYXliZUFzeW5jUmVzdWx0KSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpO1xuICAgIH1cbiAgICByZWZpbmUoY2hlY2ssIG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZ2V0SXNzdWVQcm9wZXJ0aWVzID0gKHZhbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBtZXNzYWdlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVjayh2YWwpO1xuICAgICAgICAgICAgY29uc3Qgc2V0RXJyb3IgPSAoKSA9PiBjdHguYWRkSXNzdWUoe1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5jdXN0b20sXG4gICAgICAgICAgICAgICAgLi4uZ2V0SXNzdWVQcm9wZXJ0aWVzKHZhbCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHNldEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWZpbmVtZW50KGNoZWNrLCByZWZpbmVtZW50RGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudCgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGlmICghY2hlY2sodmFsKSkge1xuICAgICAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh0eXBlb2YgcmVmaW5lbWVudERhdGEgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA/IHJlZmluZW1lbnREYXRhKHZhbCwgY3R4KVxuICAgICAgICAgICAgICAgICAgICA6IHJlZmluZW1lbnREYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9yZWZpbmVtZW50KHJlZmluZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgICAgIGVmZmVjdDogeyB0eXBlOiBcInJlZmluZW1lbnRcIiwgcmVmaW5lbWVudCB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3VwZXJSZWZpbmUocmVmaW5lbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudChyZWZpbmVtZW50KTtcbiAgICB9XG4gICAgb3B0aW9uYWwoKSB7XG4gICAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgbnVsbGFibGUoKSB7XG4gICAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgbnVsbGlzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpO1xuICAgIH1cbiAgICBhcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZEFycmF5LmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gWm9kUHJvbWlzZS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgb3Iob3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBab2RVbmlvbi5jcmVhdGUoW3RoaXMsIG9wdGlvbl0sIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIGFuZChpbmNvbWluZykge1xuICAgICAgICByZXR1cm4gWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZSh0aGlzLCBpbmNvbWluZywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtKHRyYW5zZm9ybSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwidHJhbnNmb3JtXCIsIHRyYW5zZm9ybSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVmYXVsdChkZWYpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlRnVuYyA9IHR5cGVvZiBkZWYgPT09IFwiZnVuY3Rpb25cIiA/IGRlZiA6ICgpID0+IGRlZjtcbiAgICAgICAgcmV0dXJuIG5ldyBab2REZWZhdWx0KHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlRnVuYyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGJyYW5kKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEJyYW5kZWQoe1xuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCcmFuZGVkLFxuICAgICAgICAgICAgdHlwZTogdGhpcyxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoKGRlZikge1xuICAgICAgICBjb25zdCBjYXRjaFZhbHVlRnVuYyA9IHR5cGVvZiBkZWYgPT09IFwiZnVuY3Rpb25cIiA/IGRlZiA6ICgpID0+IGRlZjtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RDYXRjaCh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBpbm5lclR5cGU6IHRoaXMsXG4gICAgICAgICAgICBjYXRjaFZhbHVlOiBjYXRjaFZhbHVlRnVuYyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQ2F0Y2gsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZXNjcmliZShkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCBUaGlzID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBUaGlzKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGlwZSh0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFpvZFBpcGVsaW5lLmNyZWF0ZSh0aGlzLCB0YXJnZXQpO1xuICAgIH1cbiAgICByZWFkb25seSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZFJlYWRvbmx5LmNyZWF0ZSh0aGlzKTtcbiAgICB9XG4gICAgaXNPcHRpb25hbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKHVuZGVmaW5lZCkuc3VjY2VzcztcbiAgICB9XG4gICAgaXNOdWxsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKG51bGwpLnN1Y2Nlc3M7XG4gICAgfVxufVxuY29uc3QgY3VpZFJlZ2V4ID0gL15jW15cXHMtXXs4LH0kL2k7XG5jb25zdCBjdWlkMlJlZ2V4ID0gL15bYS16XVthLXowLTldKiQvO1xuY29uc3QgdWxpZFJlZ2V4ID0gL15bMC05QS1ISktNTlAtVFYtWl17MjZ9JC87XG4vLyBjb25zdCB1dWlkUmVnZXggPVxuLy8gICAvXihbYS1mMC05XXs4fS1bYS1mMC05XXs0fS1bMS01XVthLWYwLTldezN9LVthLWYwLTldezR9LVthLWYwLTldezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO1xuY29uc3QgdXVpZFJlZ2V4ID0gL15bMC05YS1mQS1GXXs4fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXsxMn0kL2k7XG4vLyBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NjE4MS8xNTUwMTU1XG4vLyBvbGQgdmVyc2lvbjogdG9vIHNsb3csIGRpZG4ndCBzdXBwb3J0IHVuaWNvZGVcbi8vIGNvbnN0IGVtYWlsUmVnZXggPSAvXigoKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSsoXFwuKFthLXpdfFxcZHxbISNcXCQlJidcXCpcXCtcXC1cXC89XFw/XFxeX2B7XFx8fX5dfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSspKil8KChcXHgyMikoKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPygoW1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4N2ZdfFxceDIxfFtcXHgyMy1cXHg1Yl18W1xceDVkLVxceDdlXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KFxcXFwoW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBkLVxceDdmXXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSkqKCgoXFx4MjB8XFx4MDkpKihcXHgwZFxceDBhKSk/KFxceDIwfFxceDA5KSspPyhcXHgyMikpKUAoKChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18XFxkfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpXFwuKSsoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoKFthLXpdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKShbYS16XXxcXGR8LXxcXC58X3x+fFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSooW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSkkL2k7XG4vL29sZCBlbWFpbCByZWdleFxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKChbXjw+KClbXFxdLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF0uLDs6XFxzQFwiXSspKil8KFwiLitcIikpQCgoPyEtKShbXjw+KClbXFxdLiw7Olxcc0BcIl0rXFwuKStbXjw+KClbXFxdLiw7Olxcc0BcIl17MSx9KVteLTw+KClbXFxdLiw7Olxcc0BcIl0kL2k7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXigoW148PigpW1xcXVxcXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKSopfChcXFwiLitcXFwiKSlAKChcXFsoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXF0pfChcXFtJUHY2OigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSlcXF0pfChbQS1aYS16MC05XShbQS1aYS16MC05LV0qW0EtWmEtejAtOV0pKihcXC5bQS1aYS16XXsyLH0pKykpJC87XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL15bYS16QS1aMC05XFwuXFwhXFwjXFwkXFwlXFwmXFwnXFwqXFwrXFwvXFw9XFw/XFxeXFxfXFxgXFx7XFx8XFx9XFx+XFwtXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSokLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXig/OlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcXC5bYS16MC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKSp8XCIoPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMVxceDIzLVxceDViXFx4NWQtXFx4N2ZdfFxcXFxbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGUtXFx4N2ZdKSpcIilAKD86KD86W2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP1xcLikrW2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP3xcXFsoPzooPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldP3xbYS16MC05LV0qW2EtejAtOV06KD86W1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4MjEtXFx4NWFcXHg1My1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKylcXF0pJC9pO1xuY29uc3QgZW1haWxSZWdleCA9IC9eKD8hXFwuKSg/IS4qXFwuXFwuKShbQS1aMC05XystXFwuXSopW0EtWjAtOV8rLV1AKFtBLVowLTldW0EtWjAtOVxcLV0qXFwuKStbQS1aXXsyLH0kL2k7XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID1cbi8vICAgL15bYS16MC05LiEjJCUm4oCZKisvPT9eX2B7fH1+LV0rQFthLXowLTktXSsoPzpcXC5bYS16MC05XFwtXSspKiQvaTtcbi8vIGZyb20gaHR0cHM6Ly90aGVrZXZpbnNjb3R0LmNvbS9lbW9qaXMtaW4tamF2YXNjcmlwdC8jd3JpdGluZy1hLXJlZ3VsYXItZXhwcmVzc2lvblxuY29uc3QgX2Vtb2ppUmVnZXggPSBgXihcXFxccHtFeHRlbmRlZF9QaWN0b2dyYXBoaWN9fFxcXFxwe0Vtb2ppX0NvbXBvbmVudH0pKyRgO1xubGV0IGVtb2ppUmVnZXg7XG5jb25zdCBpcHY0UmVnZXggPSAvXigoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSQvO1xuY29uc3QgaXB2NlJlZ2V4ID0gL14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSkpJC87XG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMxNDMyMzFcbmNvbnN0IGRhdGV0aW1lUmVnZXggPSAoYXJncykgPT4ge1xuICAgIGlmIChhcmdzLnByZWNpc2lvbikge1xuICAgICAgICBpZiAoYXJncy5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn1cXFxcLlxcXFxkeyR7YXJncy5wcmVjaXNpb259fSgoWystXVxcXFxkezJ9KDo/XFxcXGR7Mn0pPyl8WikkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9XFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1aJGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3MucHJlY2lzaW9uID09PSAwKSB7XG4gICAgICAgIGlmIChhcmdzLm9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5cXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfVRcXFxcZHsyfTpcXFxcZHsyfTpcXFxcZHsyfSgoWystXVxcXFxkezJ9KDo/XFxcXGR7Mn0pPyl8WikkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9WiRgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGFyZ3Mub2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9KFxcXFwuXFxcXGQrKT8oKFsrLV1cXFxcZHsyfSg6P1xcXFxkezJ9KT8pfFopJGApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5cXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfVRcXFxcZHsyfTpcXFxcZHsyfTpcXFxcZHsyfShcXFxcLlxcXFxkKyk/WiRgKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5mdW5jdGlvbiBpc1ZhbGlkSVAoaXAsIHZlcnNpb24pIHtcbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjRcIiB8fCAhdmVyc2lvbikgJiYgaXB2NFJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjZcIiB8fCAhdmVyc2lvbikgJiYgaXB2NlJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5jbGFzcyBab2RTdHJpbmcgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBTdHJpbmcoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPiBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gaW5wdXQuZGF0YS5sZW5ndGggPiBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGlucHV0LmRhdGEubGVuZ3RoIDwgY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZyB8fCB0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtYWlsXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImVtYWlsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJlbW9qaVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbW9qaVJlZ2V4KSB7XG4gICAgICAgICAgICAgICAgICAgIGVtb2ppUmVnZXggPSBuZXcgUmVnRXhwKF9lbW9qaVJlZ2V4LCBcInVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZW1vamlSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1vamlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInV1aWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdXVpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1dWlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1aWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiY3VpZDJcIikge1xuICAgICAgICAgICAgICAgIGlmICghY3VpZDJSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZDJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInVsaWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdWxpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1bGlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ1cmxcIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW5wdXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInVybFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwicmVnZXhcIikge1xuICAgICAgICAgICAgICAgIGNoZWNrLnJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IGNoZWNrLnJlZ2V4LnRlc3QoaW5wdXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXN0UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwicmVnZXhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRyaW1cIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiaW5jbHVkZXNcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5pbmNsdWRlcyhjaGVjay52YWx1ZSwgY2hlY2sucG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgaW5jbHVkZXM6IGNoZWNrLnZhbHVlLCBwb3NpdGlvbjogY2hlY2sucG9zaXRpb24gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRvTG93ZXJDYXNlXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0b1VwcGVyQ2FzZVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwic3RhcnRzV2l0aFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLnN0YXJ0c1dpdGgoY2hlY2sudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgc3RhcnRzV2l0aDogY2hlY2sudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVuZHNXaXRoXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuZW5kc1dpdGgoY2hlY2sudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgZW5kc1dpdGg6IGNoZWNrLnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJkYXRldGltZVwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBkYXRldGltZVJlZ2V4KGNoZWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiaXBcIikge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZElQKGlucHV0LmRhdGEsIGNoZWNrLnZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiaXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgX3JlZ2V4KHJlZ2V4LCB2YWxpZGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmluZW1lbnQoKGRhdGEpID0+IHJlZ2V4LnRlc3QoZGF0YSksIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb24sXG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW1haWwobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImVtYWlsXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdXJsKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1cmxcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBlbW9qaShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1vamlcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1dWlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1dWlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgY3VpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiY3VpZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGN1aWQyKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJjdWlkMlwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHVsaWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVsaWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBpcChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiaXBcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMpIH0pO1xuICAgIH1cbiAgICBkYXRldGltZShvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgICAgICBwcmVjaXNpb246IG51bGwsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBvcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgIHByZWNpc2lvbjogdHlwZW9mIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJlY2lzaW9uKSA9PT0gXCJ1bmRlZmluZWRcIiA/IG51bGwgOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucHJlY2lzaW9uLFxuICAgICAgICAgICAgb2Zmc2V0OiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMub2Zmc2V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWdleChyZWdleCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJyZWdleFwiLFxuICAgICAgICAgICAgcmVnZXg6IHJlZ2V4LFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5jbHVkZXModmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiaW5jbHVkZXNcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMucG9zaXRpb24sXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhcnRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJzdGFydHNXaXRoXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbmRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJlbmRzV2l0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkxlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBtaW5MZW5ndGgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IG1heExlbmd0aCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibGVuZ3RoXCIsXG4gICAgICAgICAgICB2YWx1ZTogbGVuLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHouc3RyaW5nKCkubWluKDEpIGluc3RlYWQuXG4gICAgICogQHNlZSB7QGxpbmsgWm9kU3RyaW5nLm1pbn1cbiAgICAgKi9cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBlcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkpO1xuICAgIH1cbiAgICB0cmltKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidHJpbVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9Mb3dlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b0xvd2VyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9VcHBlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b1VwcGVyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGlzRGF0ZXRpbWUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZGF0ZXRpbWVcIik7XG4gICAgfVxuICAgIGdldCBpc0VtYWlsKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtYWlsXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVUkwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidXJsXCIpO1xuICAgIH1cbiAgICBnZXQgaXNFbW9qaSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJlbW9qaVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzVVVJRCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1dWlkXCIpO1xuICAgIH1cbiAgICBnZXQgaXNDVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImN1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQyKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImN1aWQyXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVTElEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInVsaWRcIik7XG4gICAgfVxuICAgIGdldCBpc0lQKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImlwXCIpO1xuICAgIH1cbiAgICBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhMZW5ndGgoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG59XG5ab2RTdHJpbmcuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3RyaW5nLFxuICAgICAgICBjb2VyY2U6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzk2NjQ4NC93aHktZG9lcy1tb2R1bHVzLW9wZXJhdG9yLXJldHVybi1mcmFjdGlvbmFsLW51bWJlci1pbi1qYXZhc2NyaXB0LzMxNzExMDM0IzMxNzExMDM0XG5mdW5jdGlvbiBmbG9hdFNhZmVSZW1haW5kZXIodmFsLCBzdGVwKSB7XG4gICAgY29uc3QgdmFsRGVjQ291bnQgPSAodmFsLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBjb25zdCBzdGVwRGVjQ291bnQgPSAoc3RlcC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3QgZGVjQ291bnQgPSB2YWxEZWNDb3VudCA+IHN0ZXBEZWNDb3VudCA/IHZhbERlY0NvdW50IDogc3RlcERlY0NvdW50O1xuICAgIGNvbnN0IHZhbEludCA9IHBhcnNlSW50KHZhbC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgY29uc3Qgc3RlcEludCA9IHBhcnNlSW50KHN0ZXAudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIHJldHVybiAodmFsSW50ICUgc3RlcEludCkgLyBNYXRoLnBvdygxMCwgZGVjQ291bnQpO1xufVxuY2xhc3MgWm9kTnVtYmVyIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubWluID0gdGhpcy5ndGU7XG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5sdGU7XG4gICAgICAgIHRoaXMuc3RlcCA9IHRoaXMubXVsdGlwbGVPZjtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gTnVtYmVyKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubnVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm51bWJlcixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBQYXJzZVN0YXR1cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaGVjay5raW5kID09PSBcImludFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dGlsLmlzSW50ZWdlcihpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IFwiZmxvYXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhIDwgY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhIDw9IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPiBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPj0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsb2F0U2FmZVJlbWFpbmRlcihpbnB1dC5kYXRhLCBjaGVjay52YWx1ZSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZixcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlT2Y6IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZmluaXRlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X2Zpbml0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ3RlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBndCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW50KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiaW50XCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb3NpdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbm5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11bHRpcGxlT2YodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibXVsdGlwbGVPZlwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZmluaXRlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiZmluaXRlXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzYWZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pblZhbHVlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhWYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbiAgICBnZXQgaXNJbnQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiaW50XCIgfHxcbiAgICAgICAgICAgIChjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIiAmJiB1dGlsLmlzSW50ZWdlcihjaC52YWx1ZSkpKTtcbiAgICB9XG4gICAgZ2V0IGlzRmluaXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbCwgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJmaW5pdGVcIiB8fFxuICAgICAgICAgICAgICAgIGNoLmtpbmQgPT09IFwiaW50XCIgfHxcbiAgICAgICAgICAgICAgICBjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobWluKSAmJiBOdW1iZXIuaXNGaW5pdGUobWF4KTtcbiAgICB9XG59XG5ab2ROdW1iZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdW1iZXIsXG4gICAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQmlnSW50IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubWluID0gdGhpcy5ndGU7XG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5sdGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IEJpZ0ludChpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJpZ2ludCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5iaWdpbnQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY2hlY2suaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQuZGF0YSA8IGNoZWNrLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogaW5wdXQuZGF0YSA8PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhICUgY2hlY2sudmFsdWUgIT09IEJpZ0ludCgwKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgZ3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgc2V0TGltaXQoa2luZCwgdmFsdWUsIGluY2x1c2l2ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEJpZ0ludCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ubmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtdWx0aXBsZU9mKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pblZhbHVlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhWYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cblpvZEJpZ0ludC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCaWdJbnQsXG4gICAgICAgIGNvZXJjZTogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RCb29sZWFuIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gQm9vbGVhbihpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJvb2xlYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYm9vbGVhbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RCb29sZWFuLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEJvb2xlYW4oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJvb2xlYW4sXG4gICAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRGF0ZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IG5ldyBEYXRlKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5kYXRlLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmFOKGlucHV0LmRhdGEuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5nZXRUaW1lKCkgPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEuZ2V0VGltZSgpID4gY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cy52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShpbnB1dC5kYXRhLmdldFRpbWUoKSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkRhdGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogbWluRGF0ZS5nZXRUaW1lKCksXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4RGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBtYXhEYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5EYXRlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCA/IG5ldyBEYXRlKG1pbikgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbWF4RGF0ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4ICE9IG51bGwgPyBuZXcgRGF0ZShtYXgpIDogbnVsbDtcbiAgICB9XG59XG5ab2REYXRlLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICBjb2VyY2U6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSB8fCBmYWxzZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REYXRlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kU3ltYm9sIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc3ltYm9sKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnN5bWJvbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RTeW1ib2wuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kU3ltYm9sKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTeW1ib2wsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RVbmRlZmluZWQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFVuZGVmaW5lZC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmRlZmluZWQoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVuZGVmaW5lZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE51bGwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm51bGwsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kTnVsbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdWxsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQW55IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHRvIHByZXZlbnQgaW5zdGFuY2VzIG9mIG90aGVyIGNsYXNzZXMgZnJvbSBleHRlbmRpbmcgWm9kQW55LiB0aGlzIGNhdXNlcyBpc3N1ZXMgd2l0aCBjYXRjaGFsbCBpbiBab2RPYmplY3QuXG4gICAgICAgIHRoaXMuX2FueSA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kQW55LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEFueSh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQW55LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVW5rbm93biBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvLyByZXF1aXJlZFxuICAgICAgICB0aGlzLl91bmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RVbmtub3duLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVua25vd24oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVua25vd24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2ROZXZlciBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5ldmVyLFxuICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgfVxufVxuWm9kTmV2ZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmV2ZXIoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5ldmVyLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVm9pZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS52b2lkLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFZvaWQuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVm9pZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVm9pZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEFycmF5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4LCBzdGF0dXMgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMuX2RlZjtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmFycmF5LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5leGFjdExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gY3R4LmRhdGEubGVuZ3RoID4gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjdHguZGF0YS5sZW5ndGggPCBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHRvb0JpZyA/IFpvZElzc3VlQ29kZS50b29fYmlnIDogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogKHRvb1NtYWxsID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogKHRvb0JpZyA/IGRlZi5leGFjdExlbmd0aC52YWx1ZSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLmV4YWN0TGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5taW5MZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCBkZWYubWluTGVuZ3RoLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5MZW5ndGgudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5taW5MZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1heExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5tYXhMZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5tYXhMZW5ndGgudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5tYXhMZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFsuLi5jdHguZGF0YV0ubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZi50eXBlLl9wYXJzZUFzeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpO1xuICAgICAgICAgICAgfSkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5jdHguZGF0YV0ubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlU3luYyhuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0KTtcbiAgICB9XG4gICAgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZTtcbiAgICB9XG4gICAgbWluKG1pbkxlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1pbkxlbmd0aDogeyB2YWx1ZTogbWluTGVuZ3RoLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhMZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtYXhMZW5ndGg6IHsgdmFsdWU6IG1heExlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgZXhhY3RMZW5ndGg6IHsgdmFsdWU6IGxlbiwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBtZXNzYWdlKTtcbiAgICB9XG59XG5ab2RBcnJheS5jcmVhdGUgPSAoc2NoZW1hLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgdHlwZTogc2NoZW1hLFxuICAgICAgICBtaW5MZW5ndGg6IG51bGwsXG4gICAgICAgIG1heExlbmd0aDogbnVsbCxcbiAgICAgICAgZXhhY3RMZW5ndGg6IG51bGwsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQXJyYXksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBkZWVwUGFydGlhbGlmeShzY2hlbWEpIHtcbiAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5zaGFwZSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSBzY2hlbWEuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoZmllbGRTY2hlbWEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi5zY2hlbWEuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZEFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4uc2NoZW1hLl9kZWYsXG4gICAgICAgICAgICB0eXBlOiBkZWVwUGFydGlhbGlmeShzY2hlbWEuZWxlbWVudCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkge1xuICAgICAgICByZXR1cm4gWm9kT3B0aW9uYWwuY3JlYXRlKGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS51bndyYXAoKSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2ROdWxsYWJsZSkge1xuICAgICAgICByZXR1cm4gWm9kTnVsbGFibGUuY3JlYXRlKGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS51bndyYXAoKSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RUdXBsZSkge1xuICAgICAgICByZXR1cm4gWm9kVHVwbGUuY3JlYXRlKHNjaGVtYS5pdGVtcy5tYXAoKGl0ZW0pID0+IGRlZXBQYXJ0aWFsaWZ5KGl0ZW0pKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gc2NoZW1hO1xuICAgIH1cbn1cbmNsYXNzIFpvZE9iamVjdCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9jYWNoZWQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgSW4gbW9zdCBjYXNlcywgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkIC0gdW5rbm93biBwcm9wZXJ0aWVzIGFyZSBub3cgc2lsZW50bHkgc3RyaXBwZWQuXG4gICAgICAgICAqIElmIHlvdSB3YW50IHRvIHBhc3MgdGhyb3VnaCB1bmtub3duIHByb3BlcnRpZXMsIHVzZSBgLnBhc3N0aHJvdWdoKClgIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5vbnN0cmljdCA9IHRoaXMucGFzc3Rocm91Z2g7XG4gICAgICAgIC8vIGV4dGVuZDxcbiAgICAgICAgLy8gICBBdWdtZW50YXRpb24gZXh0ZW5kcyBab2RSYXdTaGFwZSxcbiAgICAgICAgLy8gICBOZXdPdXRwdXQgZXh0ZW5kcyB1dGlsLmZsYXR0ZW48e1xuICAgICAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgT3V0cHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgICAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgT3V0cHV0XG4gICAgICAgIC8vICAgICAgID8gT3V0cHV0W2tdXG4gICAgICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgICAgIC8vICAgfT4sXG4gICAgICAgIC8vICAgTmV3SW5wdXQgZXh0ZW5kcyB1dGlsLmZsYXR0ZW48e1xuICAgICAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgSW5wdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX2lucHV0XCJdXG4gICAgICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIElucHV0XG4gICAgICAgIC8vICAgICAgID8gSW5wdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PlxuICAgICAgICAvLyA+KFxuICAgICAgICAvLyAgIGF1Z21lbnRhdGlvbjogQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICk6IFpvZE9iamVjdDxcbiAgICAgICAgLy8gICBleHRlbmRTaGFwZTxULCBBdWdtZW50YXRpb24+LFxuICAgICAgICAvLyAgIFVua25vd25LZXlzLFxuICAgICAgICAvLyAgIENhdGNoYWxsLFxuICAgICAgICAvLyAgIE5ld091dHB1dCxcbiAgICAgICAgLy8gICBOZXdJbnB1dFxuICAgICAgICAvLyA+IHtcbiAgICAgICAgLy8gICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIC8vICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgIC8vICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgLy8gICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgIC8vICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAgICAgLy8gICAgIH0pLFxuICAgICAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGAuZXh0ZW5kYCBpbnN0ZWFkXG4gICAgICAgICAqICAqL1xuICAgICAgICB0aGlzLmF1Z21lbnQgPSB0aGlzLmV4dGVuZDtcbiAgICB9XG4gICAgX2dldENhY2hlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWQ7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5fZGVmLnNoYXBlKCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSB1dGlsLm9iamVjdEtleXMoc2hhcGUpO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2NhY2hlZCA9IHsgc2hhcGUsIGtleXMgfSk7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCB7IHNoYXBlLCBrZXlzOiBzaGFwZUtleXMgfSA9IHRoaXMuX2dldENhY2hlZCgpO1xuICAgICAgICBjb25zdCBleHRyYUtleXMgPSBbXTtcbiAgICAgICAgaWYgKCEodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIgJiZcbiAgICAgICAgICAgIHRoaXMuX2RlZi51bmtub3duS2V5cyA9PT0gXCJzdHJpcFwiKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXBlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXBlS2V5cykge1xuICAgICAgICAgICAgY29uc3Qga2V5VmFsaWRhdG9yID0gc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTtcbiAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGtleSB9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXlWYWxpZGF0b3IuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIFpvZE5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB1bmtub3duS2V5cyA9IHRoaXMuX2RlZi51bmtub3duS2V5cztcbiAgICAgICAgICAgIGlmICh1bmtub3duS2V5cyA9PT0gXCJwYXNzdGhyb3VnaFwiKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXh0cmFLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGN0eC5kYXRhW2tleV0gfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwic3RyaWN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmFLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudW5yZWNvZ25pemVkX2tleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiBleHRyYUtleXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmtub3duS2V5cyA9PT0gXCJzdHJpcFwiKSA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIFpvZE9iamVjdCBlcnJvcjogaW52YWxpZCB1bmtub3duS2V5cyB2YWx1ZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJ1biBjYXRjaGFsbCB2YWxpZGF0aW9uXG4gICAgICAgICAgICBjb25zdCBjYXRjaGFsbCA9IHRoaXMuX2RlZi5jYXRjaGFsbDtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGV4dHJhS2V5cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTtcbiAgICAgICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYXRjaGFsbC5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KSAvLywgY3R4LmNoaWxkKGtleSksIHZhbHVlLCBnZXRQYXJzZWRUeXBlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IGtleSBpbiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICAgICAgc3luY1BhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGF3YWl0IHBhaXIudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IHBhaXIuYWx3YXlzU2V0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNQYWlycztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHN5bmNQYWlycykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBzeW5jUGFpcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzaGFwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zaGFwZSgpO1xuICAgIH1cbiAgICBzdHJpY3QobWVzc2FnZSkge1xuICAgICAgICBlcnJvclV0aWwuZXJyVG9PYmo7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmljdFwiLFxuICAgICAgICAgICAgLi4uKG1lc3NhZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1hcDogKGlzc3VlLCBjdHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRFcnJvciA9IChfYyA9IChfYiA9IChfYSA9IHRoaXMuX2RlZikuZXJyb3JNYXApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBpc3N1ZSwgY3R4KS5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdHguZGVmYXVsdEVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwidW5yZWNvZ25pemVkX2tleXNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAoX2QgPSBlcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkubWVzc2FnZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZGVmYXVsdEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZmF1bHRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RyaXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXNzdGhyb3VnaCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwicGFzc3Rocm91Z2hcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGNvbnN0IEF1Z21lbnRGYWN0b3J5ID1cbiAgICAvLyAgIDxEZWYgZXh0ZW5kcyBab2RPYmplY3REZWY+KGRlZjogRGVmKSA9PlxuICAgIC8vICAgPEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlPihcbiAgICAvLyAgICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAvLyAgICk6IFpvZE9iamVjdDxcbiAgICAvLyAgICAgZXh0ZW5kU2hhcGU8UmV0dXJuVHlwZTxEZWZbXCJzaGFwZVwiXT4sIEF1Z21lbnRhdGlvbj4sXG4gICAgLy8gICAgIERlZltcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgICBEZWZbXCJjYXRjaGFsbFwiXVxuICAgIC8vICAgPiA9PiB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgICAuLi5kZWYsXG4gICAgLy8gICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgLy8gICAgICAgICAuLi5kZWYuc2hhcGUoKSxcbiAgICAvLyAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAvLyAgICAgICB9KSxcbiAgICAvLyAgICAgfSkgYXMgYW55O1xuICAgIC8vICAgfTtcbiAgICBleHRlbmQoYXVnbWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJpb3IgdG8gem9kQDEuMC4xMiB0aGVyZSB3YXMgYSBidWcgaW4gdGhlXG4gICAgICogaW5mZXJyZWQgdHlwZSBvZiBtZXJnZWQgb2JqZWN0cy4gUGxlYXNlXG4gICAgICogdXBncmFkZSBpZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBpc3N1ZXMuXG4gICAgICovXG4gICAgbWVyZ2UobWVyZ2luZykge1xuICAgICAgICBjb25zdCBtZXJnZWQgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgICAgICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICAgICAgLi4ubWVyZ2luZy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG4gICAgLy8gbWVyZ2U8XG4gICAgLy8gICBJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdCxcbiAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIEluY29taW5nW1wic2hhcGVcIl0sXG4gICAgLy8gICBOZXdPdXRwdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIE91dHB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAvLyAgICAgICA/IE91dHB1dFtrXVxuICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgLy8gICB9LFxuICAgIC8vICAgTmV3SW5wdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIElucHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX2lucHV0XCJdXG4gICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAvLyAgICAgICA/IElucHV0W2tdXG4gICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAvLyAgIH1cbiAgICAvLyA+KFxuICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmdcbiAgICAvLyApOiBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdLFxuICAgIC8vICAgTmV3T3V0cHV0LFxuICAgIC8vICAgTmV3SW5wdXRcbiAgICAvLyA+IHtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBzZXRLZXkoa2V5LCBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVnbWVudCh7IFtrZXldOiBzY2hlbWEgfSk7XG4gICAgfVxuICAgIC8vIG1lcmdlPEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0PihcbiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gICAgLy8gKTogLy9ab2RPYmplY3Q8VCAmIEluY29taW5nW1wiX3NoYXBlXCJdLCBVbmtub3duS2V5cywgQ2F0Y2hhbGw+ID0gKG1lcmdpbmcpID0+IHtcbiAgICAvLyBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdXG4gICAgLy8gPiB7XG4gICAgLy8gICAvLyBjb25zdCBtZXJnZWRTaGFwZSA9IG9iamVjdFV0aWwubWVyZ2VTaGFwZXMoXG4gICAgLy8gICAvLyAgIHRoaXMuX2RlZi5zaGFwZSgpLFxuICAgIC8vICAgLy8gICBtZXJnaW5nLl9kZWYuc2hhcGUoKVxuICAgIC8vICAgLy8gKTtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBjYXRjaGFsbChpbmRleCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogaW5kZXgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaWNrKG1hc2spIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbC5vYmplY3RLZXlzKG1hc2spLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKG1hc2tba2V5XSAmJiB0aGlzLnNoYXBlW2tleV0pIHtcbiAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb21pdChtYXNrKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0ge307XG4gICAgICAgIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZGVlcFBhcnRpYWwoKSB7XG4gICAgICAgIHJldHVybiBkZWVwUGFydGlhbGlmeSh0aGlzKTtcbiAgICB9XG4gICAgcGFydGlhbChtYXNrKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgaWYgKG1hc2sgJiYgIW1hc2tba2V5XSkge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBmaWVsZFNjaGVtYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBmaWVsZFNjaGVtYS5vcHRpb25hbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWlyZWQobWFzaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAobWFzayAmJiAhbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgICAgIGxldCBuZXdGaWVsZCA9IGZpZWxkU2NoZW1hO1xuICAgICAgICAgICAgICAgIHdoaWxlIChuZXdGaWVsZCBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld0ZpZWxkID0gbmV3RmllbGQuX2RlZi5pbm5lclR5cGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBuZXdGaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGtleW9mKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlWm9kRW51bSh1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkpO1xuICAgIH1cbn1cblpvZE9iamVjdC5jcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kT2JqZWN0LnN0cmljdENyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmljdFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kT2JqZWN0LmxhenljcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RVbmlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX2RlZi5vcHRpb25zO1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVSZXN1bHRzKHJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIHJldHVybiBmaXJzdCBpc3N1ZS1mcmVlIHZhbGlkYXRpb24gaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBpc3N1ZXMgZnJvbSBkaXJ0eSBvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5yZXN1bHQuY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXR1cm4gaW52YWxpZFxuICAgICAgICAgICAgY29uc3QgdW5pb25FcnJvcnMgPSByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiBuZXcgWm9kRXJyb3IocmVzdWx0LmN0eC5jb21tb24uaXNzdWVzKSk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbixcbiAgICAgICAgICAgICAgICB1bmlvbkVycm9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChvcHRpb25zLm1hcChhc3luYyAob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDdHggPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBhd2FpdCBvcHRpb24uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBjdHg6IGNoaWxkQ3R4LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSkudGhlbihoYW5kbGVSZXN1bHRzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBkaXJ0eSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ3R4ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvbi5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNoaWxkQ3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiICYmICFkaXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IHsgcmVzdWx0LCBjdHg6IGNoaWxkQ3R4IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaGlsZEN0eC5jb21tb24uaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZXMucHVzaChjaGlsZEN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGlydHkpIHtcbiAgICAgICAgICAgICAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKC4uLmRpcnR5LmN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlydHkucmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdW5pb25FcnJvcnMgPSBpc3N1ZXMubWFwKChpc3N1ZXMpID0+IG5ldyBab2RFcnJvcihpc3N1ZXMpKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uLFxuICAgICAgICAgICAgICAgIHVuaW9uRXJyb3JzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zO1xuICAgIH1cbn1cblpvZFVuaW9uLmNyZWF0ZSA9ICh0eXBlcywgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmlvbih7XG4gICAgICAgIG9wdGlvbnM6IHR5cGVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVuaW9uLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmNvbnN0IGdldERpc2NyaW1pbmF0b3IgPSAodHlwZSkgPT4ge1xuICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kTGF6eSkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnNjaGVtYSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RFZmZlY3RzKSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuaW5uZXJUeXBlKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kTGl0ZXJhbCkge1xuICAgICAgICByZXR1cm4gW3R5cGUudmFsdWVdO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRW51bSkge1xuICAgICAgICByZXR1cm4gdHlwZS5vcHRpb25zO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kTmF0aXZlRW51bSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYmFuL2JhblxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModHlwZS5lbnVtKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZERlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5fZGVmLmlubmVyVHlwZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RVbmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWRdO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kTnVsbCkge1xuICAgICAgICByZXR1cm4gW251bGxdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufTtcbmNsYXNzIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yID0gdGhpcy5kaXNjcmltaW5hdG9yO1xuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWUgPSBjdHguZGF0YVtkaXNjcmltaW5hdG9yXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zTWFwLmdldChkaXNjcmltaW5hdG9yVmFsdWUpO1xuICAgICAgICBpZiAoIW9wdGlvbikge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5mcm9tKHRoaXMub3B0aW9uc01hcC5rZXlzKCkpLFxuICAgICAgICAgICAgICAgIHBhdGg6IFtkaXNjcmltaW5hdG9yXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGRpc2NyaW1pbmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcjtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnNNYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uIHNjaGVtYS4gSXRzIGJlaGF2aW91ciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgbm9ybWFsIHoudW5pb24oKSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBIb3dldmVyLCBpdCBvbmx5IGFsbG93cyBhIHVuaW9uIG9mIG9iamVjdHMsIGFsbCBvZiB3aGljaCBuZWVkIHRvIHNoYXJlIGEgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBtdXN0XG4gICAgICogaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgZWFjaCBvYmplY3QgaW4gdGhlIHVuaW9uLlxuICAgICAqIEBwYXJhbSBkaXNjcmltaW5hdG9yIHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGVzIGFuIGFycmF5IG9mIG9iamVjdCBzY2hlbWFzXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZGlzY3JpbWluYXRvciwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICAgIC8vIEdldCBhbGwgdGhlIHZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWVzXG4gICAgICAgIGNvbnN0IG9wdGlvbnNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWVzID0gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnNoYXBlW2Rpc2NyaW1pbmF0b3JdKTtcbiAgICAgICAgICAgIGlmICghZGlzY3JpbWluYXRvclZhbHVlcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQSBkaXNjcmltaW5hdG9yIHZhbHVlIGZvciBrZXkgXFxgJHtkaXNjcmltaW5hdG9yfVxcYCBjb3VsZCBub3QgYmUgZXh0cmFjdGVkIGZyb20gYWxsIHNjaGVtYSBvcHRpb25zYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGRpc2NyaW1pbmF0b3JWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9uc01hcC5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlzY3JpbWluYXRvciBwcm9wZXJ0eSAke1N0cmluZyhkaXNjcmltaW5hdG9yKX0gaGFzIGR1cGxpY2F0ZSB2YWx1ZSAke1N0cmluZyh2YWx1ZSl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAuc2V0KHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZERpc2NyaW1pbmF0ZWRVbmlvbih7XG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERpc2NyaW1pbmF0ZWRVbmlvbixcbiAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IsXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9uc01hcCxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbWVyZ2VWYWx1ZXMoYSwgYikge1xuICAgIGNvbnN0IGFUeXBlID0gZ2V0UGFyc2VkVHlwZShhKTtcbiAgICBjb25zdCBiVHlwZSA9IGdldFBhcnNlZFR5cGUoYik7XG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IGEgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUub2JqZWN0ICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICBjb25zdCBiS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhiKTtcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5cyA9IHV0aWxcbiAgICAgICAgICAgIC5vYmplY3RLZXlzKGEpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IGJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpO1xuICAgICAgICBjb25zdCBuZXdPYmogPSB7IC4uLmEsIC4uLmIgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IG5ld09iaiB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdBcnJheSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BID0gYVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBpdGVtQiA9IGJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3QXJyYXkucHVzaChzaGFyZWRWYWx1ZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3QXJyYXkgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUuZGF0ZSAmJlxuICAgICAgICBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5kYXRlICYmXG4gICAgICAgICthID09PSArYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgfVxufVxuY2xhc3MgWm9kSW50ZXJzZWN0aW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZVBhcnNlZCA9IChwYXJzZWRMZWZ0LCBwYXJzZWRSaWdodCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzQWJvcnRlZChwYXJzZWRMZWZ0KSB8fCBpc0Fib3J0ZWQocGFyc2VkUmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVZhbHVlcyhwYXJzZWRMZWZ0LnZhbHVlLCBwYXJzZWRSaWdodC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIW1lcmdlZC52YWxpZCkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEaXJ0eShwYXJzZWRMZWZ0KSB8fCBpc0RpcnR5KHBhcnNlZFJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBtZXJnZWQuZGF0YSB9O1xuICAgICAgICB9O1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0pLnRoZW4oKFtsZWZ0LCByaWdodF0pID0+IGhhbmRsZVBhcnNlZChsZWZ0LCByaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBhcnNlZCh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pLCB0aGlzLl9kZWYucmlnaHQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5ab2RJbnRlcnNlY3Rpb24uY3JlYXRlID0gKGxlZnQsIHJpZ2h0LCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEludGVyc2VjdGlvbih7XG4gICAgICAgIGxlZnQ6IGxlZnQsXG4gICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RJbnRlcnNlY3Rpb24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RUdXBsZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYXJyYXksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoIDwgdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICBtaW5pbXVtOiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN0ID0gdGhpcy5fZGVmLnJlc3Q7XG4gICAgICAgIGlmICghcmVzdCAmJiBjdHguZGF0YS5sZW5ndGggPiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICBtYXhpbXVtOiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpdGVtcyA9IFsuLi5jdHguZGF0YV1cbiAgICAgICAgICAgIC5tYXAoKGl0ZW0sIGl0ZW1JbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5fZGVmLml0ZW1zW2l0ZW1JbmRleF0gfHwgdGhpcy5fZGVmLnJlc3Q7XG4gICAgICAgICAgICBpZiAoIXNjaGVtYSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBzY2hlbWEuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaXRlbUluZGV4KSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiAhIXgpOyAvLyBmaWx0ZXIgbnVsbHNcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChpdGVtcykudGhlbigocmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgaXRlbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pdGVtcztcbiAgICB9XG4gICAgcmVzdChyZXN0KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kVHVwbGUoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgcmVzdCxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuWm9kVHVwbGUuY3JlYXRlID0gKHNjaGVtYXMsIHBhcmFtcykgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWFzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IG9mIHNjaGVtYXMgdG8gei50dXBsZShbIC4uLiBdKVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7XG4gICAgICAgIGl0ZW1zOiBzY2hlbWFzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFR1cGxlLFxuICAgICAgICByZXN0OiBudWxsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kUmVjb3JkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWlycyA9IFtdO1xuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGN0eC5kYXRhKSB7XG4gICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBrZXksIGN0eC5wYXRoLCBrZXkpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgY3R4LmRhdGFba2V5XSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdEFzeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoZmlyc3QsIHNlY29uZCwgdGhpcmQpIHtcbiAgICAgICAgaWYgKHNlY29uZCBpbnN0YW5jZW9mIFpvZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgICAgICAgICBrZXlUeXBlOiBmaXJzdCxcbiAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IHNlY29uZCxcbiAgICAgICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlY29yZCxcbiAgICAgICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXJkKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kUmVjb3JkKHtcbiAgICAgICAgICAgIGtleVR5cGU6IFpvZFN0cmluZy5jcmVhdGUoKSxcbiAgICAgICAgICAgIHZhbHVlVHlwZTogZmlyc3QsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlY29yZCxcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMoc2Vjb25kKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY2xhc3MgWm9kTWFwIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm1hcCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5tYXAsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gWy4uLmN0eC5kYXRhLmVudHJpZXMoKV0ubWFwKChba2V5LCB2YWx1ZV0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIFtpbmRleCwgXCJrZXlcIl0pKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBbaW5kZXgsIFwidmFsdWVcIl0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cblpvZE1hcC5jcmVhdGUgPSAoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE1hcCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RNYXAsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RTZXQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnNldCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zZXQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWYgPSB0aGlzLl9kZWY7XG4gICAgICAgIGlmIChkZWYubWluU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPCBkZWYubWluU2l6ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluU2l6ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5taW5TaXplLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5tYXhTaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA+IGRlZi5tYXhTaXplLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4U2l6ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5tYXhTaXplLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgZnVuY3Rpb24gZmluYWxpemVTZXQoZWxlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFNldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICBwYXJzZWRTZXQuYWRkKGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBwYXJzZWRTZXQgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IFsuLi5jdHguZGF0YS52YWx1ZXMoKV0ubWFwKChpdGVtLCBpKSA9PiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpKTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChlbGVtZW50cykudGhlbigoZWxlbWVudHMpID0+IGZpbmFsaXplU2V0KGVsZW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmluYWxpemVTZXQoZWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1pbihtaW5TaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1pblNpemU6IHsgdmFsdWU6IG1pblNpemUsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heFNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTZXQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWF4U2l6ZTogeyB2YWx1ZTogbWF4U2l6ZSwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaXplKHNpemUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKHNpemUsIG1lc3NhZ2UpLm1heChzaXplLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgbm9uZW1wdHkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oMSwgbWVzc2FnZSk7XG4gICAgfVxufVxuWm9kU2V0LmNyZWF0ZSA9ICh2YWx1ZVR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICBtaW5TaXplOiBudWxsLFxuICAgICAgICBtYXhTaXplOiBudWxsLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFNldCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEZ1bmN0aW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudmFsaWRhdGUgPSB0aGlzLmltcGxlbWVudDtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlQXJnc0lzc3VlKGFyZ3MsIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFrZUlzc3VlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBhcmdzLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwczogW1xuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1hcCgpLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1hcCxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICAgICAgICAgICAgICBpc3N1ZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfYXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNFcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VSZXR1cm5zSXNzdWUocmV0dXJucywgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlSXNzdWUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHJldHVybnMsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgIGdldEVycm9yTWFwKCksXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWFwLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZUVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAgfTtcbiAgICAgICAgY29uc3QgZm4gPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5yZXR1cm5zIGluc3RhbmNlb2YgWm9kUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gV291bGQgbG92ZSBhIHdheSB0byBhdm9pZCBkaXNhYmxpbmcgdGhpcyBydWxlLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYW4gYWxpYXMgKHVzaW5nIGFuIGFycm93IGZ1bmN0aW9uIHdhcyB3aGF0IGNhdXNlZCAyNjUxKS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIE9LKGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoW10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBhd2FpdCBtZS5fZGVmLmFyZ3NcbiAgICAgICAgICAgICAgICAgICAgLnBhcnNlQXN5bmMoYXJncywgcGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZUFyZ3NJc3N1ZShhcmdzLCBlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXMsIHBhcnNlZEFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJldHVybnMgPSBhd2FpdCBtZS5fZGVmLnJldHVybnMuX2RlZi50eXBlXG4gICAgICAgICAgICAgICAgICAgIC5wYXJzZUFzeW5jKHJlc3VsdCwgcGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFJldHVybnM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdvdWxkIGxvdmUgYSB3YXkgdG8gYXZvaWQgZGlzYWJsaW5nIHRoaXMgcnVsZSwgYnV0IHdlIG5lZWRcbiAgICAgICAgICAgIC8vIGFuIGFsaWFzICh1c2luZyBhbiBhcnJvdyBmdW5jdGlvbiB3YXMgd2hhdCBjYXVzZWQgMjY1MSkuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBPSyhmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBtZS5fZGVmLmFyZ3Muc2FmZVBhcnNlKGFyZ3MsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRBcmdzLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFpvZEVycm9yKFttYWtlQXJnc0lzc3VlKGFyZ3MsIHBhcnNlZEFyZ3MuZXJyb3IpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXMsIHBhcnNlZEFyZ3MuZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkUmV0dXJucyA9IG1lLl9kZWYucmV0dXJucy5zYWZlUGFyc2UocmVzdWx0LCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkUmV0dXJucy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBab2RFcnJvcihbbWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIHBhcnNlZFJldHVybnMuZXJyb3IpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXR1cm5zLmRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJhbWV0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmFyZ3M7XG4gICAgfVxuICAgIHJldHVyblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYucmV0dXJucztcbiAgICB9XG4gICAgYXJncyguLi5pdGVtcykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGFyZ3M6IFpvZFR1cGxlLmNyZWF0ZShpdGVtcykucmVzdChab2RVbmtub3duLmNyZWF0ZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybnMocmV0dXJuVHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVyblR5cGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbXBsZW1lbnQoZnVuYykge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGdW5jID0gdGhpcy5wYXJzZShmdW5jKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZEZ1bmM7XG4gICAgfVxuICAgIHN0cmljdEltcGxlbWVudChmdW5jKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZ1bmMgPSB0aGlzLnBhcnNlKGZ1bmMpO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVkRnVuYztcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhcmdzLCByZXR1cm5zLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICBhcmdzOiAoYXJnc1xuICAgICAgICAgICAgICAgID8gYXJnc1xuICAgICAgICAgICAgICAgIDogWm9kVHVwbGUuY3JlYXRlKFtdKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpKSxcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVybnMgfHwgWm9kVW5rbm93bi5jcmVhdGUoKSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRnVuY3Rpb24sXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNsYXNzIFpvZExhenkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQgc2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGxhenlTY2hlbWEgPSB0aGlzLl9kZWYuZ2V0dGVyKCk7XG4gICAgICAgIHJldHVybiBsYXp5U2NoZW1hLl9wYXJzZSh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgfVxufVxuWm9kTGF6eS5jcmVhdGUgPSAoZ2V0dGVyLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZExhenkoe1xuICAgICAgICBnZXR0ZXI6IGdldHRlcixcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RMYXp5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTGl0ZXJhbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQuZGF0YSAhPT0gdGhpcy5fZGVmLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfbGl0ZXJhbCxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdGhpcy5fZGVmLnZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlO1xuICAgIH1cbn1cblpvZExpdGVyYWwuY3JlYXRlID0gKHZhbHVlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZExpdGVyYWwoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGl0ZXJhbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZVpvZEVudW0odmFsdWVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRW51bSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufVxuY2xhc3MgWm9kRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGVmLnZhbHVlcy5pbmRleE9mKGlucHV0LmRhdGEpID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB0aGlzLl9kZWYudmFsdWVzO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2VudW1fdmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogZXhwZWN0ZWRWYWx1ZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVzO1xuICAgIH1cbiAgICBnZXQgZW51bSgpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGdldCBWYWx1ZXMoKSB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykge1xuICAgICAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtVmFsdWVzO1xuICAgIH1cbiAgICBnZXQgRW51bSgpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGV4dHJhY3QodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh2YWx1ZXMpO1xuICAgIH1cbiAgICBleGNsdWRlKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gWm9kRW51bS5jcmVhdGUodGhpcy5vcHRpb25zLmZpbHRlcigob3B0KSA9PiAhdmFsdWVzLmluY2x1ZGVzKG9wdCkpKTtcbiAgICB9XG59XG5ab2RFbnVtLmNyZWF0ZSA9IGNyZWF0ZVpvZEVudW07XG5jbGFzcyBab2ROYXRpdmVFbnVtIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZUVudW1WYWx1ZXMgPSB1dGlsLmdldFZhbGlkRW51bVZhbHVlcyh0aGlzLl9kZWYudmFsdWVzKTtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc3RyaW5nICYmXG4gICAgICAgICAgICBjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbC5vYmplY3RWYWx1ZXMobmF0aXZlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbC5qb2luVmFsdWVzKGV4cGVjdGVkVmFsdWVzKSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdGl2ZUVudW1WYWx1ZXMuaW5kZXhPZihpbnB1dC5kYXRhKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbC5vYmplY3RWYWx1ZXMobmF0aXZlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBleHBlY3RlZFZhbHVlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBnZXQgZW51bSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgfVxufVxuWm9kTmF0aXZlRW51bS5jcmVhdGUgPSAodmFsdWVzLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE5hdGl2ZUVudW0oe1xuICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROYXRpdmVFbnVtLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kUHJvbWlzZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5wcm9taXNlICYmXG4gICAgICAgICAgICBjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5wcm9taXNlLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvbWlzaWZpZWQgPSBjdHgucGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5wcm9taXNlXG4gICAgICAgICAgICA/IGN0eC5kYXRhXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShjdHguZGF0YSk7XG4gICAgICAgIHJldHVybiBPSyhwcm9taXNpZmllZC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhkYXRhLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXA6IGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5ab2RQcm9taXNlLmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kUHJvbWlzZSh7XG4gICAgICAgIHR5cGU6IHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RQcm9taXNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRWZmZWN0cyBleHRlbmRzIFpvZFR5cGUge1xuICAgIGlubmVyVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWE7XG4gICAgfVxuICAgIHNvdXJjZVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzXG4gICAgICAgICAgICA/IHRoaXMuX2RlZi5zY2hlbWEuc291cmNlVHlwZSgpXG4gICAgICAgICAgICA6IHRoaXMuX2RlZi5zY2hlbWE7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBlZmZlY3QgPSB0aGlzLl9kZWYuZWZmZWN0IHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGNoZWNrQ3R4ID0ge1xuICAgICAgICAgICAgYWRkSXNzdWU6IChhcmcpID0+IHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIGFyZyk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZy5mYXRhbCkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3R4LnBhdGg7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBjaGVja0N0eC5hZGRJc3N1ZSA9IGNoZWNrQ3R4LmFkZElzc3VlLmJpbmQoY2hlY2tDdHgpO1xuICAgICAgICBpZiAoZWZmZWN0LnR5cGUgPT09IFwicHJlcHJvY2Vzc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWQgPSBlZmZlY3QudHJhbnNmb3JtKGN0eC5kYXRhLCBjaGVja0N0eCk7XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImRpcnR5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2Nlc3NlZCkudGhlbigocHJvY2Vzc2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJyZWZpbmVtZW50XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVSZWZpbmVtZW50ID0gKGFjY1xuICAgICAgICAgICAgLy8gZWZmZWN0OiBSZWZpbmVtZW50RWZmZWN0PGFueT5cbiAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC5yZWZpbmVtZW50KGFjYywgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkXG4gICAgICAgICAgICAgICAgZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5uZXIudmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hXG4gICAgICAgICAgICAgICAgICAgIC5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGlubmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbm5lci52YWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZmZWN0LnR5cGUgPT09IFwidHJhbnNmb3JtXCIpIHtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZChiYXNlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZWZmZWN0LnRyYW5zZm9ybShiYXNlLnZhbHVlLCBjaGVja0N0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHJlc3VsdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoYmFzZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlZmZlY3QudHJhbnNmb3JtKGJhc2UudmFsdWUsIGNoZWNrQ3R4KSkudGhlbigocmVzdWx0KSA9PiAoeyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHJlc3VsdCB9KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXRpbC5hc3NlcnROZXZlcihlZmZlY3QpO1xuICAgIH1cbn1cblpvZEVmZmVjdHMuY3JlYXRlID0gKHNjaGVtYSwgZWZmZWN0LCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kRWZmZWN0cy5jcmVhdGVXaXRoUHJlcHJvY2VzcyA9IChwcmVwcm9jZXNzLCBzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicHJlcHJvY2Vzc1wiLCB0cmFuc2Zvcm06IHByZXByb2Nlc3MgfSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kT3B0aW9uYWwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBPSyh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kT3B0aW9uYWwuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT3B0aW9uYWwoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2ROdWxsYWJsZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLm51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBPSyhudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZE51bGxhYmxlLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGxhYmxlKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGxhYmxlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRGVmYXVsdCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgbGV0IGRhdGEgPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMuX2RlZi5kZWZhdWx0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW1vdmVEZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2REZWZhdWx0LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgcGFyYW1zLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBwYXJhbXMuZGVmYXVsdFxuICAgICAgICAgICAgOiAoKSA9PiBwYXJhbXMuZGVmYXVsdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZENhdGNoIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICAvLyBuZXdDdHggaXMgdXNlZCB0byBub3QgY29sbGVjdCBpc3N1ZXMgZnJvbSBpbm5lciB0eXBlcyBpbiBjdHhcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0ge1xuICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YTogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICBwYXRoOiBuZXdDdHgucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDoge1xuICAgICAgICAgICAgICAgIC4uLm5ld0N0eCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNBc3luYyhyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFpvZEVycm9yKG5ld0N0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBuZXdDdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcInZhbGlkXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2RlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFpvZEVycm9yKG5ld0N0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVDYXRjaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kQ2F0Y2guY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQ2F0Y2gsXG4gICAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBwYXJhbXMuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IHBhcmFtcy5jYXRjaCA6ICgpID0+IHBhcmFtcy5jYXRjaCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE5hTiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm5hbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5uYW4sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG59XG5ab2ROYU4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmFOKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROYU4sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jb25zdCBCUkFORCA9IFN5bWJvbChcInpvZF9icmFuZFwiKTtcbmNsYXNzIFpvZEJyYW5kZWQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjdHguZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbn1cbmNsYXNzIFpvZFBpcGVsaW5lIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVBc3luYyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IGF3YWl0IHRoaXMuX2RlZi5pbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKGluUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYub3V0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVBc3luYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5SZXN1bHQgPSB0aGlzLl9kZWYuaW4uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcImRpcnR5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpblJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhLCBiKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kUGlwZWxpbmUoe1xuICAgICAgICAgICAgaW46IGEsXG4gICAgICAgICAgICBvdXQ6IGIsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFBpcGVsaW5lLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5jbGFzcyBab2RSZWFkb25seSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIGlmIChpc1ZhbGlkKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IE9iamVjdC5mcmVlemUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblpvZFJlYWRvbmx5LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFJlYWRvbmx5KHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlYWRvbmx5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY29uc3QgY3VzdG9tID0gKGNoZWNrLCBwYXJhbXMgPSB7fSwgXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKlxuICogUGFzcyBgZmF0YWxgIGludG8gdGhlIHBhcmFtcyBvYmplY3QgaW5zdGVhZDpcbiAqXG4gKiBgYGB0c1xuICogei5zdHJpbmcoKS5jdXN0b20oKHZhbCkgPT4gdmFsLmxlbmd0aCA+IDUsIHsgZmF0YWw6IGZhbHNlIH0pXG4gKiBgYGBcbiAqXG4gKi9cbmZhdGFsKSA9PiB7XG4gICAgaWYgKGNoZWNrKVxuICAgICAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICBpZiAoIWNoZWNrKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA/IHBhcmFtcyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICA6IHR5cGVvZiBwYXJhbXMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8geyBtZXNzYWdlOiBwYXJhbXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJhbXM7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZhdGFsID0gKF9iID0gKF9hID0gcC5mYXRhbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmF0YWwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcDIgPSB0eXBlb2YgcCA9PT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZTogcCB9IDogcDtcbiAgICAgICAgICAgICAgICBjdHguYWRkSXNzdWUoeyBjb2RlOiBcImN1c3RvbVwiLCAuLi5wMiwgZmF0YWw6IF9mYXRhbCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIFpvZEFueS5jcmVhdGUoKTtcbn07XG5jb25zdCBsYXRlID0ge1xuICAgIG9iamVjdDogWm9kT2JqZWN0LmxhenljcmVhdGUsXG59O1xudmFyIFpvZEZpcnN0UGFydHlUeXBlS2luZDtcbihmdW5jdGlvbiAoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKSB7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU3RyaW5nXCJdID0gXCJab2RTdHJpbmdcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdW1iZXJcIl0gPSBcIlpvZE51bWJlclwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5hTlwiXSA9IFwiWm9kTmFOXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQmlnSW50XCJdID0gXCJab2RCaWdJbnRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCb29sZWFuXCJdID0gXCJab2RCb29sZWFuXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGF0ZVwiXSA9IFwiWm9kRGF0ZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFN5bWJvbFwiXSA9IFwiWm9kU3ltYm9sXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5kZWZpbmVkXCJdID0gXCJab2RVbmRlZmluZWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdWxsXCJdID0gXCJab2ROdWxsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQW55XCJdID0gXCJab2RBbnlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmtub3duXCJdID0gXCJab2RVbmtub3duXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmV2ZXJcIl0gPSBcIlpvZE5ldmVyXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVm9pZFwiXSA9IFwiWm9kVm9pZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEFycmF5XCJdID0gXCJab2RBcnJheVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE9iamVjdFwiXSA9IFwiWm9kT2JqZWN0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5pb25cIl0gPSBcIlpvZFVuaW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCJdID0gXCJab2REaXNjcmltaW5hdGVkVW5pb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RJbnRlcnNlY3Rpb25cIl0gPSBcIlpvZEludGVyc2VjdGlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFR1cGxlXCJdID0gXCJab2RUdXBsZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFJlY29yZFwiXSA9IFwiWm9kUmVjb3JkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTWFwXCJdID0gXCJab2RNYXBcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTZXRcIl0gPSBcIlpvZFNldFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEZ1bmN0aW9uXCJdID0gXCJab2RGdW5jdGlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZExhenlcIl0gPSBcIlpvZExhenlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RMaXRlcmFsXCJdID0gXCJab2RMaXRlcmFsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRW51bVwiXSA9IFwiWm9kRW51bVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEVmZmVjdHNcIl0gPSBcIlpvZEVmZmVjdHNcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROYXRpdmVFbnVtXCJdID0gXCJab2ROYXRpdmVFbnVtXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kT3B0aW9uYWxcIl0gPSBcIlpvZE9wdGlvbmFsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVsbGFibGVcIl0gPSBcIlpvZE51bGxhYmxlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGVmYXVsdFwiXSA9IFwiWm9kRGVmYXVsdFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZENhdGNoXCJdID0gXCJab2RDYXRjaFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFByb21pc2VcIl0gPSBcIlpvZFByb21pc2VcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCcmFuZGVkXCJdID0gXCJab2RCcmFuZGVkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUGlwZWxpbmVcIl0gPSBcIlpvZFBpcGVsaW5lXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUmVhZG9ubHlcIl0gPSBcIlpvZFJlYWRvbmx5XCI7XG59KShab2RGaXJzdFBhcnR5VHlwZUtpbmQgfHwgKFpvZEZpcnN0UGFydHlUeXBlS2luZCA9IHt9KSk7XG5jb25zdCBpbnN0YW5jZU9mVHlwZSA9IChcbi8vIGNvbnN0IGluc3RhbmNlT2ZUeXBlID0gPFQgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuY2xzLCBwYXJhbXMgPSB7XG4gICAgbWVzc2FnZTogYElucHV0IG5vdCBpbnN0YW5jZSBvZiAke2Nscy5uYW1lfWAsXG59KSA9PiBjdXN0b20oKGRhdGEpID0+IGRhdGEgaW5zdGFuY2VvZiBjbHMsIHBhcmFtcyk7XG5jb25zdCBzdHJpbmdUeXBlID0gWm9kU3RyaW5nLmNyZWF0ZTtcbmNvbnN0IG51bWJlclR5cGUgPSBab2ROdW1iZXIuY3JlYXRlO1xuY29uc3QgbmFuVHlwZSA9IFpvZE5hTi5jcmVhdGU7XG5jb25zdCBiaWdJbnRUeXBlID0gWm9kQmlnSW50LmNyZWF0ZTtcbmNvbnN0IGJvb2xlYW5UeXBlID0gWm9kQm9vbGVhbi5jcmVhdGU7XG5jb25zdCBkYXRlVHlwZSA9IFpvZERhdGUuY3JlYXRlO1xuY29uc3Qgc3ltYm9sVHlwZSA9IFpvZFN5bWJvbC5jcmVhdGU7XG5jb25zdCB1bmRlZmluZWRUeXBlID0gWm9kVW5kZWZpbmVkLmNyZWF0ZTtcbmNvbnN0IG51bGxUeXBlID0gWm9kTnVsbC5jcmVhdGU7XG5jb25zdCBhbnlUeXBlID0gWm9kQW55LmNyZWF0ZTtcbmNvbnN0IHVua25vd25UeXBlID0gWm9kVW5rbm93bi5jcmVhdGU7XG5jb25zdCBuZXZlclR5cGUgPSBab2ROZXZlci5jcmVhdGU7XG5jb25zdCB2b2lkVHlwZSA9IFpvZFZvaWQuY3JlYXRlO1xuY29uc3QgYXJyYXlUeXBlID0gWm9kQXJyYXkuY3JlYXRlO1xuY29uc3Qgb2JqZWN0VHlwZSA9IFpvZE9iamVjdC5jcmVhdGU7XG5jb25zdCBzdHJpY3RPYmplY3RUeXBlID0gWm9kT2JqZWN0LnN0cmljdENyZWF0ZTtcbmNvbnN0IHVuaW9uVHlwZSA9IFpvZFVuaW9uLmNyZWF0ZTtcbmNvbnN0IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUgPSBab2REaXNjcmltaW5hdGVkVW5pb24uY3JlYXRlO1xuY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IFpvZEludGVyc2VjdGlvbi5jcmVhdGU7XG5jb25zdCB0dXBsZVR5cGUgPSBab2RUdXBsZS5jcmVhdGU7XG5jb25zdCByZWNvcmRUeXBlID0gWm9kUmVjb3JkLmNyZWF0ZTtcbmNvbnN0IG1hcFR5cGUgPSBab2RNYXAuY3JlYXRlO1xuY29uc3Qgc2V0VHlwZSA9IFpvZFNldC5jcmVhdGU7XG5jb25zdCBmdW5jdGlvblR5cGUgPSBab2RGdW5jdGlvbi5jcmVhdGU7XG5jb25zdCBsYXp5VHlwZSA9IFpvZExhenkuY3JlYXRlO1xuY29uc3QgbGl0ZXJhbFR5cGUgPSBab2RMaXRlcmFsLmNyZWF0ZTtcbmNvbnN0IGVudW1UeXBlID0gWm9kRW51bS5jcmVhdGU7XG5jb25zdCBuYXRpdmVFbnVtVHlwZSA9IFpvZE5hdGl2ZUVudW0uY3JlYXRlO1xuY29uc3QgcHJvbWlzZVR5cGUgPSBab2RQcm9taXNlLmNyZWF0ZTtcbmNvbnN0IGVmZmVjdHNUeXBlID0gWm9kRWZmZWN0cy5jcmVhdGU7XG5jb25zdCBvcHRpb25hbFR5cGUgPSBab2RPcHRpb25hbC5jcmVhdGU7XG5jb25zdCBudWxsYWJsZVR5cGUgPSBab2ROdWxsYWJsZS5jcmVhdGU7XG5jb25zdCBwcmVwcm9jZXNzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlV2l0aFByZXByb2Nlc3M7XG5jb25zdCBwaXBlbGluZVR5cGUgPSBab2RQaXBlbGluZS5jcmVhdGU7XG5jb25zdCBvc3RyaW5nID0gKCkgPT4gc3RyaW5nVHlwZSgpLm9wdGlvbmFsKCk7XG5jb25zdCBvbnVtYmVyID0gKCkgPT4gbnVtYmVyVHlwZSgpLm9wdGlvbmFsKCk7XG5jb25zdCBvYm9vbGVhbiA9ICgpID0+IGJvb2xlYW5UeXBlKCkub3B0aW9uYWwoKTtcbmNvbnN0IGNvZXJjZSA9IHtcbiAgICBzdHJpbmc6ICgoYXJnKSA9PiBab2RTdHJpbmcuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIG51bWJlcjogKChhcmcpID0+IFpvZE51bWJlci5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG4gICAgYm9vbGVhbjogKChhcmcpID0+IFpvZEJvb2xlYW4uY3JlYXRlKHtcbiAgICAgICAgLi4uYXJnLFxuICAgICAgICBjb2VyY2U6IHRydWUsXG4gICAgfSkpLFxuICAgIGJpZ2ludDogKChhcmcpID0+IFpvZEJpZ0ludC5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG4gICAgZGF0ZTogKChhcmcpID0+IFpvZERhdGUuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxufTtcbmNvbnN0IE5FVkVSID0gSU5WQUxJRDtcblxudmFyIHogPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGRlZmF1bHRFcnJvck1hcDogZXJyb3JNYXAsXG4gICAgc2V0RXJyb3JNYXA6IHNldEVycm9yTWFwLFxuICAgIGdldEVycm9yTWFwOiBnZXRFcnJvck1hcCxcbiAgICBtYWtlSXNzdWU6IG1ha2VJc3N1ZSxcbiAgICBFTVBUWV9QQVRIOiBFTVBUWV9QQVRILFxuICAgIGFkZElzc3VlVG9Db250ZXh0OiBhZGRJc3N1ZVRvQ29udGV4dCxcbiAgICBQYXJzZVN0YXR1czogUGFyc2VTdGF0dXMsXG4gICAgSU5WQUxJRDogSU5WQUxJRCxcbiAgICBESVJUWTogRElSVFksXG4gICAgT0s6IE9LLFxuICAgIGlzQWJvcnRlZDogaXNBYm9ydGVkLFxuICAgIGlzRGlydHk6IGlzRGlydHksXG4gICAgaXNWYWxpZDogaXNWYWxpZCxcbiAgICBpc0FzeW5jOiBpc0FzeW5jLFxuICAgIGdldCB1dGlsICgpIHsgcmV0dXJuIHV0aWw7IH0sXG4gICAgZ2V0IG9iamVjdFV0aWwgKCkgeyByZXR1cm4gb2JqZWN0VXRpbDsgfSxcbiAgICBab2RQYXJzZWRUeXBlOiBab2RQYXJzZWRUeXBlLFxuICAgIGdldFBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUsXG4gICAgWm9kVHlwZTogWm9kVHlwZSxcbiAgICBab2RTdHJpbmc6IFpvZFN0cmluZyxcbiAgICBab2ROdW1iZXI6IFpvZE51bWJlcixcbiAgICBab2RCaWdJbnQ6IFpvZEJpZ0ludCxcbiAgICBab2RCb29sZWFuOiBab2RCb29sZWFuLFxuICAgIFpvZERhdGU6IFpvZERhdGUsXG4gICAgWm9kU3ltYm9sOiBab2RTeW1ib2wsXG4gICAgWm9kVW5kZWZpbmVkOiBab2RVbmRlZmluZWQsXG4gICAgWm9kTnVsbDogWm9kTnVsbCxcbiAgICBab2RBbnk6IFpvZEFueSxcbiAgICBab2RVbmtub3duOiBab2RVbmtub3duLFxuICAgIFpvZE5ldmVyOiBab2ROZXZlcixcbiAgICBab2RWb2lkOiBab2RWb2lkLFxuICAgIFpvZEFycmF5OiBab2RBcnJheSxcbiAgICBab2RPYmplY3Q6IFpvZE9iamVjdCxcbiAgICBab2RVbmlvbjogWm9kVW5pb24sXG4gICAgWm9kRGlzY3JpbWluYXRlZFVuaW9uOiBab2REaXNjcmltaW5hdGVkVW5pb24sXG4gICAgWm9kSW50ZXJzZWN0aW9uOiBab2RJbnRlcnNlY3Rpb24sXG4gICAgWm9kVHVwbGU6IFpvZFR1cGxlLFxuICAgIFpvZFJlY29yZDogWm9kUmVjb3JkLFxuICAgIFpvZE1hcDogWm9kTWFwLFxuICAgIFpvZFNldDogWm9kU2V0LFxuICAgIFpvZEZ1bmN0aW9uOiBab2RGdW5jdGlvbixcbiAgICBab2RMYXp5OiBab2RMYXp5LFxuICAgIFpvZExpdGVyYWw6IFpvZExpdGVyYWwsXG4gICAgWm9kRW51bTogWm9kRW51bSxcbiAgICBab2ROYXRpdmVFbnVtOiBab2ROYXRpdmVFbnVtLFxuICAgIFpvZFByb21pc2U6IFpvZFByb21pc2UsXG4gICAgWm9kRWZmZWN0czogWm9kRWZmZWN0cyxcbiAgICBab2RUcmFuc2Zvcm1lcjogWm9kRWZmZWN0cyxcbiAgICBab2RPcHRpb25hbDogWm9kT3B0aW9uYWwsXG4gICAgWm9kTnVsbGFibGU6IFpvZE51bGxhYmxlLFxuICAgIFpvZERlZmF1bHQ6IFpvZERlZmF1bHQsXG4gICAgWm9kQ2F0Y2g6IFpvZENhdGNoLFxuICAgIFpvZE5hTjogWm9kTmFOLFxuICAgIEJSQU5EOiBCUkFORCxcbiAgICBab2RCcmFuZGVkOiBab2RCcmFuZGVkLFxuICAgIFpvZFBpcGVsaW5lOiBab2RQaXBlbGluZSxcbiAgICBab2RSZWFkb25seTogWm9kUmVhZG9ubHksXG4gICAgY3VzdG9tOiBjdXN0b20sXG4gICAgU2NoZW1hOiBab2RUeXBlLFxuICAgIFpvZFNjaGVtYTogWm9kVHlwZSxcbiAgICBsYXRlOiBsYXRlLFxuICAgIGdldCBab2RGaXJzdFBhcnR5VHlwZUtpbmQgKCkgeyByZXR1cm4gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kOyB9LFxuICAgIGNvZXJjZTogY29lcmNlLFxuICAgIGFueTogYW55VHlwZSxcbiAgICBhcnJheTogYXJyYXlUeXBlLFxuICAgIGJpZ2ludDogYmlnSW50VHlwZSxcbiAgICBib29sZWFuOiBib29sZWFuVHlwZSxcbiAgICBkYXRlOiBkYXRlVHlwZSxcbiAgICBkaXNjcmltaW5hdGVkVW5pb246IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUsXG4gICAgZWZmZWN0OiBlZmZlY3RzVHlwZSxcbiAgICAnZW51bSc6IGVudW1UeXBlLFxuICAgICdmdW5jdGlvbic6IGZ1bmN0aW9uVHlwZSxcbiAgICAnaW5zdGFuY2VvZic6IGluc3RhbmNlT2ZUeXBlLFxuICAgIGludGVyc2VjdGlvbjogaW50ZXJzZWN0aW9uVHlwZSxcbiAgICBsYXp5OiBsYXp5VHlwZSxcbiAgICBsaXRlcmFsOiBsaXRlcmFsVHlwZSxcbiAgICBtYXA6IG1hcFR5cGUsXG4gICAgbmFuOiBuYW5UeXBlLFxuICAgIG5hdGl2ZUVudW06IG5hdGl2ZUVudW1UeXBlLFxuICAgIG5ldmVyOiBuZXZlclR5cGUsXG4gICAgJ251bGwnOiBudWxsVHlwZSxcbiAgICBudWxsYWJsZTogbnVsbGFibGVUeXBlLFxuICAgIG51bWJlcjogbnVtYmVyVHlwZSxcbiAgICBvYmplY3Q6IG9iamVjdFR5cGUsXG4gICAgb2Jvb2xlYW46IG9ib29sZWFuLFxuICAgIG9udW1iZXI6IG9udW1iZXIsXG4gICAgb3B0aW9uYWw6IG9wdGlvbmFsVHlwZSxcbiAgICBvc3RyaW5nOiBvc3RyaW5nLFxuICAgIHBpcGVsaW5lOiBwaXBlbGluZVR5cGUsXG4gICAgcHJlcHJvY2VzczogcHJlcHJvY2Vzc1R5cGUsXG4gICAgcHJvbWlzZTogcHJvbWlzZVR5cGUsXG4gICAgcmVjb3JkOiByZWNvcmRUeXBlLFxuICAgIHNldDogc2V0VHlwZSxcbiAgICBzdHJpY3RPYmplY3Q6IHN0cmljdE9iamVjdFR5cGUsXG4gICAgc3RyaW5nOiBzdHJpbmdUeXBlLFxuICAgIHN5bWJvbDogc3ltYm9sVHlwZSxcbiAgICB0cmFuc2Zvcm1lcjogZWZmZWN0c1R5cGUsXG4gICAgdHVwbGU6IHR1cGxlVHlwZSxcbiAgICAndW5kZWZpbmVkJzogdW5kZWZpbmVkVHlwZSxcbiAgICB1bmlvbjogdW5pb25UeXBlLFxuICAgIHVua25vd246IHVua25vd25UeXBlLFxuICAgICd2b2lkJzogdm9pZFR5cGUsXG4gICAgTkVWRVI6IE5FVkVSLFxuICAgIFpvZElzc3VlQ29kZTogWm9kSXNzdWVDb2RlLFxuICAgIHF1b3RlbGVzc0pzb246IHF1b3RlbGVzc0pzb24sXG4gICAgWm9kRXJyb3I6IFpvZEVycm9yXG59KTtcblxuZXhwb3J0IHsgQlJBTkQsIERJUlRZLCBFTVBUWV9QQVRILCBJTlZBTElELCBORVZFUiwgT0ssIFBhcnNlU3RhdHVzLCBab2RUeXBlIGFzIFNjaGVtYSwgWm9kQW55LCBab2RBcnJheSwgWm9kQmlnSW50LCBab2RCb29sZWFuLCBab2RCcmFuZGVkLCBab2RDYXRjaCwgWm9kRGF0ZSwgWm9kRGVmYXVsdCwgWm9kRGlzY3JpbWluYXRlZFVuaW9uLCBab2RFZmZlY3RzLCBab2RFbnVtLCBab2RFcnJvciwgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLCBab2RGdW5jdGlvbiwgWm9kSW50ZXJzZWN0aW9uLCBab2RJc3N1ZUNvZGUsIFpvZExhenksIFpvZExpdGVyYWwsIFpvZE1hcCwgWm9kTmFOLCBab2ROYXRpdmVFbnVtLCBab2ROZXZlciwgWm9kTnVsbCwgWm9kTnVsbGFibGUsIFpvZE51bWJlciwgWm9kT2JqZWN0LCBab2RPcHRpb25hbCwgWm9kUGFyc2VkVHlwZSwgWm9kUGlwZWxpbmUsIFpvZFByb21pc2UsIFpvZFJlYWRvbmx5LCBab2RSZWNvcmQsIFpvZFR5cGUgYXMgWm9kU2NoZW1hLCBab2RTZXQsIFpvZFN0cmluZywgWm9kU3ltYm9sLCBab2RFZmZlY3RzIGFzIFpvZFRyYW5zZm9ybWVyLCBab2RUdXBsZSwgWm9kVHlwZSwgWm9kVW5kZWZpbmVkLCBab2RVbmlvbiwgWm9kVW5rbm93biwgWm9kVm9pZCwgYWRkSXNzdWVUb0NvbnRleHQsIGFueVR5cGUgYXMgYW55LCBhcnJheVR5cGUgYXMgYXJyYXksIGJpZ0ludFR5cGUgYXMgYmlnaW50LCBib29sZWFuVHlwZSBhcyBib29sZWFuLCBjb2VyY2UsIGN1c3RvbSwgZGF0ZVR5cGUgYXMgZGF0ZSwgeiBhcyBkZWZhdWx0LCBlcnJvck1hcCBhcyBkZWZhdWx0RXJyb3JNYXAsIGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUgYXMgZGlzY3JpbWluYXRlZFVuaW9uLCBlZmZlY3RzVHlwZSBhcyBlZmZlY3QsIGVudW1UeXBlIGFzIGVudW0sIGZ1bmN0aW9uVHlwZSBhcyBmdW5jdGlvbiwgZ2V0RXJyb3JNYXAsIGdldFBhcnNlZFR5cGUsIGluc3RhbmNlT2ZUeXBlIGFzIGluc3RhbmNlb2YsIGludGVyc2VjdGlvblR5cGUgYXMgaW50ZXJzZWN0aW9uLCBpc0Fib3J0ZWQsIGlzQXN5bmMsIGlzRGlydHksIGlzVmFsaWQsIGxhdGUsIGxhenlUeXBlIGFzIGxhenksIGxpdGVyYWxUeXBlIGFzIGxpdGVyYWwsIG1ha2VJc3N1ZSwgbWFwVHlwZSBhcyBtYXAsIG5hblR5cGUgYXMgbmFuLCBuYXRpdmVFbnVtVHlwZSBhcyBuYXRpdmVFbnVtLCBuZXZlclR5cGUgYXMgbmV2ZXIsIG51bGxUeXBlIGFzIG51bGwsIG51bGxhYmxlVHlwZSBhcyBudWxsYWJsZSwgbnVtYmVyVHlwZSBhcyBudW1iZXIsIG9iamVjdFR5cGUgYXMgb2JqZWN0LCBvYmplY3RVdGlsLCBvYm9vbGVhbiwgb251bWJlciwgb3B0aW9uYWxUeXBlIGFzIG9wdGlvbmFsLCBvc3RyaW5nLCBwaXBlbGluZVR5cGUgYXMgcGlwZWxpbmUsIHByZXByb2Nlc3NUeXBlIGFzIHByZXByb2Nlc3MsIHByb21pc2VUeXBlIGFzIHByb21pc2UsIHF1b3RlbGVzc0pzb24sIHJlY29yZFR5cGUgYXMgcmVjb3JkLCBzZXRUeXBlIGFzIHNldCwgc2V0RXJyb3JNYXAsIHN0cmljdE9iamVjdFR5cGUgYXMgc3RyaWN0T2JqZWN0LCBzdHJpbmdUeXBlIGFzIHN0cmluZywgc3ltYm9sVHlwZSBhcyBzeW1ib2wsIGVmZmVjdHNUeXBlIGFzIHRyYW5zZm9ybWVyLCB0dXBsZVR5cGUgYXMgdHVwbGUsIHVuZGVmaW5lZFR5cGUgYXMgdW5kZWZpbmVkLCB1bmlvblR5cGUgYXMgdW5pb24sIHVua25vd25UeXBlIGFzIHVua25vd24sIHV0aWwsIHZvaWRUeXBlIGFzIHZvaWQsIHogfTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJleHBvcnQgKiBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuZXhwb3J0ICogZnJvbSBcIkBlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYlwiO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|