@aws-cdk/aws-medialive-alpha 2.268.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/.jsii +60888 -0
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +524 -0
  4. package/LICENSE +201 -0
  5. package/NOTICE +2 -0
  6. package/README.md +1297 -0
  7. package/grants.json +27 -0
  8. package/lib/audio-codec-settings.d.ts +901 -0
  9. package/lib/audio-codec-settings.js +1098 -0
  10. package/lib/audio-selector.d.ts +170 -0
  11. package/lib/audio-selector.js +306 -0
  12. package/lib/avail-settings.d.ts +231 -0
  13. package/lib/avail-settings.js +226 -0
  14. package/lib/caption-selector.d.ts +234 -0
  15. package/lib/caption-selector.js +413 -0
  16. package/lib/caption-settings.d.ts +349 -0
  17. package/lib/caption-settings.js +482 -0
  18. package/lib/channel-features.d.ts +106 -0
  19. package/lib/channel-features.js +85 -0
  20. package/lib/channel-placement-group.d.ts +73 -0
  21. package/lib/channel-placement-group.js +132 -0
  22. package/lib/channel.d.ts +687 -0
  23. package/lib/channel.js +1096 -0
  24. package/lib/cluster.d.ts +129 -0
  25. package/lib/cluster.js +158 -0
  26. package/lib/color-correction.d.ts +39 -0
  27. package/lib/color-correction.js +29 -0
  28. package/lib/destinations.d.ts +242 -0
  29. package/lib/destinations.js +455 -0
  30. package/lib/encode-configuration.d.ts +615 -0
  31. package/lib/encode-configuration.js +629 -0
  32. package/lib/enums.d.ts +698 -0
  33. package/lib/enums.js +1045 -0
  34. package/lib/file-location.d.ts +65 -0
  35. package/lib/file-location.js +150 -0
  36. package/lib/framerate.d.ts +31 -0
  37. package/lib/framerate.js +71 -0
  38. package/lib/index.d.ts +26 -0
  39. package/lib/index.js +43 -0
  40. package/lib/input-attachment.d.ts +319 -0
  41. package/lib/input-attachment.js +228 -0
  42. package/lib/input-security-group.d.ts +51 -0
  43. package/lib/input-security-group.js +123 -0
  44. package/lib/input-specification.d.ts +111 -0
  45. package/lib/input-specification.js +181 -0
  46. package/lib/input.d.ts +505 -0
  47. package/lib/input.js +803 -0
  48. package/lib/m2ts-settings.d.ts +421 -0
  49. package/lib/m2ts-settings.js +469 -0
  50. package/lib/m3u8-settings.d.ts +272 -0
  51. package/lib/m3u8-settings.js +304 -0
  52. package/lib/medialive-grants.generated.d.ts +30 -0
  53. package/lib/medialive-grants.generated.js +92 -0
  54. package/lib/network.d.ts +83 -0
  55. package/lib/network.js +132 -0
  56. package/lib/output-group.d.ts +924 -0
  57. package/lib/output-group.js +941 -0
  58. package/lib/outputs.d.ts +304 -0
  59. package/lib/outputs.js +598 -0
  60. package/lib/sdi-source.d.ts +124 -0
  61. package/lib/sdi-source.js +180 -0
  62. package/lib/shared.d.ts +44 -0
  63. package/lib/shared.js +146 -0
  64. package/lib/video-codec-settings.d.ts +1500 -0
  65. package/lib/video-codec-settings.js +1722 -0
  66. package/lib/video-selection.d.ts +92 -0
  67. package/lib/video-selection.js +95 -0
  68. package/package.json +135 -0
  69. package/rosetta/_generated.ts-fixture +6 -0
  70. package/rosetta/default.ts-fixture +21 -0
