@pipeline-builder/api-core 3.4.81 → 3.4.83

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.
@@ -5,72 +5,143 @@
5
5
  *
6
6
  * AI calls are sized much smaller than `apiCalls` because each call has
7
7
  * external provider cost (~$0.01$0.10/call). Developer tier allows light
8
- * exploration (100/period); Pro lifts to 5000; Unlimited is uncapped.
8
+ * exploration (50/period); Pro lifts to 2,500; Enterprise is capped high
9
+ * (25,000) — fair-use, not literally unlimited.
9
10
  *
10
11
  * `storageBytes` is the aggregate registry cap per org. Sized
11
12
  * around plugin-image realities: a typical plugin image is 200500 MB;
12
- * Developer's 5 GB holds ~10 versions × ~500 MB, Pro's 100 GB covers a
13
+ * Developer's 2 GB holds ~4 versions × ~500 MB, Pro's 50 GB covers a
13
14
  * mature catalog. Operators can override per-org via the quota CRUD API.
14
15
  */
15
16
  const GB = 1024 * 1024 * 1024;
16
- export const QUOTA_TIERS = {
17
+ /**
18
+ * Code-default limits per tier — the fallback when no env override is set.
19
+ * -1 means unlimited. (Counts sized to "comfortably enough for one team, not
20
+ * script spam": 20 dashboards, 50 alert rules, 10 destinations, 1 IdP config
21
+ * for Developer; scaled up for Pro; -1 (uncapped) for the count-quotas on
22
+ * Team/Enterprise while cost-driving quotas stay finite.)
23
+ */
24
+ const TB = 1024 * GB;
25
+ const DEFAULT_TIER_LIMITS = {
26
+ // Free tier: single seat, apiCalls CAPPED (was unlimited — a DoS/abuse hole
27
+ // on a shared resource); aiCalls small (each has ~$0.01-0.10 external cost).
17
28
  developer: {
18
- label: 'Developer',
19
- limits: {
20
- plugins: 100,
21
- pipelines: 10,
22
- apiCalls: -1,
23
- aiCalls: 100,
24
- storageBytes: 5 * GB,
25
- // Counts sized to "comfortably enough for one team, not a script spam":
26
- // 20 dashboards covers ops + per-service drill-downs, 50 alert rules
27
- // covers per-service alerts, 10 destinations covers Slack channels
28
- // per team + a webhook fallback, 1 IdP config (you only have one).
29
- dashboards: 20,
30
- alertRules: 50,
31
- alertDestinations: 10,
32
- idpConfigs: 1,
33
- },
29
+ plugins: 25,
30
+ pipelines: 5,
31
+ apiCalls: 25_000,
32
+ aiCalls: 50,
33
+ storageBytes: 2 * GB,
34
+ dashboards: 20,
35
+ alertRules: 50,
36
+ alertDestinations: 10,
37
+ idpConfigs: 1,
38
+ seats: 1,
34
39
  },
40
+ // Pro = one power user, individual pricing.
35
41
  pro: {
36
- label: 'Pro',
37
- limits: {
38
- plugins: 1000,
39
- pipelines: 100,
40
- apiCalls: -1,
41
- aiCalls: 5000,
42
- storageBytes: 100 * GB,
43
- dashboards: 200,
44
- alertRules: 500,
45
- alertDestinations: 50,
46
- idpConfigs: 5,
47
- },
42
+ plugins: 50,
43
+ pipelines: 10,
44
+ apiCalls: 500_000,
45
+ aiCalls: 2_500,
46
+ storageBytes: 50 * GB,
47
+ dashboards: 200,
48
+ alertRules: 500,
49
+ alertDestinations: 50,
50
+ idpConfigs: 5,
51
+ seats: 1,
52
+ },
53
+ // Team = collaboration tier; the seat limit (10) is the real differentiator
54
+ // over Pro. Limits sit between Pro and Enterprise.
55
+ team: {
56
+ plugins: 100,
57
+ pipelines: 200,
58
+ apiCalls: -1,
59
+ aiCalls: 10_000,
60
+ storageBytes: 250 * GB,
61
+ dashboards: -1,
62
+ alertRules: -1,
63
+ alertDestinations: -1,
64
+ idpConfigs: 5,
65
+ seats: 10,
48
66
  },
49
- unlimited: {
50
- label: 'Unlimited',
51
- limits: {
52
- plugins: -1,
53
- pipelines: -1,
54
- apiCalls: -1,
55
- aiCalls: -1,
56
- storageBytes: -1,
57
- dashboards: -1,
58
- alertRules: -1,
59
- alertDestinations: -1,
60
- idpConfigs: -1,
61
- },
67
+ // Enterprise: org-wide, high seat cap. FAIR-USE — cost drivers (aiCalls,
68
+ // storageBytes) capped high so one account can't run up unbounded provider/
69
+ // storage cost on a flat price; cheap count-quotas stay -1.
70
+ enterprise: {
71
+ plugins: 250,
72
+ pipelines: 200,
73
+ apiCalls: -1,
74
+ aiCalls: 25_000,
75
+ storageBytes: TB,
76
+ dashboards: -1,
77
+ alertRules: -1,
78
+ alertDestinations: -1,
79
+ idpConfigs: -1,
80
+ seats: 25,
62
81
  },
63
82
  };
83
+ /** Read an integer env var, falling back to the code default. `-1` = unlimited. */
84
+ function envInt(name, fallback) {
85
+ const raw = process.env[name];
86
+ if (raw === undefined || raw === '')
87
+ return fallback;
88
+ const n = parseInt(raw, 10);
89
+ return Number.isNaN(n) ? fallback : n;
90
+ }
91
+ /** Read a string env var, falling back to the code default. */
92
+ function envStr(name, fallback) {
93
+ const raw = process.env[name];
94
+ return raw === undefined || raw === '' ? fallback : raw;
95
+ }
96
+ /**
97
+ * Per-tier limits, each overridable via `QUOTA_TIER_<TIER>_<LIMIT>` env vars
98
+ * (e.g. `QUOTA_TIER_PRO_PIPELINES=250`, `QUOTA_TIER_DEVELOPER_STORAGE_BYTES=...`).
99
+ * Unset/empty → the code default. `-1` = unlimited. Read once at module load —
100
+ * on k8s these flow in via the `app-env` ConfigMap (built from `.env`).
101
+ */
102
+ function tierLimits(tier) {
103
+ const d = DEFAULT_TIER_LIMITS[tier];
104
+ const T = tier.toUpperCase();
105
+ return {
106
+ plugins: envInt(`QUOTA_TIER_${T}_PLUGINS`, d.plugins),
107
+ pipelines: envInt(`QUOTA_TIER_${T}_PIPELINES`, d.pipelines),
108
+ apiCalls: envInt(`QUOTA_TIER_${T}_API_CALLS`, d.apiCalls),
109
+ aiCalls: envInt(`QUOTA_TIER_${T}_AI_CALLS`, d.aiCalls),
110
+ storageBytes: envInt(`QUOTA_TIER_${T}_STORAGE_BYTES`, d.storageBytes),
111
+ dashboards: envInt(`QUOTA_TIER_${T}_DASHBOARDS`, d.dashboards),
112
+ alertRules: envInt(`QUOTA_TIER_${T}_ALERT_RULES`, d.alertRules),
113
+ alertDestinations: envInt(`QUOTA_TIER_${T}_ALERT_DESTINATIONS`, d.alertDestinations),
114
+ idpConfigs: envInt(`QUOTA_TIER_${T}_IDP_CONFIGS`, d.idpConfigs),
115
+ seats: envInt(`QUOTA_TIER_${T}_SEATS`, d.seats),
116
+ };
117
+ }
118
+ // Labels are overridable via `QUOTA_TIER_<TIER>_LABEL` (display name only).
119
+ export const QUOTA_TIERS = {
120
+ developer: { label: envStr('QUOTA_TIER_DEVELOPER_LABEL', 'Developer'), limits: tierLimits('developer') },
121
+ pro: { label: envStr('QUOTA_TIER_PRO_LABEL', 'Pro'), limits: tierLimits('pro') },
122
+ team: { label: envStr('QUOTA_TIER_TEAM_LABEL', 'Team'), limits: tierLimits('team') },
123
+ enterprise: { label: envStr('QUOTA_TIER_ENTERPRISE_LABEL', 'Enterprise'), limits: tierLimits('enterprise') },
124
+ };
64
125
  /** All valid tier names. */
65
126
  export const VALID_TIERS = Object.keys(QUOTA_TIERS);
66
- /** Default tier assigned to new organizations. */
67
- export const DEFAULT_TIER = 'developer';
127
+ /**
128
+ * Default tier assigned to new organizations. Overridable via the
129
+ * `DEFAULT_QUOTA_TIER` env var (one of developer|pro|team|enterprise);
130
+ * an invalid/unset value falls back to 'developer'.
131
+ */
132
+ export const DEFAULT_TIER = isValidTier(process.env.DEFAULT_QUOTA_TIER ?? '')
133
+ ? process.env.DEFAULT_QUOTA_TIER
134
+ : 'developer';
68
135
  /** Check whether a string is a valid QuotaTier. */
69
136
  export function isValidTier(value) {
70
- return value in QUOTA_TIERS;
137
+ // Use the explicit tuple, not `value in QUOTA_TIERS`: `in` walks the prototype
138
+ // chain, so inherited Object keys ('toString', 'constructor', …) would return
139
+ // true and then `getTierLimits` would read `.limits` off a function → crash.
140
+ // `tier` is attacker-influenceable (JWT / request body / DEFAULT_QUOTA_TIER env).
141
+ return VALID_TIERS.includes(value);
71
142
  }
72
143
  /** Get the default limits for a given tier (falls back to developer). */
73
144
  export function getTierLimits(tier) {
74
145
  return isValidTier(tier) ? QUOTA_TIERS[tier].limits : QUOTA_TIERS.developer.limits;
75
146
  }
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQWdDdEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM5QixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQXVDO0lBQzdELFNBQVMsRUFBRTtRQUNULEtBQUssRUFBRSxXQUFXO1FBQ2xCLE1BQU0sRUFBRTtZQUNOLE9BQU8sRUFBRSxHQUFHO1lBQ1osU0FBUyxFQUFFLEVBQUU7WUFDYixRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ1osT0FBTyxFQUFFLEdBQUc7WUFDWixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsd0VBQXdFO1lBQ3hFLHFFQUFxRTtZQUNyRSxtRUFBbUU7WUFDbkUsbUVBQW1FO1lBQ25FLFVBQVUsRUFBRSxFQUFFO1lBQ2QsVUFBVSxFQUFFLEVBQUU7WUFDZCxpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLFVBQVUsRUFBRSxDQUFDO1NBQ2Q7S0FDRjtJQUNELEdBQUcsRUFBRTtRQUNILEtBQUssRUFBRSxLQUFLO1FBQ1osTUFBTSxFQUFFO1lBQ04sT0FBTyxFQUFFLElBQUk7WUFDYixTQUFTLEVBQUUsR0FBRztZQUNkLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDWixPQUFPLEVBQUUsSUFBSTtZQUNiLFlBQVksRUFBRSxHQUFHLEdBQUcsRUFBRTtZQUN0QixVQUFVLEVBQUUsR0FBRztZQUNmLFVBQVUsRUFBRSxHQUFHO1lBQ2YsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQixVQUFVLEVBQUUsQ0FBQztTQUNkO0tBQ0Y7SUFDRCxTQUFTLEVBQUU7UUFDVCxLQUFLLEVBQUUsV0FBVztRQUNsQixNQUFNLEVBQUU7WUFDTixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ1gsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNiLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDWixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ1gsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNoQixVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ2QsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNkLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUNyQixVQUFVLEVBQUUsQ0FBQyxDQUFDO1NBQ2Y7S0FDRjtDQUNGLENBQUM7QUFFRiw0QkFBNEI7QUFDNUIsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUF5QixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBZ0IsQ0FBQztBQUV6RixrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFjLFdBQVcsQ0FBQztBQUVuRCxtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLE9BQU8sS0FBSyxJQUFJLFdBQVcsQ0FBQztBQUM5QixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBWTtJQUN4QyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDcEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKiogQXZhaWxhYmxlIHF1b3RhIHRpZXIgaWRlbnRpZmllcnMuICovXG5leHBvcnQgdHlwZSBRdW90YVRpZXIgPSAnZGV2ZWxvcGVyJyB8ICdwcm8nIHwgJ3VubGltaXRlZCc7XG5cbi8qKiBMaW1pdCB2YWx1ZXMgZm9yIGVhY2ggcXVvdGEgdHlwZSB3aXRoaW4gYSB0aWVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVRpZXJMaW1pdHMge1xuICBwbHVnaW5zOiBudW1iZXI7XG4gIHBpcGVsaW5lczogbnVtYmVyO1xuICBhcGlDYWxsczogbnVtYmVyO1xuICBhaUNhbGxzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZ2dyZWdhdGUgcmVnaXN0cnkgc3RvcmFnZSBjYXAgaW4gQllURVMuIENvdW50ZWQgYWNyb3NzIGV2ZXJ5IHJlcG9cbiAgICogdW5kZXIgdGhlIG9yZydzIGBvcmcte29yZ0lkfS9gIG5hbWVzcGFjZS4gLTEgbWVhbnMgdW5saW1pdGVkLlxuICAgKiBwdXNoLWdhdGUgcmVhZHMgdGhpczsgdGhlIGltYWdlLXJlZ2lzdHJ5IHJlamVjdHMgdG9rZW4gaXNzdWFuY2UgZm9yXG4gICAqIGBwdXNoYCBzY29wZSB3aGVuIHRoZSBvcmcncyBtZWFzdXJlZCB1c2FnZSBleGNlZWRzIHRoZSBsaW1pdC5cbiAgICovXG4gIHN0b3JhZ2VCeXRlczogbnVtYmVyO1xuICAvKiogQ291bnQtcXVvdGFzIG9uIHRoZSB1c2VyLWVkaXRhYmxlIGZlYXR1cmUgdGFibGVzIGFkZGVkIHRvIGNsb3NlIHBlci1vcmdcbiAgICogIERvUyB2aWEgc3BhbS4gLTEgbWVhbnMgdW5saW1pdGVkLiAqL1xuICBkYXNoYm9hcmRzOiBudW1iZXI7XG4gIGFsZXJ0UnVsZXM6IG51bWJlcjtcbiAgYWxlcnREZXN0aW5hdGlvbnM6IG51bWJlcjtcbiAgaWRwQ29uZmlnczogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKlxuICogUHJlc2V0IGxpbWl0cyBmb3IgZWFjaCB0aWVyLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gKlxuICogQUkgY2FsbHMgYXJlIHNpemVkIG11Y2ggc21hbGxlciB0aGFuIGBhcGlDYWxsc2AgYmVjYXVzZSBlYWNoIGNhbGwgaGFzXG4gKiBleHRlcm5hbCBwcm92aWRlciBjb3N0ICh+JDAuMDEkMC4xMC9jYWxsKS4gRGV2ZWxvcGVyIHRpZXIgYWxsb3dzIGxpZ2h0XG4gKiBleHBsb3JhdGlvbiAoMTAwL3BlcmlvZCk7IFBybyBsaWZ0cyB0byA1MDAwOyBVbmxpbWl0ZWQgaXMgdW5jYXBwZWQuXG4gKlxuICogYHN0b3JhZ2VCeXRlc2AgaXMgdGhlIGFnZ3JlZ2F0ZSByZWdpc3RyeSBjYXAgcGVyIG9yZy4gU2l6ZWRcbiAqIGFyb3VuZCBwbHVnaW4taW1hZ2UgcmVhbGl0aWVzOiBhIHR5cGljYWwgcGx1Z2luIGltYWdlIGlzIDIwMDUwMCBNQjtcbiAqIERldmVsb3BlcidzIDUgR0IgaG9sZHMgfjEwIHZlcnNpb25zIMOXIH41MDAgTUIsIFBybydzIDEwMCBHQiBjb3ZlcnMgYVxuICogbWF0dXJlIGNhdGFsb2cuIE9wZXJhdG9ycyBjYW4gb3ZlcnJpZGUgcGVyLW9yZyB2aWEgdGhlIHF1b3RhIENSVUQgQVBJLlxuICovXG5jb25zdCBHQiA9IDEwMjQgKiAxMDI0ICogMTAyNDtcbmV4cG9ydCBjb25zdCBRVU9UQV9USUVSUzogUmVjb3JkPFF1b3RhVGllciwgUXVvdGFUaWVyUHJlc2V0PiA9IHtcbiAgZGV2ZWxvcGVyOiB7XG4gICAgbGFiZWw6ICdEZXZlbG9wZXInLFxuICAgIGxpbWl0czoge1xuICAgICAgcGx1Z2luczogMTAwLFxuICAgICAgcGlwZWxpbmVzOiAxMCxcbiAgICAgIGFwaUNhbGxzOiAtMSxcbiAgICAgIGFpQ2FsbHM6IDEwMCxcbiAgICAgIHN0b3JhZ2VCeXRlczogNSAqIEdCLFxuICAgICAgLy8gQ291bnRzIHNpemVkIHRvIFwiY29tZm9ydGFibHkgZW5vdWdoIGZvciBvbmUgdGVhbSwgbm90IGEgc2NyaXB0IHNwYW1cIjpcbiAgICAgIC8vIDIwIGRhc2hib2FyZHMgY292ZXJzIG9wcyArIHBlci1zZXJ2aWNlIGRyaWxsLWRvd25zLCA1MCBhbGVydCBydWxlc1xuICAgICAgLy8gY292ZXJzIHBlci1zZXJ2aWNlIGFsZXJ0cywgMTAgZGVzdGluYXRpb25zIGNvdmVycyBTbGFjayBjaGFubmVsc1xuICAgICAgLy8gcGVyIHRlYW0gKyBhIHdlYmhvb2sgZmFsbGJhY2ssIDEgSWRQIGNvbmZpZyAoeW91IG9ubHkgaGF2ZSBvbmUpLlxuICAgICAgZGFzaGJvYXJkczogMjAsXG4gICAgICBhbGVydFJ1bGVzOiA1MCxcbiAgICAgIGFsZXJ0RGVzdGluYXRpb25zOiAxMCxcbiAgICAgIGlkcENvbmZpZ3M6IDEsXG4gICAgfSxcbiAgfSxcbiAgcHJvOiB7XG4gICAgbGFiZWw6ICdQcm8nLFxuICAgIGxpbWl0czoge1xuICAgICAgcGx1Z2luczogMTAwMCxcbiAgICAgIHBpcGVsaW5lczogMTAwLFxuICAgICAgYXBpQ2FsbHM6IC0xLFxuICAgICAgYWlDYWxsczogNTAwMCxcbiAgICAgIHN0b3JhZ2VCeXRlczogMTAwICogR0IsXG4gICAgICBkYXNoYm9hcmRzOiAyMDAsXG4gICAgICBhbGVydFJ1bGVzOiA1MDAsXG4gICAgICBhbGVydERlc3RpbmF0aW9uczogNTAsXG4gICAgICBpZHBDb25maWdzOiA1LFxuICAgIH0sXG4gIH0sXG4gIHVubGltaXRlZDoge1xuICAgIGxhYmVsOiAnVW5saW1pdGVkJyxcbiAgICBsaW1pdHM6IHtcbiAgICAgIHBsdWdpbnM6IC0xLFxuICAgICAgcGlwZWxpbmVzOiAtMSxcbiAgICAgIGFwaUNhbGxzOiAtMSxcbiAgICAgIGFpQ2FsbHM6IC0xLFxuICAgICAgc3RvcmFnZUJ5dGVzOiAtMSxcbiAgICAgIGRhc2hib2FyZHM6IC0xLFxuICAgICAgYWxlcnRSdWxlczogLTEsXG4gICAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgICBpZHBDb25maWdzOiAtMSxcbiAgICB9LFxuICB9LFxufTtcblxuLyoqIEFsbCB2YWxpZCB0aWVyIG5hbWVzLiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IE9iamVjdC5rZXlzKFFVT1RBX1RJRVJTKSBhcyBRdW90YVRpZXJbXTtcblxuLyoqIERlZmF1bHQgdGllciBhc3NpZ25lZCB0byBuZXcgb3JnYW5pemF0aW9ucy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJRVI6IFF1b3RhVGllciA9ICdkZXZlbG9wZXInO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFF1b3RhVGllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGllcih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUXVvdGFUaWVyIHtcbiAgcmV0dXJuIHZhbHVlIGluIFFVT1RBX1RJRVJTO1xufVxuXG4vKiogR2V0IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgYSBnaXZlbiB0aWVyIChmYWxscyBiYWNrIHRvIGRldmVsb3BlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGllckxpbWl0cyh0aWVyOiBzdHJpbmcpOiBRdW90YVRpZXJMaW1pdHMge1xuICByZXR1cm4gaXNWYWxpZFRpZXIodGllcikgPyBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHM6IFFVT1RBX1RJRVJTLmRldmVsb3Blci5saW1pdHM7XG59XG4iXX0=
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQXNDdEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFOUI7Ozs7OztHQU1HO0FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNyQixNQUFNLG1CQUFtQixHQUF1QztJQUM5RCw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLFNBQVMsRUFBRTtRQUNULE9BQU8sRUFBRSxFQUFFO1FBQ1gsU0FBUyxFQUFFLENBQUM7UUFDWixRQUFRLEVBQUUsTUFBTTtRQUNoQixPQUFPLEVBQUUsRUFBRTtRQUNYLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRTtRQUNwQixVQUFVLEVBQUUsRUFBRTtRQUNkLFVBQVUsRUFBRSxFQUFFO1FBQ2QsaUJBQWlCLEVBQUUsRUFBRTtRQUNyQixVQUFVLEVBQUUsQ0FBQztRQUNiLEtBQUssRUFBRSxDQUFDO0tBQ1Q7SUFDRCw0Q0FBNEM7SUFDNUMsR0FBRyxFQUFFO1FBQ0gsT0FBTyxFQUFFLEVBQUU7UUFDWCxTQUFTLEVBQUUsRUFBRTtRQUNiLFFBQVEsRUFBRSxPQUFPO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsWUFBWSxFQUFFLEVBQUUsR0FBRyxFQUFFO1FBQ3JCLFVBQVUsRUFBRSxHQUFHO1FBQ2YsVUFBVSxFQUFFLEdBQUc7UUFDZixpQkFBaUIsRUFBRSxFQUFFO1FBQ3JCLFVBQVUsRUFBRSxDQUFDO1FBQ2IsS0FBSyxFQUFFLENBQUM7S0FDVDtJQUNELDRFQUE0RTtJQUM1RSxtREFBbUQ7SUFDbkQsSUFBSSxFQUFFO1FBQ0osT0FBTyxFQUFFLEdBQUc7UUFDWixTQUFTLEVBQUUsR0FBRztRQUNkLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDWixPQUFPLEVBQUUsTUFBTTtRQUNmLFlBQVksRUFBRSxHQUFHLEdBQUcsRUFBRTtRQUN0QixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2QsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNkLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUNyQixVQUFVLEVBQUUsQ0FBQztRQUNiLEtBQUssRUFBRSxFQUFFO0tBQ1Y7SUFDRCx5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLDREQUE0RDtJQUM1RCxVQUFVLEVBQUU7UUFDVixPQUFPLEVBQUUsR0FBRztRQUNaLFNBQVMsRUFBRSxHQUFHO1FBQ2QsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNaLE9BQU8sRUFBRSxNQUFNO1FBQ2YsWUFBWSxFQUFFLEVBQUU7UUFDaEIsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNkLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDZCxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFDckIsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNkLEtBQUssRUFBRSxFQUFFO0tBQ1Y7Q0FDRixDQUFDO0FBRUYsbUZBQW1GO0FBQ25GLFNBQVMsTUFBTSxDQUFDLElBQVksRUFBRSxRQUFnQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELFNBQVMsTUFBTSxDQUFDLElBQVksRUFBRSxRQUFnQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFlO0lBQ2pDLE1BQU0sQ0FBQyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3QixPQUFPO1FBQ0wsT0FBTyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDckQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDM0QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDekQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDdEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUNyRSxVQUFVLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUM5RCxVQUFVLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUMvRCxpQkFBaUIsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUNwRixVQUFVLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUMvRCxLQUFLLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUNoRCxDQUFDO0FBQ0osQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQXVDO0lBQzdELFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsNEJBQTRCLEVBQUUsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtJQUN4RyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDaEYsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO0lBQ3BGLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsNkJBQTZCLEVBQUUsWUFBWSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRTtDQUM3RyxDQUFDO0FBRUYsNEJBQTRCO0FBQzVCLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBeUIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQWdCLENBQUM7QUFFekY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FDdkIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksRUFBRSxDQUFDO0lBQy9DLENBQUMsQ0FBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQztJQUMvQyxDQUFDLENBQUMsV0FBVyxDQUFDO0FBRWxCLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQWE7SUFDdkMsK0VBQStFO0lBQy9FLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0Usa0ZBQWtGO0lBQ2xGLE9BQVEsV0FBaUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQVk7SUFDeEMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ3BGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqIEF2YWlsYWJsZSBxdW90YSB0aWVyIGlkZW50aWZpZXJzLiAqL1xuZXhwb3J0IHR5cGUgUXVvdGFUaWVyID0gJ2RldmVsb3BlcicgfCAncHJvJyB8ICd0ZWFtJyB8ICdlbnRlcnByaXNlJztcblxuLyoqIExpbWl0IHZhbHVlcyBmb3IgZWFjaCBxdW90YSB0eXBlIHdpdGhpbiBhIHRpZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhVGllckxpbWl0cyB7XG4gIHBsdWdpbnM6IG51bWJlcjtcbiAgcGlwZWxpbmVzOiBudW1iZXI7XG4gIGFwaUNhbGxzOiBudW1iZXI7XG4gIGFpQ2FsbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFnZ3JlZ2F0ZSByZWdpc3RyeSBzdG9yYWdlIGNhcCBpbiBCWVRFUy4gQ291bnRlZCBhY3Jvc3MgZXZlcnkgcmVwb1xuICAgKiB1bmRlciB0aGUgb3JnJ3MgYG9yZy17b3JnSWR9L2AgbmFtZXNwYWNlLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gICAqIHB1c2gtZ2F0ZSByZWFkcyB0aGlzOyB0aGUgaW1hZ2UtcmVnaXN0cnkgcmVqZWN0cyB0b2tlbiBpc3N1YW5jZSBmb3JcbiAgICogYHB1c2hgIHNjb3BlIHdoZW4gdGhlIG9yZydzIG1lYXN1cmVkIHVzYWdlIGV4Y2VlZHMgdGhlIGxpbWl0LlxuICAgKi9cbiAgc3RvcmFnZUJ5dGVzOiBudW1iZXI7XG4gIC8qKiBDb3VudC1xdW90YXMgb24gdGhlIHVzZXItZWRpdGFibGUgZmVhdHVyZSB0YWJsZXMgYWRkZWQgdG8gY2xvc2UgcGVyLW9yZ1xuICAgKiAgRG9TIHZpYSBzcGFtLiAtMSBtZWFucyB1bmxpbWl0ZWQuICovXG4gIGRhc2hib2FyZHM6IG51bWJlcjtcbiAgYWxlcnRSdWxlczogbnVtYmVyO1xuICBhbGVydERlc3RpbmF0aW9uczogbnVtYmVyO1xuICBpZHBDb25maWdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXggb3JnIG1lbWJlcnMgKGFjdGl2ZSB1c2VycyAvIHNlYXRzKS4gLTEgPSB1bmxpbWl0ZWQuIFRoaXMgaXMgdGhlIFwiVGVhbVwiXG4gICAqIHRpZXIgZGlmZmVyZW50aWF0b3Ig4oCUIGVuZm9yY2VkIGF0IG1lbWJlci1pbnZpdGUgdGltZSAoYW4gaW52aXRlIGlzIGJsb2NrZWRcbiAgICogd2hlbiBhY3RpdmUgbWVtYmVycyArIHBlbmRpbmcgaW52aXRlcyB3b3VsZCBleGNlZWQgdGhpcykuXG4gICAqL1xuICBzZWF0czogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKlxuICogUHJlc2V0IGxpbWl0cyBmb3IgZWFjaCB0aWVyLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gKlxuICogQUkgY2FsbHMgYXJlIHNpemVkIG11Y2ggc21hbGxlciB0aGFuIGBhcGlDYWxsc2AgYmVjYXVzZSBlYWNoIGNhbGwgaGFzXG4gKiBleHRlcm5hbCBwcm92aWRlciBjb3N0ICh+JDAuMDEkMC4xMC9jYWxsKS4gRGV2ZWxvcGVyIHRpZXIgYWxsb3dzIGxpZ2h0XG4gKiBleHBsb3JhdGlvbiAoNTAvcGVyaW9kKTsgUHJvIGxpZnRzIHRvIDIsNTAwOyBFbnRlcnByaXNlIGlzIGNhcHBlZCBoaWdoXG4gKiAoMjUsMDAwKSDigJQgZmFpci11c2UsIG5vdCBsaXRlcmFsbHkgdW5saW1pdGVkLlxuICpcbiAqIGBzdG9yYWdlQnl0ZXNgIGlzIHRoZSBhZ2dyZWdhdGUgcmVnaXN0cnkgY2FwIHBlciBvcmcuIFNpemVkXG4gKiBhcm91bmQgcGx1Z2luLWltYWdlIHJlYWxpdGllczogYSB0eXBpY2FsIHBsdWdpbiBpbWFnZSBpcyAyMDA1MDAgTUI7XG4gKiBEZXZlbG9wZXIncyAyIEdCIGhvbGRzIH40IHZlcnNpb25zIMOXIH41MDAgTUIsIFBybydzIDUwIEdCIGNvdmVycyBhXG4gKiBtYXR1cmUgY2F0YWxvZy4gT3BlcmF0b3JzIGNhbiBvdmVycmlkZSBwZXItb3JnIHZpYSB0aGUgcXVvdGEgQ1JVRCBBUEkuXG4gKi9cbmNvbnN0IEdCID0gMTAyNCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIENvZGUtZGVmYXVsdCBsaW1pdHMgcGVyIHRpZXIg4oCUIHRoZSBmYWxsYmFjayB3aGVuIG5vIGVudiBvdmVycmlkZSBpcyBzZXQuXG4gKiAtMSBtZWFucyB1bmxpbWl0ZWQuIChDb3VudHMgc2l6ZWQgdG8gXCJjb21mb3J0YWJseSBlbm91Z2ggZm9yIG9uZSB0ZWFtLCBub3RcbiAqIHNjcmlwdCBzcGFtXCI6IDIwIGRhc2hib2FyZHMsIDUwIGFsZXJ0IHJ1bGVzLCAxMCBkZXN0aW5hdGlvbnMsIDEgSWRQIGNvbmZpZ1xuICogZm9yIERldmVsb3Blcjsgc2NhbGVkIHVwIGZvciBQcm87IC0xICh1bmNhcHBlZCkgZm9yIHRoZSBjb3VudC1xdW90YXMgb25cbiAqIFRlYW0vRW50ZXJwcmlzZSB3aGlsZSBjb3N0LWRyaXZpbmcgcXVvdGFzIHN0YXkgZmluaXRlLilcbiAqL1xuY29uc3QgVEIgPSAxMDI0ICogR0I7XG5jb25zdCBERUZBVUxUX1RJRVJfTElNSVRTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJMaW1pdHM+ID0ge1xuICAvLyBGcmVlIHRpZXI6IHNpbmdsZSBzZWF0LCBhcGlDYWxscyBDQVBQRUQgKHdhcyB1bmxpbWl0ZWQg4oCUIGEgRG9TL2FidXNlIGhvbGVcbiAgLy8gb24gYSBzaGFyZWQgcmVzb3VyY2UpOyBhaUNhbGxzIHNtYWxsIChlYWNoIGhhcyB+JDAuMDEtMC4xMCBleHRlcm5hbCBjb3N0KS5cbiAgZGV2ZWxvcGVyOiB7XG4gICAgcGx1Z2luczogMjUsXG4gICAgcGlwZWxpbmVzOiA1LFxuICAgIGFwaUNhbGxzOiAyNV8wMDAsXG4gICAgYWlDYWxsczogNTAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyICogR0IsXG4gICAgZGFzaGJvYXJkczogMjAsXG4gICAgYWxlcnRSdWxlczogNTAsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IDEwLFxuICAgIGlkcENvbmZpZ3M6IDEsXG4gICAgc2VhdHM6IDEsXG4gIH0sXG4gIC8vIFBybyA9IG9uZSBwb3dlciB1c2VyLCBpbmRpdmlkdWFsIHByaWNpbmcuXG4gIHBybzoge1xuICAgIHBsdWdpbnM6IDUwLFxuICAgIHBpcGVsaW5lczogMTAsXG4gICAgYXBpQ2FsbHM6IDUwMF8wMDAsXG4gICAgYWlDYWxsczogMl81MDAsXG4gICAgc3RvcmFnZUJ5dGVzOiA1MCAqIEdCLFxuICAgIGRhc2hib2FyZHM6IDIwMCxcbiAgICBhbGVydFJ1bGVzOiA1MDAsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IDUwLFxuICAgIGlkcENvbmZpZ3M6IDUsXG4gICAgc2VhdHM6IDEsXG4gIH0sXG4gIC8vIFRlYW0gPSBjb2xsYWJvcmF0aW9uIHRpZXI7IHRoZSBzZWF0IGxpbWl0ICgxMCkgaXMgdGhlIHJlYWwgZGlmZmVyZW50aWF0b3JcbiAgLy8gb3ZlciBQcm8uIExpbWl0cyBzaXQgYmV0d2VlbiBQcm8gYW5kIEVudGVycHJpc2UuXG4gIHRlYW06IHtcbiAgICBwbHVnaW5zOiAxMDAsXG4gICAgcGlwZWxpbmVzOiAyMDAsXG4gICAgYXBpQ2FsbHM6IC0xLFxuICAgIGFpQ2FsbHM6IDEwXzAwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDI1MCAqIEdCLFxuICAgIGRhc2hib2FyZHM6IC0xLFxuICAgIGFsZXJ0UnVsZXM6IC0xLFxuICAgIGFsZXJ0RGVzdGluYXRpb25zOiAtMSxcbiAgICBpZHBDb25maWdzOiA1LFxuICAgIHNlYXRzOiAxMCxcbiAgfSxcbiAgLy8gRW50ZXJwcmlzZTogb3JnLXdpZGUsIGhpZ2ggc2VhdCBjYXAuIEZBSVItVVNFIOKAlCBjb3N0IGRyaXZlcnMgKGFpQ2FsbHMsXG4gIC8vIHN0b3JhZ2VCeXRlcykgY2FwcGVkIGhpZ2ggc28gb25lIGFjY291bnQgY2FuJ3QgcnVuIHVwIHVuYm91bmRlZCBwcm92aWRlci9cbiAgLy8gc3RvcmFnZSBjb3N0IG9uIGEgZmxhdCBwcmljZTsgY2hlYXAgY291bnQtcXVvdGFzIHN0YXkgLTEuXG4gIGVudGVycHJpc2U6IHtcbiAgICBwbHVnaW5zOiAyNTAsXG4gICAgcGlwZWxpbmVzOiAyMDAsXG4gICAgYXBpQ2FsbHM6IC0xLFxuICAgIGFpQ2FsbHM6IDI1XzAwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IFRCLFxuICAgIGRhc2hib2FyZHM6IC0xLFxuICAgIGFsZXJ0UnVsZXM6IC0xLFxuICAgIGFsZXJ0RGVzdGluYXRpb25zOiAtMSxcbiAgICBpZHBDb25maWdzOiAtMSxcbiAgICBzZWF0czogMjUsXG4gIH0sXG59O1xuXG4vKiogUmVhZCBhbiBpbnRlZ2VyIGVudiB2YXIsIGZhbGxpbmcgYmFjayB0byB0aGUgY29kZSBkZWZhdWx0LiBgLTFgID0gdW5saW1pdGVkLiAqL1xuZnVuY3Rpb24gZW52SW50KG5hbWU6IHN0cmluZywgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W25hbWVdO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIGZhbGxiYWNrO1xuICBjb25zdCBuID0gcGFyc2VJbnQocmF3LCAxMCk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBmYWxsYmFjayA6IG47XG59XG5cbi8qKiBSZWFkIGEgc3RyaW5nIGVudiB2YXIsIGZhbGxpbmcgYmFjayB0byB0aGUgY29kZSBkZWZhdWx0LiAqL1xuZnVuY3Rpb24gZW52U3RyKG5hbWU6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W25hbWVdO1xuICByZXR1cm4gcmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJyA/IGZhbGxiYWNrIDogcmF3O1xufVxuXG4vKipcbiAqIFBlci10aWVyIGxpbWl0cywgZWFjaCBvdmVycmlkYWJsZSB2aWEgYFFVT1RBX1RJRVJfPFRJRVI+XzxMSU1JVD5gIGVudiB2YXJzXG4gKiAoZS5nLiBgUVVPVEFfVElFUl9QUk9fUElQRUxJTkVTPTI1MGAsIGBRVU9UQV9USUVSX0RFVkVMT1BFUl9TVE9SQUdFX0JZVEVTPS4uLmApLlxuICogVW5zZXQvZW1wdHkg4oaSIHRoZSBjb2RlIGRlZmF1bHQuIGAtMWAgPSB1bmxpbWl0ZWQuIFJlYWQgb25jZSBhdCBtb2R1bGUgbG9hZCDigJRcbiAqIG9uIGs4cyB0aGVzZSBmbG93IGluIHZpYSB0aGUgYGFwcC1lbnZgIENvbmZpZ01hcCAoYnVpbHQgZnJvbSBgLmVudmApLlxuICovXG5mdW5jdGlvbiB0aWVyTGltaXRzKHRpZXI6IFF1b3RhVGllcik6IFF1b3RhVGllckxpbWl0cyB7XG4gIGNvbnN0IGQgPSBERUZBVUxUX1RJRVJfTElNSVRTW3RpZXJdO1xuICBjb25zdCBUID0gdGllci50b1VwcGVyQ2FzZSgpO1xuICByZXR1cm4ge1xuICAgIHBsdWdpbnM6IGVudkludChgUVVPVEFfVElFUl8ke1R9X1BMVUdJTlNgLCBkLnBsdWdpbnMpLFxuICAgIHBpcGVsaW5lczogZW52SW50KGBRVU9UQV9USUVSXyR7VH1fUElQRUxJTkVTYCwgZC5waXBlbGluZXMpLFxuICAgIGFwaUNhbGxzOiBlbnZJbnQoYFFVT1RBX1RJRVJfJHtUfV9BUElfQ0FMTFNgLCBkLmFwaUNhbGxzKSxcbiAgICBhaUNhbGxzOiBlbnZJbnQoYFFVT1RBX1RJRVJfJHtUfV9BSV9DQUxMU2AsIGQuYWlDYWxscyksXG4gICAgc3RvcmFnZUJ5dGVzOiBlbnZJbnQoYFFVT1RBX1RJRVJfJHtUfV9TVE9SQUdFX0JZVEVTYCwgZC5zdG9yYWdlQnl0ZXMpLFxuICAgIGRhc2hib2FyZHM6IGVudkludChgUVVPVEFfVElFUl8ke1R9X0RBU0hCT0FSRFNgLCBkLmRhc2hib2FyZHMpLFxuICAgIGFsZXJ0UnVsZXM6IGVudkludChgUVVPVEFfVElFUl8ke1R9X0FMRVJUX1JVTEVTYCwgZC5hbGVydFJ1bGVzKSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogZW52SW50KGBRVU9UQV9USUVSXyR7VH1fQUxFUlRfREVTVElOQVRJT05TYCwgZC5hbGVydERlc3RpbmF0aW9ucyksXG4gICAgaWRwQ29uZmlnczogZW52SW50KGBRVU9UQV9USUVSXyR7VH1fSURQX0NPTkZJR1NgLCBkLmlkcENvbmZpZ3MpLFxuICAgIHNlYXRzOiBlbnZJbnQoYFFVT1RBX1RJRVJfJHtUfV9TRUFUU2AsIGQuc2VhdHMpLFxuICB9O1xufVxuXG4vLyBMYWJlbHMgYXJlIG92ZXJyaWRhYmxlIHZpYSBgUVVPVEFfVElFUl88VElFUj5fTEFCRUxgIChkaXNwbGF5IG5hbWUgb25seSkuXG5leHBvcnQgY29uc3QgUVVPVEFfVElFUlM6IFJlY29yZDxRdW90YVRpZXIsIFF1b3RhVGllclByZXNldD4gPSB7XG4gIGRldmVsb3BlcjogeyBsYWJlbDogZW52U3RyKCdRVU9UQV9USUVSX0RFVkVMT1BFUl9MQUJFTCcsICdEZXZlbG9wZXInKSwgbGltaXRzOiB0aWVyTGltaXRzKCdkZXZlbG9wZXInKSB9LFxuICBwcm86IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9QUk9fTEFCRUwnLCAnUHJvJyksIGxpbWl0czogdGllckxpbWl0cygncHJvJykgfSxcbiAgdGVhbTogeyBsYWJlbDogZW52U3RyKCdRVU9UQV9USUVSX1RFQU1fTEFCRUwnLCAnVGVhbScpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ3RlYW0nKSB9LFxuICBlbnRlcnByaXNlOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfRU5URVJQUklTRV9MQUJFTCcsICdFbnRlcnByaXNlJyksIGxpbWl0czogdGllckxpbWl0cygnZW50ZXJwcmlzZScpIH0sXG59O1xuXG4vKiogQWxsIHZhbGlkIHRpZXIgbmFtZXMuICovXG5leHBvcnQgY29uc3QgVkFMSURfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gT2JqZWN0LmtleXMoUVVPVEFfVElFUlMpIGFzIFF1b3RhVGllcltdO1xuXG4vKipcbiAqIERlZmF1bHQgdGllciBhc3NpZ25lZCB0byBuZXcgb3JnYW5pemF0aW9ucy4gT3ZlcnJpZGFibGUgdmlhIHRoZVxuICogYERFRkFVTFRfUVVPVEFfVElFUmAgZW52IHZhciAob25lIG9mIGRldmVsb3Blcnxwcm98dGVhbXxlbnRlcnByaXNlKTtcbiAqIGFuIGludmFsaWQvdW5zZXQgdmFsdWUgZmFsbHMgYmFjayB0byAnZGV2ZWxvcGVyJy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElFUjogUXVvdGFUaWVyID1cbiAgaXNWYWxpZFRpZXIocHJvY2Vzcy5lbnYuREVGQVVMVF9RVU9UQV9USUVSID8/ICcnKVxuICAgID8gKHByb2Nlc3MuZW52LkRFRkFVTFRfUVVPVEFfVElFUiBhcyBRdW90YVRpZXIpXG4gICAgOiAnZGV2ZWxvcGVyJztcblxuLyoqIENoZWNrIHdoZXRoZXIgYSBzdHJpbmcgaXMgYSB2YWxpZCBRdW90YVRpZXIuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRpZXIodmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFF1b3RhVGllciB7XG4gIC8vIFVzZSB0aGUgZXhwbGljaXQgdHVwbGUsIG5vdCBgdmFsdWUgaW4gUVVPVEFfVElFUlNgOiBgaW5gIHdhbGtzIHRoZSBwcm90b3R5cGVcbiAgLy8gY2hhaW4sIHNvIGluaGVyaXRlZCBPYmplY3Qga2V5cyAoJ3RvU3RyaW5nJywgJ2NvbnN0cnVjdG9yJywg4oCmKSB3b3VsZCByZXR1cm5cbiAgLy8gdHJ1ZSBhbmQgdGhlbiBgZ2V0VGllckxpbWl0c2Agd291bGQgcmVhZCBgLmxpbWl0c2Agb2ZmIGEgZnVuY3Rpb24g4oaSIGNyYXNoLlxuICAvLyBgdGllcmAgaXMgYXR0YWNrZXItaW5mbHVlbmNlYWJsZSAoSldUIC8gcmVxdWVzdCBib2R5IC8gREVGQVVMVF9RVU9UQV9USUVSIGVudikuXG4gIHJldHVybiAoVkFMSURfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuLyoqIEdldCB0aGUgZGVmYXVsdCBsaW1pdHMgZm9yIGEgZ2l2ZW4gdGllciAoZmFsbHMgYmFjayB0byBkZXZlbG9wZXIpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpZXJMaW1pdHModGllcjogc3RyaW5nKTogUXVvdGFUaWVyTGltaXRzIHtcbiAgcmV0dXJuIGlzVmFsaWRUaWVyKHRpZXIpID8gUVVPVEFfVElFUlNbdGllcl0ubGltaXRzOiBRVU9UQV9USUVSUy5kZXZlbG9wZXIubGltaXRzO1xufVxuIl19
@@ -131,7 +131,16 @@ export class KmsKeyProvider {
131
131
  if (!this.decryptInFlight) {
132
132
  this.decryptInFlight = this.fetchAndDecrypt();
133
133
  }
134
- this.masterKeyCache = await this.decryptInFlight;
134
+ try {
135
+ this.masterKeyCache = await this.decryptInFlight;
136
+ }
137
+ catch (err) {
138
+ // A transient KMS failure must not permanently poison the provider: clear
139
+ // the rejected in-flight promise so a later warmup() retries instead of
140
+ // re-awaiting the same rejection forever (matches PerOrgKmsKeyProvider).
141
+ this.decryptInFlight = null;
142
+ throw err;
143
+ }
135
144
  }
136
145
  async fetchAndDecrypt() {
137
146
  // Dynamic import so EnvKeyProvider-only envs don't load the SDK.
@@ -373,4 +382,4 @@ export function isEncryptedBlob(value) {
373
382
  && typeof value.iv === 'string'
374
383
  && typeof value.ciphertext === 'string');
375
384
  }
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LWVuY3J5cHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VjcmV0LWVuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUE2QmpGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUNSLFNBQVMsQ0FBUztJQUVuQyxZQUFZLGlCQUEwQjtRQUNwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsMEVBQTBFO1FBQzFFLHNEQUFzRDtRQUN0RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNyQix1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLDJEQUEyRDtRQUMzRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUUsUUFBUSxFQUNoQyxJQUFJLENBQUMsU0FBUyxFQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUMxQixZQUFZLEVBQ1osRUFBRSxDQUNILENBQUM7UUFDRiwyRUFBMkU7UUFDM0UsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFDakIsY0FBYyxHQUFrQixJQUFJLENBQUM7SUFDNUIsS0FBSyxDQUFTO0lBQ2QsYUFBYSxDQUFTO0lBQ3RCLE1BQU0sQ0FBVTtJQUNoQixRQUFRLENBQVU7SUFDM0IsZUFBZSxHQUEyQixJQUFJLENBQUM7SUFFdkQsWUFBWSxJQUF3RjtRQUNsRyxNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUM7UUFDMUYsSUFBSSxDQUFDLEtBQUs7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLFVBQVU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7UUFDdkYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEVBQUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7SUFDakUsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBRSxxSEFBcUgsQ0FDckksQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxNQUFNO1FBQ1YsSUFBSSxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDbkQsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlO1FBQzNCLGlFQUFpRTtRQUNqRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUM7WUFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNyRCxDQUFDLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUM7WUFDaEQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDO1NBQzFELENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixHQUFHLENBQUMsTUFBTSx3QkFBd0IsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRjtBQUVELDBFQUEwRTtBQUMxRSx1RUFBdUU7QUFDdkUsSUFBSSxlQUFlLEdBQXVCLElBQUksQ0FBQztBQUMvQyxTQUFTLGtCQUFrQjtJQUN6QixJQUFJLENBQUMsZUFBZTtRQUFFLGVBQWUsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0lBQzdELE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7OztxQkFJcUI7QUFDckIsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxPQUFPLGtCQUFrQixFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsdUJBQXVCLEtBQVcsZUFBZSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFFM0U7d0RBQ3dEO0FBQ3hELE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBcUIsSUFBVSxlQUFlLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQWtCM0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixrREFBa0Q7SUFDakMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUF3QyxDQUFDO0lBQzNFLGdFQUFnRTtJQUMvQyxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFDOUQ7OzhFQUUwRTtJQUN6RCxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXdELENBQUM7SUFDNUYsMERBQTBEO0lBQ3pDLFFBQVEsQ0FBYztJQUN0QixRQUFRLENBQW9CO0lBQzVCLE1BQU0sQ0FBVTtJQUNoQixRQUFRLENBQVU7SUFFbkMsWUFBWSxJQUtYO1FBQ0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztRQUN0RixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7eUJBSXFCO0lBQ3JCLFNBQVMsQ0FBQyxLQUFhO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFhO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWE7UUFDOUIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQ3BDLDRFQUE0RTtRQUM1RSx3RUFBd0U7UUFDeEUsb0VBQW9FO1FBQ3BFLCtCQUErQjtRQUMvQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsQyxLQUFLLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxPQUFPO2dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDO1FBQzdCLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQWE7UUFDM0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRO2dCQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsMkNBQTJDO1lBQ3ZFLEdBQUcsR0FBRyxRQUFRLENBQUM7WUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBb0I7UUFDaEQsTUFBTSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxDQUFDO1lBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDdEQsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDO1lBQ2hELEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztZQUNoQixjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDO1NBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbEcsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixHQUFHLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEtBQUssZUFBZSxDQUFDLENBQUM7UUFDcEgsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7cUVBQ2lFO0lBQ2pFLEtBQUssQ0FBQyxLQUFhO1FBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUUsU0FBaUIsRUFDOUMsS0FBYSxFQUNiLFdBQXdCLGtCQUFrQixFQUFFO0lBRTVDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2hDLGtFQUFrRTtJQUNsRSxzRUFBc0U7SUFDdEUsb0VBQW9FO0lBQ3BFLDhEQUE4RDtJQUM5RCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsT0FBTztRQUNMLEdBQUcsRUFBRSxnQkFBZ0I7UUFDckIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3pCLG1FQUFtRTtRQUNuRSxtRUFBbUU7UUFDbkUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3hELEdBQUcsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDdEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBRSxJQUFtQixFQUNoRCxLQUFhLEVBQ2IsV0FBd0Isa0JBQWtCLEVBQUU7SUFFNUMsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLGdCQUFnQixFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELG1FQUFtRTtJQUNuRSxtRUFBbUU7SUFDbkUsaUVBQWlFO0lBQ2pFLDBFQUEwRTtJQUMxRSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsSUFBSSxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsSUFBSSxDQUFDLEdBQUcsMkJBQTJCLFdBQVcsWUFBWSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RJLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkQsMEVBQTBFO0lBQzFFLHFFQUFxRTtJQUNyRSxpRUFBaUU7SUFDakUsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxRCxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1QyxPQUFPLENBQUUsT0FBTyxLQUFLLEtBQUssUUFBUTtXQUM3QixLQUFLLEtBQUssSUFBSTtXQUNiLEtBQTJCLENBQUMsR0FBRyxLQUFLLGdCQUFnQjtXQUNyRCxPQUFRLEtBQTBCLENBQUMsRUFBRSxLQUFLLFFBQVE7V0FDbEQsT0FBUSxLQUFrQyxDQUFDLFVBQVUsS0FBSyxRQUFRLENBQ3RFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogIFBlci1vcmcgZW52ZWxvcGUgZW5jcnlwdGlvbiBmb3Igc2VjcmV0IGNvbHVtbnMuXG4gKlxuICogVG9kYXkncyBwb3N0dXJlIGZvciBvcmctc2NvcGVkIHNlY3JldHMgKGFpUHJvdmlkZXJLZXlzLCB3ZWJob29rIFVSTHMsXG4gKiByZWdpc3RyeSBjcmVkZW50aWFscykgaXMgY2xlYXItdGV4dCBpbiBNb25nbyAvIFBvc3RncmVzIHdpdGggYXBwLWxheWVyXG4gKiBtYXNraW5nIG9uIG91dHB1dC4gVGhpcyBtb2R1bGUgaXMgdGhlIGVuY3J5cHRpb24gcHJpbWl0aXZlIHRoYXQgbGV0cyB0aGVcbiAqIG1vZGVsIGxheWVyIHN3YXAgY2xlYXItdGV4dCBzdHJpbmdzIGZvciBgRW5jcnlwdGVkQmxvYmAgdmFsdWVzIGF0IHdyaXRlXG4gKiB0aW1lIGFuZCBkZWNyeXB0IGF0IHJlYWQgdGltZS5cbiAqXG4gKiBDcnlwdG9ncmFwaHkgKiAtIEFFUy0yNTYtR0NNIChhdXRoZW50aWNhdGVkIGVuY3J5cHRpb24pLlxuICogLSBQZXItb3JnIGtleSBkZXJpdmVkIHZpYSBIS0RGLVNIQTI1NihtYXN0ZXJLZXksIHNhbHQ9b3JnSWQsIGluZm89J3NlY3JldHMtdjEnKS5cbiAqIEVhY2ggb3JnIGdldHMgYSB1bmlxdWUga2V5IHdpdGhvdXQgb3BlcmF0b3Iga2V5LW1hbmFnZW1lbnQgY2VyZW1vbnkuXG4gKiAtIDEyLWJ5dGUgSVYgZ2VuZXJhdGVkIHBlciBlbmNyeXB0aW9uIHdpdGggYGNyeXB0by5yYW5kb21CeXRlc2AuXG4gKiAtIDE2LWJ5dGUgYXV0aGVudGljYXRpb24gdGFnIGNvbmNhdGVuYXRlZCB3aXRoIGNpcGhlcnRleHQgKHN0YW5kYXJkIEdDTSkuXG4gKlxuICogT3BlcmF0b3IgY29uZmlndXJhdGlvbiAqIC0gYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWWAgZW52OiBoZXgtIG9yIGJhc2U2NC1lbmNvZGVkIDMyLWJ5dGUgbWFzdGVyIGtleS5cbiAqIFJlcXVpcmVkIHdoZW4gYGVuY3J5cHRTZWNyZXRgL2BkZWNyeXB0U2VjcmV0YCBhcmUgY2FsbGVkLiBNaXNzaW5nIGtleVxuICogdGhyb3dzICBlbmNyeXB0aW9uIGlzIGZhaWwtY2xvc2VkOyB3ZSBuZXZlciBzaWxlbnRseSByb3VuZC10cmlwIGFcbiAqIHNlY3JldCBhcyBwbGFpbnRleHQuXG4gKlxuICogS01TIG1pZ3JhdGlvbiBwYXRoICogLSBUaGUgdHdvIGV4cG9ydGVkIGZ1bmN0aW9ucyB0YWtlIGEgYHByb3ZpZGVyYCBwYXJhbWV0ZXIuIFRoZSBkZWZhdWx0XG4gKiBgRW52S2V5UHJvdmlkZXJgIGltcGxlbWVudHMgSEtERiBkZXJpdmF0aW9uLiBBIGZ1dHVyZSBgQXdzS21zUHJvdmlkZXJgXG4gKiBwbHVncyBpbiBoZXJlOiBpdCBjYW4gY2FsbCBLTVMgYEVuY3J5cHRgIC8gYERlY3J5cHRgIHRvIHdyYXAgYSBERUtcbiAqIHJhdGhlciB0aGFuIGhvbGRpbmcgYSBtYXN0ZXIga2V5IGluIGVudi4gVGhlIG9uLWRpc2sgYmxvYiBzaGFwZVxuICogKGB7IGFsZywgaXYsIGNpcGhlcnRleHQsIGtpZD8gfWApIGlzIGZvcndhcmQtY29tcGF0aWJsZSAgYGtpZGBcbiAqIGNhcnJpZXMgdGhlIEtNUyBrZXkgaWQgd2hlbiB0aGUgcHJvdmlkZXIgbmVlZHMgaXQuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlQ2lwaGVyaXYsIGNyZWF0ZURlY2lwaGVyaXYsIGhrZGZTeW5jLCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5cbi8qKiBPbi1kaXNrIHNoYXBlIG9mIGFuIGVuY3J5cHRlZCBzZWNyZXQuIEpTT04tc2VyaWFsaXphYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmNyeXB0ZWRCbG9iIHtcbiAgLyoqIEFsZ29yaXRobSB0YWcuIEJ1bXAgb24gZm9ybWF0IGNoYW5nZSBzbyBhIGZ1dHVyZSBtaWdyYXRpb24gY2FuIGRldGVjdCBvbGQgYmxvYnMuICovXG4gIGFsZzogJ2Flcy0yNTYtZ2NtLXYxJztcbiAgLyoqIEJhc2U2NC1lbmNvZGVkIDEyLWJ5dGUgSVYuICovXG4gIGl2OiBzdHJpbmc7XG4gIC8qKiBCYXNlNjQtZW5jb2RlZCBjaXBoZXJ0ZXh0ICsgMTYtYnl0ZSBhdXRoZW50aWNhdGlvbiB0YWcgY29uY2F0ZW5hdGVkLiAqL1xuICBjaXBoZXJ0ZXh0OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBrZXkgaWQgIHBvcHVsYXRlZCBieSBLTVMtYmFja2VkIHByb3ZpZGVycywgaWdub3JlZCBieSB0aGUgZW52IHByb3ZpZGVyLiAqL1xuICBraWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBQbHVnZ2FibGUga2V5IHNvdXJjZS4gRW52LWJhY2tlZCBieSBkZWZhdWx0OyBLTVMtYmFja2VkIGF2YWlsYWJsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5UHJvdmlkZXIge1xuICAvKiogRGVyaXZlIGEgMzItYnl0ZSBzeW1tZXRyaWMga2V5IGJvdW5kIHRvIGBvcmdJZGAuICovXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyO1xuICAvKiogT3B0aW9uYWwgYXN5bmMgdmFyaWFudCBmb3IgcHJvdmlkZXJzIHRoYXQgbmVlZCB0byBkbyBJL08gKGUuZy5cbiAgICogIHBlci1vcmcgS01TIGxvb2t1cCB0aGUgZmlyc3QgdGltZSBhbiBvcmcgaXMgc2VlbikuIERlZmF1bHRcbiAgICogIGltcGxlbWVudGF0aW9uIGZvcndhcmRzIHRvIHRoZSBzeW5jIGBkZXJpdmVLZXlgLiAqL1xuICBkZXJpdmVLZXlBc3luYz8ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPjtcbiAgLyoqIE9wdGlvbmFsIEtNUy1rZXktaWQgdGhpcyBwcm92aWRlciB1c2VkIGZvciBgb3JnSWRgLiBFbWJlZGRlZCBpbiB0aGVcbiAgICogIGBFbmNyeXB0ZWRCbG9iLmtpZGAgZmllbGQgb24gd3JpdGUgc28gZGVjcnlwdCBjYW4gdmVyaWZ5IHRoZSByaWdodFxuICAgKiAgS01TIENNSyBpcyBiZWluZyB1c2VkIChkZWZlbnNlIGFnYWluc3QgYW4gYXR0YWNrZXIgd2hvIHN3YXBzIGEgYmxvYlxuICAgKiAgYmV0d2VlbiBvcmdzKS4gRGVmYXVsdCByZXR1cm5zIHVuZGVmaW5lZCAoZW52IHByb3ZpZGVyKS4gKi9cbiAga2lkRm9yPyhvcmdJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERlZmF1bHQgcHJvdmlkZXIgIGRlcml2ZXMgYSBwZXItb3JnIGtleSBmcm9tIGBTRUNSRVRfRU5DUllQVElPTl9LRVlgIHZpYVxuICogSEtERi1TSEEyNTYuIFN1aXRhYmxlIGZvciBzZWxmLWhvc3RlZCAvIGRldiB3aGVyZSBvcGVyYXRvcnMgZG9uJ3QgaGF2ZSBLTVMuXG4gKlxuICogRmFpbHMgZmFzdCBpZiB0aGUgZW52IGlzIG1pc3Npbmcgb3IgdGhlIGtleSBpcyB0aGUgd3JvbmcgbGVuZ3RoIHNvIG1pc2NvbmZpZ1xuICogc3VyZmFjZXMgYXQgZmlyc3QgdXNlIHJhdGhlciB0aGFuIHNpbGVudGx5IGZpbmdlcnByaW50aW5nIGFsbCB3cml0ZXMgd2l0aFxuICogYSBkZWZhdWx0IHplcm8ga2V5LlxuICovXG5leHBvcnQgY2xhc3MgRW52S2V5UHJvdmlkZXIgaW1wbGVtZW50cyBLZXlQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFzdGVyS2V5OiBCdWZmZXI7XG5cbiAgY29uc3RydWN0b3IobWFzdGVyS2V5T3ZlcnJpZGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCByYXcgPSBtYXN0ZXJLZXlPdmVycmlkZSA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LRVk7XG4gICAgaWYgKCFyYXcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU0VDUkVUX0VOQ1JZUFRJT05fS0VZIGVudiBpcyByZXF1aXJlZCBmb3Igc2VjcmV0IGVuY3J5cHRpb24nKTtcbiAgICB9XG4gICAgLy8gQWNjZXB0IGVpdGhlciBoZXggKDY0IGNoYXJzKSBvciBiYXNlNjQgKDQ0IGNoYXJzIGluY2x1ZGluZyBwYWRkaW5nKSBmb3JcbiAgICAvLyBvcGVyYXRvciBjb252ZW5pZW5jZSAgYm90aCBkZWNvZGUgdG8gYSAzMi1ieXRlIGtleS5cbiAgICBjb25zdCBkZWNvZGVkID0gcmF3Lmxlbmd0aCA9PT0gNjQgJiYgL15bMC05YS1mXSskL2kudGVzdChyYXcpXG4gICAgICA/IEJ1ZmZlci5mcm9tKHJhdywgJ2hleCcpXG4gICAgICA6IEJ1ZmZlci5mcm9tKHJhdywgJ2Jhc2U2NCcpO1xuICAgIGlmIChkZWNvZGVkLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU0VDUkVUX0VOQ1JZUFRJT05fS0VZIG11c3QgZGVjb2RlIHRvIDMyIGJ5dGVzIChnb3QgJHtkZWNvZGVkLmxlbmd0aH0pYCk7XG4gICAgfVxuICAgIHRoaXMubWFzdGVyS2V5ID0gZGVjb2RlZDtcbiAgfVxuXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICAvLyBIS0RGIGJpbmRzIHRoZSBtYXN0ZXIga2V5IHRvIHRoZSBvcmcgc28gdHdvIG9yZ3MgZW5jcnlwdGluZyB0aGUgc2FtZVxuICAgIC8vIHBsYWludGV4dCBwcm9kdWNlIGRpZmZlcmVudCBjaXBoZXJ0ZXh0cyAga2VlcHMgYSBzdG9sZW4gREIgdW5hYmxlIHRvXG4gICAgLy8gdGVsbCB3aGljaCBvcmdzIHNoYXJlIHNlY3JldHMgdmlhIGNpcGhlcnRleHQgY29tcGFyaXNvbi5cbiAgICBjb25zdCBkZXJpdmVkID0gaGtkZlN5bmMoICdzaGEyNTYnLFxuICAgICAgdGhpcy5tYXN0ZXJLZXksXG4gICAgICBCdWZmZXIuZnJvbShvcmdJZCwgJ3V0ZjgnKSxcbiAgICAgICdzZWNyZXRzLXYxJyxcbiAgICAgIDMyLFxuICAgICk7XG4gICAgLy8gaGtkZlN5bmMgcmV0dXJucyBBcnJheUJ1ZmZlciBpbiBvbGRlciBOb2RlIHR5cGluZ3M7IG5vcm1hbGl6ZSB0byBCdWZmZXIuXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlcml2ZWQpO1xuICB9XG59XG5cbi8qKlxuICogIEFXUy1LTVMtYmFja2VkIEtleVByb3ZpZGVyLlxuICpcbiAqIFRyYWRlLW9mZiBwaWNrZWQ6IHN0b3JlIE9ORSBtYXN0ZXIga2V5IGVuY3J5cHRlZCB1bmRlciBhIEtNUyBDTUs7IG9uXG4gKiBmaXJzdCB1c2UsIGNhbGwgYGttczpEZWNyeXB0YCB0byByZWNvdmVyIHRoZSBtYXN0ZXIga2V5IGJ5dGVzOyBIS0RGLVxuICogZGVyaXZlIHBlci1vcmcgZnJvbSBpdCAoc2FtZSBhcyBFbnZLZXlQcm92aWRlcikuIFRoZSBwcm9jZXNzIHRoZW4gaG9sZHNcbiAqIHRoZSBwbGFpbnRleHQgbWFzdGVyIGtleSBpbiBtZW1vcnkgdW50aWwgcmVzdGFydC5cbiAqXG4gKiBQUk9TOiBvbmUgS01TIGNhbGwgcGVyIHByb2Nlc3MgbGlmZXRpbWUgKGNoZWFwLCBsb3cgcDk5IGltcGFjdCksXG4gKiB0aGUgZW5jcnlwdGVkLW1hc3Rlci1rZXkgYmxvYiBpcyBzYWZlIHRvIGNvbW1pdC9sb2cvY2hlY2tpbixcbiAqIEtNUyBhdWRpdCBsb2cgcmVjb3JkcyB3aGVuIHRoZSBtYXN0ZXIgaXMgcmVjb3ZlcmVkLlxuICogQ09OUzogcHJvY2VzcyBtZW1vcnkgc3RpbGwgaG9sZHMgdGhlIG1hc3RlciBrZXkgIHNhbWUgcG9zdHVyZSBhc1xuICogRW52S2V5UHJvdmlkZXIgb25jZSB3YXJtZWQgdXAuIEZvciBzdHJvbmdlciBpc29sYXRpb24gYW5cbiAqIG9wZXJhdG9yIGNhbiBtb3ZlIHRvIHBlci1yZWNvcmQgZW52ZWxvcGUgZW5jcnlwdGlvbiAoY2FsbFxuICogR2VuZXJhdGVEYXRhS2V5IG9uIGV2ZXJ5IHdyaXRlKTsgdGhhdCdzIGEgZm9sbG93LW9uLlxuICpcbiAqIE9wZXJhdG9yIHNldHVwICogMS4gQ3JlYXRlIGEgS01TIENNSyB3aXRoIGtleSBwb2xpY3kgYWxsb3dpbmcgdGhlIHBsYXRmb3JtIHNlcnZpY2Unc1xuICogSUFNIHJvbGUga21zOkRlY3J5cHQuXG4gKiAyLiBHZW5lcmF0ZSBhIHJhbmRvbSAzMi1ieXRlIG1hc3RlciAqIGhlYWQgLWMgMzIgL2Rldi91cmFuZG9tIHwgYmFzZTY0XG4gKiAzLiBXcmFwIGl0IHdpdGggS01TICogYXdzIGttcyBlbmNyeXB0IC0ta2V5LWlkIDxLRVlfSUQ+IFxcXG4gKiAtLXBsYWludGV4dCA8YmFzZTY0LWZyb20tc3RlcC0yPiAtLW91dHB1dCB0ZXh0IFxcXG4gKiAtLXF1ZXJ5IENpcGhlcnRleHRCbG9iXG4gKiA0LiBTZXQgb24gdGhlIHNlcnZpY2UgKiBTRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEPTxLRVlfSUQ+XG4gKiBTRUNSRVRfRU5DUllQVElPTl9LTVNfQ0lQSEVSVEVYVD08YmFzZTY0LW91dHB1dC1vZi1zdGVwLTM+XG4gKiA1LiBQaWNrIHRoaXMgcHJvdmlkZXIgdmlhIGBzZXRLZXlQcm92aWRlcihuZXcgS21zS2V5UHJvdmlkZXIoKSlgLlxuICpcbiAqIENvbnN0cnVjdCBsYXppbHkgIGltcG9ydGluZyB0aGUgQVdTIFNESyBoYXMgYSBub24tdHJpdmlhbCBjb2xkLXN0YXJ0XG4gKiBjb3N0IHNvIGVudnMgdGhhdCBzdGF5IG9uIEVudktleVByb3ZpZGVyIG5ldmVyIGxvYWQgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBLbXNLZXlQcm92aWRlciBpbXBsZW1lbnRzIEtleVByb3ZpZGVyIHtcbiAgcHJpdmF0ZSBtYXN0ZXJLZXlDYWNoZTogQnVmZmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkga2V5SWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjaXBoZXJ0ZXh0QjY0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50Pzogc3RyaW5nO1xuICBwcml2YXRlIGRlY3J5cHRJbkZsaWdodDogUHJvbWlzZTxCdWZmZXI+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3Iob3B0cz86IHsga2V5SWQ/OiBzdHJpbmc7IGNpcGhlcnRleHRCYXNlNjQ/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZzsgZW5kcG9pbnQ/OiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGtleUlkID0gb3B0cz8ua2V5SWQgPz8gcHJvY2Vzcy5lbnYuU0VDUkVUX0VOQ1JZUFRJT05fS01TX0tFWV9JRDtcbiAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gb3B0cz8uY2lwaGVydGV4dEJhc2U2NCA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LTVNfQ0lQSEVSVEVYVDtcbiAgICBpZiAoIWtleUlkKSB0aHJvdyBuZXcgRXJyb3IoJ1NFQ1JFVF9FTkNSWVBUSU9OX0tNU19LRVlfSUQgZW52IGlzIHJlcXVpcmVkIGZvciBLbXNLZXlQcm92aWRlcicpO1xuICAgIGlmICghY2lwaGVydGV4dCkgdGhyb3cgbmV3IEVycm9yKCdTRUNSRVRfRU5DUllQVElPTl9LTVNfQ0lQSEVSVEVYVCBlbnYgaXMgcmVxdWlyZWQgZm9yIEttc0tleVByb3ZpZGVyJyk7XG4gICAgdGhpcy5rZXlJZCA9IGtleUlkO1xuICAgIHRoaXMuY2lwaGVydGV4dEI2NCA9IGNpcGhlcnRleHQ7XG4gICAgdGhpcy5yZWdpb24gPSBvcHRzPy5yZWdpb24gPz8gcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiA/PyBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT047XG4gICAgdGhpcy5lbmRwb2ludCA9IG9wdHM/LmVuZHBvaW50ID8/IHByb2Nlc3MuZW52LkFXU19LTVNfRU5EUE9JTlQ7XG4gIH1cblxuICBkZXJpdmVLZXkob3JnSWQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLm1hc3RlcktleUNhY2hlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoICdLbXNLZXlQcm92aWRlciBpcyBub3Qgd2FybWVkIHVwLiBDYWxsIGBhd2FpdCBwcm92aWRlci53YXJtdXAoKWAgb25jZSBhdCBzZXJ2aWNlIHN0YXJ0dXAgYmVmb3JlIGFueSBlbmNyeXB0L2RlY3J5cHQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGRlcml2ZWQgPSBoa2RmU3luYygnc2hhMjU2JywgdGhpcy5tYXN0ZXJLZXlDYWNoZSwgQnVmZmVyLmZyb20ob3JnSWQsICd1dGY4JyksICdzZWNyZXRzLXYxJywgMzIpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShkZXJpdmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFYWdlcmx5IHJlY292ZXIgdGhlIG1hc3RlciBrZXkgZnJvbSBLTVMgc28gc3Vic2VxdWVudCBgZGVyaXZlS2V5YFxuICAgKiBjYWxscyBhcmUgc3luYy4gSWRlbXBvdGVudCAgY29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBzYW1lIGluLVxuICAgKiBmbGlnaHQgcHJvbWlzZSBzbyB3ZSBkb24ndCBzcGF3biBtdWx0aXBsZSBLTVMgRGVjcnlwdCByZXF1ZXN0cyBhdFxuICAgKiBib290LiBUaHJvd3Mgb24gYW55IEtNUyBmYWlsdXJlOyB0aGUgY2FsbGVyICh0eXBpY2FsbHkgdGhlIHNlcnZpY2Unc1xuICAgKiBvbkJlZm9yZVN0YXJ0IGhvb2spIGRlY2lkZXMgd2hldGhlciB0byBmYWxsIGJhY2sgdG8gYSBkaWZmZXJlbnRcbiAgICogcHJvdmlkZXIgb3IgZmFpbC1zdGFydHVwLlxuICAgKi9cbiAgYXN5bmMgd2FybXVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1hc3RlcktleUNhY2hlKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmRlY3J5cHRJbkZsaWdodCkge1xuICAgICAgdGhpcy5kZWNyeXB0SW5GbGlnaHQgPSB0aGlzLmZldGNoQW5kRGVjcnlwdCgpO1xuICAgIH1cbiAgICB0aGlzLm1hc3RlcktleUNhY2hlID0gYXdhaXQgdGhpcy5kZWNyeXB0SW5GbGlnaHQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoQW5kRGVjcnlwdCgpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIC8vIER5bmFtaWMgaW1wb3J0IHNvIEVudktleVByb3ZpZGVyLW9ubHkgZW52cyBkb24ndCBsb2FkIHRoZSBTREsuXG4gICAgY29uc3QgeyBLTVNDbGllbnQsIERlY3J5cHRDb21tYW5kIH0gPSBhd2FpdCBpbXBvcnQoJ0Bhd3Mtc2RrL2NsaWVudC1rbXMnKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgS01TQ2xpZW50KHtcbiAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb24sXG4gICAgICAuLi4odGhpcy5lbmRwb2ludCA/IHsgZW5kcG9pbnQ6IHRoaXMuZW5kcG9pbnQgfToge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgRGVjcnlwdENvbW1hbmQoe1xuICAgICAgS2V5SWQ6IHRoaXMua2V5SWQsXG4gICAgICBDaXBoZXJ0ZXh0QmxvYjogQnVmZmVyLmZyb20odGhpcy5jaXBoZXJ0ZXh0QjY0LCAnYmFzZTY0JyksXG4gICAgfSkpO1xuICAgIGlmICghcmVzcC5QbGFpbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS01TIERlY3J5cHQgcmV0dXJuZWQgYW4gZW1wdHkgUGxhaW50ZXh0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHJlc3AuUGxhaW50ZXh0KTtcbiAgICBpZiAoYnVmLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgS01TIERlY3J5cHQgcmV0dXJuZWQgJHtidWYubGVuZ3RofS1ieXRlIGtleTsgZXhwZWN0ZWQgMzJgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxufVxuXG4vLyBMYXp5IHNpbmdsZXRvbiAgb3BlcmF0b3IgY29kZSBpbiBsb25nLWxpdmVkIHNlcnZpY2VzIHBheXMgdGhlIGVudi1wYXJzZVxuLy8gY29zdCBvbmNlLCBhbmQgdGVzdHMgY2FuIG1pbnQgdGhlaXIgb3duIHByb3ZpZGVyIHdpdGggYSBsaXRlcmFsIGtleS5cbmxldCBkZWZhdWx0UHJvdmlkZXI6IEtleVByb3ZpZGVyIHwgbnVsbCA9IG51bGw7XG5mdW5jdGlvbiBnZXREZWZhdWx0UHJvdmlkZXIoKTogS2V5UHJvdmlkZXIge1xuICBpZiAoIWRlZmF1bHRQcm92aWRlcikgZGVmYXVsdFByb3ZpZGVyID0gbmV3IEVudktleVByb3ZpZGVyKCk7XG4gIHJldHVybiBkZWZhdWx0UHJvdmlkZXI7XG59XG5cbi8qKiBSZWFkIHRoZSBhY3RpdmUgZGVmYXVsdCBwcm92aWRlci4gRXhwb3NlZCBzbyBzZXJ2aWNlIGNvZGUgKGUuZy4gYW5cbiAqICBhZG1pbiBlbmRwb2ludCB0aGF0IGp1c3Qgcm90YXRlZCBhbiBvcmcncyBLTVMgY29uZmlnKSBjYW4gY2FsbFxuICogIGBwcm92aWRlci5ldmljdChvcmdJZClgIG9uIHRoZSBsaXZlIHByb3ZpZGVyIHJhdGhlciB0aGFuIHJlY29uc3RydWN0aW5nXG4gKiAgb25lLiBUcmlnZ2VycyBsYXp5IGluaXRpYWxpemF0aW9uIG9uIGZpcnN0IGFjY2Vzcywgc2FtZSBhcyB0aGUgaW50ZXJuYWxcbiAqICBjYWxsZXJzIGJlbG93LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRLZXlQcm92aWRlcigpOiBLZXlQcm92aWRlciB7XG4gIHJldHVybiBnZXREZWZhdWx0UHJvdmlkZXIoKTtcbn1cblxuLyoqIFJlc2V0IHRoZSBjYWNoZWQgZGVmYXVsdCBwcm92aWRlciAgZm9yIHRlc3RzIHRoYXQgbXV0YXRlIGBwcm9jZXNzLmVudmAuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXREZWZhdWx0S2V5UHJvdmlkZXIoKTogdm9pZCB7IGRlZmF1bHRQcm92aWRlciA9IG51bGw7IH1cblxuLyoqIFJlcGxhY2UgdGhlIGRlZmF1bHQgcHJvdmlkZXIgIHNlcnZpY2VzIHRoYXQgb3B0IGludG8gS01TIGNhbGwgdGhpc1xuICogb25jZSBhdCBzdGFydHVwIHdpdGggYSB3YXJtZWQtdXAgYEttc0tleVByb3ZpZGVyYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRLZXlQcm92aWRlcihwcm92aWRlcjogS2V5UHJvdmlkZXIpOiB2b2lkIHsgZGVmYXVsdFByb3ZpZGVyID0gcHJvdmlkZXI7IH1cblxuLyoqIFBlci1vcmcgS01TIGNvbmZpZyB0aGUgb3BlcmF0b3Igc3VwcGxpZXMuIFRoZSBga2V5SWRgIGlkZW50aWZpZXMgdGhlXG4gKiAgS01TIENNSyB0byBjYWxsIERlY3J5cHQgb247IGBjaXBoZXJ0ZXh0QmFzZTY0YCBpcyB0aGUgd3JhcHBlZCAzMi1ieXRlXG4gKiAgbWFzdGVyIGdlbmVyYXRlZCBieSBgYXdzIGttcyBlbmNyeXB0YCBhZ2FpbnN0IHRoYXQga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJPcmdLbXNDb25maWcge1xuICBrZXlJZDogc3RyaW5nO1xuICBjaXBoZXJ0ZXh0QmFzZTY0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXN5bmMgcmVzb2x2ZXIgdGhhdCBtYXBzIGFuIG9yZyBpZCB0byBpdHMgS01TIGNvbmZpZy4gUmV0dXJucyBgbnVsbGAgd2hlblxuICogdGhlIG9yZyBoYXMgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBwcm92aWRlciB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiBgZmFsbGJhY2tgIHByb3ZpZGVyIHN1cHBsaWVkIGF0IGNvbnN0cnVjdGlvbiAodXN1YWxseSBhbiBFbnZLZXlQcm92aWRlclxuICogb3IgYSBkZWZhdWx0IEttc0tleVByb3ZpZGVyKS5cbiAqL1xuZXhwb3J0IHR5cGUgUGVyT3JnS21zUmVzb2x2ZXIgPSAob3JnSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxQZXJPcmdLbXNDb25maWcgfCBudWxsPjtcblxuLyoqXG4gKiBQZXItb3JnIEtNUy1iYWNrZWQgS2V5UHJvdmlkZXIuIFRoZSBibGFzdCByYWRpdXMgb2YgYSBLTVMga2V5IGNvbXByb21pc2VcbiAqIGlzIG9uZSBvcmcgaW5zdGVhZCBvZiBldmVyeSBvcmcgdW5kZXIgYSBzaGFyZWQgbWFzdGVyLlxuICpcbiAqIEVhY2ggb3JnIGhhcyBpdHMgb3duIEtNUyBDTUsgKyBpdHMgb3duIHdyYXBwZWQgbWFzdGVyIChzdG9yZWQgaW4gTW9uZ29cbiAqIHZpYSB0aGUgb3BlcmF0b3IncyBzZXR1cCBzY3JpcHQpLiBPbiBmaXJzdCBlbmNyeXB0L2RlY3J5cHQgZm9yIGFuIG9yZyxcbiAqIHRoZSBwcm92aWRlcjpcbiAqICAgMS4gQ2FsbHMgdGhlIHJlc29sdmVyIHRvIGZldGNoIHRoZSBvcmcncyBLTVMgY29uZmlnLlxuICogICAyLiBDYWxscyBga21zOkRlY3J5cHRgIHRvIHJlY292ZXIgdGhlIDMyLWJ5dGUgbWFzdGVyLlxuICogICAzLiBDYWNoZXMgdGhlIHJlY292ZXJlZCBtYXN0ZXIgaW4tbWVtb3J5IGZvciB0aGUgcHJvY2VzcyBsaWZldGltZS5cbiAqICAgNC4gSEtERi1kZXJpdmVzIHBlci1jYWxsIGZyb20gdGhhdCBtYXN0ZXIgKyB0aGUgb3JnIGlkIHNhbHQuXG4gKlxuICogQmxvYnMgZW5jcnlwdGVkIGJ5IHRoaXMgcHJvdmlkZXIgY2FycnkgYGtpZCA9IDxrbXMta2V5LWlkPmAgc28gdGhlXG4gKiBkZWNyeXB0IHBhdGggZGV0ZWN0cyBhIHN0YWxlIGNvbmZpZyAob3BlcmF0b3Igcm90YXRlZCB0aGUga2V5IGJ1dFxuICogZXhpc3Rpbmcgcm93cyB3ZXJlbid0IHJlLWVuY3J5cHRlZCkgQkVGT1JFIEFFUy1HQ00gdGhyb3dzIGFuIG9wYXF1ZVxuICogYXV0aGVudGljYXRpb24tdGFnIGVycm9yLlxuICpcbiAqIE9yZ3Mgd2l0aG91dCBwZXItb3JnIGNvbmZpZyBmYWxsIHRocm91Z2ggdG8gdGhlIGBmYWxsYmFja2AgcHJvdmlkZXIg4oCUXG4gKiBtaXhlZC1tb2RlIGRlcGxveW1lbnRzIHdoZXJlIHNvbWUgb3JncyBoYXZlIEtNUyBpc29sYXRpb24gYW5kIG90aGVyc1xuICogc3RheSBvbiB0aGUgc2hhcmVkIG1hc3RlciBhcmUgZXhwbGljaXRseSBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJPcmdLbXNLZXlQcm92aWRlciBpbXBsZW1lbnRzIEtleVByb3ZpZGVyIHtcbiAgLyoqIENhY2hlZCBwZXItb3JnIG1hc3RlciBrZXlzLCBrZXllZCBieSBvcmdJZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsga2V5OiBCdWZmZXI7IGtpZDogc3RyaW5nIH0+KCk7XG4gIC8qKiBSZXNvbHZlZCBwZXItb3JnIGNvbmZpZ3MgY2FjaGVkIGZvciB0aGUgcHJvY2VzcyBsaWZldGltZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdzID0gbmV3IE1hcDxzdHJpbmcsIFBlck9yZ0ttc0NvbmZpZz4oKTtcbiAgLyoqIEluLWZsaWdodCByZXNvbHZlciBwcm9taXNlcyBzbyBjb25jdXJyZW50IGZpcnN0LXRvdWNoIGNhbGxlcnMgc2hhcmUgb25lIEtNUyBEZWNyeXB0LlxuICAgKiAgUmVzb2x2ZXMgdG8gYG51bGxgIGZvciBvcmdzIHdpdGggbm8gcGVyLW9yZyBjb25maWcg4oCUIGNhbGxlciB0cmVhdHMgbnVsbCBhc1xuICAgKiAgXCJmYWxsIHRocm91Z2ggdG8gdGhlIGZhbGxiYWNrIHByb3ZpZGVyXCIsIHNhbWUgYXMgYSBjb2xkIGNhY2hlIG1pc3MuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5GbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx7IGtleTogQnVmZmVyOyBraWQ6IHN0cmluZyB9IHwgbnVsbD4+KCk7XG4gIC8qKiBQcm92aWRlciB1c2VkIGZvciBvcmdzIHRoYXQgaGF2ZSBubyBwZXItb3JnIGNvbmZpZy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBmYWxsYmFjazogS2V5UHJvdmlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IFBlck9yZ0ttc1Jlc29sdmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbmRwb2ludD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRzOiB7XG4gICAgcmVzb2x2ZXI6IFBlck9yZ0ttc1Jlc29sdmVyO1xuICAgIGZhbGxiYWNrOiBLZXlQcm92aWRlcjtcbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0aGlzLnJlc29sdmVyID0gb3B0cy5yZXNvbHZlcjtcbiAgICB0aGlzLmZhbGxiYWNrID0gb3B0cy5mYWxsYmFjaztcbiAgICB0aGlzLnJlZ2lvbiA9IG9wdHMucmVnaW9uID8/IHByb2Nlc3MuZW52LkFXU19SRUdJT04gPz8gcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OO1xuICAgIHRoaXMuZW5kcG9pbnQgPSBvcHRzLmVuZHBvaW50ID8/IHByb2Nlc3MuZW52LkFXU19LTVNfRU5EUE9JTlQ7XG4gIH1cblxuICAvKiogU3luYyBgZGVyaXZlS2V5YCBvbmx5IHdvcmtzIGZvciBhbHJlYWR5LXdhcm1lZCBvcmdzLiBDb2xkIG9yZ3MgZmFsbFxuICAgKiAgdGhyb3VnaCB0byB0aGUgZmFsbGJhY2sgcHJvdmlkZXIuIENhbGxlcnMgdGhhdCB3YW50IHBlci1vcmcgaXNvbGF0aW9uXG4gICAqICBNVVNUIGBhd2FpdCBkZXJpdmVLZXlBc3luYyhvcmdJZClgIG9uY2UgZmlyc3QgKGUuZy4gZHVyaW5nIHJlcXVlc3Qgc2V0dXBcbiAgICogIG9yIGFzIHBhcnQgb2YgYSB3YXJtdXAgcGFzcykg4oCUIG90aGVyd2lzZSB0aGUgb3JnIHNpbGVudGx5IHVzZXMgdGhlXG4gICAqICBzaGFyZWQgbWFzdGVyLiAqL1xuICBkZXJpdmVLZXkob3JnSWQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5tYXN0ZXJzLmdldChvcmdJZCk7XG4gICAgaWYgKCFjYWNoZWQpIHJldHVybiB0aGlzLmZhbGxiYWNrLmRlcml2ZUtleShvcmdJZCk7XG4gICAgY29uc3QgZGVyaXZlZCA9IGhrZGZTeW5jKCdzaGEyNTYnLCBjYWNoZWQua2V5LCBCdWZmZXIuZnJvbShvcmdJZCwgJ3V0ZjgnKSwgJ3NlY3JldHMtdjEnLCAzMik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlcml2ZWQpO1xuICB9XG5cbiAgYXN5bmMgZGVyaXZlS2V5QXN5bmMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXYXJtZWQob3JnSWQpO1xuICAgIHJldHVybiB0aGlzLmRlcml2ZUtleShvcmdJZCk7XG4gIH1cblxuICBraWRGb3Iob3JnSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWFzdGVycy5nZXQob3JnSWQpPy5raWQgPz8gdGhpcy5mYWxsYmFjay5raWRGb3I/LihvcmdJZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgb3JnJ3MgS01TIGNvbmZpZywgY2FsbCBEZWNyeXB0LCBjYWNoZSB0aGUgbWFzdGVyLiBTdWJzZXF1ZW50XG4gICAqIGNhbGxzIGZvciB0aGUgc2FtZSBvcmcgYXJlIG5vLW9wcy4gQ29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBpbi1mbGlnaHRcbiAgICogRGVjcnlwdCBwcm9taXNlLlxuICAgKlxuICAgKiBSZXR1cm5zIHNpbGVudGx5IHdoZW4gdGhlIG9yZyBoYXMgbm8gcGVyLW9yZyBjb25maWcg4oCUIHRoZSBmYWxsYmFja1xuICAgKiBwcm92aWRlciBoYW5kbGVzIHRob3NlIG9yZ3MuXG4gICAqL1xuICBhc3luYyBlbnN1cmVXYXJtZWQob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm1hc3RlcnMuaGFzKG9yZ0lkKSkgcmV0dXJuO1xuICAgIC8vIEluc3RhbGwgdGhlIGluLWZsaWdodCBwcm9taXNlIFNZTkNIUk9OT1VTTFkgYmVmb3JlIHlpZWxkaW5nIHNvIGNvbmN1cnJlbnRcbiAgICAvLyBjYWxsZXJzIGZpbmQgaXQgb24gdGhlIHNlY29uZC1hbmQtbGF0ZXIgcGFzc2VzLiBBd2FpdGluZyB0aGUgcmVzb2x2ZXJcbiAgICAvLyBiZWZvcmUgcG9wdWxhdGluZyB0aGUgbWFwIGlzIHRoZSBidWcgdGhhdCBsZXRzIGEgUHJvbWlzZS5hbGwgb2YgM1xuICAgIC8vIGNhbGxlcnMgZmlyZSAzIEtNUyBEZWNyeXB0cy5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuaW5GbGlnaHQuZ2V0KG9yZ0lkKTtcbiAgICBpZiAoIXByb21pc2UpIHtcbiAgICAgIHByb21pc2UgPSB0aGlzLnJlc29sdmVBbmREZWNyeXB0KG9yZ0lkKTtcbiAgICAgIHRoaXMuaW5GbGlnaHQuc2V0KG9yZ0lkLCBwcm9taXNlKTtcbiAgICAgIHZvaWQgcHJvbWlzZS5maW5hbGx5KCgpID0+IHsgaWYgKHRoaXMuaW5GbGlnaHQuZ2V0KG9yZ0lkKSA9PT0gcHJvbWlzZSkgdGhpcy5pbkZsaWdodC5kZWxldGUob3JnSWQpOyB9KTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbWlzZTtcbiAgICBpZiAocmVzdWx0KSB0aGlzLm1hc3RlcnMuc2V0KG9yZ0lkLCByZXN1bHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlQW5kRGVjcnlwdChvcmdJZDogc3RyaW5nKTogUHJvbWlzZTx7IGtleTogQnVmZmVyOyBraWQ6IHN0cmluZyB9IHwgbnVsbD4ge1xuICAgIGxldCBjZmcgPSB0aGlzLmNvbmZpZ3MuZ2V0KG9yZ0lkKTtcbiAgICBpZiAoIWNmZykge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmVyKG9yZ0lkKTtcbiAgICAgIGlmICghcmVzb2x2ZWQpIHJldHVybiBudWxsOyAvLyBubyBwZXItb3JnIGNvbmZpZyDihpIgY2FsbGVyIHVzZXMgZmFsbGJhY2tcbiAgICAgIGNmZyA9IHJlc29sdmVkO1xuICAgICAgdGhpcy5jb25maWdzLnNldChvcmdJZCwgY2ZnKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5mZXRjaEFuZERlY3J5cHQoY2ZnKTtcbiAgICByZXR1cm4geyBrZXksIGtpZDogY2ZnLmtleUlkIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoQW5kRGVjcnlwdChjZmc6IFBlck9yZ0ttc0NvbmZpZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgeyBLTVNDbGllbnQsIERlY3J5cHRDb21tYW5kIH0gPSBhd2FpdCBpbXBvcnQoJ0Bhd3Mtc2RrL2NsaWVudC1rbXMnKTtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgS01TQ2xpZW50KHtcbiAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb24sXG4gICAgICAuLi4odGhpcy5lbmRwb2ludCA/IHsgZW5kcG9pbnQ6IHRoaXMuZW5kcG9pbnQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IERlY3J5cHRDb21tYW5kKHtcbiAgICAgIEtleUlkOiBjZmcua2V5SWQsXG4gICAgICBDaXBoZXJ0ZXh0QmxvYjogQnVmZmVyLmZyb20oY2ZnLmNpcGhlcnRleHRCYXNlNjQsICdiYXNlNjQnKSxcbiAgICB9KSk7XG4gICAgaWYgKCFyZXNwLlBsYWludGV4dCkgdGhyb3cgbmV3IEVycm9yKGBLTVMgRGVjcnlwdCByZXR1cm5lZCBlbXB0eSBQbGFpbnRleHQgZm9yIGtleSAke2NmZy5rZXlJZH1gKTtcbiAgICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShyZXNwLlBsYWludGV4dCk7XG4gICAgaWYgKGJ1Zi5sZW5ndGggIT09IDMyKSB0aHJvdyBuZXcgRXJyb3IoYEtNUyBEZWNyeXB0IHJldHVybmVkICR7YnVmLmxlbmd0aH0tYnl0ZSBrZXkgZm9yICR7Y2ZnLmtleUlkfTsgZXhwZWN0ZWQgMzJgKTtcbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgLyoqIEV2aWN0IGEgY2FjaGVkIHBlci1vcmcgbWFzdGVyLiBVc2UgYWZ0ZXIgYSBrZXkgcm90YXRpb24gc28gdGhlIG5leHRcbiAgICogIHRvdWNoIHJlLWZldGNoZXMgdGhlIG5ldyB3cmFwcGVkIG1hc3RlciBmcm9tIHRoZSByZXNvbHZlci4gKi9cbiAgZXZpY3Qob3JnSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFzdGVycy5kZWxldGUob3JnSWQpO1xuICAgIHRoaXMuY29uZmlncy5kZWxldGUob3JnSWQpO1xuICB9XG59XG5cbi8qKlxuICogRW5jcnlwdCBhIHBsYWludGV4dCBzdHJpbmcgZm9yIHN0b3JhZ2UuIFJldHVybnMgYW4gYEVuY3J5cHRlZEJsb2JgIHRoYXRcbiAqIGNhbiBiZSBKU09OLXNlcmlhbGl6ZWQgaW50byB0aGUgdW5kZXJseWluZyBjb2x1bW4gLyBNb25nbyBkb2N1bWVudC5cbiAqXG4gKiBFbXB0eSBzdHJpbmdzIHJvdW5kLXRyaXAgYXMgYG51bGxgIHNvIHRoZSBjYWxsaW5nIG1vZGVsIGxheWVyIGNhbiB0cmVhdFxuICogXCJubyBzZWNyZXQgc2V0XCIgaWRlbnRpY2FsbHkgdG8gXCJmaWVsZCBhYnNlbnRcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY3J5cHRTZWNyZXQoIHBsYWludGV4dDogc3RyaW5nLFxuICBvcmdJZDogc3RyaW5nLFxuICBwcm92aWRlcjogS2V5UHJvdmlkZXIgPSBnZXREZWZhdWx0UHJvdmlkZXIoKSxcbik6IEVuY3J5cHRlZEJsb2Ige1xuICBpZiAoIXBsYWludGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVmdXNpbmcgdG8gZW5jcnlwdCBlbXB0eSBzdHJpbmc7IGNhbGxlciBzaG91bGQgc3RvcmUgbnVsbCBpbnN0ZWFkJyk7XG4gIH1cbiAgY29uc3Qga2V5ID0gcHJvdmlkZXIuZGVyaXZlS2V5KG9yZ0lkKTtcbiAgY29uc3QgaXYgPSByYW5kb21CeXRlcygxMik7XG4gIGNvbnN0IGNpcGhlciA9IGNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWdjbScsIGtleSwgaXYpO1xuICBjb25zdCBlbmMgPSBCdWZmZXIuY29uY2F0KFtjaXBoZXIudXBkYXRlKHBsYWludGV4dCwgJ3V0ZjgnKSwgY2lwaGVyLmZpbmFsKCldKTtcbiAgY29uc3QgdGFnID0gY2lwaGVyLmdldEF1dGhUYWcoKTtcbiAgLy8gUGVyT3JnS21zS2V5UHJvdmlkZXIgdGFncyBibG9icyB3aXRoIHRoZSBLTVMga2V5IGlkIHVzZWQgc28gdGhlXG4gIC8vIGRlY3J5cHQgcGF0aCBjYW4gcmVmdXNlIHRvIG9wZXJhdGUgaWYgdGhlIG9wZXJhdG9yIGxhdGVyIHN3YXBzIGluIGFcbiAgLy8gZGlmZmVyZW50IHBlci1vcmcgY29uZmlnIChhIG1pc2NvbmZpZ3VyZWQgc3dhcCBzaG91bGRuJ3Qgc2lsZW50bHlcbiAgLy8gYWNjZXB0IGEgc3RhbGUgYmxvYiBpdCBjYW4ndCB2ZXJpZnkgYWdhaW5zdCB0aGUgcmlnaHQgQ01LKS5cbiAgY29uc3Qga2lkID0gcHJvdmlkZXIua2lkRm9yPy4ob3JnSWQpO1xuICByZXR1cm4ge1xuICAgIGFsZzogJ2Flcy0yNTYtZ2NtLXYxJyxcbiAgICBpdjogaXYudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIC8vIEdDTSB0YWcgTVVTVCB0cmF2ZWwgd2l0aCB0aGUgY2lwaGVydGV4dCBvciBgZGVjcnlwdFNlY3JldGAgY2FuJ3RcbiAgICAvLyB2ZXJpZnkgaW50ZWdyaXR5ICBjb25jYXRlbmF0ZSBzbyB0aGUgb24tZGlzayBzaGFwZSBpcyBvbmUgZmllbGQuXG4gICAgY2lwaGVydGV4dDogQnVmZmVyLmNvbmNhdChbZW5jLCB0YWddKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgLi4uKGtpZCAhPT0gdW5kZWZpbmVkID8geyBraWQgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IGFuIGBFbmNyeXB0ZWRCbG9iYCB3cml0dGVuIGJ5IGBlbmNyeXB0U2VjcmV0YC4gVGhyb3dzIG9uICogLSB1bmtub3duIGBhbGdgIChmb3JjZXMgYW4gZXhwbGljaXQgbWlncmF0aW9uIHdoZW4gdGhlIGZvcm1hdCBjaGFuZ2VzKVxuICogLSB3cm9uZyBvcmdJZCAoSEtERiBiaW5kaW5nIG1pc21hdGNoIGZhaWxzIHRoZSBhdXRoIHRhZylcbiAqIC0gdGFtcGVyZWQgY2lwaGVydGV4dCAoR0NNIGF1dGggdGFnIGNoZWNrIGZhaWxzKVxuICpcbiAqIENhbGxlcnMgaGFuZGxlIHRoZSB0aHJvdyAgbWFza2luZyB0aGUgZmFpbHVyZSBhcyBgbnVsbGAgd291bGQgaGlkZVxuICogc2lsZW50IGNvcnJ1cHRpb24gLyB3cm9uZy1vcmcgcmVhZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNyeXB0U2VjcmV0KCBibG9iOiBFbmNyeXB0ZWRCbG9iLFxuICBvcmdJZDogc3RyaW5nLFxuICBwcm92aWRlcjogS2V5UHJvdmlkZXIgPSBnZXREZWZhdWx0UHJvdmlkZXIoKSxcbik6IHN0cmluZyB7XG4gIGlmIChibG9iLmFsZyAhPT0gJ2Flcy0yNTYtZ2NtLXYxJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBhbGc6ICR7YmxvYi5hbGd9YCk7XG4gIH1cbiAgLy8gSWYgYm90aCB0aGUgcHJvdmlkZXIgQU5EIHRoZSBibG9iIHJlcG9ydCBhIGtpZCwgdGhleSBtdXN0IG1hdGNoLlxuICAvLyBNaXNtYXRjaCB1c3VhbGx5IG1lYW5zIGFuIG9wZXJhdG9yIHJvdGF0ZWQvcmVwbGFjZWQgYW4gb3JnJ3MgS01TXG4gIC8vIGNvbmZpZyBhbmQgaXMgbm93IHJlYWRpbmcgYSBibG9iIGVuY3J5cHRlZCB1bmRlciB0aGUgT0xEIGtleSDigJRcbiAgLy8gZmFpbGluZyBsb3VkIGhlcmUgYmVhdHMgbGV0dGluZyBBRVMtR0NNIHRocm93IGFuIG9wYXF1ZSBhdXRoLXRhZyBlcnJvci5cbiAgY29uc3QgcHJvdmlkZXJLaWQgPSBwcm92aWRlci5raWRGb3I/LihvcmdJZCk7XG4gIGlmIChwcm92aWRlcktpZCAhPT0gdW5kZWZpbmVkICYmIGJsb2Iua2lkICE9PSB1bmRlZmluZWQgJiYgcHJvdmlkZXJLaWQgIT09IGJsb2Iua2lkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBLTVMga2V5IGlkIG1pc21hdGNoOiBibG9iIHdhcyBlbmNyeXB0ZWQgdW5kZXIgJHtibG9iLmtpZH0sIGN1cnJlbnQgcHJvdmlkZXIgdXNlcyAke3Byb3ZpZGVyS2lkfSBmb3Igb3JnICR7b3JnSWR9YCk7XG4gIH1cbiAgY29uc3Qga2V5ID0gcHJvdmlkZXIuZGVyaXZlS2V5KG9yZ0lkKTtcbiAgY29uc3QgaXYgPSBCdWZmZXIuZnJvbShibG9iLml2LCAnYmFzZTY0Jyk7XG4gIGNvbnN0IGFsbCA9IEJ1ZmZlci5mcm9tKGJsb2IuY2lwaGVydGV4dCwgJ2Jhc2U2NCcpO1xuICAvLyBTcGxpdCBvZmYgdGhlIDE2LWJ5dGUgYXV0aCB0YWcgYXBwZW5kZWQgaW4gZW5jcnlwdFNlY3JldC4gQW55IHRhbXBlcmluZ1xuICAvLyAgdG8gZWl0aGVyIHRoZSBjaXBoZXJ0ZXh0IE9SIHRoZSB0YWcgIGNhdXNlcyB0aGUgbmV4dCBgZmluYWwoKWAgdG9cbiAgLy8gdGhyb3cgd2l0aCBcIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YVwiLlxuICBjb25zdCB0YWcgPSBhbGwuc3ViYXJyYXkoYWxsLmxlbmd0aCAtIDE2KTtcbiAgY29uc3QgZW5jID0gYWxsLnN1YmFycmF5KDAsIGFsbC5sZW5ndGggLSAxNik7XG4gIGNvbnN0IGRlY2lwaGVyID0gY3JlYXRlRGVjaXBoZXJpdignYWVzLTI1Ni1nY20nLCBrZXksIGl2KTtcbiAgZGVjaXBoZXIuc2V0QXV0aFRhZyh0YWcpO1xuICBjb25zdCBkZWMgPSBCdWZmZXIuY29uY2F0KFtkZWNpcGhlci51cGRhdGUoZW5jKSwgZGVjaXBoZXIuZmluYWwoKV0pO1xuICByZXR1cm4gZGVjLnRvU3RyaW5nKCd1dGY4Jyk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCAgaGFuZHkgZm9yIG1vZGVsIGxheWVycyB0aGF0IGhvbGQgYSBjb2x1bW4gd2hvc2UgdmFsdWUgbWF5IGJlXG4gKiBlaXRoZXIgYSBjbGVhci10ZXh0IHN0cmluZyAobGVnYWN5IC8gdW5lbmNyeXB0ZWQpIE9SIGFuIGVuY3J5cHRlZCBibG9iXG4gKiAocG9zdC1taWdyYXRpb24pLiBNaXhlZCBzdGF0ZXMgYXJpc2UgbWlkLW1pZ3JhdGlvbjsgdGhlIG1vZGVsIGRlY2lkZXNcbiAqIHdoYXQgdG8gZG8gKGRlY3J5cHQgb24gcmVhZCwgZW5jcnlwdCBvbiBuZXh0IHdyaXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW5jcnlwdGVkQmxvYih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEVuY3J5cHRlZEJsb2Ige1xuICByZXR1cm4gKCB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgJiYgdmFsdWUgIT09IG51bGxcbiAgICAmJiAodmFsdWUgYXMgeyBhbGc/OiB1bmtub3duIH0pLmFsZyA9PT0gJ2Flcy0yNTYtZ2NtLXYxJ1xuICAgICYmIHR5cGVvZiAodmFsdWUgYXMgeyBpdj86IHVua25vd24gfSkuaXYgPT09ICdzdHJpbmcnXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyB7IGNpcGhlcnRleHQ/OiB1bmtub3duIH0pLmNpcGhlcnRleHQgPT09ICdzdHJpbmcnXG4gICk7XG59XG4iXX0=
385
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LWVuY3J5cHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VjcmV0LWVuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxRQUFRLENBQUM7QUE2QmpGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUNSLFNBQVMsQ0FBUztJQUVuQyxZQUFZLGlCQUEwQjtRQUNwQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsMEVBQTBFO1FBQzFFLHNEQUFzRDtRQUN0RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMzRCxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNy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QUM7SUFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLE9BQU8sQ0FBRSxPQUFPLEtBQUssS0FBSyxRQUFRO1dBQzdCLEtBQUssS0FBSyxJQUFJO1dBQ2IsS0FBMkIsQ0FBQyxHQUFHLEtBQUssZ0JBQWdCO1dBQ3JELE9BQVEsS0FBMEIsQ0FBQyxFQUFFLEtBQUssUUFBUTtXQUNsRCxPQUFRLEtBQWtDLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FDdEUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiAgUGVyLW9yZyBlbnZlbG9wZSBlbmNyeXB0aW9uIGZvciBzZWNyZXQgY29sdW1ucy5cbiAqXG4gKiBUb2RheSdzIHBvc3R1cmUgZm9yIG9yZy1zY29wZWQgc2VjcmV0cyAoYWlQcm92aWRlcktleXMsIHdlYmhvb2sgVVJMcyxcbiAqIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzKSBpcyBjbGVhci10ZXh0IGluIE1vbmdvIC8gUG9zdGdyZXMgd2l0aCBhcHAtbGF5ZXJcbiAqIG1hc2tpbmcgb24gb3V0cHV0LiBUaGlzIG1vZHVsZSBpcyB0aGUgZW5jcnlwdGlvbiBwcmltaXRpdmUgdGhhdCBsZXRzIHRoZVxuICogbW9kZWwgbGF5ZXIgc3dhcCBjbGVhci10ZXh0IHN0cmluZ3MgZm9yIGBFbmNyeXB0ZWRCbG9iYCB2YWx1ZXMgYXQgd3JpdGVcbiAqIHRpbWUgYW5kIGRlY3J5cHQgYXQgcmVhZCB0aW1lLlxuICpcbiAqIENyeXB0b2dyYXBoeSAqIC0gQUVTLTI1Ni1HQ00gKGF1dGhlbnRpY2F0ZWQgZW5jcnlwdGlvbikuXG4gKiAtIFBlci1vcmcga2V5IGRlcml2ZWQgdmlhIEhLREYtU0hBMjU2KG1hc3RlcktleSwgc2FsdD1vcmdJZCwgaW5mbz0nc2VjcmV0cy12MScpLlxuICogRWFjaCBvcmcgZ2V0cyBhIHVuaXF1ZSBrZXkgd2l0aG91dCBvcGVyYXRvciBrZXktbWFuYWdlbWVudCBjZXJlbW9ueS5cbiAqIC0gMTItYnl0ZSBJViBnZW5lcmF0ZWQgcGVyIGVuY3J5cHRpb24gd2l0aCBgY3J5cHRvLnJhbmRvbUJ5dGVzYC5cbiAqIC0gMTYtYnl0ZSBhdXRoZW50aWNhdGlvbiB0YWcgY29uY2F0ZW5hdGVkIHdpdGggY2lwaGVydGV4dCAoc3RhbmRhcmQgR0NNKS5cbiAqXG4gKiBPcGVyYXRvciBjb25maWd1cmF0aW9uICogLSBgU0VDUkVUX0VOQ1JZUFRJT05fS0VZYCBlbnY6IGhleC0gb3IgYmFzZTY0LWVuY29kZWQgMzItYnl0ZSBtYXN0ZXIga2V5LlxuICogUmVxdWlyZWQgd2hlbiBgZW5jcnlwdFNlY3JldGAvYGRlY3J5cHRTZWNyZXRgIGFyZSBjYWxsZWQuIE1pc3Npbmcga2V5XG4gKiB0aHJvd3MgIGVuY3J5cHRpb24gaXMgZmFpbC1jbG9zZWQ7IHdlIG5ldmVyIHNpbGVudGx5IHJvdW5kLXRyaXAgYVxuICogc2VjcmV0IGFzIHBsYWludGV4dC5cbiAqXG4gKiBLTVMgbWlncmF0aW9uIHBhdGggKiAtIFRoZSB0d28gZXhwb3J0ZWQgZnVuY3Rpb25zIHRha2UgYSBgcHJvdmlkZXJgIHBhcmFtZXRlci4gVGhlIGRlZmF1bHRcbiAqIGBFbnZLZXlQcm92aWRlcmAgaW1wbGVtZW50cyBIS0RGIGRlcml2YXRpb24uIEEgZnV0dXJlIGBBd3NLbXNQcm92aWRlcmBcbiAqIHBsdWdzIGluIGhlcmU6IGl0IGNhbiBjYWxsIEtNUyBgRW5jcnlwdGAgLyBgRGVjcnlwdGAgdG8gd3JhcCBhIERFS1xuICogcmF0aGVyIHRoYW4gaG9sZGluZyBhIG1hc3RlciBrZXkgaW4gZW52LiBUaGUgb24tZGlzayBibG9iIHNoYXBlXG4gKiAoYHsgYWxnLCBpdiwgY2lwaGVydGV4dCwga2lkPyB9YCkgaXMgZm9yd2FyZC1jb21wYXRpYmxlICBga2lkYFxuICogY2FycmllcyB0aGUgS01TIGtleSBpZCB3aGVuIHRoZSBwcm92aWRlciBuZWVkcyBpdC5cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVDaXBoZXJpdiwgY3JlYXRlRGVjaXBoZXJpdiwgaGtkZlN5bmMsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuLyoqIE9uLWRpc2sgc2hhcGUgb2YgYW4gZW5jcnlwdGVkIHNlY3JldC4gSlNPTi1zZXJpYWxpemFibGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuY3J5cHRlZEJsb2Ige1xuICAvKiogQWxnb3JpdGhtIHRhZy4gQnVtcCBvbiBmb3JtYXQgY2hhbmdlIHNvIGEgZnV0dXJlIG1pZ3JhdGlvbiBjYW4gZGV0ZWN0IG9sZCBibG9icy4gKi9cbiAgYWxnOiAnYWVzLTI1Ni1nY20tdjEnO1xuICAvKiogQmFzZTY0LWVuY29kZWQgMTItYnl0ZSBJVi4gKi9cbiAgaXY6IHN0cmluZztcbiAgLyoqIEJhc2U2NC1lbmNvZGVkIGNpcGhlcnRleHQgKyAxNi1ieXRlIGF1dGhlbnRpY2F0aW9uIHRhZyBjb25jYXRlbmF0ZWQuICovXG4gIGNpcGhlcnRleHQ6IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGtleSBpZCAgcG9wdWxhdGVkIGJ5IEtNUy1iYWNrZWQgcHJvdmlkZXJzLCBpZ25vcmVkIGJ5IHRoZSBlbnYgcHJvdmlkZXIuICovXG4gIGtpZD86IHN0cmluZztcbn1cblxuLyoqIFBsdWdnYWJsZSBrZXkgc291cmNlLiBFbnYtYmFja2VkIGJ5IGRlZmF1bHQ7IEtNUy1iYWNrZWQgYXZhaWxhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlQcm92aWRlciB7XG4gIC8qKiBEZXJpdmUgYSAzMi1ieXRlIHN5bW1ldHJpYyBrZXkgYm91bmQgdG8gYG9yZ0lkYC4gKi9cbiAgZGVyaXZlS2V5KG9yZ0lkOiBzdHJpbmcpOiBCdWZmZXI7XG4gIC8qKiBPcHRpb25hbCBhc3luYyB2YXJpYW50IGZvciBwcm92aWRlcnMgdGhhdCBuZWVkIHRvIGRvIEkvTyAoZS5nLlxuICAgKiAgcGVyLW9yZyBLTVMgbG9va3VwIHRoZSBmaXJzdCB0aW1lIGFuIG9yZyBpcyBzZWVuKS4gRGVmYXVsdFxuICAgKiAgaW1wbGVtZW50YXRpb24gZm9yd2FyZHMgdG8gdGhlIHN5bmMgYGRlcml2ZUtleWAuICovXG4gIGRlcml2ZUtleUFzeW5jPyhvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+O1xuICAvKiogT3B0aW9uYWwgS01TLWtleS1pZCB0aGlzIHByb3ZpZGVyIHVzZWQgZm9yIGBvcmdJZGAuIEVtYmVkZGVkIGluIHRoZVxuICAgKiAgYEVuY3J5cHRlZEJsb2Iua2lkYCBmaWVsZCBvbiB3cml0ZSBzbyBkZWNyeXB0IGNhbiB2ZXJpZnkgdGhlIHJpZ2h0XG4gICAqICBLTVMgQ01LIGlzIGJlaW5nIHVzZWQgKGRlZmVuc2UgYWdhaW5zdCBhbiBhdHRhY2tlciB3aG8gc3dhcHMgYSBibG9iXG4gICAqICBiZXR3ZWVuIG9yZ3MpLiBEZWZhdWx0IHJldHVybnMgdW5kZWZpbmVkIChlbnYgcHJvdmlkZXIpLiAqL1xuICBraWRGb3I/KG9yZ0lkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVmYXVsdCBwcm92aWRlciAgZGVyaXZlcyBhIHBlci1vcmcga2V5IGZyb20gYFNFQ1JFVF9FTkNSWVBUSU9OX0tFWWAgdmlhXG4gKiBIS0RGLVNIQTI1Ni4gU3VpdGFibGUgZm9yIHNlbGYtaG9zdGVkIC8gZGV2IHdoZXJlIG9wZXJhdG9ycyBkb24ndCBoYXZlIEtNUy5cbiAqXG4gKiBGYWlscyBmYXN0IGlmIHRoZSBlbnYgaXMgbWlzc2luZyBvciB0aGUga2V5IGlzIHRoZSB3cm9uZyBsZW5ndGggc28gbWlzY29uZmlnXG4gKiBzdXJmYWNlcyBhdCBmaXJzdCB1c2UgcmF0aGVyIHRoYW4gc2lsZW50bHkgZmluZ2VycHJpbnRpbmcgYWxsIHdyaXRlcyB3aXRoXG4gKiBhIGRlZmF1bHQgemVybyBrZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnZLZXlQcm92aWRlciBpbXBsZW1lbnRzIEtleVByb3ZpZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXN0ZXJLZXk6IEJ1ZmZlcjtcblxuICBjb25zdHJ1Y3RvcihtYXN0ZXJLZXlPdmVycmlkZT86IHN0cmluZykge1xuICAgIGNvbnN0IHJhdyA9IG1hc3RlcktleU92ZXJyaWRlID8/IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tFWTtcbiAgICBpZiAoIXJhdykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTRUNSRVRfRU5DUllQVElPTl9LRVkgZW52IGlzIHJlcXVpcmVkIGZvciBzZWNyZXQgZW5jcnlwdGlvbicpO1xuICAgIH1cbiAgICAvLyBBY2NlcHQgZWl0aGVyIGhleCAoNjQgY2hhcnMpIG9yIGJhc2U2NCAoNDQgY2hhcnMgaW5jbHVkaW5nIHBhZGRpbmcpIGZvclxuICAgIC8vIG9wZXJhdG9yIGNvbnZlbmllbmNlICBib3RoIGRlY29kZSB0byBhIDMyLWJ5dGUga2V5LlxuICAgIGNvbnN0IGRlY29kZWQgPSByYXcubGVuZ3RoID09PSA2NCAmJiAvXlswLTlhLWZdKyQvaS50ZXN0KHJhdylcbiAgICAgID8gQnVmZmVyLmZyb20ocmF3LCAnaGV4JylcbiAgICAgIDogQnVmZmVyLmZyb20ocmF3LCAnYmFzZTY0Jyk7XG4gICAgaWYgKGRlY29kZWQubGVuZ3RoICE9PSAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTRUNSRVRfRU5DUllQVElPTl9LRVkgbXVzdCBkZWNvZGUgdG8gMzIgYnl0ZXMgKGdvdCAke2RlY29kZWQubGVuZ3RofSlgKTtcbiAgICB9XG4gICAgdGhpcy5tYXN0ZXJLZXkgPSBkZWNvZGVkO1xuICB9XG5cbiAgZGVyaXZlS2V5KG9yZ0lkOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIC8vIEhLREYgYmluZHMgdGhlIG1hc3RlciBrZXkgdG8gdGhlIG9yZyBzbyB0d28gb3JncyBlbmNyeXB0aW5nIHRoZSBzYW1lXG4gICAgLy8gcGxhaW50ZXh0IHByb2R1Y2UgZGlmZmVyZW50IGNpcGhlcnRleHRzICBrZWVwcyBhIHN0b2xlbiBEQiB1bmFibGUgdG9cbiAgICAvLyB0ZWxsIHdoaWNoIG9yZ3Mgc2hhcmUgc2VjcmV0cyB2aWEgY2lwaGVydGV4dCBjb21wYXJpc29uLlxuICAgIGNvbnN0IGRlcml2ZWQgPSBoa2RmU3luYyggJ3NoYTI1NicsXG4gICAgICB0aGlzLm1hc3RlcktleSxcbiAgICAgIEJ1ZmZlci5mcm9tKG9yZ0lkLCAndXRmOCcpLFxuICAgICAgJ3NlY3JldHMtdjEnLFxuICAgICAgMzIsXG4gICAgKTtcbiAgICAvLyBoa2RmU3luYyByZXR1cm5zIEFycmF5QnVmZmVyIGluIG9sZGVyIE5vZGUgdHlwaW5nczsgbm9ybWFsaXplIHRvIEJ1ZmZlci5cbiAgICByZXR1cm4gQnVmZmVyLmZyb20oZGVyaXZlZCk7XG4gIH1cbn1cblxuLyoqXG4gKiAgQVdTLUtNUy1iYWNrZWQgS2V5UHJvdmlkZXIuXG4gKlxuICogVHJhZGUtb2ZmIHBpY2tlZDogc3RvcmUgT05FIG1hc3RlciBrZXkgZW5jcnlwdGVkIHVuZGVyIGEgS01TIENNSzsgb25cbiAqIGZpcnN0IHVzZSwgY2FsbCBga21zOkRlY3J5cHRgIHRvIHJlY292ZXIgdGhlIG1hc3RlciBrZXkgYnl0ZXM7IEhLREYtXG4gKiBkZXJpdmUgcGVyLW9yZyBmcm9tIGl0IChzYW1lIGFzIEVudktleVByb3ZpZGVyKS4gVGhlIHByb2Nlc3MgdGhlbiBob2xkc1xuICogdGhlIHBsYWludGV4dCBtYXN0ZXIga2V5IGluIG1lbW9yeSB1bnRpbCByZXN0YXJ0LlxuICpcbiAqIFBST1M6IG9uZSBLTVMgY2FsbCBwZXIgcHJvY2VzcyBsaWZldGltZSAoY2hlYXAsIGxvdyBwOTkgaW1wYWN0KSxcbiAqIHRoZSBlbmNyeXB0ZWQtbWFzdGVyLWtleSBibG9iIGlzIHNhZmUgdG8gY29tbWl0L2xvZy9jaGVja2luLFxuICogS01TIGF1ZGl0IGxvZyByZWNvcmRzIHdoZW4gdGhlIG1hc3RlciBpcyByZWNvdmVyZWQuXG4gKiBDT05TOiBwcm9jZXNzIG1lbW9yeSBzdGlsbCBob2xkcyB0aGUgbWFzdGVyIGtleSAgc2FtZSBwb3N0dXJlIGFzXG4gKiBFbnZLZXlQcm92aWRlciBvbmNlIHdhcm1lZCB1cC4gRm9yIHN0cm9uZ2VyIGlzb2xhdGlvbiBhblxuICogb3BlcmF0b3IgY2FuIG1vdmUgdG8gcGVyLXJlY29yZCBlbnZlbG9wZSBlbmNyeXB0aW9uIChjYWxsXG4gKiBHZW5lcmF0ZURhdGFLZXkgb24gZXZlcnkgd3JpdGUpOyB0aGF0J3MgYSBmb2xsb3ctb24uXG4gKlxuICogT3BlcmF0b3Igc2V0dXAgKiAxLiBDcmVhdGUgYSBLTVMgQ01LIHdpdGgga2V5IHBvbGljeSBhbGxvd2luZyB0aGUgcGxhdGZvcm0gc2VydmljZSdzXG4gKiBJQU0gcm9sZSBrbXM6RGVjcnlwdC5cbiAqIDIuIEdlbmVyYXRlIGEgcmFuZG9tIDMyLWJ5dGUgbWFzdGVyICogaGVhZCAtYyAzMiAvZGV2L3VyYW5kb20gfCBiYXNlNjRcbiAqIDMuIFdyYXAgaXQgd2l0aCBLTVMgKiBhd3Mga21zIGVuY3J5cHQgLS1rZXktaWQgPEtFWV9JRD4gXFxcbiAqIC0tcGxhaW50ZXh0IDxiYXNlNjQtZnJvbS1zdGVwLTI+IC0tb3V0cHV0IHRleHQgXFxcbiAqIC0tcXVlcnkgQ2lwaGVydGV4dEJsb2JcbiAqIDQuIFNldCBvbiB0aGUgc2VydmljZSAqIFNFQ1JFVF9FTkNSWVBUSU9OX0tNU19LRVlfSUQ9PEtFWV9JRD5cbiAqIFNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUPTxiYXNlNjQtb3V0cHV0LW9mLXN0ZXAtMz5cbiAqIDUuIFBpY2sgdGhpcyBwcm92aWRlciB2aWEgYHNldEtleVByb3ZpZGVyKG5ldyBLbXNLZXlQcm92aWRlcigpKWAuXG4gKlxuICogQ29uc3RydWN0IGxhemlseSAgaW1wb3J0aW5nIHRoZSBBV1MgU0RLIGhhcyBhIG5vbi10cml2aWFsIGNvbGQtc3RhcnRcbiAqIGNvc3Qgc28gZW52cyB0aGF0IHN0YXkgb24gRW52S2V5UHJvdmlkZXIgbmV2ZXIgbG9hZCBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEttc0tleVByb3ZpZGVyIGltcGxlbWVudHMgS2V5UHJvdmlkZXIge1xuICBwcml2YXRlIG1hc3RlcktleUNhY2hlOiBCdWZmZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBrZXlJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNpcGhlcnRleHRCNjQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgZGVjcnlwdEluRmxpZ2h0OiBQcm9taXNlPEJ1ZmZlcj4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihvcHRzPzogeyBrZXlJZD86IHN0cmluZzsgY2lwaGVydGV4dEJhc2U2ND86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nOyBlbmRwb2ludD86IHN0cmluZyB9KSB7XG4gICAgY29uc3Qga2V5SWQgPSBvcHRzPy5rZXlJZCA/PyBwcm9jZXNzLmVudi5TRUNSRVRfRU5DUllQVElPTl9LTVNfS0VZX0lEO1xuICAgIGNvbnN0IGNpcGhlcnRleHQgPSBvcHRzPy5jaXBoZXJ0ZXh0QmFzZTY0ID8/IHByb2Nlc3MuZW52LlNFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUO1xuICAgIGlmICgha2V5SWQpIHRocm93IG5ldyBFcnJvcignU0VDUkVUX0VOQ1JZUFRJT05fS01TX0tFWV9JRCBlbnYgaXMgcmVxdWlyZWQgZm9yIEttc0tleVByb3ZpZGVyJyk7XG4gICAgaWYgKCFjaXBoZXJ0ZXh0KSB0aHJvdyBuZXcgRXJyb3IoJ1NFQ1JFVF9FTkNSWVBUSU9OX0tNU19DSVBIRVJURVhUIGVudiBpcyByZXF1aXJlZCBmb3IgS21zS2V5UHJvdmlkZXInKTtcbiAgICB0aGlzLmtleUlkID0ga2V5SWQ7XG4gICAgdGhpcy5jaXBoZXJ0ZXh0QjY0ID0gY2lwaGVydGV4dDtcbiAgICB0aGlzLnJlZ2lvbiA9IG9wdHM/LnJlZ2lvbiA/PyBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID8/IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTjtcbiAgICB0aGlzLmVuZHBvaW50ID0gb3B0cz8uZW5kcG9pbnQgPz8gcHJvY2Vzcy5lbnYuQVdTX0tNU19FTkRQT0lOVDtcbiAgfVxuXG4gIGRlcml2ZUtleShvcmdJZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMubWFzdGVyS2V5Q2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvciggJ0ttc0tleVByb3ZpZGVyIGlzIG5vdCB3YXJtZWQgdXAuIENhbGwgYGF3YWl0IHByb3ZpZGVyLndhcm11cCgpYCBvbmNlIGF0IHNlcnZpY2Ugc3RhcnR1cCBiZWZvcmUgYW55IGVuY3J5cHQvZGVjcnlwdC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGVyaXZlZCA9IGhrZGZTeW5jKCdzaGEyNTYnLCB0aGlzLm1hc3RlcktleUNhY2hlLCBCdWZmZXIuZnJvbShvcmdJZCwgJ3V0ZjgnKSwgJ3NlY3JldHMtdjEnLCAzMik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRlcml2ZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVhZ2VybHkgcmVjb3ZlciB0aGUgbWFzdGVyIGtleSBmcm9tIEtNUyBzbyBzdWJzZXF1ZW50IGBkZXJpdmVLZXlgXG4gICAqIGNhbGxzIGFyZSBzeW5jLiBJZGVtcG90ZW50ICBjb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgdGhlIHNhbWUgaW4tXG4gICAqIGZsaWdodCBwcm9taXNlIHNvIHdlIGRvbid0IHNwYXduIG11bHRpcGxlIEtNUyBEZWNyeXB0IHJlcXVlc3RzIGF0XG4gICAqIGJvb3QuIFRocm93cyBvbiBhbnkgS01TIGZhaWx1cmU7IHRoZSBjYWxsZXIgKHR5cGljYWxseSB0aGUgc2VydmljZSdzXG4gICAqIG9uQmVmb3JlU3RhcnQgaG9vaykgZGVjaWRlcyB3aGV0aGVyIHRvIGZhbGwgYmFjayB0byBhIGRpZmZlcmVudFxuICAgKiBwcm92aWRlciBvciBmYWlsLXN0YXJ0dXAuXG4gICAqL1xuICBhc3luYyB3YXJtdXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubWFzdGVyS2V5Q2FjaGUpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuZGVjcnlwdEluRmxpZ2h0KSB7XG4gICAgICB0aGlzLmRlY3J5cHRJbkZsaWdodCA9IHRoaXMuZmV0Y2hBbmREZWNyeXB0KCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLm1hc3RlcktleUNhY2hlID0gYXdhaXQgdGhpcy5kZWNyeXB0SW5GbGlnaHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBBIHRyYW5zaWVudCBLTVMgZmFpbHVyZSBtdXN0IG5vdCBwZXJtYW5lbnRseSBwb2lzb24gdGhlIHByb3ZpZGVyOiBjbGVhclxuICAgICAgLy8gdGhlIHJlamVjdGVkIGluLWZsaWdodCBwcm9taXNlIHNvIGEgbGF0ZXIgd2FybXVwKCkgcmV0cmllcyBpbnN0ZWFkIG9mXG4gICAgICAvLyByZS1hd2FpdGluZyB0aGUgc2FtZSByZWplY3Rpb24gZm9yZXZlciAobWF0Y2hlcyBQZXJPcmdLbXNLZXlQcm92aWRlcikuXG4gICAgICB0aGlzLmRlY3J5cHRJbkZsaWdodCA9IG51bGw7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEFuZERlY3J5cHQoKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAvLyBEeW5hbWljIGltcG9ydCBzbyBFbnZLZXlQcm92aWRlci1vbmx5IGVudnMgZG9uJ3QgbG9hZCB0aGUgU0RLLlxuICAgIGNvbnN0IHsgS01TQ2xpZW50LCBEZWNyeXB0Q29tbWFuZCB9ID0gYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQta21zJyk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IEtNU0NsaWVudCh7XG4gICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgLi4uKHRoaXMuZW5kcG9pbnQgPyB7IGVuZHBvaW50OiB0aGlzLmVuZHBvaW50IH06IHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IERlY3J5cHRDb21tYW5kKHtcbiAgICAgIEtleUlkOiB0aGlzLmtleUlkLFxuICAgICAgQ2lwaGVydGV4dEJsb2I6IEJ1ZmZlci5mcm9tKHRoaXMuY2lwaGVydGV4dEI2NCwgJ2Jhc2U2NCcpLFxuICAgIH0pKTtcbiAgICBpZiAoIXJlc3AuUGxhaW50ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tNUyBEZWNyeXB0IHJldHVybmVkIGFuIGVtcHR5IFBsYWludGV4dCcpO1xuICAgIH1cbiAgICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShyZXNwLlBsYWludGV4dCk7XG4gICAgaWYgKGJ1Zi5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEtNUyBEZWNyeXB0IHJldHVybmVkICR7YnVmLmxlbmd0aH0tYnl0ZSBrZXk7IGV4cGVjdGVkIDMyYCk7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG4gIH1cbn1cblxuLy8gTGF6eSBzaW5nbGV0b24gIG9wZXJhdG9yIGNvZGUgaW4gbG9uZy1saXZlZCBzZXJ2aWNlcyBwYXlzIHRoZSBlbnYtcGFyc2Vcbi8vIGNvc3Qgb25jZSwgYW5kIHRlc3RzIGNhbiBtaW50IHRoZWlyIG93biBwcm92aWRlciB3aXRoIGEgbGl0ZXJhbCBrZXkuXG5sZXQgZGVmYXVsdFByb3ZpZGVyOiBLZXlQcm92aWRlciB8IG51bGwgPSBudWxsO1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFByb3ZpZGVyKCk6IEtleVByb3ZpZGVyIHtcbiAgaWYgKCFkZWZhdWx0UHJvdmlkZXIpIGRlZmF1bHRQcm92aWRlciA9IG5ldyBFbnZLZXlQcm92aWRlcigpO1xuICByZXR1cm4gZGVmYXVsdFByb3ZpZGVyO1xufVxuXG4vKiogUmVhZCB0aGUgYWN0aXZlIGRlZmF1bHQgcHJvdmlkZXIuIEV4cG9zZWQgc28gc2VydmljZSBjb2RlIChlLmcuIGFuXG4gKiAgYWRtaW4gZW5kcG9pbnQgdGhhdCBqdXN0IHJvdGF0ZWQgYW4gb3JnJ3MgS01TIGNvbmZpZykgY2FuIGNhbGxcbiAqICBgcHJvdmlkZXIuZXZpY3Qob3JnSWQpYCBvbiB0aGUgbGl2ZSBwcm92aWRlciByYXRoZXIgdGhhbiByZWNvbnN0cnVjdGluZ1xuICogIG9uZS4gVHJpZ2dlcnMgbGF6eSBpbml0aWFsaXphdGlvbiBvbiBmaXJzdCBhY2Nlc3MsIHNhbWUgYXMgdGhlIGludGVybmFsXG4gKiAgY2FsbGVycyBiZWxvdy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0S2V5UHJvdmlkZXIoKTogS2V5UHJvdmlkZXIge1xuICByZXR1cm4gZ2V0RGVmYXVsdFByb3ZpZGVyKCk7XG59XG5cbi8qKiBSZXNldCB0aGUgY2FjaGVkIGRlZmF1bHQgcHJvdmlkZXIgIGZvciB0ZXN0cyB0aGF0IG11dGF0ZSBgcHJvY2Vzcy5lbnZgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0RGVmYXVsdEtleVByb3ZpZGVyKCk6IHZvaWQgeyBkZWZhdWx0UHJvdmlkZXIgPSBudWxsOyB9XG5cbi8qKiBSZXBsYWNlIHRoZSBkZWZhdWx0IHByb3ZpZGVyICBzZXJ2aWNlcyB0aGF0IG9wdCBpbnRvIEtNUyBjYWxsIHRoaXNcbiAqIG9uY2UgYXQgc3RhcnR1cCB3aXRoIGEgd2FybWVkLXVwIGBLbXNLZXlQcm92aWRlcmAuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0S2V5UHJvdmlkZXIocHJvdmlkZXI6IEtleVByb3ZpZGVyKTogdm9pZCB7IGRlZmF1bHRQcm92aWRlciA9IHByb3ZpZGVyOyB9XG5cbi8qKiBQZXItb3JnIEtNUyBjb25maWcgdGhlIG9wZXJhdG9yIHN1cHBsaWVzLiBUaGUgYGtleUlkYCBpZGVudGlmaWVzIHRoZVxuICogIEtNUyBDTUsgdG8gY2FsbCBEZWNyeXB0IG9uOyBgY2lwaGVydGV4dEJhc2U2NGAgaXMgdGhlIHdyYXBwZWQgMzItYnl0ZVxuICogIG1hc3RlciBnZW5lcmF0ZWQgYnkgYGF3cyBrbXMgZW5jcnlwdGAgYWdhaW5zdCB0aGF0IGtleS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVyT3JnS21zQ29uZmlnIHtcbiAga2V5SWQ6IHN0cmluZztcbiAgY2lwaGVydGV4dEJhc2U2NDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFzeW5jIHJlc29sdmVyIHRoYXQgbWFwcyBhbiBvcmcgaWQgdG8gaXRzIEtNUyBjb25maWcuIFJldHVybnMgYG51bGxgIHdoZW5cbiAqIHRoZSBvcmcgaGFzIG5vIHBlci1vcmcgY29uZmlnIOKAlCB0aGUgcHJvdmlkZXIgdGhlbiBmYWxscyBiYWNrIHRvIHRoZVxuICogYGZhbGxiYWNrYCBwcm92aWRlciBzdXBwbGllZCBhdCBjb25zdHJ1Y3Rpb24gKHVzdWFsbHkgYW4gRW52S2V5UHJvdmlkZXJcbiAqIG9yIGEgZGVmYXVsdCBLbXNLZXlQcm92aWRlcikuXG4gKi9cbmV4cG9ydCB0eXBlIFBlck9yZ0ttc1Jlc29sdmVyID0gKG9yZ0lkOiBzdHJpbmcpID0+IFByb21pc2U8UGVyT3JnS21zQ29uZmlnIHwgbnVsbD47XG5cbi8qKlxuICogUGVyLW9yZyBLTVMtYmFja2VkIEtleVByb3ZpZGVyLiBUaGUgYmxhc3QgcmFkaXVzIG9mIGEgS01TIGtleSBjb21wcm9taXNlXG4gKiBpcyBvbmUgb3JnIGluc3RlYWQgb2YgZXZlcnkgb3JnIHVuZGVyIGEgc2hhcmVkIG1hc3Rlci5cbiAqXG4gKiBFYWNoIG9yZyBoYXMgaXRzIG93biBLTVMgQ01LICsgaXRzIG93biB3cmFwcGVkIG1hc3RlciAoc3RvcmVkIGluIE1vbmdvXG4gKiB2aWEgdGhlIG9wZXJhdG9yJ3Mgc2V0dXAgc2NyaXB0KS4gT24gZmlyc3QgZW5jcnlwdC9kZWNyeXB0IGZvciBhbiBvcmcsXG4gKiB0aGUgcHJvdmlkZXI6XG4gKiAgIDEuIENhbGxzIHRoZSByZXNvbHZlciB0byBmZXRjaCB0aGUgb3JnJ3MgS01TIGNvbmZpZy5cbiAqICAgMi4gQ2FsbHMgYGttczpEZWNyeXB0YCB0byByZWNvdmVyIHRoZSAzMi1ieXRlIG1hc3Rlci5cbiAqICAgMy4gQ2FjaGVzIHRoZSByZWNvdmVyZWQgbWFzdGVyIGluLW1lbW9yeSBmb3IgdGhlIHByb2Nlc3MgbGlmZXRpbWUuXG4gKiAgIDQuIEhLREYtZGVyaXZlcyBwZXItY2FsbCBmcm9tIHRoYXQgbWFzdGVyICsgdGhlIG9yZyBpZCBzYWx0LlxuICpcbiAqIEJsb2JzIGVuY3J5cHRlZCBieSB0aGlzIHByb3ZpZGVyIGNhcnJ5IGBraWQgPSA8a21zLWtleS1pZD5gIHNvIHRoZVxuICogZGVjcnlwdCBwYXRoIGRldGVjdHMgYSBzdGFsZSBjb25maWcgKG9wZXJhdG9yIHJvdGF0ZWQgdGhlIGtleSBidXRcbiAqIGV4aXN0aW5nIHJvd3Mgd2VyZW4ndCByZS1lbmNyeXB0ZWQpIEJFRk9SRSBBRVMtR0NNIHRocm93cyBhbiBvcGFxdWVcbiAqIGF1dGhlbnRpY2F0aW9uLXRhZyBlcnJvci5cbiAqXG4gKiBPcmdzIHdpdGhvdXQgcGVyLW9yZyBjb25maWcgZmFsbCB0aHJvdWdoIHRvIHRoZSBgZmFsbGJhY2tgIHByb3ZpZGVyIOKAlFxuICogbWl4ZWQtbW9kZSBkZXBsb3ltZW50cyB3aGVyZSBzb21lIG9yZ3MgaGF2ZSBLTVMgaXNvbGF0aW9uIGFuZCBvdGhlcnNcbiAqIHN0YXkgb24gdGhlIHNoYXJlZCBtYXN0ZXIgYXJlIGV4cGxpY2l0bHkgc3VwcG9ydGVkLlxuICovXG5leHBvcnQgY2xhc3MgUGVyT3JnS21zS2V5UHJvdmlkZXIgaW1wbGVtZW50cyBLZXlQcm92aWRlciB7XG4gIC8qKiBDYWNoZWQgcGVyLW9yZyBtYXN0ZXIga2V5cywga2V5ZWQgYnkgb3JnSWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFzdGVycyA9IG5ldyBNYXA8c3RyaW5nLCB7IGtleTogQnVmZmVyOyBraWQ6IHN0cmluZyB9PigpO1xuICAvKiogUmVzb2x2ZWQgcGVyLW9yZyBjb25maWdzIGNhY2hlZCBmb3IgdGhlIHByb2Nlc3MgbGlmZXRpbWUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlncyA9IG5ldyBNYXA8c3RyaW5nLCBQZXJPcmdLbXNDb25maWc+KCk7XG4gIC8qKiBJbi1mbGlnaHQgcmVzb2x2ZXIgcHJvbWlzZXMgc28gY29uY3VycmVudCBmaXJzdC10b3VjaCBjYWxsZXJzIHNoYXJlIG9uZSBLTVMgRGVjcnlwdC5cbiAgICogIFJlc29sdmVzIHRvIGBudWxsYCBmb3Igb3JncyB3aXRoIG5vIHBlci1vcmcgY29uZmlnIOKAlCBjYWxsZXIgdHJlYXRzIG51bGwgYXNcbiAgICogIFwiZmFsbCB0aHJvdWdoIHRvIHRoZSBmYWxsYmFjayBwcm92aWRlclwiLCBzYW1lIGFzIGEgY29sZCBjYWNoZSBtaXNzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGluRmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8eyBrZXk6IEJ1ZmZlcjsga2lkOiBzdHJpbmcgfSB8IG51bGw+PigpO1xuICAvKiogUHJvdmlkZXIgdXNlZCBmb3Igb3JncyB0aGF0IGhhdmUgbm8gcGVyLW9yZyBjb25maWcuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZmFsbGJhY2s6IEtleVByb3ZpZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVyOiBQZXJPcmdLbXNSZXNvbHZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0czoge1xuICAgIHJlc29sdmVyOiBQZXJPcmdLbXNSZXNvbHZlcjtcbiAgICBmYWxsYmFjazogS2V5UHJvdmlkZXI7XG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIGVuZHBvaW50Pzogc3RyaW5nO1xuICB9KSB7XG4gICAgdGhpcy5yZXNvbHZlciA9IG9wdHMucmVzb2x2ZXI7XG4gICAgdGhpcy5mYWxsYmFjayA9IG9wdHMuZmFsbGJhY2s7XG4gICAgdGhpcy5yZWdpb24gPSBvcHRzLnJlZ2lvbiA/PyBwcm9jZXNzLmVudi5BV1NfUkVHSU9OID8/IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTjtcbiAgICB0aGlzLmVuZHBvaW50ID0gb3B0cy5lbmRwb2ludCA/PyBwcm9jZXNzLmVudi5BV1NfS01TX0VORFBPSU5UO1xuICB9XG5cbiAgLyoqIFN5bmMgYGRlcml2ZUtleWAgb25seSB3b3JrcyBmb3IgYWxyZWFkeS13YXJtZWQgb3Jncy4gQ29sZCBvcmdzIGZhbGxcbiAgICogIHRocm91Z2ggdG8gdGhlIGZhbGxiYWNrIHByb3ZpZGVyLiBDYWxsZXJzIHRoYXQgd2FudCBwZXItb3JnIGlzb2xhdGlvblxuICAgKiAgTVVTVCBgYXdhaXQgZGVyaXZlS2V5QXN5bmMob3JnSWQpYCBvbmNlIGZpcnN0IChlLmcuIGR1cmluZyByZXF1ZXN0IHNldHVwXG4gICAqICBvciBhcyBwYXJ0IG9mIGEgd2FybXVwIHBhc3MpIOKAlCBvdGhlcndpc2UgdGhlIG9yZyBzaWxlbnRseSB1c2VzIHRoZVxuICAgKiAgc2hhcmVkIG1hc3Rlci4gKi9cbiAgZGVyaXZlS2V5KG9yZ0lkOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMubWFzdGVycy5nZXQob3JnSWQpO1xuICAgIGlmICghY2FjaGVkKSByZXR1cm4gdGhpcy5mYWxsYmFjay5kZXJpdmVLZXkob3JnSWQpO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBoa2RmU3luYygnc2hhMjU2JywgY2FjaGVkLmtleSwgQnVmZmVyLmZyb20ob3JnSWQsICd1dGY4JyksICdzZWNyZXRzLXYxJywgMzIpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShkZXJpdmVkKTtcbiAgfVxuXG4gIGFzeW5jIGRlcml2ZUtleUFzeW5jKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2FybWVkKG9yZ0lkKTtcbiAgICByZXR1cm4gdGhpcy5kZXJpdmVLZXkob3JnSWQpO1xuICB9XG5cbiAga2lkRm9yKG9yZ0lkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1hc3RlcnMuZ2V0KG9yZ0lkKT8ua2lkID8/IHRoaXMuZmFsbGJhY2sua2lkRm9yPy4ob3JnSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIG9yZydzIEtNUyBjb25maWcsIGNhbGwgRGVjcnlwdCwgY2FjaGUgdGhlIG1hc3Rlci4gU3Vic2VxdWVudFxuICAgKiBjYWxscyBmb3IgdGhlIHNhbWUgb3JnIGFyZSBuby1vcHMuIENvbmN1cnJlbnQgY2FsbGVycyBzaGFyZSB0aGUgaW4tZmxpZ2h0XG4gICAqIERlY3J5cHQgcHJvbWlzZS5cbiAgICpcbiAgICogUmV0dXJucyBzaWxlbnRseSB3aGVuIHRoZSBvcmcgaGFzIG5vIHBlci1vcmcgY29uZmlnIOKAlCB0aGUgZmFsbGJhY2tcbiAgICogcHJvdmlkZXIgaGFuZGxlcyB0aG9zZSBvcmdzLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlV2FybWVkKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tYXN0ZXJzLmhhcyhvcmdJZCkpIHJldHVybjtcbiAgICAvLyBJbnN0YWxsIHRoZSBpbi1mbGlnaHQgcHJvbWlzZSBTWU5DSFJPTk9VU0xZIGJlZm9yZSB5aWVsZGluZyBzbyBjb25jdXJyZW50XG4gICAgLy8gY2FsbGVycyBmaW5kIGl0IG9uIHRoZSBzZWNvbmQtYW5kLWxhdGVyIHBhc3Nlcy4gQXdhaXRpbmcgdGhlIHJlc29sdmVyXG4gICAgLy8gYmVmb3JlIHBvcHVsYXRpbmcgdGhlIG1hcCBpcyB0aGUgYnVnIHRoYXQgbGV0cyBhIFByb21pc2UuYWxsIG9mIDNcbiAgICAvLyBjYWxsZXJzIGZpcmUgMyBLTVMgRGVjcnlwdHMuXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLmluRmxpZ2h0LmdldChvcmdJZCk7XG4gICAgaWYgKCFwcm9taXNlKSB7XG4gICAgICBwcm9taXNlID0gdGhpcy5yZXNvbHZlQW5kRGVjcnlwdChvcmdJZCk7XG4gICAgICB0aGlzLmluRmxpZ2h0LnNldChvcmdJZCwgcHJvbWlzZSk7XG4gICAgICB2b2lkIHByb21pc2UuZmluYWxseSgoKSA9PiB7IGlmICh0aGlzLmluRmxpZ2h0LmdldChvcmdJZCkgPT09IHByb21pc2UpIHRoaXMuaW5GbGlnaHQuZGVsZXRlKG9yZ0lkKTsgfSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21pc2U7XG4gICAgaWYgKHJlc3VsdCkgdGhpcy5tYXN0ZXJzLnNldChvcmdJZCwgcmVzdWx0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZUFuZERlY3J5cHQob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8eyBrZXk6IEJ1ZmZlcjsga2lkOiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgICBsZXQgY2ZnID0gdGhpcy5jb25maWdzLmdldChvcmdJZCk7XG4gICAgaWYgKCFjZmcpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgdGhpcy5yZXNvbHZlcihvcmdJZCk7XG4gICAgICBpZiAoIXJlc29sdmVkKSByZXR1cm4gbnVsbDsgLy8gbm8gcGVyLW9yZyBjb25maWcg4oaSIGNhbGxlciB1c2VzIGZhbGxiYWNrXG4gICAgICBjZmcgPSByZXNvbHZlZDtcbiAgICAgIHRoaXMuY29uZmlncy5zZXQob3JnSWQsIGNmZyk7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMuZmV0Y2hBbmREZWNyeXB0KGNmZyk7XG4gICAgcmV0dXJuIHsga2V5LCBraWQ6IGNmZy5rZXlJZCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEFuZERlY3J5cHQoY2ZnOiBQZXJPcmdLbXNDb25maWcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IHsgS01TQ2xpZW50LCBEZWNyeXB0Q29tbWFuZCB9ID0gYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQta21zJyk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IEtNU0NsaWVudCh7XG4gICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgLi4uKHRoaXMuZW5kcG9pbnQgPyB7IGVuZHBvaW50OiB0aGlzLmVuZHBvaW50IH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBEZWNyeXB0Q29tbWFuZCh7XG4gICAgICBLZXlJZDogY2ZnLmtleUlkLFxuICAgICAgQ2lwaGVydGV4dEJsb2I6IEJ1ZmZlci5mcm9tKGNmZy5jaXBoZXJ0ZXh0QmFzZTY0LCAnYmFzZTY0JyksXG4gICAgfSkpO1xuICAgIGlmICghcmVzcC5QbGFpbnRleHQpIHRocm93IG5ldyBFcnJvcihgS01TIERlY3J5cHQgcmV0dXJuZWQgZW1wdHkgUGxhaW50ZXh0IGZvciBrZXkgJHtjZmcua2V5SWR9YCk7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20ocmVzcC5QbGFpbnRleHQpO1xuICAgIGlmIChidWYubGVuZ3RoICE9PSAzMikgdGhyb3cgbmV3IEVycm9yKGBLTVMgRGVjcnlwdCByZXR1cm5lZCAke2J1Zi5sZW5ndGh9LWJ5dGUga2V5IGZvciAke2NmZy5rZXlJZH07IGV4cGVjdGVkIDMyYCk7XG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIC8qKiBFdmljdCBhIGNhY2hlZCBwZXItb3JnIG1hc3Rlci4gVXNlIGFmdGVyIGEga2V5IHJvdGF0aW9uIHNvIHRoZSBuZXh0XG4gICAqICB0b3VjaCByZS1mZXRjaGVzIHRoZSBuZXcgd3JhcHBlZCBtYXN0ZXIgZnJvbSB0aGUgcmVzb2x2ZXIuICovXG4gIGV2aWN0KG9yZ0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hc3RlcnMuZGVsZXRlKG9yZ0lkKTtcbiAgICB0aGlzLmNvbmZpZ3MuZGVsZXRlKG9yZ0lkKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuY3J5cHQgYSBwbGFpbnRleHQgc3RyaW5nIGZvciBzdG9yYWdlLiBSZXR1cm5zIGFuIGBFbmNyeXB0ZWRCbG9iYCB0aGF0XG4gKiBjYW4gYmUgSlNPTi1zZXJpYWxpemVkIGludG8gdGhlIHVuZGVybHlpbmcgY29sdW1uIC8gTW9uZ28gZG9jdW1lbnQuXG4gKlxuICogRW1wdHkgc3RyaW5ncyByb3VuZC10cmlwIGFzIGBudWxsYCBzbyB0aGUgY2FsbGluZyBtb2RlbCBsYXllciBjYW4gdHJlYXRcbiAqIFwibm8gc2VjcmV0IHNldFwiIGlkZW50aWNhbGx5IHRvIFwiZmllbGQgYWJzZW50XCIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNyeXB0U2VjcmV0KCBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcHJvdmlkZXI6IEtleVByb3ZpZGVyID0gZ2V0RGVmYXVsdFByb3ZpZGVyKCksXG4pOiBFbmNyeXB0ZWRCbG9iIHtcbiAgaWYgKCFwbGFpbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZnVzaW5nIHRvIGVuY3J5cHQgZW1wdHkgc3RyaW5nOyBjYWxsZXIgc2hvdWxkIHN0b3JlIG51bGwgaW5zdGVhZCcpO1xuICB9XG4gIGNvbnN0IGtleSA9IHByb3ZpZGVyLmRlcml2ZUtleShvcmdJZCk7XG4gIGNvbnN0IGl2ID0gcmFuZG9tQnl0ZXMoMTIpO1xuICBjb25zdCBjaXBoZXIgPSBjcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1nY20nLCBrZXksIGl2KTtcbiAgY29uc3QgZW5jID0gQnVmZmVyLmNvbmNhdChbY2lwaGVyLnVwZGF0ZShwbGFpbnRleHQsICd1dGY4JyksIGNpcGhlci5maW5hbCgpXSk7XG4gIGNvbnN0IHRhZyA9IGNpcGhlci5nZXRBdXRoVGFnKCk7XG4gIC8vIFBlck9yZ0ttc0tleVByb3ZpZGVyIHRhZ3MgYmxvYnMgd2l0aCB0aGUgS01TIGtleSBpZCB1c2VkIHNvIHRoZVxuICAvLyBkZWNyeXB0IHBhdGggY2FuIHJlZnVzZSB0byBvcGVyYXRlIGlmIHRoZSBvcGVyYXRvciBsYXRlciBzd2FwcyBpbiBhXG4gIC8vIGRpZmZlcmVudCBwZXItb3JnIGNvbmZpZyAoYSBtaXNjb25maWd1cmVkIHN3YXAgc2hvdWxkbid0IHNpbGVudGx5XG4gIC8vIGFjY2VwdCBhIHN0YWxlIGJsb2IgaXQgY2FuJ3QgdmVyaWZ5IGFnYWluc3QgdGhlIHJpZ2h0IENNSykuXG4gIGNvbnN0IGtpZCA9IHByb3ZpZGVyLmtpZEZvcj8uKG9yZ0lkKTtcbiAgcmV0dXJuIHtcbiAgICBhbGc6ICdhZXMtMjU2LWdjbS12MScsXG4gICAgaXY6IGl2LnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAvLyBHQ00gdGFnIE1VU1QgdHJhdmVsIHdpdGggdGhlIGNpcGhlcnRleHQgb3IgYGRlY3J5cHRTZWNyZXRgIGNhbid0XG4gICAgLy8gdmVyaWZ5IGludGVncml0eSAgY29uY2F0ZW5hdGUgc28gdGhlIG9uLWRpc2sgc2hhcGUgaXMgb25lIGZpZWxkLlxuICAgIGNpcGhlcnRleHQ6IEJ1ZmZlci5jb25jYXQoW2VuYywgdGFnXSkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIC4uLihraWQgIT09IHVuZGVmaW5lZCA/IHsga2lkIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogRGVjcnlwdCBhbiBgRW5jcnlwdGVkQmxvYmAgd3JpdHRlbiBieSBgZW5jcnlwdFNlY3JldGAuIFRocm93cyBvbiAqIC0gdW5rbm93biBgYWxnYCAoZm9yY2VzIGFuIGV4cGxpY2l0IG1pZ3JhdGlvbiB3aGVuIHRoZSBmb3JtYXQgY2hhbmdlcylcbiAqIC0gd3Jvbmcgb3JnSWQgKEhLREYgYmluZGluZyBtaXNtYXRjaCBmYWlscyB0aGUgYXV0aCB0YWcpXG4gKiAtIHRhbXBlcmVkIGNpcGhlcnRleHQgKEdDTSBhdXRoIHRhZyBjaGVjayBmYWlscylcbiAqXG4gKiBDYWxsZXJzIGhhbmRsZSB0aGUgdGhyb3cgIG1hc2tpbmcgdGhlIGZhaWx1cmUgYXMgYG51bGxgIHdvdWxkIGhpZGVcbiAqIHNpbGVudCBjb3JydXB0aW9uIC8gd3Jvbmctb3JnIHJlYWRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjcnlwdFNlY3JldCggYmxvYjogRW5jcnlwdGVkQmxvYixcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcHJvdmlkZXI6IEtleVByb3ZpZGVyID0gZ2V0RGVmYXVsdFByb3ZpZGVyKCksXG4pOiBzdHJpbmcge1xuICBpZiAoYmxvYi5hbGcgIT09ICdhZXMtMjU2LWdjbS12MScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGVuY3J5cHRpb24gYWxnOiAke2Jsb2IuYWxnfWApO1xuICB9XG4gIC8vIElmIGJvdGggdGhlIHByb3ZpZGVyIEFORCB0aGUgYmxvYiByZXBvcnQgYSBraWQsIHRoZXkgbXVzdCBtYXRjaC5cbiAgLy8gTWlzbWF0Y2ggdXN1YWxseSBtZWFucyBhbiBvcGVyYXRvciByb3RhdGVkL3JlcGxhY2VkIGFuIG9yZydzIEtNU1xuICAvLyBjb25maWcgYW5kIGlzIG5vdyByZWFkaW5nIGEgYmxvYiBlbmNyeXB0ZWQgdW5kZXIgdGhlIE9MRCBrZXkg4oCUXG4gIC8vIGZhaWxpbmcgbG91ZCBoZXJlIGJlYXRzIGxldHRpbmcgQUVTLUdDTSB0aHJvdyBhbiBvcGFxdWUgYXV0aC10YWcgZXJyb3IuXG4gIGNvbnN0IHByb3ZpZGVyS2lkID0gcHJvdmlkZXIua2lkRm9yPy4ob3JnSWQpO1xuICBpZiAocHJvdmlkZXJLaWQgIT09IHVuZGVmaW5lZCAmJiBibG9iLmtpZCAhPT0gdW5kZWZpbmVkICYmIHByb3ZpZGVyS2lkICE9PSBibG9iLmtpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgS01TIGtleSBpZCBtaXNtYXRjaDogYmxvYiB3YXMgZW5jcnlwdGVkIHVuZGVyICR7YmxvYi5raWR9LCBjdXJyZW50IHByb3ZpZGVyIHVzZXMgJHtwcm92aWRlcktpZH0gZm9yIG9yZyAke29yZ0lkfWApO1xuICB9XG4gIGNvbnN0IGtleSA9IHByb3ZpZGVyLmRlcml2ZUtleShvcmdJZCk7XG4gIGNvbnN0IGl2ID0gQnVmZmVyLmZyb20oYmxvYi5pdiwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhbGwgPSBCdWZmZXIuZnJvbShibG9iLmNpcGhlcnRleHQsICdiYXNlNjQnKTtcbiAgLy8gU3BsaXQgb2ZmIHRoZSAxNi1ieXRlIGF1dGggdGFnIGFwcGVuZGVkIGluIGVuY3J5cHRTZWNyZXQuIEFueSB0YW1wZXJpbmdcbiAgLy8gIHRvIGVpdGhlciB0aGUgY2lwaGVydGV4dCBPUiB0aGUgdGFnICBjYXVzZXMgdGhlIG5leHQgYGZpbmFsKClgIHRvXG4gIC8vIHRocm93IHdpdGggXCJVbnN1cHBvcnRlZCBzdGF0ZSBvciB1bmFibGUgdG8gYXV0aGVudGljYXRlIGRhdGFcIi5cbiAgY29uc3QgdGFnID0gYWxsLnN1YmFycmF5KGFsbC5sZW5ndGggLSAxNik7XG4gIGNvbnN0IGVuYyA9IGFsbC5zdWJhcnJheSgwLCBhbGwubGVuZ3RoIC0gMTYpO1xuICBjb25zdCBkZWNpcGhlciA9IGNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0yNTYtZ2NtJywga2V5LCBpdik7XG4gIGRlY2lwaGVyLnNldEF1dGhUYWcodGFnKTtcbiAgY29uc3QgZGVjID0gQnVmZmVyLmNvbmNhdChbZGVjaXBoZXIudXBkYXRlKGVuYyksIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgcmV0dXJuIGRlYy50b1N0cmluZygndXRmOCcpO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgIGhhbmR5IGZvciBtb2RlbCBsYXllcnMgdGhhdCBob2xkIGEgY29sdW1uIHdob3NlIHZhbHVlIG1heSBiZVxuICogZWl0aGVyIGEgY2xlYXItdGV4dCBzdHJpbmcgKGxlZ2FjeSAvIHVuZW5jcnlwdGVkKSBPUiBhbiBlbmNyeXB0ZWQgYmxvYlxuICogKHBvc3QtbWlncmF0aW9uKS4gTWl4ZWQgc3RhdGVzIGFyaXNlIG1pZC1taWdyYXRpb247IHRoZSBtb2RlbCBkZWNpZGVzXG4gKiB3aGF0IHRvIGRvIChkZWNyeXB0IG9uIHJlYWQsIGVuY3J5cHQgb24gbmV4dCB3cml0ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VuY3J5cHRlZEJsb2IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFbmNyeXB0ZWRCbG9iIHtcbiAgcmV0dXJuICggdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgKHZhbHVlIGFzIHsgYWxnPzogdW5rbm93biB9KS5hbGcgPT09ICdhZXMtMjU2LWdjbS12MSdcbiAgICAmJiB0eXBlb2YgKHZhbHVlIGFzIHsgaXY/OiB1bmtub3duIH0pLml2ID09PSAnc3RyaW5nJ1xuICAgICYmIHR5cGVvZiAodmFsdWUgYXMgeyBjaXBoZXJ0ZXh0PzogdW5rbm93biB9KS5jaXBoZXJ0ZXh0ID09PSAnc3RyaW5nJ1xuICApO1xufVxuIl19
package/package.json CHANGED
@@ -85,7 +85,7 @@
85
85
  "access": "public",
86
86
  "registry": "https://registry.npmjs.org/"
87
87
  },
88
- "version": "3.4.81",
88
+ "version": "3.4.83",
89
89
  "bugs": {
90
90
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
91
91
  },