@nlabs/reaktor 1.6.3 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +74 -201
- package/README.md +48 -16
- package/lib/actions/analytics.d.ts +10 -0
- package/lib/actions/analytics.js +539 -0
- package/lib/actions/apps.js +2 -2
- package/lib/actions/connections.js +1 -1
- package/lib/actions/content.js +2 -2
- package/lib/actions/conversations.js +2 -2
- package/lib/actions/crm.d.ts +5 -1
- package/lib/actions/crm.js +226 -3
- package/lib/actions/crud.js +2 -2
- package/lib/actions/dynamodb.d.ts +1 -1
- package/lib/actions/dynamodb.js +2 -2
- package/lib/actions/email.d.ts +1 -1
- package/lib/actions/email.js +2 -2
- package/lib/actions/files.js +2 -2
- package/lib/actions/flags.d.ts +6 -0
- package/lib/actions/flags.js +147 -0
- package/lib/actions/groups.js +2 -2
- package/lib/actions/images.d.ts +1 -1
- package/lib/actions/images.js +2 -2
- package/lib/actions/index.d.ts +3 -2
- package/lib/actions/index.js +4 -3
- package/lib/actions/ios.js +1 -1
- package/lib/actions/locations.js +2 -2
- package/lib/actions/messages.js +2 -2
- package/lib/actions/notifications.d.ts +1 -1
- package/lib/actions/notifications.js +2 -2
- package/lib/actions/payments.d.ts +3 -3
- package/lib/actions/payments.js +144 -189
- package/lib/actions/personas.js +1 -1
- package/lib/actions/posts.d.ts +0 -4
- package/lib/actions/posts.js +2 -4
- package/lib/actions/query.js +2 -2
- package/lib/actions/reactions.js +2 -2
- package/lib/actions/rum.js +143 -45
- package/lib/actions/s3.d.ts +1 -1
- package/lib/actions/s3.js +2 -2
- package/lib/actions/search.js +2 -2
- package/lib/actions/sms.js +2 -2
- package/lib/actions/statistics.js +2 -2
- package/lib/actions/subscriptions.js +2 -2
- package/lib/actions/tags.js +2 -2
- package/lib/actions/users.js +59 -6
- package/lib/actions/videos.js +2 -2
- package/lib/adapters/arangoAdapter.js +1 -1
- package/lib/adapters/contentAdapter.js +2 -2
- package/lib/adapters/fileAdapter.js +1 -1
- package/lib/adapters/imageAdapter.js +1 -1
- package/lib/adapters/index.js +1 -1
- package/lib/adapters/messageAdapter.js +1 -1
- package/lib/adapters/postAdapter.js +1 -1
- package/lib/adapters/reaktorAdapter.js +1 -1
- package/lib/adapters/tagAdapter.d.ts +0 -1
- package/lib/adapters/tagAdapter.js +1 -2
- package/lib/adapters/userAdapter.d.ts +0 -1
- package/lib/adapters/userAdapter.js +1 -2
- package/lib/config.js +8 -2
- package/lib/constants/collections.d.ts +5 -1
- package/lib/constants/collections.js +6 -2
- package/lib/handlers/graphqlHandler.d.ts +2 -2
- package/lib/handlers/graphqlHandler.js +2 -19
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/lambdas/actions/websockets.js +2 -2
- package/lib/lambdas/authorizer.js +2 -2
- package/lib/lambdas/connection.js +2 -2
- package/lib/lambdas/utils/message.js +2 -2
- package/lib/lambdas/utils/websocket.d.ts +1 -1
- package/lib/lambdas/utils/websocket.js +2 -2
- package/lib/mocks/conversation.js +1 -1
- package/lib/mocks/file.js +1 -1
- package/lib/mocks/group.js +1 -1
- package/lib/mocks/image.js +1 -1
- package/lib/mocks/post.js +1 -1
- package/lib/mocks/tag.js +1 -1
- package/lib/mocks/user.js +1 -1
- package/lib/mocks/video.js +1 -1
- package/lib/mutations/analytics/analytics.d.ts +1 -0
- package/lib/mutations/analytics/analytics.js +35 -0
- package/lib/mutations/content/content.js +2 -2
- package/lib/mutations/crm/crm.js +18 -4
- package/lib/mutations/events/events.js +2 -2
- package/lib/mutations/flags/flags.d.ts +1 -0
- package/lib/mutations/flags/flags.js +33 -0
- package/lib/mutations/groups/groups.js +2 -2
- package/lib/mutations/images/images.js +2 -2
- package/lib/mutations/index.d.ts +3 -1
- package/lib/mutations/index.js +13 -3
- package/lib/mutations/locations/locations.js +2 -2
- package/lib/mutations/messages/messages.js +2 -2
- package/lib/mutations/personas/personas.js +2 -2
- package/lib/mutations/posts/posts.js +2 -2
- package/lib/mutations/reactions/reactions.js +2 -2
- package/lib/mutations/rum/rum.js +2 -2
- package/lib/mutations/statistics/statistics.js +2 -2
- package/lib/mutations/subscriptions/subscriptions.js +2 -2
- package/lib/mutations/tags/tags.js +2 -2
- package/lib/mutations/users/users.js +30 -17
- package/lib/mutations/videos/videos.js +2 -2
- package/lib/objectTypes/analytics.d.ts +8 -0
- package/lib/objectTypes/analytics.js +147 -0
- package/lib/objectTypes/app.js +2 -2
- package/lib/objectTypes/bankAccount.js +2 -2
- package/lib/objectTypes/connection.js +2 -2
- package/lib/objectTypes/content.js +2 -2
- package/lib/objectTypes/conversation.js +2 -2
- package/lib/objectTypes/creditCard.js +2 -2
- package/lib/objectTypes/crm.d.ts +5 -0
- package/lib/objectTypes/crm.js +64 -2
- package/lib/objectTypes/document.js +1 -1
- package/lib/objectTypes/error.js +2 -2
- package/lib/objectTypes/event.js +2 -2
- package/lib/objectTypes/external.js +2 -2
- package/lib/objectTypes/file.js +2 -2
- package/lib/objectTypes/filter.js +2 -2
- package/lib/objectTypes/flag.d.ts +1 -0
- package/lib/objectTypes/flag.js +32 -0
- package/lib/objectTypes/group.js +2 -2
- package/lib/objectTypes/iapSubscription.js +2 -2
- package/lib/objectTypes/image.d.ts +1 -1
- package/lib/objectTypes/image.js +2 -2
- package/lib/objectTypes/index.d.ts +2 -0
- package/lib/objectTypes/index.js +3 -1
- package/lib/objectTypes/location.js +2 -2
- package/lib/objectTypes/message.js +2 -2
- package/lib/objectTypes/passcode.js +2 -2
- package/lib/objectTypes/persona.js +2 -2
- package/lib/objectTypes/plan.js +2 -2
- package/lib/objectTypes/post.js +2 -2
- package/lib/objectTypes/query.js +2 -2
- package/lib/objectTypes/reaction.js +2 -2
- package/lib/objectTypes/relation.js +2 -2
- package/lib/objectTypes/rum.js +4 -4
- package/lib/objectTypes/search.js +2 -2
- package/lib/objectTypes/statistics.js +2 -2
- package/lib/objectTypes/subscription.js +2 -2
- package/lib/objectTypes/tag.js +2 -2
- package/lib/objectTypes/user.js +2 -2
- package/lib/objectTypes/video.d.ts +1 -1
- package/lib/objectTypes/video.js +2 -2
- package/lib/queries/analytics/analytics.d.ts +1 -0
- package/lib/queries/analytics/analytics.js +41 -0
- package/lib/queries/content/content.js +2 -2
- package/lib/queries/crm/crm.js +15 -4
- package/lib/queries/events/events.js +2 -2
- package/lib/queries/flags/flags.d.ts +1 -0
- package/lib/queries/flags/flags.js +16 -0
- package/lib/queries/groups/groups.js +2 -2
- package/lib/queries/images/images.js +2 -2
- package/lib/queries/index.d.ts +3 -1
- package/lib/queries/index.js +13 -3
- package/lib/queries/locations/locations.js +2 -2
- package/lib/queries/messages/messages.js +1 -1
- package/lib/queries/personas/personas.js +2 -2
- package/lib/queries/posts/posts.js +2 -2
- package/lib/queries/query/query.js +2 -2
- package/lib/queries/reactions/reactions.js +2 -2
- package/lib/queries/statistics/statistics.js +2 -2
- package/lib/queries/subscriptions/subscriptions.js +1 -1
- package/lib/queries/tags/tags.js +2 -2
- package/lib/queries/users/users.js +2 -2
- package/lib/queries/videos/videos.js +2 -2
- package/lib/templates/email/layout.js +1 -1
- package/lib/templates/email/passwordForgot.js +1 -1
- package/lib/templates/email/passwordRecovery.js +1 -1
- package/lib/templates/email/verifyEmail.js +1 -1
- package/lib/templates/email/welcome.js +1 -1
- package/lib/templates/sms/passwordForgot.js +1 -1
- package/lib/templates/sms/passwordRecovery.js +1 -1
- package/lib/templates/sms/verifyEmail.js +1 -1
- package/lib/templates/sms/verifyPhone.js +1 -1
- package/lib/templates/sms/welcome.js +1 -1
- package/lib/types/analytics.types.d.ts +92 -0
- package/lib/types/analytics.types.js +6 -0
- package/lib/types/apps.types.d.ts +1 -1
- package/lib/types/apps.types.js +2 -2
- package/lib/types/arangodb.types.d.ts +2 -2
- package/lib/types/arangodb.types.js +2 -2
- package/lib/types/auth.types.d.ts +3 -1
- package/lib/types/auth.types.js +2 -2
- package/lib/types/connections.types.d.ts +1 -1
- package/lib/types/connections.types.js +2 -2
- package/lib/types/content.types.d.ts +1 -1
- package/lib/types/content.types.js +2 -2
- package/lib/types/conversations.types.d.ts +1 -1
- package/lib/types/conversations.types.js +2 -2
- package/lib/types/crm.types.d.ts +38 -1
- package/lib/types/crm.types.js +2 -2
- package/lib/types/email.types.d.ts +1 -1
- package/lib/types/email.types.js +2 -2
- package/lib/types/error.types.js +1 -1
- package/lib/types/files.types.d.ts +1 -1
- package/lib/types/files.types.js +2 -2
- package/lib/types/flags.types.d.ts +28 -0
- package/lib/types/flags.types.js +3 -0
- package/lib/types/google.types.d.ts +1 -1
- package/lib/types/google.types.js +2 -2
- package/lib/types/groups.types.d.ts +1 -1
- package/lib/types/groups.types.js +2 -2
- package/lib/types/images.types.d.ts +1 -1
- package/lib/types/images.types.js +2 -2
- package/lib/types/index.d.ts +3 -1
- package/lib/types/index.js +4 -2
- package/lib/types/locations.types.d.ts +1 -1
- package/lib/types/locations.types.js +2 -2
- package/lib/types/messages.types.d.ts +1 -1
- package/lib/types/messages.types.js +2 -2
- package/lib/types/notifications.types.d.ts +1 -1
- package/lib/types/notifications.types.js +2 -2
- package/lib/types/payments.types.d.ts +4 -1
- package/lib/types/payments.types.js +2 -2
- package/lib/types/personas.types.js +1 -1
- package/lib/types/posts.types.d.ts +1 -1
- package/lib/types/posts.types.js +2 -2
- package/lib/types/rum.types.d.ts +3 -3
- package/lib/types/rum.types.js +2 -2
- package/lib/types/statistics.types.js +1 -1
- package/lib/types/tags.types.d.ts +1 -1
- package/lib/types/tags.types.js +2 -2
- package/lib/types/users.types.d.ts +1 -1
- package/lib/types/users.types.js +2 -2
- package/lib/types/videos.types.d.ts +1 -1
- package/lib/types/videos.types.js +2 -2
- package/lib/types/websockets.types.d.ts +1 -1
- package/lib/types/websockets.types.js +2 -2
- package/lib/upload.js +4 -9
- package/lib/utils/adapterUtils.d.ts +1 -1
- package/lib/utils/adapterUtils.js +2 -2
- package/lib/utils/analyticsUtils.d.ts +1 -1
- package/lib/utils/analyticsUtils.js +2 -2
- package/lib/utils/aqlHelpers.d.ts +1 -1
- package/lib/utils/aqlHelpers.js +2 -2
- package/lib/utils/arangodbUtils.d.ts +9 -1
- package/lib/utils/arangodbUtils.js +10 -2
- package/lib/utils/authUtils.js +2 -2
- package/lib/utils/awsUtils.js +2 -2
- package/lib/utils/collectionRegistry.d.ts +1 -1
- package/lib/utils/collectionRegistry.js +17 -2
- package/lib/utils/contextUtils.d.ts +2 -2
- package/lib/utils/contextUtils.js +2 -2
- package/lib/utils/dbI18n.example.d.ts +1 -1
- package/lib/utils/dbI18n.example.js +2 -2
- package/lib/utils/dbI18n.js +2 -2
- package/lib/utils/googleTranslate.d.ts +1 -1
- package/lib/utils/googleTranslate.js +2 -2
- package/lib/utils/graphqlUtils.d.ts +1 -0
- package/lib/utils/graphqlUtils.js +1 -1
- package/lib/utils/imageUtils.js +1 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/languageDetection.js +1 -1
- package/lib/utils/localeUtils.d.ts +1 -1
- package/lib/utils/localeUtils.example.d.ts +1 -1
- package/lib/utils/localeUtils.example.js +2 -2
- package/lib/utils/localeUtils.js +2 -2
- package/lib/utils/middlewareUtils.js +1 -1
- package/lib/utils/queryBuilder.d.ts +1 -1
- package/lib/utils/queryBuilder.js +2 -2
- package/lib/utils/schemaUtils.js +1 -1
- package/lib/utils/sessionUtils.js +2 -2
- package/lib/utils/stripeUtils.d.ts +1 -1
- package/lib/utils/stripeUtils.js +2 -2
- package/lib/utils/templateUtils.js +1 -1
- package/lib/utils/testUtils.js +2 -2
- package/lib/utils/translationQueue.d.ts +1 -1
- package/lib/utils/translationQueue.example.d.ts +1 -1
- package/lib/utils/translationQueue.example.js +2 -2
- package/lib/utils/translationQueue.js +2 -2
- package/lib/videoProcessing.js +1 -1
- package/package.json +43 -80
- package/lib/actions/websockets.d.ts +0 -20
- package/lib/actions/websockets.js +0 -164
- package/lib/mocks/nlabs.png +0 -0
package/lib/actions/payments.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright (c) 2019-Present, Nitrogen Labs, Inc.
|
|
3
|
-
*
|
|
3
|
+
* All rights reserved. Use is subject to the accompanying commercial LICENSE.
|
|
4
4
|
*/ import { parseNum } from '@nlabs/utils/parsers/numbers';
|
|
5
|
-
import {
|
|
5
|
+
import { parseChar, parseId, parseString, parseVarChar } from '@nlabs/utils/parsers/strings';
|
|
6
6
|
import { aql } from 'arangojs';
|
|
7
7
|
import { ErrorTypes } from '../types/error.types.js';
|
|
8
8
|
import { logError, UserError } from '../utils/analyticsUtils.js';
|
|
@@ -106,122 +106,6 @@ export const addBankAccount = (context, bankAccount)=>{
|
|
|
106
106
|
});
|
|
107
107
|
});
|
|
108
108
|
};
|
|
109
|
-
export const addCreditCard = (context, card)=>{
|
|
110
|
-
const action = 'addCreditCard';
|
|
111
|
-
const { databaseName, session: { userId: sessionId } } = context;
|
|
112
|
-
return getUserById(context, {
|
|
113
|
-
userId: sessionId
|
|
114
|
-
}).then((user)=>{
|
|
115
|
-
// User
|
|
116
|
-
const { stripeAccountId } = user;
|
|
117
|
-
// Card
|
|
118
|
-
const { accountNumber, city, country, cvc, expMonth, expYear, fullName, street1, street2, state, zip } = card;
|
|
119
|
-
const formatNumber = parseNum(accountNumber, 16);
|
|
120
|
-
if (!formatNumber) {
|
|
121
|
-
throw new UserError('required_credit_card_number');
|
|
122
|
-
}
|
|
123
|
-
const formatExpMonth = parseNum(expMonth, 2);
|
|
124
|
-
if (!formatExpMonth) {
|
|
125
|
-
throw new UserError('required_credit_card_exp_month');
|
|
126
|
-
}
|
|
127
|
-
const formatExpYear = parseNum(expYear, 2);
|
|
128
|
-
if (!formatExpYear) {
|
|
129
|
-
throw new UserError('required_credit_card_exp_year');
|
|
130
|
-
}
|
|
131
|
-
const formatCvc = parseNum(cvc, 3);
|
|
132
|
-
// Address
|
|
133
|
-
const paymentCard = {};
|
|
134
|
-
const formatCity = parseVarChar(city, 32);
|
|
135
|
-
if (formatCity) {
|
|
136
|
-
paymentCard.city = formatCity;
|
|
137
|
-
}
|
|
138
|
-
const formatCountry = parseChar(country, 2);
|
|
139
|
-
if (formatCountry) {
|
|
140
|
-
paymentCard.country = formatCountry;
|
|
141
|
-
}
|
|
142
|
-
const formatFullName = parseVarChar(fullName, 32);
|
|
143
|
-
if (formatFullName) {
|
|
144
|
-
paymentCard.fullName = formatFullName;
|
|
145
|
-
}
|
|
146
|
-
const formatStreet1 = parseVarChar(street1, 32);
|
|
147
|
-
if (formatStreet1) {
|
|
148
|
-
paymentCard.street1 = formatStreet1;
|
|
149
|
-
}
|
|
150
|
-
const formatStreet2 = parseVarChar(street2, 32);
|
|
151
|
-
if (formatStreet2) {
|
|
152
|
-
paymentCard.street2 = formatStreet2;
|
|
153
|
-
}
|
|
154
|
-
const formatState = parseChar(state, 2);
|
|
155
|
-
if (formatState) {
|
|
156
|
-
paymentCard.state = formatState;
|
|
157
|
-
}
|
|
158
|
-
const formatZip = parseVarChar(zip, 10);
|
|
159
|
-
if (formatZip) {
|
|
160
|
-
paymentCard.zip = formatZip;
|
|
161
|
-
}
|
|
162
|
-
const stripeClient = getStripeClient();
|
|
163
|
-
// Create a token first, then use the token as the source
|
|
164
|
-
return stripeClient.tokens.create({
|
|
165
|
-
card: {
|
|
166
|
-
address_city: formatCity,
|
|
167
|
-
address_country: formatCountry,
|
|
168
|
-
address_line1: formatStreet1,
|
|
169
|
-
address_line2: formatStreet2,
|
|
170
|
-
address_state: formatState,
|
|
171
|
-
address_zip: formatZip,
|
|
172
|
-
cvc: formatCvc.toString(),
|
|
173
|
-
exp_month: formatExpMonth.toString(),
|
|
174
|
-
exp_year: formatExpYear.toString(),
|
|
175
|
-
name: fullName,
|
|
176
|
-
number: formatNumber.toString()
|
|
177
|
-
}
|
|
178
|
-
}).then((token)=>stripeClient.customers.createSource(stripeAccountId, {
|
|
179
|
-
source: token.id
|
|
180
|
-
})).then((newSource)=>{
|
|
181
|
-
// Use type assertion for card properties
|
|
182
|
-
const cardSource = newSource;
|
|
183
|
-
const brand = cardSource.brand || '';
|
|
184
|
-
const cvcCheck = cardSource.cvc_check || '';
|
|
185
|
-
const last4 = cardSource.last4 || '';
|
|
186
|
-
// Create session
|
|
187
|
-
const now = Date.now();
|
|
188
|
-
const insert = {
|
|
189
|
-
...paymentCard,
|
|
190
|
-
_key: createHash(`user-payment-${sessionId}`),
|
|
191
|
-
accountNumber: last4,
|
|
192
|
-
added: now,
|
|
193
|
-
brand,
|
|
194
|
-
cvcCheck,
|
|
195
|
-
expMonth,
|
|
196
|
-
expYear,
|
|
197
|
-
modified: now,
|
|
198
|
-
userId: sessionId
|
|
199
|
-
};
|
|
200
|
-
const insertAqlQry = aql`INSERT ${insert} IN creditCards RETURN NEW`;
|
|
201
|
-
return useDb(databaseName).query(insertAqlQry).then((cursor)=>cursor.next()).then((newCard)=>{
|
|
202
|
-
if (newCard) {
|
|
203
|
-
// Add linked edge
|
|
204
|
-
const { _id: cardId, _key: cardKey } = card;
|
|
205
|
-
const edgeCollection = useDb(databaseName).collection('hasPayment');
|
|
206
|
-
const edgeId = createHash(`payment-${cardKey}`);
|
|
207
|
-
const edge = {
|
|
208
|
-
_from: `users/${sessionId}`,
|
|
209
|
-
_key: edgeId,
|
|
210
|
-
_to: cardId
|
|
211
|
-
};
|
|
212
|
-
return edgeCollection.save(edge, {
|
|
213
|
-
returnNew: true
|
|
214
|
-
}).then(()=>card);
|
|
215
|
-
}
|
|
216
|
-
return newCard;
|
|
217
|
-
}).catch((error)=>logError({
|
|
218
|
-
action,
|
|
219
|
-
category: eventCategory,
|
|
220
|
-
label: 'payment_error'
|
|
221
|
-
}, error, context).then(()=>null));
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
};
|
|
225
109
|
export const updateCreditCard = (context, card)=>{
|
|
226
110
|
const { databaseName, session: { userId: sessionId } } = context;
|
|
227
111
|
const { city, country, expMonth, expYear, fullName, id, street1, state, zip } = card;
|
|
@@ -462,13 +346,55 @@ const ensureStripeCustomerId = async (context)=>{
|
|
|
462
346
|
}
|
|
463
347
|
return String(user?.stripeCustomerId || '');
|
|
464
348
|
};
|
|
465
|
-
const
|
|
466
|
-
const
|
|
467
|
-
const
|
|
468
|
-
if (
|
|
469
|
-
|
|
349
|
+
const getConfiguredBillingOrigins = (context)=>{
|
|
350
|
+
const configuredOrigins = String(process.env.STRIPE_RETURN_URL_ORIGINS || '').split(',').map((origin)=>origin.trim()).filter(Boolean);
|
|
351
|
+
const appUrl = String(context.config?.details?.url || '').trim();
|
|
352
|
+
if (appUrl) {
|
|
353
|
+
configuredOrigins.push(appUrl.includes('://') ? appUrl : `https://${appUrl}`);
|
|
354
|
+
}
|
|
355
|
+
return new Set(configuredOrigins.map((origin)=>{
|
|
356
|
+
try {
|
|
357
|
+
return new URL(origin).origin;
|
|
358
|
+
} catch {
|
|
359
|
+
return '';
|
|
360
|
+
}
|
|
361
|
+
}).filter(Boolean));
|
|
362
|
+
};
|
|
363
|
+
const parseBillingReturnUrl = (context, returnUrl)=>{
|
|
364
|
+
let parsedUrl;
|
|
365
|
+
try {
|
|
366
|
+
parsedUrl = new URL(String(returnUrl || '').trim());
|
|
367
|
+
} catch {
|
|
368
|
+
throw new UserError('invalid_billing_return_url');
|
|
369
|
+
}
|
|
370
|
+
const isLocalDevelopmentUrl = parsedUrl.protocol === 'http:' && [
|
|
371
|
+
'127.0.0.1',
|
|
372
|
+
'localhost'
|
|
373
|
+
].includes(parsedUrl.hostname);
|
|
374
|
+
const isSecureUrl = parsedUrl.protocol === 'https:';
|
|
375
|
+
const allowedOrigins = getConfiguredBillingOrigins(context);
|
|
376
|
+
if (!isSecureUrl && !isLocalDevelopmentUrl || !isLocalDevelopmentUrl && !allowedOrigins.has(parsedUrl.origin)) {
|
|
377
|
+
throw new UserError('invalid_billing_return_url');
|
|
378
|
+
}
|
|
379
|
+
parsedUrl.hash = '';
|
|
380
|
+
return parsedUrl;
|
|
381
|
+
};
|
|
382
|
+
const getCheckoutReturnUrl = (returnUrl, status)=>{
|
|
383
|
+
const nextUrl = new URL(returnUrl.toString());
|
|
384
|
+
nextUrl.searchParams.set('billing', status);
|
|
385
|
+
if (status === 'success') {
|
|
386
|
+
nextUrl.searchParams.set('session_id', '{CHECKOUT_SESSION_ID}');
|
|
470
387
|
}
|
|
471
|
-
return
|
|
388
|
+
return nextUrl.toString().replace('%7BCHECKOUT_SESSION_ID%7D', '{CHECKOUT_SESSION_ID}');
|
|
389
|
+
};
|
|
390
|
+
const updateUserBillingPaymentMethod = async (context, update)=>{
|
|
391
|
+
const sessionId = String(context.session?.userId || '').trim();
|
|
392
|
+
const userUpdate = {
|
|
393
|
+
modified: Date.now(),
|
|
394
|
+
...update
|
|
395
|
+
};
|
|
396
|
+
const aqlQry = aql`UPDATE ${sessionId} WITH ${userUpdate} IN users LIMIT 1 RETURN NEW`;
|
|
397
|
+
return useDb(context.databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((user)=>user);
|
|
472
398
|
};
|
|
473
399
|
const ensurePlusStripePlan = async ()=>{
|
|
474
400
|
const stripeClient = getStripeClient();
|
|
@@ -548,78 +474,98 @@ export const upgradeUserToPlus = async (context)=>{
|
|
|
548
474
|
throw new UserError('payment_error');
|
|
549
475
|
}
|
|
550
476
|
};
|
|
551
|
-
export const
|
|
552
|
-
const
|
|
553
|
-
|
|
477
|
+
export const createBillingSetupSession = async (context, { returnUrl })=>{
|
|
478
|
+
const sessionId = String(context.session?.userId || '').trim();
|
|
479
|
+
if (!sessionId) {
|
|
480
|
+
throw new UserError('invalid_session');
|
|
481
|
+
}
|
|
554
482
|
const stripeCustomerId = await ensureStripeCustomerId(context);
|
|
555
|
-
if (!stripeCustomerId
|
|
483
|
+
if (!stripeCustomerId) {
|
|
556
484
|
throw new UserError('payment_error');
|
|
557
485
|
}
|
|
558
|
-
const
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
486
|
+
const parsedReturnUrl = parseBillingReturnUrl(context, returnUrl);
|
|
487
|
+
const checkoutSession = await getStripeClient().checkout.sessions.create({
|
|
488
|
+
cancel_url: getCheckoutReturnUrl(parsedReturnUrl, 'canceled'),
|
|
489
|
+
customer: stripeCustomerId,
|
|
490
|
+
metadata: {
|
|
491
|
+
type: 'billing-payment-method',
|
|
492
|
+
userId: sessionId
|
|
493
|
+
},
|
|
494
|
+
mode: 'setup',
|
|
495
|
+
payment_method_types: [
|
|
496
|
+
'card'
|
|
497
|
+
],
|
|
498
|
+
setup_intent_data: {
|
|
499
|
+
metadata: {
|
|
500
|
+
type: 'billing-payment-method',
|
|
501
|
+
userId: sessionId
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
success_url: getCheckoutReturnUrl(parsedReturnUrl, 'success')
|
|
505
|
+
});
|
|
506
|
+
const checkoutUrl = String(checkoutSession.url || '').trim();
|
|
507
|
+
if (!checkoutUrl) {
|
|
508
|
+
throw new UserError('payment_error');
|
|
565
509
|
}
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
510
|
+
return checkoutUrl;
|
|
511
|
+
};
|
|
512
|
+
export const completeBillingSetupSession = async (context, checkoutSessionId)=>{
|
|
513
|
+
const sessionId = String(context.session?.userId || '').trim();
|
|
514
|
+
const normalizedCheckoutSessionId = String(checkoutSessionId || '').trim();
|
|
515
|
+
if (!sessionId) {
|
|
516
|
+
throw new UserError('invalid_session');
|
|
569
517
|
}
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
throw new UserError('required_credit_card_cvc');
|
|
518
|
+
if (!normalizedCheckoutSessionId) {
|
|
519
|
+
throw new UserError('invalid_billing_setup_session');
|
|
573
520
|
}
|
|
574
|
-
const stripeClient = getStripeClient();
|
|
575
521
|
const currentUser = await getUserById(context, {
|
|
576
522
|
userId: sessionId
|
|
577
523
|
});
|
|
578
|
-
const
|
|
579
|
-
|
|
580
|
-
const token = await stripeClient.tokens.create({
|
|
581
|
-
card: {
|
|
582
|
-
cvc: formatCvc,
|
|
583
|
-
exp_month: String(formatExpMonth),
|
|
584
|
-
exp_year: String(formatExpYear),
|
|
585
|
-
name: String(card?.fullName || '').trim() || undefined,
|
|
586
|
-
number: formatNumber
|
|
587
|
-
}
|
|
588
|
-
});
|
|
589
|
-
const newSource = await stripeClient.customers.createSource(stripeCustomerId, {
|
|
590
|
-
source: token.id
|
|
591
|
-
});
|
|
592
|
-
const cardSource = newSource;
|
|
593
|
-
const brand = String(cardSource.brand || '').trim();
|
|
594
|
-
const last4 = String(cardSource.last4 || '').trim();
|
|
595
|
-
const stripeCardId = String(cardSource.id || '').trim();
|
|
596
|
-
await stripeClient.customers.update(stripeCustomerId, {
|
|
597
|
-
default_source: stripeCardId
|
|
598
|
-
});
|
|
599
|
-
if (currentStripeCardId && currentStripeCardId !== stripeCardId) {
|
|
600
|
-
await stripeClient.customers.deleteSource(stripeCustomerId, currentStripeCardId).catch(()=>null);
|
|
601
|
-
}
|
|
602
|
-
const update = {
|
|
603
|
-
modified: Date.now(),
|
|
604
|
-
stripeCardBrand: brand,
|
|
605
|
-
stripeCardId,
|
|
606
|
-
stripeCardLast4: last4
|
|
607
|
-
};
|
|
608
|
-
const aqlQry = aql`UPDATE ${sessionId} WITH ${update} IN users LIMIT 1 RETURN NEW`;
|
|
609
|
-
const updatedUser = await useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((user)=>user);
|
|
610
|
-
return updatedUser;
|
|
611
|
-
} catch (error) {
|
|
612
|
-
await logError({
|
|
613
|
-
action,
|
|
614
|
-
category: eventCategory,
|
|
615
|
-
label: 'payment_error'
|
|
616
|
-
}, error, context);
|
|
524
|
+
const stripeCustomerId = String(currentUser?.stripeCustomerId || '').trim();
|
|
525
|
+
if (!stripeCustomerId) {
|
|
617
526
|
throw new UserError('payment_error');
|
|
618
527
|
}
|
|
528
|
+
const stripeClient = getStripeClient();
|
|
529
|
+
const checkoutSession = await stripeClient.checkout.sessions.retrieve(normalizedCheckoutSessionId, {
|
|
530
|
+
expand: [
|
|
531
|
+
'setup_intent.payment_method'
|
|
532
|
+
]
|
|
533
|
+
});
|
|
534
|
+
const checkoutCustomerId = typeof checkoutSession.customer === 'string' ? checkoutSession.customer : checkoutSession.customer?.id;
|
|
535
|
+
if (checkoutSession.mode !== 'setup' || checkoutSession.status !== 'complete' || checkoutCustomerId !== stripeCustomerId || checkoutSession.metadata?.userId !== sessionId) {
|
|
536
|
+
throw new UserError('invalid_billing_setup_session');
|
|
537
|
+
}
|
|
538
|
+
const setupIntent = typeof checkoutSession.setup_intent === 'string' ? await stripeClient.setupIntents.retrieve(checkoutSession.setup_intent, {
|
|
539
|
+
expand: [
|
|
540
|
+
'payment_method'
|
|
541
|
+
]
|
|
542
|
+
}) : checkoutSession.setup_intent;
|
|
543
|
+
if (!setupIntent || setupIntent.status !== 'succeeded') {
|
|
544
|
+
throw new UserError('billing_setup_incomplete');
|
|
545
|
+
}
|
|
546
|
+
const paymentMethod = typeof setupIntent.payment_method === 'string' ? await stripeClient.paymentMethods.retrieve(setupIntent.payment_method) : setupIntent.payment_method;
|
|
547
|
+
const paymentMethodCustomerId = typeof paymentMethod?.customer === 'string' ? paymentMethod.customer : paymentMethod?.customer?.id;
|
|
548
|
+
if (!paymentMethod || paymentMethod.type !== 'card' || !paymentMethod.card || paymentMethodCustomerId !== stripeCustomerId) {
|
|
549
|
+
throw new UserError('invalid_billing_payment_method');
|
|
550
|
+
}
|
|
551
|
+
await stripeClient.customers.update(stripeCustomerId, {
|
|
552
|
+
invoice_settings: {
|
|
553
|
+
default_payment_method: paymentMethod.id
|
|
554
|
+
}
|
|
555
|
+
});
|
|
556
|
+
const currentStripeCardId = String(currentUser?.stripeCardId || '').trim();
|
|
557
|
+
if (currentStripeCardId.startsWith('pm_') && currentStripeCardId !== paymentMethod.id) {
|
|
558
|
+
await stripeClient.paymentMethods.detach(currentStripeCardId).catch(()=>null);
|
|
559
|
+
}
|
|
560
|
+
return updateUserBillingPaymentMethod(context, {
|
|
561
|
+
stripeCardBrand: String(paymentMethod.card.brand || '').trim(),
|
|
562
|
+
stripeCardId: paymentMethod.id,
|
|
563
|
+
stripeCardLast4: String(paymentMethod.card.last4 || '').trim()
|
|
564
|
+
});
|
|
619
565
|
};
|
|
620
566
|
export const deleteUserBillingCard = async (context)=>{
|
|
621
567
|
const action = 'deleteUserBillingCard';
|
|
622
|
-
const {
|
|
568
|
+
const { session: { userId: sessionId } = {} } = context;
|
|
623
569
|
const currentUser = await getUserById(context, {
|
|
624
570
|
userId: sessionId
|
|
625
571
|
});
|
|
@@ -628,16 +574,25 @@ export const deleteUserBillingCard = async (context)=>{
|
|
|
628
574
|
const stripeClient = getStripeClient();
|
|
629
575
|
try {
|
|
630
576
|
if (stripeCustomerId && stripeCardId) {
|
|
631
|
-
|
|
577
|
+
if (stripeCardId.startsWith('pm_')) {
|
|
578
|
+
const customer = await stripeClient.customers.retrieve(stripeCustomerId);
|
|
579
|
+
if (!('deleted' in customer) && customer.invoice_settings.default_payment_method === stripeCardId) {
|
|
580
|
+
await stripeClient.customers.update(stripeCustomerId, {
|
|
581
|
+
invoice_settings: {
|
|
582
|
+
default_payment_method: null
|
|
583
|
+
}
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
await stripeClient.paymentMethods.detach(stripeCardId).catch(()=>null);
|
|
587
|
+
} else {
|
|
588
|
+
await stripeClient.customers.deleteSource(stripeCustomerId, stripeCardId).catch(()=>null);
|
|
589
|
+
}
|
|
632
590
|
}
|
|
633
|
-
|
|
634
|
-
modified: Date.now(),
|
|
591
|
+
return updateUserBillingPaymentMethod(context, {
|
|
635
592
|
stripeCardBrand: '',
|
|
636
593
|
stripeCardId: '',
|
|
637
594
|
stripeCardLast4: ''
|
|
638
|
-
};
|
|
639
|
-
const aqlQry = aql`UPDATE ${sessionId} WITH ${update} IN users LIMIT 1 RETURN NEW`;
|
|
640
|
-
return useDb(databaseName).query(aqlQry).then((cursor)=>cursor.next()).then((user)=>user);
|
|
595
|
+
});
|
|
641
596
|
} catch (error) {
|
|
642
597
|
await logError({
|
|
643
598
|
action,
|
|
@@ -648,4 +603,4 @@ export const deleteUserBillingCard = async (context)=>{
|
|
|
648
603
|
}
|
|
649
604
|
};
|
|
650
605
|
|
|
651
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3Ivc3JjL2FjdGlvbnMvcGF5bWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgc3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7UGF5bWVudEJhbmtBY2NvdW50LCBQYXltZW50Q2FyZFR5cGUsIFBheW1lbnRDaGFyZ2UsIFBheW1lbnRUcmFuc2Zlcn0gZnJvbSAnLi4vdHlwZXMvcGF5bWVudHMudHlwZXMuanMnO1xuaW1wb3J0IHtVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvdXNlcnMudHlwZXMuanMnO1xuaW1wb3J0IHtsb2dFcnJvciwgVXNlckVycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscy5qcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7aGFzQWNjZXNzTGV2ZWx9IGZyb20gJy4uL3V0aWxzL3Nlc3Npb25VdGlscy5qcyc7XG5pbXBvcnQge2dldFN0cmlwZUNsaWVudH0gZnJvbSAnLi4vdXRpbHMvc3RyaXBlVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRVc2VyQnlJZH0gZnJvbSAnLi91c2Vycy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbnMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5ID0gJ3BheW1lbnRzJztcbmNvbnN0IFBMVVNfUExBTl9JRCA9ICdwaGFudGF6ZS1wbHVzLW1vbnRobHknO1xuY29uc3QgUExVU19QTEFOX0FNT1VOVCA9IDEwMDA7XG5jb25zdCBQTFVTX1BMQU5fQUNDRVNTID0gMTtcblxuZXhwb3J0IGNvbnN0IGFkZEN1c3RvbWVyQWNjb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGRDdXN0b21lckFjY291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSA9IHt9fSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAuY3JlYXRlKHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkLFxuICAgICAgICB1c2VybmFtZVxuICAgICAgfVxuICAgIH0gYXMgYW55KVxuICAgIC50aGVuKChjdXN0b21lcikgPT4ge1xuICAgICAgLy8gQ3JlYXRlIHNlc3Npb25cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB1cGRhdGU6IFVzZXJUeXBlID0ge1xuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICBzdHJpcGVDdXN0b21lcklkOiBjdXN0b21lci5pZFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKHVwZGF0ZWRVc2VyOiBVc2VyVHlwZSkgPT4gISF1cGRhdGVkVXNlcilcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZEJhbmtBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGJhbmtBY2NvdW50OiBQYXltZW50QmFua0FjY291bnQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZFBheW1lbnRBY2NvdW50QmFuayc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuXG4gIC8vIFBhcmFtc1xuICBjb25zdCB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICBmdWxsTmFtZSxcbiAgICByb3V0aW5nXG4gIH0gPSBiYW5rQWNjb3VudDtcblxuICBjb25zdCBmb3JtYXRBY2NvdW50ID0gcGFyc2VTdHJpbmcoYWNjb3VudE51bWJlciwgMzIpO1xuXG4gIGlmKGZvcm1hdEFjY291bnQgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfYWNjb3VudF9udW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAxMjgpO1xuXG4gIGlmKGZvcm1hdEZ1bGxOYW1lID09PSAnJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2Z1bGxfbmFtZScpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0Um91dGluZyA9IHBhcnNlU3RyaW5nKHJvdXRpbmcsIDMyKTtcblxuICBpZihmb3JtYXRSb3V0aW5nID09PSAnJykge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX3JvdXRpbmdfbnVtYmVyJyk7XG4gIH1cblxuICByZXR1cm4gZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSlcbiAgICAudGhlbigodXNlcjogVXNlclR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9ID0gdXNlcjtcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gICAgICAvLyBDcmVhdGUgYSB0b2tlbiBmaXJzdCwgdGhlbiB1c2UgdGhlIHRva2VuIGFzIHRoZSBzb3VyY2VcbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQudG9rZW5zLmNyZWF0ZSh7XG4gICAgICAgIGJhbmtfYWNjb3VudDoge1xuICAgICAgICAgIGFjY291bnRfaG9sZGVyX25hbWU6IGZvcm1hdEZ1bGxOYW1lLFxuICAgICAgICAgIGFjY291bnRfaG9sZGVyX3R5cGU6ICdpbmRpdmlkdWFsJyxcbiAgICAgICAgICBhY2NvdW50X251bWJlcjogZm9ybWF0QWNjb3VudCxcbiAgICAgICAgICBjb3VudHJ5OiAnVVMnLFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICByb3V0aW5nX251bWJlcjogZm9ybWF0Um91dGluZ1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgICAudGhlbigodG9rZW4pID0+IHN0cmlwZUNsaWVudC5jdXN0b21lcnMuY3JlYXRlU291cmNlKFxuICAgICAgICAgIHN0cmlwZUFjY291bnRJZCxcbiAgICAgICAgICB7c291cmNlOiB0b2tlbi5pZH1cbiAgICAgICAgKSlcbiAgICAgICAgLnRoZW4oKGFjY291bnQpID0+IHtcbiAgICAgICAgICAvLyBVc2UgdHlwZSBhc3NlcnRpb24gZm9yIGNhcmQgcHJvcGVydGllc1xuICAgICAgICAgIC8vIGNvbnN0IGNhcmRTb3VyY2UgPSBhY2NvdW50IGFzIHVua25vd24gYXMgQ2FyZDtcbiAgICAgICAgICAvLyBjb25zdCBicmFuZCA9IGNhcmRTb3VyY2UuYnJhbmQgfHwgJyc7XG4gICAgICAgICAgLy8gY29uc3QgY3ZjQ2hlY2sgPSBjYXJkU291cmNlLmN2Y19jaGVjayB8fCAnJztcbiAgICAgICAgICAvLyBjb25zdCBsYXN0NCA9IGNhcmRTb3VyY2UubGFzdDQgfHwgJyc7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgc2Vzc2lvblxuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgICAgICAgYmFua0FjY291bnQsXG4gICAgICAgICAgICBiYW5rRnVsbE5hbWU6IGZvcm1hdEZ1bGxOYW1lLFxuICAgICAgICAgICAgYmFua0lkOiBhY2NvdW50LmlkLFxuICAgICAgICAgICAgYmFua1JvdXRpbmc6IGZvcm1hdFJvdXRpbmcsXG4gICAgICAgICAgICBtb2RpZmllZDogbm93XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgICAgIC50aGVuKCh1cGRhdGVkVXNlcjogVXNlclR5cGUpID0+IHVwZGF0ZWRVc2VyKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBlcnJvci5tZXNzYWdlO1xuXG4gICAgICAgICAgaWYobXNnID09PSAnQSBiYW5rIGFjY291bnQgd2l0aCB0aGF0IHJvdXRpbmcgbnVtYmVyIGFuZCBhY2NvdW50IG51bWJlciAnICtcbiAgICAgICAgICAgICdhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBjdXN0b21lci4nKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBsYWJlbDogJ2JhbmtfYWNjb3VudF9leGlzdHMnXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmQ6IFBheW1lbnRDYXJkVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZENyZWRpdENhcmQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgcmV0dXJuIGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IHNlc3Npb25JZH0pXG4gICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlKSA9PiB7XG4gICAgICAvLyBVc2VyXG4gICAgICBjb25zdCB7c3RyaXBlQWNjb3VudElkfSA9IHVzZXI7XG5cbiAgICAgIC8vIENhcmRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWNjb3VudE51bWJlcixcbiAgICAgICAgY2l0eSxcbiAgICAgICAgY291bnRyeSxcbiAgICAgICAgY3ZjLFxuICAgICAgICBleHBNb250aCxcbiAgICAgICAgZXhwWWVhcixcbiAgICAgICAgZnVsbE5hbWUsXG4gICAgICAgIHN0cmVldDEsXG4gICAgICAgIHN0cmVldDIsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICB6aXBcbiAgICAgIH06IFBheW1lbnRDYXJkVHlwZSA9IGNhcmQ7XG5cbiAgICAgIGNvbnN0IGZvcm1hdE51bWJlciA9IHBhcnNlTnVtKGFjY291bnROdW1iZXIsIDE2KTtcblxuICAgICAgaWYoIWZvcm1hdE51bWJlcikge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9udW1iZXInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RXhwTW9udGggPSBwYXJzZU51bShleHBNb250aCwgMik7XG5cbiAgICAgIGlmKCFmb3JtYXRFeHBNb250aCkge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9leHBfbW9udGgnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RXhwWWVhciA9IHBhcnNlTnVtKGV4cFllYXIsIDIpO1xuXG4gICAgICBpZighZm9ybWF0RXhwWWVhcikge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9leHBfeWVhcicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRDdmMgPSBwYXJzZU51bShjdmMsIDMpO1xuXG4gICAgICAvLyBBZGRyZXNzXG4gICAgICBjb25zdCBwYXltZW50Q2FyZDogUGF5bWVudENhcmRUeXBlID0ge307XG4gICAgICBjb25zdCBmb3JtYXRDaXR5ID0gcGFyc2VWYXJDaGFyKGNpdHksIDMyKTtcblxuICAgICAgaWYoZm9ybWF0Q2l0eSkge1xuICAgICAgICBwYXltZW50Q2FyZC5jaXR5ID0gZm9ybWF0Q2l0eTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0Q291bnRyeSA9IHBhcnNlQ2hhcihjb3VudHJ5LCAyKTtcblxuICAgICAgaWYoZm9ybWF0Q291bnRyeSkge1xuICAgICAgICBwYXltZW50Q2FyZC5jb3VudHJ5ID0gZm9ybWF0Q291bnRyeTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RnVsbE5hbWUgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDMyKTtcblxuICAgICAgaWYoZm9ybWF0RnVsbE5hbWUpIHtcbiAgICAgICAgcGF5bWVudENhcmQuZnVsbE5hbWUgPSBmb3JtYXRGdWxsTmFtZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0U3RyZWV0MSA9IHBhcnNlVmFyQ2hhcihzdHJlZXQxLCAzMik7XG5cbiAgICAgIGlmKGZvcm1hdFN0cmVldDEpIHtcbiAgICAgICAgcGF5bWVudENhcmQuc3RyZWV0MSA9IGZvcm1hdFN0cmVldDE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFN0cmVldDIgPSBwYXJzZVZhckNoYXIoc3RyZWV0MiwgMzIpO1xuXG4gICAgICBpZihmb3JtYXRTdHJlZXQyKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnN0cmVldDIgPSBmb3JtYXRTdHJlZXQyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRTdGF0ZSA9IHBhcnNlQ2hhcihzdGF0ZSwgMik7XG5cbiAgICAgIGlmKGZvcm1hdFN0YXRlKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnN0YXRlID0gZm9ybWF0U3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFppcCA9IHBhcnNlVmFyQ2hhcih6aXAsIDEwKTtcblxuICAgICAgaWYoZm9ybWF0WmlwKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnppcCA9IGZvcm1hdFppcDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIHRva2VuIGZpcnN0LCB0aGVuIHVzZSB0aGUgdG9rZW4gYXMgdGhlIHNvdXJjZVxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC50b2tlbnMuY3JlYXRlKHtcbiAgICAgICAgY2FyZDoge1xuICAgICAgICAgIGFkZHJlc3NfY2l0eTogZm9ybWF0Q2l0eSxcbiAgICAgICAgICBhZGRyZXNzX2NvdW50cnk6IGZvcm1hdENvdW50cnksXG4gICAgICAgICAgYWRkcmVzc19saW5lMTogZm9ybWF0U3RyZWV0MSxcbiAgICAgICAgICBhZGRyZXNzX2xpbmUyOiBmb3JtYXRTdHJlZXQyLFxuICAgICAgICAgIGFkZHJlc3Nfc3RhdGU6IGZvcm1hdFN0YXRlLFxuICAgICAgICAgIGFkZHJlc3NfemlwOiBmb3JtYXRaaXAsXG4gICAgICAgICAgY3ZjOiBmb3JtYXRDdmMudG9TdHJpbmcoKSxcbiAgICAgICAgICBleHBfbW9udGg6IGZvcm1hdEV4cE1vbnRoLnRvU3RyaW5nKCksXG4gICAgICAgICAgZXhwX3llYXI6IGZvcm1hdEV4cFllYXIudG9TdHJpbmcoKSxcbiAgICAgICAgICBuYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgICBudW1iZXI6IGZvcm1hdE51bWJlci50b1N0cmluZygpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAgIC50aGVuKCh0b2tlbikgPT4gc3RyaXBlQ2xpZW50LmN1c3RvbWVycy5jcmVhdGVTb3VyY2UoXG4gICAgICAgICAgc3RyaXBlQWNjb3VudElkLFxuICAgICAgICAgIHtzb3VyY2U6IHRva2VuLmlkfVxuICAgICAgICApKVxuICAgICAgICAudGhlbigobmV3U291cmNlKSA9PiB7XG4gICAgICAgICAgLy8gVXNlIHR5cGUgYXNzZXJ0aW9uIGZvciBjYXJkIHByb3BlcnRpZXNcbiAgICAgICAgICBjb25zdCBjYXJkU291cmNlID0gbmV3U291cmNlIGFzIHVua25vd24gYXMgQ2FyZDtcbiAgICAgICAgICBjb25zdCBicmFuZCA9IGNhcmRTb3VyY2UuYnJhbmQgfHwgJyc7XG4gICAgICAgICAgY29uc3QgY3ZjQ2hlY2sgPSBjYXJkU291cmNlLmN2Y19jaGVjayB8fCAnJztcbiAgICAgICAgICBjb25zdCBsYXN0NCA9IGNhcmRTb3VyY2UubGFzdDQgfHwgJyc7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgc2Vzc2lvblxuICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0ID0ge1xuICAgICAgICAgICAgLi4ucGF5bWVudENhcmQsXG4gICAgICAgICAgICBfa2V5OiBjcmVhdGVIYXNoKGB1c2VyLXBheW1lbnQtJHtzZXNzaW9uSWR9YCksXG4gICAgICAgICAgICBhY2NvdW50TnVtYmVyOiBsYXN0NCxcbiAgICAgICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgICAgICBicmFuZCxcbiAgICAgICAgICAgIGN2Y0NoZWNrLFxuICAgICAgICAgICAgZXhwTW9udGgsXG4gICAgICAgICAgICBleHBZZWFyLFxuICAgICAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBpbnNlcnRBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gY3JlZGl0Q2FyZHMgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShpbnNlcnRBcWxRcnkpXG4gICAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKG5ld0NhcmQ6IFBheW1lbnRDYXJkVHlwZSkgPT4ge1xuICAgICAgICAgICAgICBpZihuZXdDYXJkKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGxpbmtlZCBlZGdlXG4gICAgICAgICAgICAgICAgY29uc3Qge19pZDogY2FyZElkLCBfa2V5OiBjYXJkS2V5fSA9IGNhcmQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKCdoYXNQYXltZW50Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZUlkID0gY3JlYXRlSGFzaChgcGF5bWVudC0ke2NhcmRLZXl9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZSA9IHtcbiAgICAgICAgICAgICAgICAgIF9mcm9tOiBgdXNlcnMvJHtzZXNzaW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgIF9rZXk6IGVkZ2VJZCxcbiAgICAgICAgICAgICAgICAgIF90bzogY2FyZElkXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGNhcmQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NhcmQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmQ6IFBheW1lbnRDYXJkVHlwZSk6IFByb21pc2U8UGF5bWVudENhcmRUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICBjb25zdCB7XG4gICAgY2l0eSxcbiAgICBjb3VudHJ5LFxuICAgIGV4cE1vbnRoLFxuICAgIGV4cFllYXIsXG4gICAgZnVsbE5hbWUsXG4gICAgaWQsXG4gICAgc3RyZWV0MSxcbiAgICBzdGF0ZSxcbiAgICB6aXBcbiAgfTogUGF5bWVudENhcmRUeXBlID0gY2FyZDtcblxuICBjb25zdCBmb3JtYXRJZCA9IHBhcnNlSWQoaWQpO1xuXG4gIGlmKGZvcm1hdElkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfaWQnKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSB7fTtcbiAgY29uc3QgZm9ybWF0RXhwTW9udGggPSBwYXJzZU51bShleHBNb250aCwgMik7XG4gIGNvbnN0IGZvcm1hdEV4cFllYXIgPSBwYXJzZU51bShleHBZZWFyLCAyKTtcbiAgY29uc3QgZm9ybWF0Q2l0eSA9IHBhcnNlVmFyQ2hhcihjaXR5LCAzMik7XG4gIGNvbnN0IGZvcm1hdENvdW50cnkgPSBwYXJzZUNoYXIoY291bnRyeSwgMik7XG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAzMik7XG4gIGNvbnN0IGZvcm1hdFN0cmVldDEgPSBwYXJzZVN0cmluZyhzdHJlZXQxLCAzMik7XG4gIGNvbnN0IGZvcm1hdFN0YXRlID0gcGFyc2VDaGFyKHN0YXRlLCAyKTtcbiAgY29uc3QgZm9ybWF0WmlwID0gcGFyc2VWYXJDaGFyKHppcCwgMTApO1xuXG4gIGlmKGZvcm1hdEV4cE1vbnRoKSB7XG4gICAgcGF5bWVudENhcmQuZXhwTW9udGggPSBmb3JtYXRFeHBNb250aDtcbiAgfVxuXG4gIGlmKGZvcm1hdEV4cFllYXIpIHtcbiAgICBwYXltZW50Q2FyZC5leHBZZWFyID0gZm9ybWF0RXhwWWVhcjtcbiAgfVxuXG4gIGlmKGZvcm1hdENpdHkpIHtcbiAgICBwYXltZW50Q2FyZC5jaXR5ID0gZm9ybWF0Q2l0eTtcbiAgfVxuXG4gIGlmKGZvcm1hdENvdW50cnkpIHtcbiAgICBwYXltZW50Q2FyZC5jb3VudHJ5ID0gZm9ybWF0Q291bnRyeTtcbiAgfVxuXG4gIGlmKGZvcm1hdEZ1bGxOYW1lKSB7XG4gICAgcGF5bWVudENhcmQuZnVsbE5hbWUgPSBmb3JtYXRGdWxsTmFtZTtcbiAgfVxuXG4gIGlmKGZvcm1hdFN0cmVldDEpIHtcbiAgICBwYXltZW50Q2FyZC5zdHJlZXQxID0gZm9ybWF0U3RyZWV0MTtcbiAgfVxuXG4gIGlmKGZvcm1hdFN0YXRlKSB7XG4gICAgcGF5bWVudENhcmQuc3RhdGUgPSBmb3JtYXRTdGF0ZTtcbiAgfVxuXG4gIGlmKGZvcm1hdFppcCkge1xuICAgIHBheW1lbnRDYXJkLnppcCA9IGZvcm1hdFppcDtcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZSA9IHBheW1lbnRDYXJkO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgTEVUIHVwZGF0ZWRDYXJkID0gRklSU1QoXG4gICAgICAgIEZPUiBjIElOIGNyZWRpdENhcmRzXG4gICAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIFVQREFURSBjIFdJVEggJHt1cGRhdGV9IElOIGNyZWRpdENhcmRzXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIE5FV1xuICAgICAgKVxuICAgICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdVxuICAgICAgKVxuICAgICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiB1cGRhdGVkQ2FyZH1gO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChyZXN1bHRzID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSByZXN1bHRzLmNhcmQ7XG4gICAgICBjb25zdCB7dXNlcn0gPSByZXN1bHRzO1xuXG4gICAgICBpZighdXBkYXRlZENhcmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcignbm90X2ZvdW5kJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtzdHJpcGVDdXN0b21lcklkfSA9IHVzZXI7XG4gICAgICBjb25zdCB7c3RyaXBlSWR9ID0gY2FyZDtcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuICAgICAgY29uc3QgdXBkYXRlOiBzdHJpcGUuQ3VzdG9tZXJVcGRhdGVTb3VyY2VQYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3NfY2l0eTogZm9ybWF0Q2l0eSxcbiAgICAgICAgYWRkcmVzc19jb3VudHJ5OiBmb3JtYXRDb3VudHJ5LFxuICAgICAgICBhZGRyZXNzX2xpbmUxOiBmb3JtYXRTdHJlZXQxLFxuICAgICAgICBhZGRyZXNzX3N0YXRlOiBmb3JtYXRTdGF0ZSxcbiAgICAgICAgYWRkcmVzc196aXA6IGZvcm1hdFppcCxcbiAgICAgICAgZXhwX21vbnRoOiBmb3JtYXRFeHBNb250aC50b1N0cmluZygpLFxuICAgICAgICBleHBfeWVhcjogZm9ybWF0RXhwWWVhci50b1N0cmluZygpLFxuICAgICAgICBuYW1lOiBmb3JtYXRGdWxsTmFtZVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgLnVwZGF0ZVNvdXJjZShzdHJpcGVDdXN0b21lcklkLCBzdHJpcGVJZCwgdXBkYXRlKVxuICAgICAgICAudGhlbigoKSA9PiBjYXJkKVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6dXBkYXRlQ2FyZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDcmVkaXRDYXJkcyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxQYXltZW50Q2FyZFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0Q3JlZGl0Q2FyZHMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICBGSUxURVIgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKGxpc3Q6IFBheW1lbnRDYXJkVHlwZVtdID0gW10pID0+IGxpc3QpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdENhcmRJZCA9IHBhcnNlSWQoY2FyZElkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBMRVQgY2FyZCA9IEZJUlNUKFxuICAgICAgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRDYXJkSWR9ICYmIGMudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVNT1ZFIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgIFJFVFVSTiBPTERcbiAgICApXG4gICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIHVcbiAgICApXG4gICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiBjYXJkfWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHJlc3VsdCA9IHtjYXJkOiB7fSwgdXNlcjoge319KSA9PiB7XG4gICAgICBpZighcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge2NhcmQsIHVzZXJ9ID0gcmVzdWx0O1xuICAgICAgY29uc3Qge19rZXk6IGNhcmRLZXl9ID0gY2FyZDtcblxuICAgICAgLy8gUmVtb3ZlIGxpbmtlZCBlZGdlc1xuICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb24gPSB1c2VEYihkYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oJ2hhc1BheW1lbnQnKTtcblxuICAgICAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLm91dEVkZ2VzKGNhcmRLZXksIHt9KVxuICAgICAgICAudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAvLyBFeHRyYWN0IGVkZ2VzIGZyb20gdGhlIHJlc3BvbnNlXG4gICAgICAgICAgY29uc3QgZWRnZXMgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSA/IHJlc3BvbnNlIDogW107XG5cbiAgICAgICAgICBpZihlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICBlZGdlcy5tYXAoKGVkZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7X2tleTogZWRnZUtleX0gPSBlZGdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUFxbFFyeTogQXFsUXVlcnkgPSBhcWxgUkVNT1ZFIHtfa2V5OiR7ZWRnZUtleX19IElOIGhhc1BheW1lbnRgO1xuICAgICAgICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KHJlbW92ZUFxbFFyeSk7XG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXBlXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAgICAgICAgICAgLmRlbGV0ZVNvdXJjZSh1c2VyLnN0cmlwZUN1c3RvbWVySWQsIGNhcmQuc3RyaXBlSWQpXG4gICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjpkZWxldGVDYXJkOjplcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUJhbmtBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGJhbmtJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcblxuICAvLyBDbGVhbiBkYlxuICBjb25zdCB1cGRhdGU6IFVzZXJUeXBlID0ge1xuICAgIGJhbmtBY2NvdW50OiAnJyxcbiAgICBiYW5rRnVsbE5hbWU6ICcnLFxuICAgIGJhbmtJZDogJycsXG4gICAgYmFua1JvdXRpbmc6ICcnLFxuICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH0gPSB1c2VyO1xuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgIC5kZWxldGVTb3VyY2Uoc3RyaXBlQWNjb3VudElkLCBiYW5rSWQpXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50VHJhbnNmZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdHJhbnNmZXI6IFBheW1lbnRUcmFuc2Zlcik6IFByb21pc2U8UGF5bWVudFRyYW5zZmVyPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY3VycmVuY3l9ID0gdHJhbnNmZXI7XG4gIGNvbnN0IGZvcm1hdEFtb3VudCA9IHBhcnNlTnVtKGFtb3VudCk7XG4gIGNvbnN0IGZvcm1hdEN1cnJlbmN5ID0gcGFyc2VDaGFyKGN1cnJlbmN5LCAzLCAnVVNEJykudG9VcHBlckNhc2UoKTtcblxuICByZXR1cm4gZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSlcbiAgICAudGhlbigodXNlcjogVXNlclR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9ID0gdXNlcjtcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LnRyYW5zZmVyc1xuICAgICAgICAuY3JlYXRlKHtcbiAgICAgICAgICBhbW91bnQ6IGZvcm1hdEFtb3VudCxcbiAgICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgICAgZGVzdGluYXRpb246IHN0cmlwZUFjY291bnRJZFxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoc3RyaXBlVHJhbnNmZXIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhzdHJpcGVUcmFuc2Zlcik7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBpbnNlcnQ6IFBheW1lbnRUcmFuc2ZlciA9IHtcbiAgICAgICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgICAgICBhbW91bnQ6IGZvcm1hdEFtb3VudCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHRyYW5zZmVycyBSRVRVUk4gTkVXYDtcblxuICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgICAgICAudGhlbigobmV3VHJhbnNmZXI6IFBheW1lbnRUcmFuc2ZlcikgPT4gbmV3VHJhbnNmZXIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50SG9sZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwYXltZW50OiBQYXltZW50Q2hhcmdlKTogUHJvbWlzZTxQYXltZW50Q2hhcmdlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY2FwdHVyZSwgY2FyZElkLCBjdXJyZW5jeSwgZGVzY3JpcHRpb259ID0gcGF5bWVudDtcbiAgY29uc3QgZm9ybWF0Q3VycmVuY3kgPSBwYXJzZUNoYXIoY3VycmVuY3ksIDMsICdVU0QnKS50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICByZXR1cm4gc3RyaXBlQ2xpZW50LmNoYXJnZXNcbiAgICAuY3JlYXRlKHtcbiAgICAgIGFtb3VudCxcbiAgICAgIGNhcHR1cmUsXG4gICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHNvdXJjZTogY2FyZElkXG4gICAgfSlcbiAgICAudGhlbigoc3RyaXBlQ2hhcmdlKSA9PiB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgaW5zZXJ0OiBQYXltZW50Q2hhcmdlID0ge1xuICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIGNhcHR1cmUsXG4gICAgICAgIGNhcmRJZCxcbiAgICAgICAgY2hhcmdlRmFpbENvZGU6IHN0cmlwZUNoYXJnZS5mYWlsdXJlX2NvZGUsXG4gICAgICAgIGNoYXJnZUZhaWxNc2c6IHN0cmlwZUNoYXJnZS5mYWlsdXJlX21lc3NhZ2UsXG4gICAgICAgIGNoYXJnZUlkOiBzdHJpcGVDaGFyZ2UuaWQsXG4gICAgICAgIGNoYXJnZVN0YXR1czogc3RyaXBlQ2hhcmdlLnN0YXR1cyxcbiAgICAgICAgY3VycmVuY3k6IGZvcm1hdEN1cnJlbmN5LFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH07XG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcGF5bWVudHMgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKG5ld1BheW1lbnQ6IFBheW1lbnRDaGFyZ2UpID0+IG5ld1BheW1lbnQpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6Y3JlYXRlSG9sZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gICAgfSk7XG59O1xuXG5pbnRlcmZhY2UgQ2FyZCB7XG4gIGlkOiBzdHJpbmc7XG4gIGJyYW5kPzogc3RyaW5nO1xuICBjdmNfY2hlY2s/OiBzdHJpbmc7XG4gIGxhc3Q0Pzogc3RyaW5nO1xufVxuXG5jb25zdCBlbnN1cmVTdHJpcGVDdXN0b21lcklkID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCBzZXNzaW9uSWQgPSBTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKTtcbiAgbGV0IHVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcblxuICBpZighdXNlcj8uc3RyaXBlQ3VzdG9tZXJJZCkge1xuICAgIGF3YWl0IGFkZEN1c3RvbWVyQWNjb3VudChjb250ZXh0KTtcbiAgICB1c2VyID0gYXdhaXQgZ2V0VXNlckJ5SWQoY29udGV4dCwge3VzZXJJZDogc2Vzc2lvbklkfSk7XG4gIH1cblxuICByZXR1cm4gU3RyaW5nKHVzZXI/LnN0cmlwZUN1c3RvbWVySWQgfHwgJycpO1xufTtcblxuY29uc3QgcGFyc2VDYXJkTnVtYmVyID0gKGFjY291bnROdW1iZXI/OiBzdHJpbmcpOiBzdHJpbmcgPT4gU3RyaW5nKGFjY291bnROdW1iZXIgfHwgJycpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG5cbmNvbnN0IHBhcnNlQ2FyZEV4cFllYXIgPSAoZXhwWWVhcj86IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGNvbnN0IHBhcnNlZFllYXIgPSBwYXJzZU51bShleHBZZWFyLCA0KTtcblxuICBpZighcGFyc2VkWWVhcikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZFllYXIgPCAxMDAgPyAyMDAwICsgcGFyc2VkWWVhciA6IHBhcnNlZFllYXI7XG59O1xuXG5jb25zdCBlbnN1cmVQbHVzU3RyaXBlUGxhbiA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHN0cmlwZUNsaWVudC5wbGFucy5yZXRyaWV2ZShQTFVTX1BMQU5fSUQpO1xuICAgIHJldHVybiBQTFVTX1BMQU5fSUQ7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBhd2FpdCBzdHJpcGVDbGllbnQucGxhbnMuY3JlYXRlKHtcbiAgICAgIGFtb3VudDogUExVU19QTEFOX0FNT1VOVCxcbiAgICAgIGN1cnJlbmN5OiAndXNkJyxcbiAgICAgIGlkOiBQTFVTX1BMQU5fSUQsXG4gICAgICBpbnRlcnZhbDogJ21vbnRoJyxcbiAgICAgIGludGVydmFsX2NvdW50OiAxLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcGxhbklkOiAncGx1cycsXG4gICAgICAgIHR5cGU6ICdhY2NvdW50J1xuICAgICAgfSxcbiAgICAgIHByb2R1Y3Q6IHtcbiAgICAgICAgbmFtZTogJ1BoYW50YXplIFBsdXMnXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gUExVU19QTEFOX0lEO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgdXBncmFkZVVzZXJUb1BsdXMgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZ3JhZGVVc2VyVG9QbHVzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG5cbiAgaWYoIXNlc3Npb25JZCkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ2ludmFsaWRfc2Vzc2lvbicpO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcblxuICBpZihoYXNBY2Nlc3NMZXZlbChjdXJyZW50VXNlciwgUExVU19QTEFOX0FDQ0VTUykgJiYgY3VycmVudFVzZXI/LnBsYW5TdWJzY3JpcHRpb25JZCkge1xuICAgIHJldHVybiBjdXJyZW50VXNlcjtcbiAgfVxuXG4gIGlmKCFjdXJyZW50VXNlcj8uc3RyaXBlQ2FyZElkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfYmlsbGluZ19jYXJkJyk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHN0cmlwZUN1c3RvbWVySWQgPSBhd2FpdCBlbnN1cmVTdHJpcGVDdXN0b21lcklkKGNvbnRleHQpO1xuXG4gICAgaWYoIXN0cmlwZUN1c3RvbWVySWQpIHtcbiAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJpcGVQbGFuSWQgPSBhd2FpdCBlbnN1cmVQbHVzU3RyaXBlUGxhbigpO1xuICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuICAgIGNvbnN0IHN0cmlwZVN1YnNjcmlwdGlvbiA9IGF3YWl0IHN0cmlwZUNsaWVudC5zdWJzY3JpcHRpb25zLmNyZWF0ZSh7XG4gICAgICBjdXN0b21lcjogc3RyaXBlQ3VzdG9tZXJJZCxcbiAgICAgIGl0ZW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwbGFuOiBzdHJpcGVQbGFuSWRcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHBsYW5JZDogJ3BsdXMnLFxuICAgICAgICB0eXBlOiAnYWNjb3VudCcsXG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc3RyaXBlUGVyaW9kRW5kID0gTnVtYmVyKChzdHJpcGVTdWJzY3JpcHRpb24gYXMgYW55KT8uY3VycmVudF9wZXJpb2RfZW5kIHx8IDApO1xuICAgIGNvbnN0IHVwZGF0ZTogUGFydGlhbDxVc2VyVHlwZT4gPSB7XG4gICAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgIHBsYW5FeHBpcmVzOiBzdHJpcGVQZXJpb2RFbmQgPyBzdHJpcGVQZXJpb2RFbmQgKiAxMDAwIDogMCxcbiAgICAgIHBsYW5JZDogJ3BsdXMnLFxuICAgICAgcGxhblN0YXR1czogU3RyaW5nKHN0cmlwZVN1YnNjcmlwdGlvbi5zdGF0dXMgfHwgJ2FjdGl2ZScpLFxuICAgICAgcGxhblN1YnNjcmlwdGlvbklkOiBzdHJpcGVTdWJzY3JpcHRpb24uaWQsXG4gICAgICB1c2VyQWNjZXNzOiBQTFVTX1BMQU5fQUNDRVNTXG4gICAgfTtcbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigodXNlcjogVXNlclR5cGUpID0+IHVzZXIpO1xuICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICBhd2FpdCBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAncGF5bWVudF9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2F2ZVVzZXJCaWxsaW5nQ2FyZCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkOiBQYXltZW50Q2FyZFR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdzYXZlVXNlckJpbGxpbmdDYXJkJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHN0cmlwZUN1c3RvbWVySWQgPSBhd2FpdCBlbnN1cmVTdHJpcGVDdXN0b21lcklkKGNvbnRleHQpO1xuXG4gIGlmKCFzdHJpcGVDdXN0b21lcklkIHx8ICFzZXNzaW9uSWQpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXROdW1iZXIgPSBwYXJzZUNhcmROdW1iZXIoY2FyZD8uYWNjb3VudE51bWJlcik7XG5cbiAgaWYoZm9ybWF0TnVtYmVyLmxlbmd0aCA8IDEyIHx8IGZvcm1hdE51bWJlci5sZW5ndGggPiAxOSkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX251bWJlcicpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0RXhwTW9udGggPSBwYXJzZU51bShjYXJkPy5leHBNb250aCwgMik7XG5cbiAgaWYoIWZvcm1hdEV4cE1vbnRoKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfZXhwX21vbnRoJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRFeHBZZWFyID0gcGFyc2VDYXJkRXhwWWVhcihjYXJkPy5leHBZZWFyKTtcblxuICBpZighZm9ybWF0RXhwWWVhcikge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX2V4cF95ZWFyJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRDdmMgPSBTdHJpbmcoY2FyZD8uY3ZjIHx8ICcnKS5yZXBsYWNlKC9cXEQvZywgJycpO1xuXG4gIGlmKGZvcm1hdEN2Yy5sZW5ndGggPCAzIHx8IGZvcm1hdEN2Yy5sZW5ndGggPiA0KSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfY3ZjJyk7XG4gIH1cblxuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcbiAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcbiAgY29uc3QgY3VycmVudFN0cmlwZUNhcmRJZCA9IFN0cmluZyhjdXJyZW50VXNlcj8uc3RyaXBlQ2FyZElkIHx8ICcnKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgc3RyaXBlQ2xpZW50LnRva2Vucy5jcmVhdGUoe1xuICAgICAgY2FyZDoge1xuICAgICAgICBjdmM6IGZvcm1hdEN2YyxcbiAgICAgICAgZXhwX21vbnRoOiBTdHJpbmcoZm9ybWF0RXhwTW9udGgpLFxuICAgICAgICBleHBfeWVhcjogU3RyaW5nKGZvcm1hdEV4cFllYXIpLFxuICAgICAgICBuYW1lOiBTdHJpbmcoY2FyZD8uZnVsbE5hbWUgfHwgJycpLnRyaW0oKSB8fCB1bmRlZmluZWQsXG4gICAgICAgIG51bWJlcjogZm9ybWF0TnVtYmVyXG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgbmV3U291cmNlID0gYXdhaXQgc3RyaXBlQ2xpZW50LmN1c3RvbWVycy5jcmVhdGVTb3VyY2Uoc3RyaXBlQ3VzdG9tZXJJZCwge3NvdXJjZTogdG9rZW4uaWR9KTtcbiAgICBjb25zdCBjYXJkU291cmNlID0gbmV3U291cmNlIGFzIHVua25vd24gYXMgQ2FyZDtcbiAgICBjb25zdCBicmFuZCA9IFN0cmluZyhjYXJkU291cmNlLmJyYW5kIHx8ICcnKS50cmltKCk7XG4gICAgY29uc3QgbGFzdDQgPSBTdHJpbmcoY2FyZFNvdXJjZS5sYXN0NCB8fCAnJykudHJpbSgpO1xuICAgIGNvbnN0IHN0cmlwZUNhcmRJZCA9IFN0cmluZyhjYXJkU291cmNlLmlkIHx8ICcnKS50cmltKCk7XG5cbiAgICBhd2FpdCBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLnVwZGF0ZShzdHJpcGVDdXN0b21lcklkLCB7ZGVmYXVsdF9zb3VyY2U6IHN0cmlwZUNhcmRJZH0pO1xuXG4gICAgaWYoY3VycmVudFN0cmlwZUNhcmRJZCAmJiBjdXJyZW50U3RyaXBlQ2FyZElkICE9PSBzdHJpcGVDYXJkSWQpIHtcbiAgICAgIGF3YWl0IHN0cmlwZUNsaWVudC5jdXN0b21lcnMuZGVsZXRlU291cmNlKHN0cmlwZUN1c3RvbWVySWQsIGN1cnJlbnRTdHJpcGVDYXJkSWQpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZTogUGFydGlhbDxVc2VyVHlwZT4gPSB7XG4gICAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgIHN0cmlwZUNhcmRCcmFuZDogYnJhbmQsXG4gICAgICBzdHJpcGVDYXJkSWQsXG4gICAgICBzdHJpcGVDYXJkTGFzdDQ6IGxhc3Q0XG4gICAgfTtcbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcbiAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4gdXNlcik7XG5cbiAgICByZXR1cm4gdXBkYXRlZFVzZXI7XG4gIH0gY2F0Y2goZXJyb3I6IGFueSkge1xuICAgIGF3YWl0IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVc2VyQmlsbGluZ0NhcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlbGV0ZVVzZXJCaWxsaW5nQ2FyZCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IHNlc3Npb25JZH0pO1xuICBjb25zdCBzdHJpcGVDdXN0b21lcklkID0gU3RyaW5nKGN1cnJlbnRVc2VyPy5zdHJpcGVDdXN0b21lcklkIHx8ICcnKTtcbiAgY29uc3Qgc3RyaXBlQ2FyZElkID0gU3RyaW5nKGN1cnJlbnRVc2VyPy5zdHJpcGVDYXJkSWQgfHwgJycpO1xuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICB0cnkge1xuICAgIGlmKHN0cmlwZUN1c3RvbWVySWQgJiYgc3RyaXBlQ2FyZElkKSB7XG4gICAgICBhd2FpdCBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbGV0ZVNvdXJjZShzdHJpcGVDdXN0b21lcklkLCBzdHJpcGVDYXJkSWQpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZTogUGFydGlhbDxVc2VyVHlwZT4gPSB7XG4gICAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICAgIHN0cmlwZUNhcmRCcmFuZDogJycsXG4gICAgICBzdHJpcGVDYXJkSWQ6ICcnLFxuICAgICAgc3RyaXBlQ2FyZExhc3Q0OiAnJ1xuICAgIH07XG4gICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlKSA9PiB1c2VyKTtcbiAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgYXdhaXQgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3BheW1lbnRfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6WyJwYXJzZU51bSIsImNyZWF0ZUhhc2giLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwicGFyc2VTdHJpbmciLCJwYXJzZVZhckNoYXIiLCJhcWwiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJVc2VyRXJyb3IiLCJ1c2VEYiIsImhhc0FjY2Vzc0xldmVsIiwiZ2V0U3RyaXBlQ2xpZW50IiwiZ2V0VXNlckJ5SWQiLCJldmVudENhdGVnb3J5IiwiUExVU19QTEFOX0lEIiwiUExVU19QTEFOX0FNT1VOVCIsIlBMVVNfUExBTl9BQ0NFU1MiLCJhZGRDdXN0b21lckFjY291bnQiLCJjb250ZXh0IiwiYWN0aW9uIiwiZGF0YWJhc2VOYW1lIiwic2Vzc2lvbiIsInVzZXJJZCIsInNlc3Npb25JZCIsInVzZXJuYW1lIiwic3RyaXBlQ2xpZW50IiwiY3VzdG9tZXJzIiwiY3JlYXRlIiwibWV0YWRhdGEiLCJ0aGVuIiwiY3VzdG9tZXIiLCJub3ciLCJEYXRlIiwidXBkYXRlIiwibW9kaWZpZWQiLCJzdHJpcGVDdXN0b21lcklkIiwiaWQiLCJhcWxRcnkiLCJxdWVyeSIsImN1cnNvciIsIm5leHQiLCJ1cGRhdGVkVXNlciIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiREFUQUJBU0VfRVJST1IiLCJhZGRCYW5rQWNjb3VudCIsImJhbmtBY2NvdW50IiwiYWNjb3VudE51bWJlciIsImZ1bGxOYW1lIiwicm91dGluZyIsImZvcm1hdEFjY291bnQiLCJmb3JtYXRGdWxsTmFtZSIsImZvcm1hdFJvdXRpbmciLCJ1c2VyIiwic3RyaXBlQWNjb3VudElkIiwidG9rZW5zIiwiYmFua19hY2NvdW50IiwiYWNjb3VudF9ob2xkZXJfbmFtZSIsImFjY291bnRfaG9sZGVyX3R5cGUiLCJhY2NvdW50X251bWJlciIsImNvdW50cnkiLCJjdXJyZW5jeSIsInJvdXRpbmdfbnVtYmVyIiwidG9rZW4iLCJjcmVhdGVTb3VyY2UiLCJzb3VyY2UiLCJhY2NvdW50IiwiYmFua0Z1bGxOYW1lIiwiYmFua0lkIiwiYmFua1JvdXRpbmciLCJtc2ciLCJtZXNzYWdlIiwiYWRkQ3JlZGl0Q2FyZCIsImNhcmQiLCJjaXR5IiwiY3ZjIiwiZXhwTW9udGgiLCJleHBZZWFyIiwic3RyZWV0MSIsInN0cmVldDIiLCJzdGF0ZSIsInppcCIsImZvcm1hdE51bWJlciIsImZvcm1hdEV4cE1vbnRoIiwiZm9ybWF0RXhwWWVhciIsImZvcm1hdEN2YyIsInBheW1lbnRDYXJkIiwiZm9ybWF0Q2l0eSIsImZvcm1hdENvdW50cnkiLCJmb3JtYXRTdHJlZXQxIiwiZm9ybWF0U3RyZWV0MiIsImZvcm1hdFN0YXRlIiwiZm9ybWF0WmlwIiwiYWRkcmVzc19jaXR5IiwiYWRkcmVzc19jb3VudHJ5IiwiYWRkcmVzc19saW5lMSIsImFkZHJlc3NfbGluZTIiLCJhZGRyZXNzX3N0YXRlIiwiYWRkcmVzc196aXAiLCJ0b1N0cmluZyIsImV4cF9tb250aCIsImV4cF95ZWFyIiwibmFtZSIsIm51bWJlciIsIm5ld1NvdXJjZSIsImNhcmRTb3VyY2UiLCJicmFuZCIsImN2Y0NoZWNrIiwiY3ZjX2NoZWNrIiwibGFzdDQiLCJpbnNlcnQiLCJfa2V5IiwiYWRkZWQiLCJpbnNlcnRBcWxRcnkiLCJuZXdDYXJkIiwiX2lkIiwiY2FyZElkIiwiY2FyZEtleSIsImVkZ2VDb2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsImVkZ2VJZCIsImVkZ2UiLCJfZnJvbSIsIl90byIsInNhdmUiLCJyZXR1cm5OZXciLCJ1cGRhdGVDcmVkaXRDYXJkIiwiZm9ybWF0SWQiLCJyZXN1bHRzIiwidXBkYXRlZENhcmQiLCJzdHJpcGVJZCIsInVwZGF0ZVNvdXJjZSIsImNvbnNvbGUiLCJsb2ciLCJnZXRDcmVkaXRDYXJkcyIsImFsbCIsImxpc3QiLCJkZWxldGVDcmVkaXRDYXJkIiwiZm9ybWF0Q2FyZElkIiwicmVzdWx0Iiwib3V0RWRnZXMiLCJyZXNwb25zZSIsImVkZ2VzIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiUHJvbWlzZSIsIm1hcCIsImVkZ2VLZXkiLCJyZW1vdmVBcWxRcnkiLCJkZWxldGVTb3VyY2UiLCJkZWxldGVCYW5rQWNjb3VudCIsInJlc29sdmUiLCJjcmVhdGVQYXltZW50VHJhbnNmZXIiLCJ0cmFuc2ZlciIsImFtb3VudCIsImZvcm1hdEFtb3VudCIsImZvcm1hdEN1cnJlbmN5IiwidG9VcHBlckNhc2UiLCJ0cmFuc2ZlcnMiLCJkZXN0aW5hdGlvbiIsInN0cmlwZVRyYW5zZmVyIiwibmV3VHJhbnNmZXIiLCJjcmVhdGVQYXltZW50SG9sZCIsInBheW1lbnQiLCJjYXB0dXJlIiwiZGVzY3JpcHRpb24iLCJjaGFyZ2VzIiwic3RyaXBlQ2hhcmdlIiwiY2hhcmdlRmFpbENvZGUiLCJmYWlsdXJlX2NvZGUiLCJjaGFyZ2VGYWlsTXNnIiwiZmFpbHVyZV9tZXNzYWdlIiwiY2hhcmdlSWQiLCJjaGFyZ2VTdGF0dXMiLCJzdGF0dXMiLCJuZXdQYXltZW50IiwiZW5zdXJlU3RyaXBlQ3VzdG9tZXJJZCIsIlN0cmluZyIsInBhcnNlQ2FyZE51bWJlciIsInJlcGxhY2UiLCJwYXJzZUNhcmRFeHBZZWFyIiwicGFyc2VkWWVhciIsImVuc3VyZVBsdXNTdHJpcGVQbGFuIiwicGxhbnMiLCJyZXRyaWV2ZSIsImludGVydmFsIiwiaW50ZXJ2YWxfY291bnQiLCJwbGFuSWQiLCJ0eXBlIiwicHJvZHVjdCIsInVwZ3JhZGVVc2VyVG9QbHVzIiwiY3VycmVudFVzZXIiLCJwbGFuU3Vic2NyaXB0aW9uSWQiLCJzdHJpcGVDYXJkSWQiLCJzdHJpcGVQbGFuSWQiLCJzdHJpcGVTdWJzY3JpcHRpb24iLCJzdWJzY3JpcHRpb25zIiwiaXRlbXMiLCJwbGFuIiwic3RyaXBlUGVyaW9kRW5kIiwiTnVtYmVyIiwiY3VycmVudF9wZXJpb2RfZW5kIiwicGxhbkV4cGlyZXMiLCJwbGFuU3RhdHVzIiwidXNlckFjY2VzcyIsInNhdmVVc2VyQmlsbGluZ0NhcmQiLCJjdXJyZW50U3RyaXBlQ2FyZElkIiwidHJpbSIsInVuZGVmaW5lZCIsImRlZmF1bHRfc291cmNlIiwic3RyaXBlQ2FyZEJyYW5kIiwic3RyaXBlQ2FyZExhc3Q0IiwiZGVsZXRlVXNlckJpbGxpbmdDYXJkIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxRQUFRLFFBQU8sK0JBQStCO0FBQ3RELFNBQVFDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxPQUFPLEVBQUVDLFdBQVcsRUFBRUMsWUFBWSxRQUFPLCtCQUErQjtBQUN2RyxTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUs3QixTQUFRQyxVQUFVLFFBQU8sMEJBQTBCO0FBR25ELFNBQVFDLFFBQVEsRUFBRUMsU0FBUyxRQUFPLDZCQUE2QjtBQUMvRCxTQUFRQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ2hELFNBQVFDLGNBQWMsUUFBTywyQkFBMkI7QUFDeEQsU0FBUUMsZUFBZSxRQUFPLDBCQUEwQjtBQUN4RCxTQUFRQyxXQUFXLFFBQU8sYUFBYTtBQUl2QyxNQUFNQyxnQkFBZ0I7QUFDdEIsTUFBTUMsZUFBZTtBQUNyQixNQUFNQyxtQkFBbUI7QUFDekIsTUFBTUMsbUJBQW1CO0FBRXpCLE9BQU8sTUFBTUMscUJBQXFCLENBQUNDO0lBQ2pDLE1BQU1DLFNBQVM7SUFDZixNQUFNLEVBQUNDLFlBQVksRUFBRUMsU0FBUyxFQUFDQyxRQUFRQyxTQUFTLEVBQUVD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
|
|
606
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC9ubGFicy1yZWFrdG9yLXJlbGVhc2UuZU1RNVNoL2NoZWNrb3V0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2FjdGlvbnMvcGF5bWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7cGFyc2VOdW19IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL251bWJlcnMnO1xuaW1wb3J0IHtwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgc3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7QmlsbGluZ1NldHVwU2Vzc2lvbk9wdGlvbnMsIFBheW1lbnRCYW5rQWNjb3VudCwgUGF5bWVudENhcmRUeXBlLCBQYXltZW50Q2hhcmdlLCBQYXltZW50VHJhbnNmZXJ9IGZyb20gJy4uL3R5cGVzL3BheW1lbnRzLnR5cGVzLmpzJztcbmltcG9ydCB7VXNlclR5cGV9IGZyb20gJy4uL3R5cGVzL3VzZXJzLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3IsIFVzZXJFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2hhc0FjY2Vzc0xldmVsfSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMuanMnO1xuaW1wb3J0IHtnZXRTdHJpcGVDbGllbnR9IGZyb20gJy4uL3V0aWxzL3N0cmlwZVV0aWxzLmpzJztcbmltcG9ydCB7Z2V0VXNlckJ5SWR9IGZyb20gJy4vdXNlcnMuanMnO1xuXG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAncGF5bWVudHMnO1xuY29uc3QgUExVU19QTEFOX0lEID0gJ3BoYW50YXplLXBsdXMtbW9udGhseSc7XG5jb25zdCBQTFVTX1BMQU5fQU1PVU5UID0gMTAwMDtcbmNvbnN0IFBMVVNfUExBTl9BQ0NFU1MgPSAxO1xuXG5leHBvcnQgY29uc3QgYWRkQ3VzdG9tZXJBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZEN1c3RvbWVyQWNjb3VudCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9ID0ge319ID0gY29udGV4dDtcblxuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgIC5jcmVhdGUoe1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWQsXG4gICAgICAgIHVzZXJuYW1lXG4gICAgICB9XG4gICAgfSBhcyBhbnkpXG4gICAgLnRoZW4oKGN1c3RvbWVyKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgc2Vzc2lvblxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHVwZGF0ZTogVXNlclR5cGUgPSB7XG4gICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgIHN0cmlwZUN1c3RvbWVySWQ6IGN1c3RvbWVyLmlkXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigodXBkYXRlZFVzZXI6IFVzZXJUeXBlKSA9PiAhIXVwZGF0ZWRVc2VyKVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkQmFua0FjY291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgYmFua0FjY291bnQ6IFBheW1lbnRCYW5rQWNjb3VudCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkUGF5bWVudEFjY291bnRCYW5rJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG5cbiAgLy8gUGFyYW1zXG4gIGNvbnN0IHtcbiAgICBhY2NvdW50TnVtYmVyLFxuICAgIGZ1bGxOYW1lLFxuICAgIHJvdXRpbmdcbiAgfSA9IGJhbmtBY2NvdW50O1xuXG4gIGNvbnN0IGZvcm1hdEFjY291bnQgPSBwYXJzZVN0cmluZyhhY2NvdW50TnVtYmVyLCAzMik7XG5cbiAgaWYoZm9ybWF0QWNjb3VudCA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9hY2NvdW50X251bWJlcicpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0RnVsbE5hbWUgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDEyOCk7XG5cbiAgaWYoZm9ybWF0RnVsbE5hbWUgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfZnVsbF9uYW1lJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRSb3V0aW5nID0gcGFyc2VTdHJpbmcocm91dGluZywgMzIpO1xuXG4gIGlmKGZvcm1hdFJvdXRpbmcgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfcm91dGluZ19udW1iZXInKTtcbiAgfVxuXG4gIHJldHVybiBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH0gPSB1c2VyO1xuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIHRva2VuIGZpcnN0LCB0aGVuIHVzZSB0aGUgdG9rZW4gYXMgdGhlIHNvdXJjZVxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC50b2tlbnMuY3JlYXRlKHtcbiAgICAgICAgYmFua19hY2NvdW50OiB7XG4gICAgICAgICAgYWNjb3VudF9ob2xkZXJfbmFtZTogZm9ybWF0RnVsbE5hbWUsXG4gICAgICAgICAgYWNjb3VudF9ob2xkZXJfdHlwZTogJ2luZGl2aWR1YWwnLFxuICAgICAgICAgIGFjY291bnRfbnVtYmVyOiBmb3JtYXRBY2NvdW50LFxuICAgICAgICAgIGNvdW50cnk6ICdVUycsXG4gICAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICAgIHJvdXRpbmdfbnVtYmVyOiBmb3JtYXRSb3V0aW5nXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAgIC50aGVuKCh0b2tlbikgPT4gc3RyaXBlQ2xpZW50LmN1c3RvbWVycy5jcmVhdGVTb3VyY2UoXG4gICAgICAgICAgc3RyaXBlQWNjb3VudElkLFxuICAgICAgICAgIHtzb3VyY2U6IHRva2VuLmlkfVxuICAgICAgICApKVxuICAgICAgICAudGhlbigoYWNjb3VudCkgPT4ge1xuICAgICAgICAgIC8vIFVzZSB0eXBlIGFzc2VydGlvbiBmb3IgY2FyZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgLy8gY29uc3QgY2FyZFNvdXJjZSA9IGFjY291bnQgYXMgdW5rbm93biBhcyBDYXJkO1xuICAgICAgICAgIC8vIGNvbnN0IGJyYW5kID0gY2FyZFNvdXJjZS5icmFuZCB8fCAnJztcbiAgICAgICAgICAvLyBjb25zdCBjdmNDaGVjayA9IGNhcmRTb3VyY2UuY3ZjX2NoZWNrIHx8ICcnO1xuICAgICAgICAgIC8vIGNvbnN0IGxhc3Q0ID0gY2FyZFNvdXJjZS5sYXN0NCB8fCAnJztcblxuICAgICAgICAgIC8vIENyZWF0ZSBzZXNzaW9uXG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCB1cGRhdGUgPSB7XG4gICAgICAgICAgICBiYW5rQWNjb3VudCxcbiAgICAgICAgICAgIGJhbmtGdWxsTmFtZTogZm9ybWF0RnVsbE5hbWUsXG4gICAgICAgICAgICBiYW5rSWQ6IGFjY291bnQuaWQsXG4gICAgICAgICAgICBiYW5rUm91dGluZzogZm9ybWF0Um91dGluZyxcbiAgICAgICAgICAgIG1vZGlmaWVkOiBub3dcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKHVwZGF0ZWRVc2VyOiBVc2VyVHlwZSkgPT4gdXBkYXRlZFVzZXIpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IGVycm9yLm1lc3NhZ2U7XG5cbiAgICAgICAgICBpZihtc2cgPT09ICdBIGJhbmsgYWNjb3VudCB3aXRoIHRoYXQgcm91dGluZyBudW1iZXIgYW5kIGFjY291bnQgbnVtYmVyICcgK1xuICAgICAgICAgICAgJ2FscmVhZHkgZXhpc3RzIGZvciB0aGlzIGN1c3RvbWVyLicpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICAgIGxhYmVsOiAnYmFua19hY2NvdW50X2V4aXN0cydcbiAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICBsYWJlbDogJ3BheW1lbnRfZXJyb3InXG4gICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUNyZWRpdENhcmQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgY2FyZDogUGF5bWVudENhcmRUeXBlKTogUHJvbWlzZTxQYXltZW50Q2FyZFR5cGU+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHtcbiAgICBjaXR5LFxuICAgIGNvdW50cnksXG4gICAgZXhwTW9udGgsXG4gICAgZXhwWWVhcixcbiAgICBmdWxsTmFtZSxcbiAgICBpZCxcbiAgICBzdHJlZXQxLFxuICAgIHN0YXRlLFxuICAgIHppcFxuICB9OiBQYXltZW50Q2FyZFR5cGUgPSBjYXJkO1xuXG4gIGNvbnN0IGZvcm1hdElkID0gcGFyc2VJZChpZCk7XG5cbiAgaWYoZm9ybWF0SWQpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9pZCcpO1xuICB9XG5cbiAgY29uc3QgcGF5bWVudENhcmQ6IFBheW1lbnRDYXJkVHlwZSA9IHt9O1xuICBjb25zdCBmb3JtYXRFeHBNb250aCA9IHBhcnNlTnVtKGV4cE1vbnRoLCAyKTtcbiAgY29uc3QgZm9ybWF0RXhwWWVhciA9IHBhcnNlTnVtKGV4cFllYXIsIDIpO1xuICBjb25zdCBmb3JtYXRDaXR5ID0gcGFyc2VWYXJDaGFyKGNpdHksIDMyKTtcbiAgY29uc3QgZm9ybWF0Q291bnRyeSA9IHBhcnNlQ2hhcihjb3VudHJ5LCAyKTtcbiAgY29uc3QgZm9ybWF0RnVsbE5hbWUgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDMyKTtcbiAgY29uc3QgZm9ybWF0U3RyZWV0MSA9IHBhcnNlU3RyaW5nKHN0cmVldDEsIDMyKTtcbiAgY29uc3QgZm9ybWF0U3RhdGUgPSBwYXJzZUNoYXIoc3RhdGUsIDIpO1xuICBjb25zdCBmb3JtYXRaaXAgPSBwYXJzZVZhckNoYXIoemlwLCAxMCk7XG5cbiAgaWYoZm9ybWF0RXhwTW9udGgpIHtcbiAgICBwYXltZW50Q2FyZC5leHBNb250aCA9IGZvcm1hdEV4cE1vbnRoO1xuICB9XG5cbiAgaWYoZm9ybWF0RXhwWWVhcikge1xuICAgIHBheW1lbnRDYXJkLmV4cFllYXIgPSBmb3JtYXRFeHBZZWFyO1xuICB9XG5cbiAgaWYoZm9ybWF0Q2l0eSkge1xuICAgIHBheW1lbnRDYXJkLmNpdHkgPSBmb3JtYXRDaXR5O1xuICB9XG5cbiAgaWYoZm9ybWF0Q291bnRyeSkge1xuICAgIHBheW1lbnRDYXJkLmNvdW50cnkgPSBmb3JtYXRDb3VudHJ5O1xuICB9XG5cbiAgaWYoZm9ybWF0RnVsbE5hbWUpIHtcbiAgICBwYXltZW50Q2FyZC5mdWxsTmFtZSA9IGZvcm1hdEZ1bGxOYW1lO1xuICB9XG5cbiAgaWYoZm9ybWF0U3RyZWV0MSkge1xuICAgIHBheW1lbnRDYXJkLnN0cmVldDEgPSBmb3JtYXRTdHJlZXQxO1xuICB9XG5cbiAgaWYoZm9ybWF0U3RhdGUpIHtcbiAgICBwYXltZW50Q2FyZC5zdGF0ZSA9IGZvcm1hdFN0YXRlO1xuICB9XG5cbiAgaWYoZm9ybWF0WmlwKSB7XG4gICAgcGF5bWVudENhcmQuemlwID0gZm9ybWF0WmlwO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlID0gcGF5bWVudENhcmQ7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgICBMRVQgdXBkYXRlZENhcmQgPSBGSVJTVChcbiAgICAgICAgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgICAgRklMVEVSIGMuX2tleSA9PSAke2Zvcm1hdElkfSAmJiBjLnVzZXJJZCA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgVVBEQVRFIGMgV0lUSCAke3VwZGF0ZX0gSU4gY3JlZGl0Q2FyZHNcbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gTkVXXG4gICAgICApXG4gICAgICBMRVQgdXNlciA9IEZJUlNUKFxuICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFJFVFVSTiB1XG4gICAgICApXG4gICAgICBSRVRVUk4ge3VzZXI6IHVzZXIsIGNhcmQ6IHVwZGF0ZWRDYXJkfWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHJlc3VsdHMgPSB7Y2FyZDoge30sIHVzZXI6IHt9fSkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZENhcmQ6IFBheW1lbnRDYXJkVHlwZSA9IHJlc3VsdHMuY2FyZDtcbiAgICAgIGNvbnN0IHt1c2VyfSA9IHJlc3VsdHM7XG5cbiAgICAgIGlmKCF1cGRhdGVkQ2FyZCkge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdub3RfZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge3N0cmlwZUN1c3RvbWVySWR9ID0gdXNlcjtcbiAgICAgIGNvbnN0IHtzdHJpcGVJZH0gPSBjYXJkO1xuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG4gICAgICBjb25zdCB1cGRhdGU6IHN0cmlwZS5DdXN0b21lclVwZGF0ZVNvdXJjZVBhcmFtcyA9IHtcbiAgICAgICAgYWRkcmVzc19jaXR5OiBmb3JtYXRDaXR5LFxuICAgICAgICBhZGRyZXNzX2NvdW50cnk6IGZvcm1hdENvdW50cnksXG4gICAgICAgIGFkZHJlc3NfbGluZTE6IGZvcm1hdFN0cmVldDEsXG4gICAgICAgIGFkZHJlc3Nfc3RhdGU6IGZvcm1hdFN0YXRlLFxuICAgICAgICBhZGRyZXNzX3ppcDogZm9ybWF0WmlwLFxuICAgICAgICBleHBfbW9udGg6IGZvcm1hdEV4cE1vbnRoLnRvU3RyaW5nKCksXG4gICAgICAgIGV4cF95ZWFyOiBmb3JtYXRFeHBZZWFyLnRvU3RyaW5nKCksXG4gICAgICAgIG5hbWU6IGZvcm1hdEZ1bGxOYW1lXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAudXBkYXRlU291cmNlKHN0cmlwZUN1c3RvbWVySWQsIHN0cmlwZUlkLCB1cGRhdGUpXG4gICAgICAgIC50aGVuKCgpID0+IGNhcmQpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjp1cGRhdGVDYXJkOjplcnJvcicsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENyZWRpdENhcmRzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPFBheW1lbnRDYXJkVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRDcmVkaXRDYXJkcyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgYyBJTiBjcmVkaXRDYXJkc1xuICAgIEZJTFRFUiBjLnVzZXJJZCA9PSAke3Nlc3Npb25JZH1cbiAgICBSRVRVUk4gY2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigobGlzdDogUGF5bWVudENhcmRUeXBlW10gPSBbXSkgPT4gbGlzdClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVDcmVkaXRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmRJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0Q2FyZElkID0gcGFyc2VJZChjYXJkSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIExFVCBjYXJkID0gRklSU1QoXG4gICAgICBGT1IgYyBJTiBjcmVkaXRDYXJkc1xuICAgICAgRklMVEVSIGMuX2tleSA9PSAke2Zvcm1hdENhcmRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgYyBJTiBjcmVkaXRDYXJkc1xuICAgICAgUkVUVVJOIE9MRFxuICAgIClcbiAgICBMRVQgdXNlciA9IEZJUlNUKFxuICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gdVxuICAgIClcbiAgICBSRVRVUk4ge3VzZXI6IHVzZXIsIGNhcmQ6IGNhcmR9YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocmVzdWx0ID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGlmKCFyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7Y2FyZCwgdXNlcn0gPSByZXN1bHQ7XG4gICAgICBjb25zdCB7X2tleTogY2FyZEtleX0gPSBjYXJkO1xuXG4gICAgICAvLyBSZW1vdmUgbGlua2VkIGVkZ2VzXG4gICAgICBjb25zdCBlZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaGFzUGF5bWVudCcpO1xuXG4gICAgICByZXR1cm4gZWRnZUNvbGxlY3Rpb24ub3V0RWRnZXMoY2FyZEtleSwge30pXG4gICAgICAgIC50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIC8vIEV4dHJhY3QgZWRnZXMgZnJvbSB0aGUgcmVzcG9uc2VcbiAgICAgICAgICBjb25zdCBlZGdlcyA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UpID8gcmVzcG9uc2UgOiBbXTtcblxuICAgICAgICAgIGlmKGVkZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGVkZ2VzLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtfa2V5OiBlZGdlS2V5fSA9IGVkZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBSRU1PVkUge19rZXk6JHtlZGdlS2V5fX0gSU4gaGFzUGF5bWVudGA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkocmVtb3ZlQXFsUXJ5KTtcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTdHJpcGVcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgICAgICAgICAgICAuZGVsZXRlU291cmNlKHVzZXIuc3RyaXBlQ3VzdG9tZXJJZCwgY2FyZC5zdHJpcGVJZClcbiAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncGF5bWVudHM6OmRlbGV0ZUNhcmQ6OmVycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQmFua0FjY291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgYmFua0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIC8vIENsZWFuIGRiXG4gIGNvbnN0IHVwZGF0ZTogVXNlclR5cGUgPSB7XG4gICAgYmFua0FjY291bnQ6ICcnLFxuICAgIGJhbmtGdWxsTmFtZTogJycsXG4gICAgYmFua0lkOiAnJyxcbiAgICBiYW5rUm91dGluZzogJycsXG4gICAgbW9kaWZpZWQ6IERhdGUubm93KClcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlKSA9PiB7XG4gICAgICBjb25zdCB7c3RyaXBlQWNjb3VudElkfSA9IHVzZXI7XG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgLmRlbGV0ZVNvdXJjZShzdHJpcGVBY2NvdW50SWQsIGJhbmtJZClcbiAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgLmNhdGNoKCgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBheW1lbnRUcmFuc2ZlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0cmFuc2ZlcjogUGF5bWVudFRyYW5zZmVyKTogUHJvbWlzZTxQYXltZW50VHJhbnNmZXI+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7YW1vdW50LCBjdXJyZW5jeX0gPSB0cmFuc2ZlcjtcbiAgY29uc3QgZm9ybWF0QW1vdW50ID0gcGFyc2VOdW0oYW1vdW50KTtcbiAgY29uc3QgZm9ybWF0Q3VycmVuY3kgPSBwYXJzZUNoYXIoY3VycmVuY3ksIDMsICdVU0QnKS50b1VwcGVyQ2FzZSgpO1xuXG4gIHJldHVybiBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH0gPSB1c2VyO1xuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQudHJhbnNmZXJzXG4gICAgICAgIC5jcmVhdGUoe1xuICAgICAgICAgIGFtb3VudDogZm9ybWF0QW1vdW50LFxuICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgICBkZXN0aW5hdGlvbjogc3RyaXBlQWNjb3VudElkXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChzdHJpcGVUcmFuc2ZlcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHN0cmlwZVRyYW5zZmVyKTtcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGluc2VydDogUGF5bWVudFRyYW5zZmVyID0ge1xuICAgICAgICAgICAgYWRkZWQ6IG5vdyxcbiAgICAgICAgICAgIGFtb3VudDogZm9ybWF0QW1vdW50LFxuICAgICAgICAgICAgY3VycmVuY3k6IGZvcm1hdEN1cnJlbmN5LFxuICAgICAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gdHJhbnNmZXJzIFJFVFVSTiBORVdgO1xuXG4gICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgICAgIC50aGVuKChuZXdUcmFuc2ZlcjogUGF5bWVudFRyYW5zZmVyKSA9PiBuZXdUcmFuc2Zlcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBheW1lbnRIb2xkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBheW1lbnQ6IFBheW1lbnRDaGFyZ2UpOiBQcm9taXNlPFBheW1lbnRDaGFyZ2U+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7YW1vdW50LCBjYXB0dXJlLCBjYXJkSWQsIGN1cnJlbmN5LCBkZXNjcmlwdGlvbn0gPSBwYXltZW50O1xuICBjb25zdCBmb3JtYXRDdXJyZW5jeSA9IHBhcnNlQ2hhcihjdXJyZW5jeSwgMywgJ1VTRCcpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gIHJldHVybiBzdHJpcGVDbGllbnQuY2hhcmdlc1xuICAgIC5jcmVhdGUoe1xuICAgICAgYW1vdW50LFxuICAgICAgY2FwdHVyZSxcbiAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgc291cmNlOiBjYXJkSWRcbiAgICB9KVxuICAgIC50aGVuKChzdHJpcGVDaGFyZ2UpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBpbnNlcnQ6IFBheW1lbnRDaGFyZ2UgPSB7XG4gICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgIGFtb3VudCxcbiAgICAgICAgY2FwdHVyZSxcbiAgICAgICAgY2FyZElkLFxuICAgICAgICBjaGFyZ2VGYWlsQ29kZTogc3RyaXBlQ2hhcmdlLmZhaWx1cmVfY29kZSxcbiAgICAgICAgY2hhcmdlRmFpbE1zZzogc3RyaXBlQ2hhcmdlLmZhaWx1cmVfbWVzc2FnZSxcbiAgICAgICAgY2hhcmdlSWQ6IHN0cmlwZUNoYXJnZS5pZCxcbiAgICAgICAgY2hhcmdlU3RhdHVzOiBzdHJpcGVDaGFyZ2Uuc3RhdHVzLFxuICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBwYXltZW50cyBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigobmV3UGF5bWVudDogUGF5bWVudENoYXJnZSkgPT4gbmV3UGF5bWVudCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjpjcmVhdGVIb2xkOjplcnJvcicsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGVuc3VyZVN0cmlwZUN1c3RvbWVySWQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHNlc3Npb25JZCA9IFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpO1xuICBsZXQgdXNlciA9IGF3YWl0IGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IHNlc3Npb25JZH0pO1xuXG4gIGlmKCF1c2VyPy5zdHJpcGVDdXN0b21lcklkKSB7XG4gICAgYXdhaXQgYWRkQ3VzdG9tZXJBY2NvdW50KGNvbnRleHQpO1xuICAgIHVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcodXNlcj8uc3RyaXBlQ3VzdG9tZXJJZCB8fCAnJyk7XG59O1xuXG5jb25zdCBnZXRDb25maWd1cmVkQmlsbGluZ09yaWdpbnMgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFNldDxzdHJpbmc+ID0+IHtcbiAgY29uc3QgY29uZmlndXJlZE9yaWdpbnMgPSBTdHJpbmcocHJvY2Vzcy5lbnYuU1RSSVBFX1JFVFVSTl9VUkxfT1JJR0lOUyB8fCAnJylcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKG9yaWdpbikgPT4gb3JpZ2luLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCBhcHBVcmwgPSBTdHJpbmcoY29udGV4dC5jb25maWc/LmRldGFpbHM/LnVybCB8fCAnJykudHJpbSgpO1xuXG4gIGlmKGFwcFVybCkge1xuICAgIGNvbmZpZ3VyZWRPcmlnaW5zLnB1c2goYXBwVXJsLmluY2x1ZGVzKCc6Ly8nKSA/IGFwcFVybCA6IGBodHRwczovLyR7YXBwVXJsfWApO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZXQoY29uZmlndXJlZE9yaWdpbnMubWFwKChvcmlnaW4pID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBVUkwob3JpZ2luKS5vcmlnaW47XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9KS5maWx0ZXIoQm9vbGVhbikpO1xufTtcblxuY29uc3QgcGFyc2VCaWxsaW5nUmV0dXJuVXJsID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHJldHVyblVybDogc3RyaW5nKTogVVJMID0+IHtcbiAgbGV0IHBhcnNlZFVybDogVVJMO1xuXG4gIHRyeSB7XG4gICAgcGFyc2VkVXJsID0gbmV3IFVSTChTdHJpbmcocmV0dXJuVXJsIHx8ICcnKS50cmltKCkpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdpbnZhbGlkX2JpbGxpbmdfcmV0dXJuX3VybCcpO1xuICB9XG5cbiAgY29uc3QgaXNMb2NhbERldmVsb3BtZW50VXJsID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cDonXG4gICAgJiYgWycxMjcuMC4wLjEnLCAnbG9jYWxob3N0J10uaW5jbHVkZXMocGFyc2VkVXJsLmhvc3RuYW1lKTtcbiAgY29uc3QgaXNTZWN1cmVVcmwgPSBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICBjb25zdCBhbGxvd2VkT3JpZ2lucyA9IGdldENvbmZpZ3VyZWRCaWxsaW5nT3JpZ2lucyhjb250ZXh0KTtcblxuICBpZigoIWlzU2VjdXJlVXJsICYmICFpc0xvY2FsRGV2ZWxvcG1lbnRVcmwpIHx8ICghaXNMb2NhbERldmVsb3BtZW50VXJsICYmICFhbGxvd2VkT3JpZ2lucy5oYXMocGFyc2VkVXJsLm9yaWdpbikpKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcignaW52YWxpZF9iaWxsaW5nX3JldHVybl91cmwnKTtcbiAgfVxuXG4gIHBhcnNlZFVybC5oYXNoID0gJyc7XG4gIHJldHVybiBwYXJzZWRVcmw7XG59O1xuXG5jb25zdCBnZXRDaGVja291dFJldHVyblVybCA9IChyZXR1cm5Vcmw6IFVSTCwgc3RhdHVzOiAnY2FuY2VsZWQnIHwgJ3N1Y2Nlc3MnKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmV4dFVybCA9IG5ldyBVUkwocmV0dXJuVXJsLnRvU3RyaW5nKCkpO1xuXG4gIG5leHRVcmwuc2VhcmNoUGFyYW1zLnNldCgnYmlsbGluZycsIHN0YXR1cyk7XG4gIGlmKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgbmV4dFVybC5zZWFyY2hQYXJhbXMuc2V0KCdzZXNzaW9uX2lkJywgJ3tDSEVDS09VVF9TRVNTSU9OX0lEfScpO1xuICB9XG5cbiAgcmV0dXJuIG5leHRVcmwudG9TdHJpbmcoKS5yZXBsYWNlKCclN0JDSEVDS09VVF9TRVNTSU9OX0lEJTdEJywgJ3tDSEVDS09VVF9TRVNTSU9OX0lEfScpO1xufTtcblxuY29uc3QgdXBkYXRlVXNlckJpbGxpbmdQYXltZW50TWV0aG9kID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1cGRhdGU6IFBhcnRpYWw8VXNlclR5cGU+XG4pOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IHNlc3Npb25JZCA9IFN0cmluZyhjb250ZXh0LnNlc3Npb24/LnVzZXJJZCB8fCAnJykudHJpbSgpO1xuICBjb25zdCB1c2VyVXBkYXRlOiBQYXJ0aWFsPFVzZXJUeXBlPiA9IHttb2RpZmllZDogRGF0ZS5ub3coKSwgLi4udXBkYXRlfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1c2VyVXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlKSA9PiB1c2VyKTtcbn07XG5cbmNvbnN0IGVuc3VyZVBsdXNTdHJpcGVQbGFuID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IGdldFN0cmlwZUNsaWVudCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgc3RyaXBlQ2xpZW50LnBsYW5zLnJldHJpZXZlKFBMVVNfUExBTl9JRCk7XG4gICAgcmV0dXJuIFBMVVNfUExBTl9JRDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGF3YWl0IHN0cmlwZUNsaWVudC5wbGFucy5jcmVhdGUoe1xuICAgICAgYW1vdW50OiBQTFVTX1BMQU5fQU1PVU5ULFxuICAgICAgY3VycmVuY3k6ICd1c2QnLFxuICAgICAgaWQ6IFBMVVNfUExBTl9JRCxcbiAgICAgIGludGVydmFsOiAnbW9udGgnLFxuICAgICAgaW50ZXJ2YWxfY291bnQ6IDEsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBwbGFuSWQ6ICdwbHVzJyxcbiAgICAgICAgdHlwZTogJ2FjY291bnQnXG4gICAgICB9LFxuICAgICAgcHJvZHVjdDoge1xuICAgICAgICBuYW1lOiAnUGhhbnRhemUgUGx1cydcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBQTFVTX1BMQU5fSUQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB1cGdyYWRlVXNlclRvUGx1cyA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBncmFkZVVzZXJUb1BsdXMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcblxuICBpZighc2Vzc2lvbklkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcignaW52YWxpZF9zZXNzaW9uJyk7XG4gIH1cblxuICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IHNlc3Npb25JZH0pO1xuXG4gIGlmKGhhc0FjY2Vzc0xldmVsKGN1cnJlbnRVc2VyLCBQTFVTX1BMQU5fQUNDRVNTKSAmJiBjdXJyZW50VXNlcj8ucGxhblN1YnNjcmlwdGlvbklkKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRVc2VyO1xuICB9XG5cbiAgaWYoIWN1cnJlbnRVc2VyPy5zdHJpcGVDYXJkSWQpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9iaWxsaW5nX2NhcmQnKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3RyaXBlQ3VzdG9tZXJJZCA9IGF3YWl0IGVuc3VyZVN0cmlwZUN1c3RvbWVySWQoY29udGV4dCk7XG5cbiAgICBpZighc3RyaXBlQ3VzdG9tZXJJZCkge1xuICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmlwZVBsYW5JZCA9IGF3YWl0IGVuc3VyZVBsdXNTdHJpcGVQbGFuKCk7XG4gICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG4gICAgY29uc3Qgc3RyaXBlU3Vic2NyaXB0aW9uID0gYXdhaXQgc3RyaXBlQ2xpZW50LnN1YnNjcmlwdGlvbnMuY3JlYXRlKHtcbiAgICAgIGN1c3RvbWVyOiBzdHJpcGVDdXN0b21lcklkLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHBsYW46IHN0cmlwZVBsYW5JZFxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcGxhbklkOiAncGx1cycsXG4gICAgICAgIHR5cGU6ICdhY2NvdW50JyxcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzdHJpcGVQZXJpb2RFbmQgPSBOdW1iZXIoKHN0cmlwZVN1YnNjcmlwdGlvbiBhcyBhbnkpPy5jdXJyZW50X3BlcmlvZF9lbmQgfHwgMCk7XG4gICAgY29uc3QgdXBkYXRlOiBQYXJ0aWFsPFVzZXJUeXBlPiA9IHtcbiAgICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpLFxuICAgICAgcGxhbkV4cGlyZXM6IHN0cmlwZVBlcmlvZEVuZCA/IHN0cmlwZVBlcmlvZEVuZCAqIDEwMDAgOiAwLFxuICAgICAgcGxhbklkOiAncGx1cycsXG4gICAgICBwbGFuU3RhdHVzOiBTdHJpbmcoc3RyaXBlU3Vic2NyaXB0aW9uLnN0YXR1cyB8fCAnYWN0aXZlJyksXG4gICAgICBwbGFuU3Vic2NyaXB0aW9uSWQ6IHN0cmlwZVN1YnNjcmlwdGlvbi5pZCxcbiAgICAgIHVzZXJBY2Nlc3M6IFBMVVNfUExBTl9BQ0NFU1NcbiAgICB9O1xuICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7c2Vzc2lvbklkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4gdXNlcik7XG4gIH0gY2F0Y2goZXJyb3I6IGFueSkge1xuICAgIGF3YWl0IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVCaWxsaW5nU2V0dXBTZXNzaW9uID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7cmV0dXJuVXJsfTogQmlsbGluZ1NldHVwU2Vzc2lvbk9wdGlvbnNcbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHNlc3Npb25JZCA9IFN0cmluZyhjb250ZXh0LnNlc3Npb24/LnVzZXJJZCB8fCAnJykudHJpbSgpO1xuXG4gIGlmKCFzZXNzaW9uSWQpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdpbnZhbGlkX3Nlc3Npb24nKTtcbiAgfVxuXG4gIGNvbnN0IHN0cmlwZUN1c3RvbWVySWQgPSBhd2FpdCBlbnN1cmVTdHJpcGVDdXN0b21lcklkKGNvbnRleHQpO1xuXG4gIGlmKCFzdHJpcGVDdXN0b21lcklkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkUmV0dXJuVXJsID0gcGFyc2VCaWxsaW5nUmV0dXJuVXJsKGNvbnRleHQsIHJldHVyblVybCk7XG4gIGNvbnN0IGNoZWNrb3V0U2Vzc2lvbiA9IGF3YWl0IGdldFN0cmlwZUNsaWVudCgpLmNoZWNrb3V0LnNlc3Npb25zLmNyZWF0ZSh7XG4gICAgY2FuY2VsX3VybDogZ2V0Q2hlY2tvdXRSZXR1cm5VcmwocGFyc2VkUmV0dXJuVXJsLCAnY2FuY2VsZWQnKSxcbiAgICBjdXN0b21lcjogc3RyaXBlQ3VzdG9tZXJJZCxcbiAgICBtZXRhZGF0YToge1xuICAgICAgdHlwZTogJ2JpbGxpbmctcGF5bWVudC1tZXRob2QnLFxuICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICB9LFxuICAgIG1vZGU6ICdzZXR1cCcsXG4gICAgcGF5bWVudF9tZXRob2RfdHlwZXM6IFsnY2FyZCddLFxuICAgIHNldHVwX2ludGVudF9kYXRhOiB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICB0eXBlOiAnYmlsbGluZy1wYXltZW50LW1ldGhvZCcsXG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICB9XG4gICAgfSxcbiAgICBzdWNjZXNzX3VybDogZ2V0Q2hlY2tvdXRSZXR1cm5VcmwocGFyc2VkUmV0dXJuVXJsLCAnc3VjY2VzcycpXG4gIH0pO1xuICBjb25zdCBjaGVja291dFVybCA9IFN0cmluZyhjaGVja291dFNlc3Npb24udXJsIHx8ICcnKS50cmltKCk7XG5cbiAgaWYoIWNoZWNrb3V0VXJsKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICB9XG5cbiAgcmV0dXJuIGNoZWNrb3V0VXJsO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbXBsZXRlQmlsbGluZ1NldHVwU2Vzc2lvbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgY2hlY2tvdXRTZXNzaW9uSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBzZXNzaW9uSWQgPSBTdHJpbmcoY29udGV4dC5zZXNzaW9uPy51c2VySWQgfHwgJycpLnRyaW0oKTtcbiAgY29uc3Qgbm9ybWFsaXplZENoZWNrb3V0U2Vzc2lvbklkID0gU3RyaW5nKGNoZWNrb3V0U2Vzc2lvbklkIHx8ICcnKS50cmltKCk7XG5cbiAgaWYoIXNlc3Npb25JZCkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ2ludmFsaWRfc2Vzc2lvbicpO1xuICB9XG5cbiAgaWYoIW5vcm1hbGl6ZWRDaGVja291dFNlc3Npb25JZCkge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ2ludmFsaWRfYmlsbGluZ19zZXR1cF9zZXNzaW9uJyk7XG4gIH1cblxuICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGdldFVzZXJCeUlkKGNvbnRleHQsIHt1c2VySWQ6IHNlc3Npb25JZH0pO1xuICBjb25zdCBzdHJpcGVDdXN0b21lcklkID0gU3RyaW5nKGN1cnJlbnRVc2VyPy5zdHJpcGVDdXN0b21lcklkIHx8ICcnKS50cmltKCk7XG5cbiAgaWYoIXN0cmlwZUN1c3RvbWVySWQpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gIH1cblxuICBjb25zdCBzdHJpcGVDbGllbnQgPSBnZXRTdHJpcGVDbGllbnQoKTtcbiAgY29uc3QgY2hlY2tvdXRTZXNzaW9uID0gYXdhaXQgc3RyaXBlQ2xpZW50LmNoZWNrb3V0LnNlc3Npb25zLnJldHJpZXZlKFxuICAgIG5vcm1hbGl6ZWRDaGVja291dFNlc3Npb25JZCxcbiAgICB7ZXhwYW5kOiBbJ3NldHVwX2ludGVudC5wYXltZW50X21ldGhvZCddfVxuICApO1xuICBjb25zdCBjaGVja291dEN1c3RvbWVySWQgPSB0eXBlb2YgY2hlY2tvdXRTZXNzaW9uLmN1c3RvbWVyID09PSAnc3RyaW5nJ1xuICAgID8gY2hlY2tvdXRTZXNzaW9uLmN1c3RvbWVyXG4gICAgOiBjaGVja291dFNlc3Npb24uY3VzdG9tZXI/LmlkO1xuXG4gIGlmKFxuICAgIGNoZWNrb3V0U2Vzc2lvbi5tb2RlICE9PSAnc2V0dXAnXG4gICAgfHwgY2hlY2tvdXRTZXNzaW9uLnN0YXR1cyAhPT0gJ2NvbXBsZXRlJ1xuICAgIHx8IGNoZWNrb3V0Q3VzdG9tZXJJZCAhPT0gc3RyaXBlQ3VzdG9tZXJJZFxuICAgIHx8IGNoZWNrb3V0U2Vzc2lvbi5tZXRhZGF0YT8udXNlcklkICE9PSBzZXNzaW9uSWRcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcignaW52YWxpZF9iaWxsaW5nX3NldHVwX3Nlc3Npb24nKTtcbiAgfVxuXG4gIGNvbnN0IHNldHVwSW50ZW50ID0gdHlwZW9mIGNoZWNrb3V0U2Vzc2lvbi5zZXR1cF9pbnRlbnQgPT09ICdzdHJpbmcnXG4gICAgPyBhd2FpdCBzdHJpcGVDbGllbnQuc2V0dXBJbnRlbnRzLnJldHJpZXZlKGNoZWNrb3V0U2Vzc2lvbi5zZXR1cF9pbnRlbnQsIHtleHBhbmQ6IFsncGF5bWVudF9tZXRob2QnXX0pXG4gICAgOiBjaGVja291dFNlc3Npb24uc2V0dXBfaW50ZW50O1xuXG4gIGlmKCFzZXR1cEludGVudCB8fCBzZXR1cEludGVudC5zdGF0dXMgIT09ICdzdWNjZWVkZWQnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcignYmlsbGluZ19zZXR1cF9pbmNvbXBsZXRlJyk7XG4gIH1cblxuICBjb25zdCBwYXltZW50TWV0aG9kID0gdHlwZW9mIHNldHVwSW50ZW50LnBheW1lbnRfbWV0aG9kID09PSAnc3RyaW5nJ1xuICAgID8gYXdhaXQgc3RyaXBlQ2xpZW50LnBheW1lbnRNZXRob2RzLnJldHJpZXZlKHNldHVwSW50ZW50LnBheW1lbnRfbWV0aG9kKVxuICAgIDogc2V0dXBJbnRlbnQucGF5bWVudF9tZXRob2Q7XG4gIGNvbnN0IHBheW1lbnRNZXRob2RDdXN0b21lcklkID0gdHlwZW9mIHBheW1lbnRNZXRob2Q/LmN1c3RvbWVyID09PSAnc3RyaW5nJ1xuICAgID8gcGF5bWVudE1ldGhvZC5jdXN0b21lclxuICAgIDogcGF5bWVudE1ldGhvZD8uY3VzdG9tZXI/LmlkO1xuXG4gIGlmKCFwYXltZW50TWV0aG9kIHx8IHBheW1lbnRNZXRob2QudHlwZSAhPT0gJ2NhcmQnIHx8ICFwYXltZW50TWV0aG9kLmNhcmQgfHwgcGF5bWVudE1ldGhvZEN1c3RvbWVySWQgIT09IHN0cmlwZUN1c3RvbWVySWQpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdpbnZhbGlkX2JpbGxpbmdfcGF5bWVudF9tZXRob2QnKTtcbiAgfVxuXG4gIGF3YWl0IHN0cmlwZUNsaWVudC5jdXN0b21lcnMudXBkYXRlKHN0cmlwZUN1c3RvbWVySWQsIHtcbiAgICBpbnZvaWNlX3NldHRpbmdzOiB7ZGVmYXVsdF9wYXltZW50X21ldGhvZDogcGF5bWVudE1ldGhvZC5pZH1cbiAgfSk7XG5cbiAgY29uc3QgY3VycmVudFN0cmlwZUNhcmRJZCA9IFN0cmluZyhjdXJyZW50VXNlcj8uc3RyaXBlQ2FyZElkIHx8ICcnKS50cmltKCk7XG5cbiAgaWYoY3VycmVudFN0cmlwZUNhcmRJZC5zdGFydHNXaXRoKCdwbV8nKSAmJiBjdXJyZW50U3RyaXBlQ2FyZElkICE9PSBwYXltZW50TWV0aG9kLmlkKSB7XG4gICAgYXdhaXQgc3RyaXBlQ2xpZW50LnBheW1lbnRNZXRob2RzLmRldGFjaChjdXJyZW50U3RyaXBlQ2FyZElkKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVVc2VyQmlsbGluZ1BheW1lbnRNZXRob2QoY29udGV4dCwge1xuICAgIHN0cmlwZUNhcmRCcmFuZDogU3RyaW5nKHBheW1lbnRNZXRob2QuY2FyZC5icmFuZCB8fCAnJykudHJpbSgpLFxuICAgIHN0cmlwZUNhcmRJZDogcGF5bWVudE1ldGhvZC5pZCxcbiAgICBzdHJpcGVDYXJkTGFzdDQ6IFN0cmluZyhwYXltZW50TWV0aG9kLmNhcmQubGFzdDQgfHwgJycpLnRyaW0oKVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVc2VyQmlsbGluZ0NhcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlbGV0ZVVzZXJCaWxsaW5nQ2FyZCc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCBnZXRVc2VyQnlJZChjb250ZXh0LCB7dXNlcklkOiBzZXNzaW9uSWR9KTtcbiAgY29uc3Qgc3RyaXBlQ3VzdG9tZXJJZCA9IFN0cmluZyhjdXJyZW50VXNlcj8uc3RyaXBlQ3VzdG9tZXJJZCB8fCAnJyk7XG4gIGNvbnN0IHN0cmlwZUNhcmRJZCA9IFN0cmluZyhjdXJyZW50VXNlcj8uc3RyaXBlQ2FyZElkIHx8ICcnKTtcbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gZ2V0U3RyaXBlQ2xpZW50KCk7XG5cbiAgdHJ5IHtcbiAgICBpZihzdHJpcGVDdXN0b21lcklkICYmIHN0cmlwZUNhcmRJZCkge1xuICAgICAgaWYoc3RyaXBlQ2FyZElkLnN0YXJ0c1dpdGgoJ3BtXycpKSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbWVyID0gYXdhaXQgc3RyaXBlQ2xpZW50LmN1c3RvbWVycy5yZXRyaWV2ZShzdHJpcGVDdXN0b21lcklkKTtcblxuICAgICAgICBpZighKCdkZWxldGVkJyBpbiBjdXN0b21lcikgJiYgY3VzdG9tZXIuaW52b2ljZV9zZXR0aW5ncy5kZWZhdWx0X3BheW1lbnRfbWV0aG9kID09PSBzdHJpcGVDYXJkSWQpIHtcbiAgICAgICAgICBhd2FpdCBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLnVwZGF0ZShzdHJpcGVDdXN0b21lcklkLCB7XG4gICAgICAgICAgICBpbnZvaWNlX3NldHRpbmdzOiB7ZGVmYXVsdF9wYXltZW50X21ldGhvZDogbnVsbH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHN0cmlwZUNsaWVudC5wYXltZW50TWV0aG9kcy5kZXRhY2goc3RyaXBlQ2FyZElkKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHN0cmlwZUNsaWVudC5jdXN0b21lcnMuZGVsZXRlU291cmNlKHN0cmlwZUN1c3RvbWVySWQsIHN0cmlwZUNhcmRJZCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZVVzZXJCaWxsaW5nUGF5bWVudE1ldGhvZChjb250ZXh0LCB7XG4gICAgICBzdHJpcGVDYXJkQnJhbmQ6ICcnLFxuICAgICAgc3RyaXBlQ2FyZElkOiAnJyxcbiAgICAgIHN0cmlwZUNhcmRMYXN0NDogJydcbiAgICB9KTtcbiAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgYXdhaXQgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3BheW1lbnRfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgfVxufTtcbiJdLCJuYW1lcyI6WyJwYXJzZU51bSIsInBhcnNlQ2hhciIsInBhcnNlSWQiLCJwYXJzZVN0cmluZyIsInBhcnNlVmFyQ2hhciIsImFxbCIsIkVycm9yVHlwZXMiLCJsb2dFcnJvciIsIlVzZXJFcnJvciIsInVzZURiIiwiaGFzQWNjZXNzTGV2ZWwiLCJnZXRTdHJpcGVDbGllbnQiLCJnZXRVc2VyQnlJZCIsImV2ZW50Q2F0ZWdvcnkiLCJQTFVTX1BMQU5fSUQiLCJQTFVTX1BMQU5fQU1PVU5UIiwiUExVU19QTEFOX0FDQ0VTUyIsImFkZEN1c3RvbWVyQWNjb3VudCIsImNvbnRleHQiLCJhY3Rpb24iLCJkYXRhYmFzZU5hbWUiLCJzZXNzaW9uIiwidXNlcklkIiwic2Vzc2lvbklkIiwidXNlcm5hbWUiLCJzdHJpcGVDbGllbnQiLCJjdXN0b21lcnMiLCJjcmVhdGUiLCJtZXRhZGF0YSIsInRoZW4iLCJjdXN0b21lciIsIm5vdyIsIkRhdGUiLCJ1cGRhdGUiLCJtb2RpZmllZCIsInN0cmlwZUN1c3RvbWVySWQiLCJpZCIsImFxbFFyeSIsInF1ZXJ5IiwiY3Vyc29yIiwibmV4dCIsInVwZGF0ZWRVc2VyIiwiY2F0Y2giLCJlcnJvciIsImNhdGVnb3J5IiwibGFiZWwiLCJEQVRBQkFTRV9FUlJPUiIsImFkZEJhbmtBY2NvdW50IiwiYmFua0FjY291bnQiLCJhY2NvdW50TnVtYmVyIiwiZnVsbE5hbWUiLCJyb3V0aW5nIiwiZm9ybWF0QWNjb3VudCIsImZvcm1hdEZ1bGxOYW1lIiwiZm9ybWF0Um91dGluZyIsInVzZXIiLCJzdHJpcGVBY2NvdW50SWQiLCJ0b2tlbnMiLCJiYW5rX2FjY291bnQiLCJhY2NvdW50X2hvbGRlcl9uYW1lIiwiYWNjb3VudF9ob2xkZXJfdHlwZSIsImFjY291bnRfbnVtYmVyIiwiY291bnRyeSIsImN1cnJlbmN5Iiwicm91dGluZ19udW1iZXIiLCJ0b2tlbiIsImNyZWF0ZVNvdXJjZSIsInNvdXJjZSIsImFjY291bnQiLCJiYW5rRnVsbE5hbWUiLCJiYW5rSWQiLCJiYW5rUm91dGluZyIsIm1zZyIsIm1lc3NhZ2UiLCJ1cGRhdGVDcmVkaXRDYXJkIiwiY2FyZCIsImNpdHkiLCJleHBNb250aCIsImV4cFllYXIiLCJzdHJlZXQxIiwic3RhdGUiLCJ6aXAiLCJmb3JtYXRJZCIsInBheW1lbnRDYXJkIiwiZm9ybWF0RXhwTW9udGgiLCJmb3JtYXRFeHBZZWFyIiwiZm9ybWF0Q2l0eSIsImZvcm1hdENvdW50cnkiLCJmb3JtYXRTdHJlZXQxIiwiZm9ybWF0U3RhdGUiLCJmb3JtYXRaaXAiLCJyZXN1bHRzIiwidXBkYXRlZENhcmQiLCJzdHJpcGVJZCIsImFkZHJlc3NfY2l0eSIsImFkZHJlc3NfY291bnRyeSIsImFkZHJlc3NfbGluZTEiLCJhZGRyZXNzX3N0YXRlIiwiYWRkcmVzc196aXAiLCJleHBfbW9udGgiLCJ0b1N0cmluZyIsImV4cF95ZWFyIiwibmFtZSIsInVwZGF0ZVNvdXJjZSIsImNvbnNvbGUiLCJsb2ciLCJnZXRDcmVkaXRDYXJkcyIsImFsbCIsImxpc3QiLCJkZWxldGVDcmVkaXRDYXJkIiwiY2FyZElkIiwiZm9ybWF0Q2FyZElkIiwicmVzdWx0IiwiX2tleSIsImNhcmRLZXkiLCJlZGdlQ29sbGVjdGlvbiIsImNvbGxlY3Rpb24iLCJvdXRFZGdlcyIsInJlc3BvbnNlIiwiZWRnZXMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJQcm9taXNlIiwibWFwIiwiZWRnZSIsImVkZ2VLZXkiLCJyZW1vdmVBcWxRcnkiLCJkZWxldGVTb3VyY2UiLCJkZWxldGVCYW5rQWNjb3VudCIsInJlc29sdmUiLCJjcmVhdGVQYXltZW50VHJhbnNmZXIiLCJ0cmFuc2ZlciIsImFtb3VudCIsImZvcm1hdEFtb3VudCIsImZvcm1hdEN1cnJlbmN5IiwidG9VcHBlckNhc2UiLCJ0cmFuc2ZlcnMiLCJkZXN0aW5hdGlvbiIsInN0cmlwZVRyYW5zZmVyIiwiaW5zZXJ0IiwiYWRkZWQiLCJuZXdUcmFuc2ZlciIsImNyZWF0ZVBheW1lbnRIb2xkIiwicGF5bWVudCIsImNhcHR1cmUiLCJkZXNjcmlwdGlvbiIsImNoYXJnZXMiLCJzdHJpcGVDaGFyZ2UiLCJjaGFyZ2VGYWlsQ29kZSIsImZhaWx1cmVfY29kZSIsImNoYXJnZUZhaWxNc2ciLCJmYWlsdXJlX21lc3NhZ2UiLCJjaGFyZ2VJZCIsImNoYXJnZVN0YXR1cyIsInN0YXR1cyIsIm5ld1BheW1lbnQiLCJlbnN1cmVTdHJpcGVDdXN0b21lcklkIiwiU3RyaW5nIiwiZ2V0Q29uZmlndXJlZEJpbGxpbmdPcmlnaW5zIiwiY29uZmlndXJlZE9yaWdpbnMiLCJwcm9jZXNzIiwiZW52IiwiU1RSSVBFX1JFVFVSTl9VUkxfT1JJR0lOUyIsInNwbGl0Iiwib3JpZ2luIiwidHJpbSIsImZpbHRlciIsIkJvb2xlYW4iLCJhcHBVcmwiLCJjb25maWciLCJkZXRhaWxzIiwidXJsIiwicHVzaCIsImluY2x1ZGVzIiwiU2V0IiwiVVJMIiwicGFyc2VCaWxsaW5nUmV0dXJuVXJsIiwicmV0dXJuVXJsIiwicGFyc2VkVXJsIiwiaXNMb2NhbERldmVsb3BtZW50VXJsIiwicHJvdG9jb2wiLCJob3N0bmFtZSIsImlzU2VjdXJlVXJsIiwiYWxsb3dlZE9yaWdpbnMiLCJoYXMiLCJoYXNoIiwiZ2V0Q2hlY2tvdXRSZXR1cm5VcmwiLCJuZXh0VXJsIiwic2VhcmNoUGFyYW1zIiwic2V0IiwicmVwbGFjZSIsInVwZGF0ZVVzZXJCaWxsaW5nUGF5bWVudE1ldGhvZCIsInVzZXJVcGRhdGUiLCJlbnN1cmVQbHVzU3RyaXBlUGxhbiIsInBsYW5zIiwicmV0cmlldmUiLCJpbnRlcnZhbCIsImludGVydmFsX2NvdW50IiwicGxhbklkIiwidHlwZSIsInByb2R1Y3QiLCJ1cGdyYWRlVXNlclRvUGx1cyIsImN1cnJlbnRVc2VyIiwicGxhblN1YnNjcmlwdGlvbklkIiwic3RyaXBlQ2FyZElkIiwic3RyaXBlUGxhbklkIiwic3RyaXBlU3Vic2NyaXB0aW9uIiwic3Vic2NyaXB0aW9ucyIsIml0ZW1zIiwicGxhbiIsInN0cmlwZVBlcmlvZEVuZCIsIk51bWJlciIsImN1cnJlbnRfcGVyaW9kX2VuZCIsInBsYW5FeHBpcmVzIiwicGxhblN0YXR1cyIsInVzZXJBY2Nlc3MiLCJjcmVhdGVCaWxsaW5nU2V0dXBTZXNzaW9uIiwicGFyc2VkUmV0dXJuVXJsIiwiY2hlY2tvdXRTZXNzaW9uIiwiY2hlY2tvdXQiLCJzZXNzaW9ucyIsImNhbmNlbF91cmwiLCJtb2RlIiwicGF5bWVudF9tZXRob2RfdHlwZXMiLCJzZXR1cF9pbnRlbnRfZGF0YSIsInN1Y2Nlc3NfdXJsIiwiY2hlY2tvdXRVcmwiLCJjb21wbGV0ZUJpbGxpbmdTZXR1cFNlc3Npb24iLCJjaGVja291dFNlc3Npb25JZCIsIm5vcm1hbGl6ZWRDaGVja291dFNlc3Npb25JZCIsImV4cGFuZCIsImNoZWNrb3V0Q3VzdG9tZXJJZCIsInNldHVwSW50ZW50Iiwic2V0dXBfaW50ZW50Iiwic2V0dXBJbnRlbnRzIiwicGF5bWVudE1ldGhvZCIsInBheW1lbnRfbWV0aG9kIiwicGF5bWVudE1ldGhvZHMiLCJwYXltZW50TWV0aG9kQ3VzdG9tZXJJZCIsImludm9pY2Vfc2V0dGluZ3MiLCJkZWZhdWx0X3BheW1lbnRfbWV0aG9kIiwiY3VycmVudFN0cmlwZUNhcmRJZCIsInN0YXJ0c1dpdGgiLCJkZXRhY2giLCJzdHJpcGVDYXJkQnJhbmQiLCJicmFuZCIsInN0cmlwZUNhcmRMYXN0NCIsImxhc3Q0IiwiZGVsZXRlVXNlckJpbGxpbmdDYXJkIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxRQUFRLFFBQU8sK0JBQStCO0FBQ3RELFNBQVFDLFNBQVMsRUFBRUMsT0FBTyxFQUFFQyxXQUFXLEVBQUVDLFlBQVksUUFBTywrQkFBK0I7QUFDM0YsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFLN0IsU0FBUUMsVUFBVSxRQUFPLDBCQUEwQjtBQUduRCxTQUFRQyxRQUFRLEVBQUVDLFNBQVMsUUFBTyw2QkFBNkI7QUFDL0QsU0FBUUMsS0FBSyxRQUFPLDRCQUE0QjtBQUNoRCxTQUFRQyxjQUFjLFFBQU8sMkJBQTJCO0FBQ3hELFNBQVFDLGVBQWUsUUFBTywwQkFBMEI7QUFDeEQsU0FBUUMsV0FBVyxRQUFPLGFBQWE7QUFHdkMsTUFBTUMsZ0JBQWdCO0FBQ3RCLE1BQU1DLGVBQWU7QUFDckIsTUFBTUMsbUJBQW1CO0FBQ3pCLE1BQU1DLG1CQUFtQjtBQUV6QixPQUFPLE1BQU1DLHFCQUFxQixDQUFDQztJQUNqQyxNQUFNQyxTQUFTO0lBQ2YsTUFBTSxFQUFDQyxZQUFZLEVBQUVDLFNBQVMsRUFBQ0MsUUFBUUMsU0FBUyxFQUFFQyxRQUFR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
|