@@ -0,0 +1,170 @@
1
+ import type { AudioNormalizationSettings, RemixSettings } from './encode-configuration';
2
+ /**
3
+ * Policy for how MediaLive identifies the audio stream when selecting by language, on a
4
+ * transport-stream PMT update.
5
+ */
6
+ export declare class AudioLanguageSelectionPolicy {
7
+ /**
8
+ * Strictly identify audio by its language descriptor. If the matching language is no
9
+ * longer present after a PMT update, mute is encoded until the language returns.
10
+ */
11
+ static readonly STRICT: AudioLanguageSelectionPolicy;
12
+ /**
13
+ * On a PMT update, fall back to another audio stream of the same type in the program if a
14
+ * stream with the same language can't be found.
15
+ */
16
+ static readonly LOOSE: AudioLanguageSelectionPolicy;
17
+ /** A value not yet modelled by AWS CDK. */
18
+ static of(value: string): AudioLanguageSelectionPolicy;
19
+ /** The underlying string value passed to CloudFormation. */
20
+ readonly value: string;
21
+ private constructor();
22
+ }
23
+ /**
24
+ * Options for selecting an HLS audio rendition.
25
+ */
26
+ export interface HlsRenditionSelectionOptions {
27
+ /** The `GROUP-ID` in the `#EXT-X-MEDIA` tag of the target HLS audio rendition. */
28
+ readonly groupId: string;
29
+ /** The `NAME` in the `#EXT-X-MEDIA` tag of the target HLS audio rendition. */
30
+ readonly renditionName: string;
31
+ }
32
+ /**
33
+ * Which Dolby E program to decode from a selected audio track.
34
+ */
35
+ export declare class DolbyEProgramSelection {
36
+ /** Decode all channels. */
37
+ static readonly ALL_CHANNELS: DolbyEProgramSelection;
38
+ /** Decode Dolby E program 1. */
39
+ static readonly PROGRAM_1: DolbyEProgramSelection;
40
+ /** Decode Dolby E program 2. */
41
+ static readonly PROGRAM_2: DolbyEProgramSelection;
42
+ /** Decode Dolby E program 3. */
43
+ static readonly PROGRAM_3: DolbyEProgramSelection;
44
+ /** Decode Dolby E program 4. */
45
+ static readonly PROGRAM_4: DolbyEProgramSelection;
46
+ /** Decode Dolby E program 5. */
47
+ static readonly PROGRAM_5: DolbyEProgramSelection;
48
+ /** Decode Dolby E program 6. */
49
+ static readonly PROGRAM_6: DolbyEProgramSelection;
50
+ /** Decode Dolby E program 7. */
51
+ static readonly PROGRAM_7: DolbyEProgramSelection;
52
+ /** Decode Dolby E program 8. */
53
+ static readonly PROGRAM_8: DolbyEProgramSelection;
54
+ /** A value not yet modelled by AWS CDK. */
55
+ static of(value: string): DolbyEProgramSelection;
56
+ /** The underlying string value passed to CloudFormation. */
57
+ readonly value: string;
58
+ private constructor();
59
+ }
60
+ /**
61
+ * Configuration for a single audio PID in a PID-based selector.
62
+ */
63
+ export interface AudioPidConfig {
64
+ /** The packet identifier (PID) value from within the source. */
65
+ readonly pid: number;
66
+ /**
67
+ * Which Dolby E program to decode from this PID.
68
+ * @default - no Dolby E decoding
69
+ */
70
+ readonly dolbyEDecode?: DolbyEProgramSelection;
71
+ /**
72
+ * Pre-mixer settings for this PID (gain, channel remix, loudness normalization).
73
+ * @default - no pre-mixing
74
+ */
75
+ readonly premixSettings?: AudioPreMixerSettings;
76
+ }
77
+ /**
78
+ * Configuration for a single audio track in a track-based selector.
79
+ */
80
+ export interface AudioTrackConfig {
81
+ /** The 1-based track number to extract. */
82
+ readonly track: number;
83
+ /**
84
+ * Pre-mixer settings for this track (gain, channel remix, loudness normalization).
85
+ * @default - no pre-mixing
86
+ */
87
+ readonly premixSettings?: AudioPreMixerSettings;
88
+ }
89
+ /**
90
+ * Audio pre-mixer settings for normalizing audio before interleaving.
91
+ * Applied per-PID or per-track before tracks are combined.
92
+ */
93
+ export declare class AudioPreMixerSettings {
94
+ private readonly props;
95
+ /**
96
+ * Create pre-mixer settings.
97
+ */
98
+ static of(props: AudioPreMixerSettingsProps): AudioPreMixerSettings;
99
+ private constructor();
100
+ }
101
+ /**
102
+ * Properties for audio pre-mixer settings.
103
+ */
104
+ export interface AudioPreMixerSettingsProps {
105
+ /**
106
+ * The gain adjustment in decibels (dB).
107
+ * @default - no gain adjustment
108
+ */
109
+ readonly gainDb?: number;
110
+ /**
111
+ * The number of audio channels to remix to. Overridden by `remixSettings` if specified.
112
+ * @default - pass through original channel count
113
+ */
114
+ readonly channels?: number;
115
+ /**
116
+ * Remix settings for fine-grained channel mapping and gain levels.
117
+ * @default - no remixing
118
+ */
119
+ readonly remixSettings?: RemixSettings;
120
+ /**
121
+ * Audio normalization settings for loudness control.
122
+ * @default - no normalization
123
+ */
124
+ readonly audioNormalizationSettings?: AudioNormalizationSettings;
125
+ }
126
+ /**
127
+ * An audio selector that identifies which audio to extract from the input.
128
+ */
129
+ export declare abstract class AudioSelector {
130
+ /**
131
+ * Select audio by language code.
132
+ *
133
+ * @param name a name for this selector
134
+ * @param languageCode the three-letter (ISO 639-2) language code to select
135
+ * @param languageSelectionPolicy how strictly to identify the stream by language on a PMT update
136
+ */
137
+ static byLanguage(name: string, languageCode: string, languageSelectionPolicy?: AudioLanguageSelectionPolicy): AudioSelector;
138
+ /**
139
+ * Select one or more audio PIDs from the source.
140
+ *
141
+ * @param name a name for this selector
142
+ * @param pids the PID configurations (each with optional Dolby E decode and pre-mix settings)
143
+ */
144
+ static byPid(name: string, pids: AudioPidConfig[]): AudioSelector;
145
+ /**
146
+ * Select one or more audio tracks (1-based) from the source.
147
+ *
148
+ * @param name a name for this selector
149
+ * @param tracks the track configurations (each with optional pre-mix settings)
150
+ * @param dolbyEProgramSelection which Dolby E program to decode from the selected track(s)
151
+ */
152
+ static byTrack(name: string, tracks: AudioTrackConfig[], dolbyEProgramSelection?: DolbyEProgramSelection): AudioSelector;
153
+ /**
154
+ * Select an HLS audio rendition by its `#EXT-X-MEDIA` `GROUP-ID` and `NAME`.
155
+ *
156
+ * @param name a name for this selector
157
+ * @param options the target rendition's group id and name
158
+ */
159
+ static hlsRendition(name: string, options: HlsRenditionSelectionOptions): AudioSelector;
160
+ /**
161
+ * Select the default audio track (no specific selector settings).
162
+ */
163
+ static default(name: string): AudioSelector;
164
+ /**
165
+ * The name of this audio selector. Reference it from features that monitor a specific
166
+ * selector, such as an audio-silence {@link FailoverCondition}.
167
+ */
168
+ readonly name: string;
169
+ protected constructor(name: string);
170
+ }
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AudioSelector = exports.AudioPreMixerSettings = exports.DolbyEProgramSelection = exports.AudioLanguageSelectionPolicy = void 0;
4
+ const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
8
+ /**
9
+ * Policy for how MediaLive identifies the audio stream when selecting by language, on a
10
+ * transport-stream PMT update.
11
+ */
12
+ class AudioLanguageSelectionPolicy {
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.AudioLanguageSelectionPolicy", version: "2.268.0-alpha.0" };
14
+ /**
15
+ * Strictly identify audio by its language descriptor. If the matching language is no
16
+ * longer present after a PMT update, mute is encoded until the language returns.
17
+ */
18
+ static STRICT = new AudioLanguageSelectionPolicy('STRICT');
19
+ /**
20
+ * On a PMT update, fall back to another audio stream of the same type in the program if a
21
+ * stream with the same language can't be found.
22
+ */
23
+ static LOOSE = new AudioLanguageSelectionPolicy('LOOSE');
24
+ /** A value not yet modelled by AWS CDK. */
25
+ static of(value) {
26
+ return new AudioLanguageSelectionPolicy(value);
27
+ }
28
+ /** The underlying string value passed to CloudFormation. */
29
+ value;
30
+ constructor(value) {
31
+ this.value = value;
32
+ }
33
+ }
34
+ exports.AudioLanguageSelectionPolicy = AudioLanguageSelectionPolicy;
35
+ /**
36
+ * Which Dolby E program to decode from a selected audio track.
37
+ */
38
+ class DolbyEProgramSelection {
39
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.DolbyEProgramSelection", version: "2.268.0-alpha.0" };
40
+ /** Decode all channels. */
41
+ static ALL_CHANNELS = new DolbyEProgramSelection('ALL_CHANNELS');
42
+ /** Decode Dolby E program 1. */
43
+ static PROGRAM_1 = new DolbyEProgramSelection('PROGRAM_1');
44
+ /** Decode Dolby E program 2. */
45
+ static PROGRAM_2 = new DolbyEProgramSelection('PROGRAM_2');
46
+ /** Decode Dolby E program 3. */
47
+ static PROGRAM_3 = new DolbyEProgramSelection('PROGRAM_3');
48
+ /** Decode Dolby E program 4. */
49
+ static PROGRAM_4 = new DolbyEProgramSelection('PROGRAM_4');
50
+ /** Decode Dolby E program 5. */
51
+ static PROGRAM_5 = new DolbyEProgramSelection('PROGRAM_5');
52
+ /** Decode Dolby E program 6. */
53
+ static PROGRAM_6 = new DolbyEProgramSelection('PROGRAM_6');
54
+ /** Decode Dolby E program 7. */
55
+ static PROGRAM_7 = new DolbyEProgramSelection('PROGRAM_7');
56
+ /** Decode Dolby E program 8. */
57
+ static PROGRAM_8 = new DolbyEProgramSelection('PROGRAM_8');
58
+ /** A value not yet modelled by AWS CDK. */
59
+ static of(value) {
60
+ return new DolbyEProgramSelection(value);
61
+ }
62
+ /** The underlying string value passed to CloudFormation. */
63
+ value;
64
+ constructor(value) {
65
+ this.value = value;
66
+ }
67
+ }
68
+ exports.DolbyEProgramSelection = DolbyEProgramSelection;
69
+ /**
70
+ * Audio pre-mixer settings for normalizing audio before interleaving.
71
+ * Applied per-PID or per-track before tracks are combined.
72
+ */
73
+ class AudioPreMixerSettings {
74
+ props;
75
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.AudioPreMixerSettings", version: "2.268.0-alpha.0" };
76
+ /**
77
+ * Create pre-mixer settings.
78
+ */
79
+ static of(props) {
80
+ try {
81
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_AudioPreMixerSettingsProps(props);
82
+ }
83
+ catch (error) {
84
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
85
+ Error.captureStackTrace(error, this.of);
86
+ }
87
+ throw error;
88
+ }
89
+ return new AudioPreMixerSettings(props);
90
+ }
91
+ constructor(props) {
92
+ this.props = props;
93
+ }
94
+ /** @internal */
95
+ _bind() {
96
+ return {
97
+ gainDb: this.props.gainDb,
98
+ channels: this.props.channels,
99
+ remixSettings: this.props.remixSettings ? {
100
+ channelMappings: this.props.remixSettings.channelMappings.map(m => ({
101
+ outputChannel: m.outputChannel,
102
+ inputChannelLevels: m.inputChannelLevels.map(l => ({
103
+ inputChannel: l.inputChannel,
104
+ gain: l.gain ?? 0,
105
+ })),
106
+ })),
107
+ channelsIn: this.props.remixSettings.channelsIn,
108
+ channelsOut: this.props.remixSettings.channelsOut,
109
+ } : undefined,
110
+ audioNormalizationSettings: this.props.audioNormalizationSettings ? {
111
+ algorithm: this.props.audioNormalizationSettings.algorithm?.value,
112
+ algorithmControl: this.props.audioNormalizationSettings.algorithmControl?.value,
113
+ targetLkfs: this.props.audioNormalizationSettings.targetLkfs,
114
+ peakCalculation: this.props.audioNormalizationSettings.peakCalculation?.value,
115
+ peakLimiterThreshold: this.props.audioNormalizationSettings.peakLimiterThreshold,
116
+ } : undefined,
117
+ };
118
+ }
119
+ }
120
+ exports.AudioPreMixerSettings = AudioPreMixerSettings;
121
+ /**
122
+ * An audio selector that identifies which audio to extract from the input.
123
+ */
124
+ class AudioSelector {
125
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-medialive-alpha.AudioSelector", version: "2.268.0-alpha.0" };
126
+ /**
127
+ * Select audio by language code.
128
+ *
129
+ * @param name a name for this selector
130
+ * @param languageCode the three-letter (ISO 639-2) language code to select
131
+ * @param languageSelectionPolicy how strictly to identify the stream by language on a PMT update
132
+ */
133
+ static byLanguage(name, languageCode, languageSelectionPolicy) {
134
+ try {
135
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_AudioLanguageSelectionPolicy(languageSelectionPolicy);
136
+ }
137
+ catch (error) {
138
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
139
+ Error.captureStackTrace(error, this.byLanguage);
140
+ }
141
+ throw error;
142
+ }
143
+ return new LanguageAudioSelector(name, languageCode, languageSelectionPolicy);
144
+ }
145
+ /**
146
+ * Select one or more audio PIDs from the source.
147
+ *
148
+ * @param name a name for this selector
149
+ * @param pids the PID configurations (each with optional Dolby E decode and pre-mix settings)
150
+ */
151
+ static byPid(name, pids) {
152
+ return new PidAudioSelector(name, pids);
153
+ }
154
+ /**
155
+ * Select one or more audio tracks (1-based) from the source.
156
+ *
157
+ * @param name a name for this selector
158
+ * @param tracks the track configurations (each with optional pre-mix settings)
159
+ * @param dolbyEProgramSelection which Dolby E program to decode from the selected track(s)
160
+ */
161
+ static byTrack(name, tracks, dolbyEProgramSelection) {
162
+ try {
163
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_DolbyEProgramSelection(dolbyEProgramSelection);
164
+ }
165
+ catch (error) {
166
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
167
+ Error.captureStackTrace(error, this.byTrack);
168
+ }
169
+ throw error;
170
+ }
171
+ return new TrackAudioSelector(name, tracks, dolbyEProgramSelection);
172
+ }
173
+ /**
174
+ * Select an HLS audio rendition by its `#EXT-X-MEDIA` `GROUP-ID` and `NAME`.
175
+ *
176
+ * @param name a name for this selector
177
+ * @param options the target rendition's group id and name
178
+ */
179
+ static hlsRendition(name, options) {
180
+ try {
181
+ jsiiDeprecationWarnings._aws_cdk_aws_medialive_alpha_HlsRenditionSelectionOptions(options);
182
+ }
183
+ catch (error) {
184
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
185
+ Error.captureStackTrace(error, this.hlsRendition);
186
+ }
187
+ throw error;
188
+ }
189
+ return new HlsRenditionAudioSelector(name, options);
190
+ }
191
+ /**
192
+ * Select the default audio track (no specific selector settings).
193
+ */
194
+ static default(name) {
195
+ return new DefaultAudioSelector(name);
196
+ }
197
+ /**
198
+ * The name of this audio selector. Reference it from features that monitor a specific
199
+ * selector, such as an audio-silence {@link FailoverCondition}.
200
+ */
201
+ name;
202
+ constructor(name) {
203
+ this.name = name;
204
+ }
205
+ }
206
+ exports.AudioSelector = AudioSelector;
207
+ /** @internal */
208
+ class LanguageAudioSelector extends AudioSelector {
209
+ languageCode;
210
+ policy;
211
+ constructor(name, languageCode, policy) {
212
+ super(name);
213
+ this.languageCode = languageCode;
214
+ this.policy = policy;
215
+ }
216
+ _bind() {
217
+ return {
218
+ name: this.name,
219
+ selectorSettings: {
220
+ audioLanguageSelection: {
221
+ languageCode: this.languageCode,
222
+ languageSelectionPolicy: this.policy?.value,
223
+ },
224
+ },
225
+ };
226
+ }
227
+ }
228
+ /** @internal */
229
+ class PidAudioSelector extends AudioSelector {
230
+ pids;
231
+ constructor(name, pids) {
232
+ super(name);
233
+ this.pids = pids;
234
+ if (pids.length === 0) {
235
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `AudioPidSelectorEmpty`, 'byPid() requires at least one PID configuration');
236
+ }
237
+ }
238
+ _bind() {
239
+ return {
240
+ name: this.name,
241
+ selectorSettings: {
242
+ audioPidSelection: {
243
+ pids: this.pids.map(p => ({
244
+ pid: p.pid,
245
+ dolbyEDecode: p.dolbyEDecode ? { programSelection: p.dolbyEDecode.value } : undefined,
246
+ premixSettings: p.premixSettings?._bind(),
247
+ })),
248
+ },
249
+ },
250
+ };
251
+ }
252
+ }
253
+ /** @internal */
254
+ class TrackAudioSelector extends AudioSelector {
255
+ tracks;
256
+ dolbyEProgramSelection;
257
+ constructor(name, tracks, dolbyEProgramSelection) {
258
+ super(name);
259
+ this.tracks = tracks;
260
+ this.dolbyEProgramSelection = dolbyEProgramSelection;
261
+ if (tracks.length === 0) {
262
+ throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `AudioTrackSelectorEmpty`, 'byTrack() requires at least one track configuration');
263
+ }
264
+ }
265
+ _bind() {
266
+ return {
267
+ name: this.name,
268
+ selectorSettings: {
269
+ audioTrackSelection: {
270
+ tracks: this.tracks.map(t => ({
271
+ track: t.track,
272
+ premixSettings: t.premixSettings?._bind(),
273
+ })),
274
+ dolbyEDecode: this.dolbyEProgramSelection ? { programSelection: this.dolbyEProgramSelection.value } : undefined,
275
+ },
276
+ },
277
+ };
278
+ }
279
+ }
280
+ /** @internal */
281
+ class HlsRenditionAudioSelector extends AudioSelector {
282
+ options;
283
+ constructor(name, options) {
284
+ super(name);
285
+ this.options = options;
286
+ }
287
+ _bind() {
288
+ return {
289
+ name: this.name,
290
+ selectorSettings: {
291
+ audioHlsRenditionSelection: {
292
+ groupId: this.options.groupId,
293
+ name: this.options.renditionName,
294
+ },
295
+ },
296
+ };
297
+ }
298
+ }
299
+ /** @internal */
300
+ class DefaultAudioSelector extends AudioSelector {
301
+ constructor(name) { super(name); }
302
+ _bind() {
303
+ return { name: this.name };
304
+ }
305
+ }
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8tc2VsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhdWRpby1zZWxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFzRDtBQUV0RCw0RUFBNEQ7QUFHNUQ7OztHQUdHO0FBQ0gsTUFBYSw0QkFBNEI7O0lBQ3ZDOzs7T0FHRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRTs7O09BR0c7SUFDSSxNQUFNLENBQVUsS0FBSyxHQUFHLElBQUksNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFekUsMkNBQTJDO0lBQ3BDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBYTtRQUM1QixPQUFPLElBQUksNEJBQTRCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDaEQ7SUFFRCw0REFBNEQ7SUFDNUMsS0FBSyxDQUFTO0lBRTlCLFlBQW9CLEtBQWE7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7S0FDcEI7O0FBdEJILG9FQXVCQztBQVlEOztHQUVHO0FBQ0gsTUFBYSxzQkFBc0I7O0lBQ2pDLDJCQUEyQjtJQUNwQixNQUFNLENBQVUsWUFBWSxHQUFHLElBQUksc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakYsZ0NBQWdDO0lBQ3pCLE1BQU0sQ0FBVSxTQUFTLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRSxnQ0FBZ0M7SUFDekIsTUFBTSxDQUFVLFNBQVMsR0FBRyxJQUFJLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLGdDQUFnQztJQUN6QixNQUFNLENBQVUsU0FBUyxHQUFHLElBQUksc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0UsZ0NBQWdDO0lBQ3pCLE1BQU0sQ0FBVSxTQUFTLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRSxnQ0FBZ0M7SUFDekIsTUFBTSxDQUFVLFNBQVMsR0FBRyxJQUFJLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLGdDQUFnQztJQUN6QixNQUFNLENBQVUsU0FBUyxHQUFHLElBQUksc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0UsZ0NBQWdDO0lBQ3pCLE1BQU0sQ0FBVSxTQUFTLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRSxnQ0FBZ0M7SUFDekIsTUFBTSxDQUFVLFNBQVMsR0FBRyxJQUFJLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTNFLDJDQUEyQztJQUNwQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWE7UUFDNUIsT0FBTyxJQUFJLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzFDO0lBRUQsNERBQTREO0lBQzVDLEtBQUssQ0FBUztJQUU5QixZQUFvQixLQUFhO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0tBQ3BCOztBQTlCSCx3REErQkM7QUFpQ0Q7OztHQUdHO0FBQ0gsTUFBYSxxQkFBcUI7SUFRSzs7SUFQckM7O09BRUc7SUFDSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWlDOzs7Ozs7Ozs7O1FBQ2hELE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN6QztJQUVELFlBQXFDLEtBQWlDO1FBQWpDLFVBQUssR0FBTCxLQUFLLENBQTRCO0tBQUk7SUFFMUUsZ0JBQWdCO0lBQ1QsS0FBSztRQUNWLE9BQU87WUFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7WUFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDeEMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNsRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLGFBQWE7b0JBQzlCLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNqRCxZQUFZLEVBQUUsQ0FBQyxDQUFDLFlBQVk7d0JBQzVCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7cUJBQ2xCLENBQUMsQ0FBQztpQkFDSixDQUFDLENBQUM7Z0JBQ0gsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVU7Z0JBQy9DLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxXQUFXO2FBQ2xELENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDYiwwQkFBMEIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztnQkFDbEUsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsU0FBUyxFQUFFLEtBQUs7Z0JBQ2pFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSztnQkFDL0UsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsVUFBVTtnQkFDNUQsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsZUFBZSxFQUFFLEtBQUs7Z0JBQzdFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsb0JBQW9CO2FBQ2pGLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDZCxDQUFDO0tBQ0g7O0FBbENILHNEQW1DQztBQTRCRDs7R0FFRztBQUNILE1BQXNCLGFBQWE7O0lBQ2pDOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBWSxFQUFFLFlBQW9CLEVBQUUsdUJBQXNEOzs7Ozs7Ozs7O1FBQ2pILE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixDQUFDLENBQUM7S0FDL0U7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBWSxFQUFFLElBQXNCO1FBQ3RELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDekM7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVksRUFBRSxNQUEwQixFQUFFLHNCQUErQzs7Ozs7Ozs7OztRQUM3RyxPQUFPLElBQUksa0JBQWtCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0tBQ3JFO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLElBQVksRUFBRSxPQUFxQzs7Ozs7Ozs7OztRQUM1RSxPQUFPLElBQUkseUJBQXlCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3JEO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVk7UUFDaEMsT0FBTyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3ZDO0lBRUQ7OztPQUdHO0lBQ2EsSUFBSSxDQUFTO0lBRTdCLFlBQXNCLElBQVk7UUFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7S0FDbEI7O0FBMURILHNDQThEQztBQUVELGdCQUFnQjtBQUNoQixNQUFNLHFCQUFzQixTQUFRLGFBQWE7SUFDSjtJQUF1QztJQUFsRixZQUFZLElBQVksRUFBbUIsWUFBb0IsRUFBbUIsTUFBcUM7UUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBNUYsaUJBQVksR0FBWixZQUFZLENBQVE7UUFBbUIsV0FBTSxHQUFOLE1BQU0sQ0FBK0I7S0FBa0I7SUFDbEksS0FBSztRQUNWLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixnQkFBZ0IsRUFBRTtnQkFDaEIsc0JBQXNCLEVBQUU7b0JBQ3RCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDL0IsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLO2lCQUM1QzthQUNGO1NBQ0YsQ0FBQztLQUNIO0NBQ0Y7QUFFRCxnQkFBZ0I7QUFDaEIsTUFBTSxnQkFBaUIsU0FBUSxhQUFhO0lBQ0M7SUFBM0MsWUFBWSxJQUFZLEVBQW1CLElBQXNCO1FBQy9ELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUQ2QixTQUFJLEdBQUosSUFBSSxDQUFrQjtRQUUvRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLHFDQUF1QixDQUFDLElBQUEsc0JBQUcsRUFBQSx1QkFBdUIsRUFBRSxpREFBaUQsQ0FBQyxDQUFDO1FBQ25ILENBQUM7S0FDRjtJQUNNLEtBQUs7UUFDVixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsZ0JBQWdCLEVBQUU7Z0JBQ2hCLGlCQUFpQixFQUFFO29CQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN4QixHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUc7d0JBQ1YsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUzt3QkFDckYsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFO3FCQUMxQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtTQUNGLENBQUM7S0FDSDtDQUNGO0FBRUQsZ0JBQWdCO0FBQ2hCLE1BQU0sa0JBQW1CLFNBQVEsYUFBYTtJQUNEO0lBQ3hCO0lBRG5CLFlBQVksSUFBWSxFQUFtQixNQUEwQixFQUNsRCxzQkFBK0M7UUFDaEUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRjZCLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBQ2xELDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBeUI7UUFFaEUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxxQ0FBdUIsQ0FBQyxJQUFBLHNCQUFHLEVBQUEseUJBQXlCLEVBQUUscURBQXFELENBQUMsQ0FBQztRQUN6SCxDQUFDO0tBQ0Y7SUFDTSxLQUFLO1FBQ1YsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLGdCQUFnQixFQUFFO2dCQUNoQixtQkFBbUIsRUFBRTtvQkFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDNUIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO3dCQUNkLGNBQWMsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRTtxQkFDMUMsQ0FBQyxDQUFDO29CQUNILFlBQVksRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUNoSDthQUNGO1NBQ0YsQ0FBQztLQUNIO0NBQ0Y7QUFFRCxnQkFBZ0I7QUFDaEIsTUFBTSx5QkFBMEIsU0FBUSxhQUFhO0lBQ1I7SUFBM0MsWUFBWSxJQUFZLEVBQW1CLE9BQXFDO1FBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQXJELFlBQU8sR0FBUCxPQUFPLENBQThCO0tBQWtCO0lBQzNGLEtBQUs7UUFDVixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsZ0JBQWdCLEVBQUU7Z0JBQ2hCLDBCQUEwQixFQUFFO29CQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO29CQUM3QixJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhO2lCQUNqQzthQUNGO1NBQ0YsQ0FBQztLQUNIO0NBQ0Y7QUFFRCxnQkFBZ0I7QUFDaEIsTUFBTSxvQkFBcUIsU0FBUSxhQUFhO0lBQzlDLFlBQVksSUFBWSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ25DLEtBQUs7UUFDVixPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUM1QjtDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IENmbkNoYW5uZWwgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFsaXZlJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHR5cGUgeyBBdWRpb05vcm1hbGl6YXRpb25TZXR0aW5ncywgUmVtaXhTZXR0aW5ncyB9IGZyb20gJy4vZW5jb2RlLWNvbmZpZ3VyYXRpb24nO1xuXG4vKipcbiAqIFBvbGljeSBmb3IgaG93IE1lZGlhTGl2ZSBpZGVudGlmaWVzIHRoZSBhdWRpbyBzdHJlYW0gd2hlbiBzZWxlY3RpbmcgYnkgbGFuZ3VhZ2UsIG9uIGFcbiAqIHRyYW5zcG9ydC1zdHJlYW0gUE1UIHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEF1ZGlvTGFuZ3VhZ2VTZWxlY3Rpb25Qb2xpY3kge1xuICAvKipcbiAgICogU3RyaWN0bHkgaWRlbnRpZnkgYXVkaW8gYnkgaXRzIGxhbmd1YWdlIGRlc2NyaXB0b3IuIElmIHRoZSBtYXRjaGluZyBsYW5ndWFnZSBpcyBub1xuICAgKiBsb25nZXIgcHJlc2VudCBhZnRlciBhIFBNVCB1cGRhdGUsIG11dGUgaXMgZW5jb2RlZCB1bnRpbCB0aGUgbGFuZ3VhZ2UgcmV0dXJucy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1RSSUNUID0gbmV3IEF1ZGlvTGFuZ3VhZ2VTZWxlY3Rpb25Qb2xpY3koJ1NUUklDVCcpO1xuICAvKipcbiAgICogT24gYSBQTVQgdXBkYXRlLCBmYWxsIGJhY2sgdG8gYW5vdGhlciBhdWRpbyBzdHJlYW0gb2YgdGhlIHNhbWUgdHlwZSBpbiB0aGUgcHJvZ3JhbSBpZiBhXG4gICAqIHN0cmVhbSB3aXRoIHRoZSBzYW1lIGxhbmd1YWdlIGNhbid0IGJlIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMT09TRSA9IG5ldyBBdWRpb0xhbmd1YWdlU2VsZWN0aW9uUG9saWN5KCdMT09TRScpO1xuXG4gIC8qKiBBIHZhbHVlIG5vdCB5ZXQgbW9kZWxsZWQgYnkgQVdTIENESy4gKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogQXVkaW9MYW5ndWFnZVNlbGVjdGlvblBvbGljeSB7XG4gICAgcmV0dXJuIG5ldyBBdWRpb0xhbmd1YWdlU2VsZWN0aW9uUG9saWN5KHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBzdHJpbmcgdmFsdWUgcGFzc2VkIHRvIENsb3VkRm9ybWF0aW9uLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzZWxlY3RpbmcgYW4gSExTIGF1ZGlvIHJlbmRpdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIbHNSZW5kaXRpb25TZWxlY3Rpb25PcHRpb25zIHtcbiAgLyoqIFRoZSBgR1JPVVAtSURgIGluIHRoZSBgI0VYVC1YLU1FRElBYCB0YWcgb2YgdGhlIHRhcmdldCBITFMgYXVkaW8gcmVuZGl0aW9uLiAqL1xuICByZWFkb25seSBncm91cElkOiBzdHJpbmc7XG4gIC8qKiBUaGUgYE5BTUVgIGluIHRoZSBgI0VYVC1YLU1FRElBYCB0YWcgb2YgdGhlIHRhcmdldCBITFMgYXVkaW8gcmVuZGl0aW9uLiAqL1xuICByZWFkb25seSByZW5kaXRpb25OYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hpY2ggRG9sYnkgRSBwcm9ncmFtIHRvIGRlY29kZSBmcm9tIGEgc2VsZWN0ZWQgYXVkaW8gdHJhY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2xieUVQcm9ncmFtU2VsZWN0aW9uIHtcbiAgLyoqIERlY29kZSBhbGwgY2hhbm5lbHMuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQUxMX0NIQU5ORUxTID0gbmV3IERvbGJ5RVByb2dyYW1TZWxlY3Rpb24oJ0FMTF9DSEFOTkVMUycpO1xuICAvKiogRGVjb2RlIERvbGJ5IEUgcHJvZ3JhbSAxLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST0dSQU1fMSA9IG5ldyBEb2xieUVQcm9ncmFtU2VsZWN0aW9uKCdQUk9HUkFNXzEnKTtcbiAgLyoqIERlY29kZSBEb2xieSBFIHByb2dyYW0gMi4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9HUkFNXzIgPSBuZXcgRG9sYnlFUHJvZ3JhbVNlbGVjdGlvbignUFJPR1JBTV8yJyk7XG4gIC8qKiBEZWNvZGUgRG9sYnkgRSBwcm9ncmFtIDMuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPR1JBTV8zID0gbmV3IERvbGJ5RVByb2dyYW1TZWxlY3Rpb24oJ1BST0dSQU1fMycpO1xuICAvKiogRGVjb2RlIERvbGJ5IEUgcHJvZ3JhbSA0LiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST0dSQU1fNCA9IG5ldyBEb2xieUVQcm9ncmFtU2VsZWN0aW9uKCdQUk9HUkFNXzQnKTtcbiAgLyoqIERlY29kZSBEb2xieSBFIHByb2dyYW0gNS4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9HUkFNXzUgPSBuZXcgRG9sYnlFUHJvZ3JhbVNlbGVjdGlvbignUFJPR1JBTV81Jyk7XG4gIC8qKiBEZWNvZGUgRG9sYnkgRSBwcm9ncmFtIDYuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPR1JBTV82ID0gbmV3IERvbGJ5RVByb2dyYW1TZWxlY3Rpb24oJ1BST0dSQU1fNicpO1xuICAvKiogRGVjb2RlIERvbGJ5IEUgcHJvZ3JhbSA3LiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST0dSQU1fNyA9IG5ldyBEb2xieUVQcm9ncmFtU2VsZWN0aW9uKCdQUk9HUkFNXzcnKTtcbiAgLyoqIERlY29kZSBEb2xieSBFIHByb2dyYW0gOC4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9HUkFNXzggPSBuZXcgRG9sYnlFUHJvZ3JhbVNlbGVjdGlvbignUFJPR1JBTV84Jyk7XG5cbiAgLyoqIEEgdmFsdWUgbm90IHlldCBtb2RlbGxlZCBieSBBV1MgQ0RLLiAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBEb2xieUVQcm9ncmFtU2VsZWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IERvbGJ5RVByb2dyYW1TZWxlY3Rpb24odmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSB1bmRlcmx5aW5nIHN0cmluZyB2YWx1ZSBwYXNzZWQgdG8gQ2xvdWRGb3JtYXRpb24uICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc2luZ2xlIGF1ZGlvIFBJRCBpbiBhIFBJRC1iYXNlZCBzZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdWRpb1BpZENvbmZpZyB7XG4gIC8qKiBUaGUgcGFja2V0IGlkZW50aWZpZXIgKFBJRCkgdmFsdWUgZnJvbSB3aXRoaW4gdGhlIHNvdXJjZS4gKi9cbiAgcmVhZG9ubHkgcGlkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGljaCBEb2xieSBFIHByb2dyYW0gdG8gZGVjb2RlIGZyb20gdGhpcyBQSUQuXG4gICAqIEBkZWZhdWx0IC0gbm8gRG9sYnkgRSBkZWNvZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZG9sYnlFRGVjb2RlPzogRG9sYnlFUHJvZ3JhbVNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIFByZS1taXhlciBzZXR0aW5ncyBmb3IgdGhpcyBQSUQgKGdhaW4sIGNoYW5uZWwgcmVtaXgsIGxvdWRuZXNzIG5vcm1hbGl6YXRpb24pLlxuICAgKiBAZGVmYXVsdCAtIG5vIHByZS1taXhpbmdcbiAgICovXG4gIHJlYWRvbmx5IHByZW1peFNldHRpbmdzPzogQXVkaW9QcmVNaXhlclNldHRpbmdzO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc2luZ2xlIGF1ZGlvIHRyYWNrIGluIGEgdHJhY2stYmFzZWQgc2VsZWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9UcmFja0NvbmZpZyB7XG4gIC8qKiBUaGUgMS1iYXNlZCB0cmFjayBudW1iZXIgdG8gZXh0cmFjdC4gKi9cbiAgcmVhZG9ubHkgdHJhY2s6IG51bWJlcjtcbiAgLyoqXG4gICAqIFByZS1taXhlciBzZXR0aW5ncyBmb3IgdGhpcyB0cmFjayAoZ2FpbiwgY2hhbm5lbCByZW1peCwgbG91ZG5lc3Mgbm9ybWFsaXphdGlvbikuXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJlLW1peGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgcHJlbWl4U2V0dGluZ3M/OiBBdWRpb1ByZU1peGVyU2V0dGluZ3M7XG59XG5cbi8qKlxuICogQXVkaW8gcHJlLW1peGVyIHNldHRpbmdzIGZvciBub3JtYWxpemluZyBhdWRpbyBiZWZvcmUgaW50ZXJsZWF2aW5nLlxuICogQXBwbGllZCBwZXItUElEIG9yIHBlci10cmFjayBiZWZvcmUgdHJhY2tzIGFyZSBjb21iaW5lZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEF1ZGlvUHJlTWl4ZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBDcmVhdGUgcHJlLW1peGVyIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihwcm9wczogQXVkaW9QcmVNaXhlclNldHRpbmdzUHJvcHMpOiBBdWRpb1ByZU1peGVyU2V0dGluZ3Mge1xuICAgIHJldHVybiBuZXcgQXVkaW9QcmVNaXhlclNldHRpbmdzKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogQXVkaW9QcmVNaXhlclNldHRpbmdzUHJvcHMpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5BdWRpb1ByZU1peGVyU2V0dGluZ3NQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdhaW5EYjogdGhpcy5wcm9wcy5nYWluRGIsXG4gICAgICBjaGFubmVsczogdGhpcy5wcm9wcy5jaGFubmVscyxcbiAgICAgIHJlbWl4U2V0dGluZ3M6IHRoaXMucHJvcHMucmVtaXhTZXR0aW5ncyA/IHtcbiAgICAgICAgY2hhbm5lbE1hcHBpbmdzOiB0aGlzLnByb3BzLnJlbWl4U2V0dGluZ3MuY2hhbm5lbE1hcHBpbmdzLm1hcChtID0+ICh7XG4gICAgICAgICAgb3V0cHV0Q2hhbm5lbDogbS5vdXRwdXRDaGFubmVsLFxuICAgICAgICAgIGlucHV0Q2hhbm5lbExldmVsczogbS5pbnB1dENoYW5uZWxMZXZlbHMubWFwKGwgPT4gKHtcbiAgICAgICAgICAgIGlucHV0Q2hhbm5lbDogbC5pbnB1dENoYW5uZWwsXG4gICAgICAgICAgICBnYWluOiBsLmdhaW4gPz8gMCxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0pKSxcbiAgICAgICAgY2hhbm5lbHNJbjogdGhpcy5wcm9wcy5yZW1peFNldHRpbmdzLmNoYW5uZWxzSW4sXG4gICAgICAgIGNoYW5uZWxzT3V0OiB0aGlzLnByb3BzLnJlbWl4U2V0dGluZ3MuY2hhbm5lbHNPdXQsXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgYXVkaW9Ob3JtYWxpemF0aW9uU2V0dGluZ3M6IHRoaXMucHJvcHMuYXVkaW9Ob3JtYWxpemF0aW9uU2V0dGluZ3MgPyB7XG4gICAgICAgIGFsZ29yaXRobTogdGhpcy5wcm9wcy5hdWRpb05vcm1hbGl6YXRpb25TZXR0aW5ncy5hbGdvcml0aG0/LnZhbHVlLFxuICAgICAgICBhbGdvcml0aG1Db250cm9sOiB0aGlzLnByb3BzLmF1ZGlvTm9ybWFsaXphdGlvblNldHRpbmdzLmFsZ29yaXRobUNvbnRyb2w/LnZhbHVlLFxuICAgICAgICB0YXJnZXRMa2ZzOiB0aGlzLnByb3BzLmF1ZGlvTm9ybWFsaXphdGlvblNldHRpbmdzLnRhcmdldExrZnMsXG4gICAgICAgIHBlYWtDYWxjdWxhdGlvbjogdGhpcy5wcm9wcy5hdWRpb05vcm1hbGl6YXRpb25TZXR0aW5ncy5wZWFrQ2FsY3VsYXRpb24/LnZhbHVlLFxuICAgICAgICBwZWFrTGltaXRlclRocmVzaG9sZDogdGhpcy5wcm9wcy5hdWRpb05vcm1hbGl6YXRpb25TZXR0aW5ncy5wZWFrTGltaXRlclRocmVzaG9sZCxcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGF1ZGlvIHByZS1taXhlciBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdWRpb1ByZU1peGVyU2V0dGluZ3NQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZ2FpbiBhZGp1c3RtZW50IGluIGRlY2liZWxzIChkQikuXG4gICAqIEBkZWZhdWx0IC0gbm8gZ2FpbiBhZGp1c3RtZW50XG4gICAqL1xuICByZWFkb25seSBnYWluRGI/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRvIHJlbWl4IHRvLiBPdmVycmlkZGVuIGJ5IGByZW1peFNldHRpbmdzYCBpZiBzcGVjaWZpZWQuXG4gICAqIEBkZWZhdWx0IC0gcGFzcyB0aHJvdWdoIG9yaWdpbmFsIGNoYW5uZWwgY291bnRcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxzPzogbnVtYmVyO1xuICAvKipcbiAgICogUmVtaXggc2V0dGluZ3MgZm9yIGZpbmUtZ3JhaW5lZCBjaGFubmVsIG1hcHBpbmcgYW5kIGdhaW4gbGV2ZWxzLlxuICAgKiBAZGVmYXVsdCAtIG5vIHJlbWl4aW5nXG4gICAqL1xuICByZWFkb25seSByZW1peFNldHRpbmdzPzogUmVtaXhTZXR0aW5ncztcbiAgLyoqXG4gICAqIEF1ZGlvIG5vcm1hbGl6YXRpb24gc2V0dGluZ3MgZm9yIGxvdWRuZXNzIGNvbnRyb2wuXG4gICAqIEBkZWZhdWx0IC0gbm8gbm9ybWFsaXphdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXVkaW9Ob3JtYWxpemF0aW9uU2V0dGluZ3M/OiBBdWRpb05vcm1hbGl6YXRpb25TZXR0aW5ncztcbn1cblxuLyoqXG4gKiBBbiBhdWRpbyBzZWxlY3RvciB0aGF0IGlkZW50aWZpZXMgd2hpY2ggYXVkaW8gdG8gZXh0cmFjdCBmcm9tIHRoZSBpbnB1dC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF1ZGlvU2VsZWN0b3Ige1xuICAvKipcbiAgICogU2VsZWN0IGF1ZGlvIGJ5IGxhbmd1YWdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIGEgbmFtZSBmb3IgdGhpcyBzZWxlY3RvclxuICAgKiBAcGFyYW0gbGFuZ3VhZ2VDb2RlIHRoZSB0aHJlZS1sZXR0ZXIgKElTTyA2MzktMikgbGFuZ3VhZ2UgY29kZSB0byBzZWxlY3RcbiAgICogQHBhcmFtIGxhbmd1YWdlU2VsZWN0aW9uUG9saWN5IGhvdyBzdHJpY3RseSB0byBpZGVudGlmeSB0aGUgc3RyZWFtIGJ5IGxhbmd1YWdlIG9uIGEgUE1UIHVwZGF0ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBieUxhbmd1YWdlKG5hbWU6IHN0cmluZywgbGFuZ3VhZ2VDb2RlOiBzdHJpbmcsIGxhbmd1YWdlU2VsZWN0aW9uUG9saWN5PzogQXVkaW9MYW5ndWFnZVNlbGVjdGlvblBvbGljeSk6IEF1ZGlvU2VsZWN0b3Ige1xuICAgIHJldHVybiBuZXcgTGFuZ3VhZ2VBdWRpb1NlbGVjdG9yKG5hbWUsIGxhbmd1YWdlQ29kZSwgbGFuZ3VhZ2VTZWxlY3Rpb25Qb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBvbmUgb3IgbW9yZSBhdWRpbyBQSURzIGZyb20gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgYSBuYW1lIGZvciB0aGlzIHNlbGVjdG9yXG4gICAqIEBwYXJhbSBwaWRzIHRoZSBQSUQgY29uZmlndXJhdGlvbnMgKGVhY2ggd2l0aCBvcHRpb25hbCBEb2xieSBFIGRlY29kZSBhbmQgcHJlLW1peCBzZXR0aW5ncylcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYnlQaWQobmFtZTogc3RyaW5nLCBwaWRzOiBBdWRpb1BpZENvbmZpZ1tdKTogQXVkaW9TZWxlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBQaWRBdWRpb1NlbGVjdG9yKG5hbWUsIHBpZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBvbmUgb3IgbW9yZSBhdWRpbyB0cmFja3MgKDEtYmFzZWQpIGZyb20gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgYSBuYW1lIGZvciB0aGlzIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB0cmFja3MgdGhlIHRyYWNrIGNvbmZpZ3VyYXRpb25zIChlYWNoIHdpdGggb3B0aW9uYWwgcHJlLW1peCBzZXR0aW5ncylcbiAgICogQHBhcmFtIGRvbGJ5RVByb2dyYW1TZWxlY3Rpb24gd2hpY2ggRG9sYnkgRSBwcm9ncmFtIHRvIGRlY29kZSBmcm9tIHRoZSBzZWxlY3RlZCB0cmFjayhzKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBieVRyYWNrKG5hbWU6IHN0cmluZywgdHJhY2tzOiBBdWRpb1RyYWNrQ29uZmlnW10sIGRvbGJ5RVByb2dyYW1TZWxlY3Rpb24/OiBEb2xieUVQcm9ncmFtU2VsZWN0aW9uKTogQXVkaW9TZWxlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBUcmFja0F1ZGlvU2VsZWN0b3IobmFtZSwgdHJhY2tzLCBkb2xieUVQcm9ncmFtU2VsZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYW4gSExTIGF1ZGlvIHJlbmRpdGlvbiBieSBpdHMgYCNFWFQtWC1NRURJQWAgYEdST1VQLUlEYCBhbmQgYE5BTUVgLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgZm9yIHRoaXMgc2VsZWN0b3JcbiAgICogQHBhcmFtIG9wdGlvbnMgdGhlIHRhcmdldCByZW5kaXRpb24ncyBncm91cCBpZCBhbmQgbmFtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBobHNSZW5kaXRpb24obmFtZTogc3RyaW5nLCBvcHRpb25zOiBIbHNSZW5kaXRpb25TZWxlY3Rpb25PcHRpb25zKTogQXVkaW9TZWxlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBIbHNSZW5kaXRpb25BdWRpb1NlbGVjdG9yKG5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgZGVmYXVsdCBhdWRpbyB0cmFjayAobm8gc3BlY2lmaWMgc2VsZWN0b3Igc2V0dGluZ3MpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0KG5hbWU6IHN0cmluZyk6IEF1ZGlvU2VsZWN0b3Ige1xuICAgIHJldHVybiBuZXcgRGVmYXVsdEF1ZGlvU2VsZWN0b3IobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyBhdWRpbyBzZWxlY3Rvci4gUmVmZXJlbmNlIGl0IGZyb20gZmVhdHVyZXMgdGhhdCBtb25pdG9yIGEgc3BlY2lmaWNcbiAgICogc2VsZWN0b3IsIHN1Y2ggYXMgYW4gYXVkaW8tc2lsZW5jZSB7QGxpbmsgRmFpbG92ZXJDb25kaXRpb259LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIGFic3RyYWN0IF9iaW5kKCk6IENmbkNoYW5uZWwuQXVkaW9TZWxlY3RvclByb3BlcnR5O1xufVxuXG4vKiogQGludGVybmFsICovXG5jbGFzcyBMYW5ndWFnZUF1ZGlvU2VsZWN0b3IgZXh0ZW5kcyBBdWRpb1NlbGVjdG9yIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ29kZTogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IHBvbGljeT86IEF1ZGlvTGFuZ3VhZ2VTZWxlY3Rpb25Qb2xpY3kpIHsgc3VwZXIobmFtZSk7IH1cbiAgcHVibGljIF9iaW5kKCk6IENmbkNoYW5uZWwuQXVkaW9TZWxlY3RvclByb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgc2VsZWN0b3JTZXR0aW5nczoge1xuICAgICAgICBhdWRpb0xhbmd1YWdlU2VsZWN0aW9uOiB7XG4gICAgICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgICAgICBsYW5ndWFnZVNlbGVjdGlvblBvbGljeTogdGhpcy5wb2xpY3k/LnZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFBpZEF1ZGlvU2VsZWN0b3IgZXh0ZW5kcyBBdWRpb1NlbGVjdG9yIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IHBpZHM6IEF1ZGlvUGlkQ29uZmlnW10pIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBpZiAocGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQXVkaW9QaWRTZWxlY3RvckVtcHR5YCwgJ2J5UGlkKCkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIFBJRCBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLkF1ZGlvU2VsZWN0b3JQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHNlbGVjdG9yU2V0dGluZ3M6IHtcbiAgICAgICAgYXVkaW9QaWRTZWxlY3Rpb246IHtcbiAgICAgICAgICBwaWRzOiB0aGlzLnBpZHMubWFwKHAgPT4gKHtcbiAgICAgICAgICAgIHBpZDogcC5waWQsXG4gICAgICAgICAgICBkb2xieUVEZWNvZGU6IHAuZG9sYnlFRGVjb2RlID8geyBwcm9ncmFtU2VsZWN0aW9uOiBwLmRvbGJ5RURlY29kZS52YWx1ZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJlbWl4U2V0dGluZ3M6IHAucHJlbWl4U2V0dGluZ3M/Ll9iaW5kKCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFRyYWNrQXVkaW9TZWxlY3RvciBleHRlbmRzIEF1ZGlvU2VsZWN0b3Ige1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgdHJhY2tzOiBBdWRpb1RyYWNrQ29uZmlnW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2xieUVQcm9ncmFtU2VsZWN0aW9uPzogRG9sYnlFUHJvZ3JhbVNlbGVjdGlvbikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIGlmICh0cmFja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEF1ZGlvVHJhY2tTZWxlY3RvckVtcHR5YCwgJ2J5VHJhY2soKSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdHJhY2sgY29uZmlndXJhdGlvbicpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5BdWRpb1NlbGVjdG9yUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBzZWxlY3RvclNldHRpbmdzOiB7XG4gICAgICAgIGF1ZGlvVHJhY2tTZWxlY3Rpb246IHtcbiAgICAgICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCh0ID0+ICh7XG4gICAgICAgICAgICB0cmFjazogdC50cmFjayxcbiAgICAgICAgICAgIHByZW1peFNldHRpbmdzOiB0LnByZW1peFNldHRpbmdzPy5fYmluZCgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBkb2xieUVEZWNvZGU6IHRoaXMuZG9sYnlFUHJvZ3JhbVNlbGVjdGlvbiA/IHsgcHJvZ3JhbVNlbGVjdGlvbjogdGhpcy5kb2xieUVQcm9ncmFtU2VsZWN0aW9uLnZhbHVlIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgSGxzUmVuZGl0aW9uQXVkaW9TZWxlY3RvciBleHRlbmRzIEF1ZGlvU2VsZWN0b3Ige1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSGxzUmVuZGl0aW9uU2VsZWN0aW9uT3B0aW9ucykgeyBzdXBlcihuYW1lKTsgfVxuICBwdWJsaWMgX2JpbmQoKTogQ2ZuQ2hhbm5lbC5BdWRpb1NlbGVjdG9yUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBzZWxlY3RvclNldHRpbmdzOiB7XG4gICAgICAgIGF1ZGlvSGxzUmVuZGl0aW9uU2VsZWN0aW9uOiB7XG4gICAgICAgICAgZ3JvdXBJZDogdGhpcy5vcHRpb25zLmdyb3VwSWQsXG4gICAgICAgICAgbmFtZTogdGhpcy5vcHRpb25zLnJlbmRpdGlvbk5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuY2xhc3MgRGVmYXVsdEF1ZGlvU2VsZWN0b3IgZXh0ZW5kcyBBdWRpb1NlbGVjdG9yIHtcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7IHN1cGVyKG5hbWUpOyB9XG4gIHB1YmxpYyBfYmluZCgpOiBDZm5DaGFubmVsLkF1ZGlvU2VsZWN0b3JQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHsgbmFtZTogdGhpcy5uYW1lIH07XG4gIH1cbn1cbiJdfQ==