@xbstracts/medusa-coupons 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.medusa/server/src/admin/index.js +3207 -0
- package/.medusa/server/src/admin/index.mjs +3253 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/entitlements/route.js +9 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/mirror-promotion/route.js +132 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/preview/route.js +28 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/route.js +18 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
- package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/route.js +14 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/[id]/route.js +53 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +26 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/route.js +27 -0
- package/.medusa/server/src/api/admin/coupon-products/configs/route.js +36 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/cancel/route.js +15 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/redeem/route.js +15 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/route.js +16 -0
- package/.medusa/server/src/api/admin/coupon-products/entitlements/route.js +22 -0
- package/.medusa/server/src/api/admin/coupon-products/options/route.js +9 -0
- package/.medusa/server/src/api/admin/coupon-products/products/route.js +16 -0
- package/.medusa/server/src/api/admin/coupon-products/route.js +13 -0
- package/.medusa/server/src/api/admin/coupon-products/uploads/route.js +7 -0
- package/.medusa/server/src/api/coupon-product-routes.js +546 -0
- package/.medusa/server/src/api/entitlement-utils.js +90 -0
- package/.medusa/server/src/api/media-upload.js +57 -0
- package/.medusa/server/src/api/middlewares.js +92 -0
- package/.medusa/server/src/api/product-utils.js +304 -0
- package/.medusa/server/src/api/promotion-code-resolver.js +225 -0
- package/.medusa/server/src/api/seller-utils.js +101 -0
- package/.medusa/server/src/api/utils.js +25 -0
- package/.medusa/server/src/api/validators.js +199 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/entitlements/route.js +9 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/route.js +18 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
- package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/route.js +14 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/route.js +60 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +41 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/route.js +45 -0
- package/.medusa/server/src/api/vendor/coupon-products/configs/route.js +51 -0
- package/.medusa/server/src/api/vendor/coupon-products/entitlements/[id]/route.js +25 -0
- package/.medusa/server/src/api/vendor/coupon-products/entitlements/route.js +45 -0
- package/.medusa/server/src/api/vendor/coupon-products/options/route.js +9 -0
- package/.medusa/server/src/api/vendor/coupon-products/products/route.js +19 -0
- package/.medusa/server/src/api/vendor/coupon-products/route.js +13 -0
- package/.medusa/server/src/api/vendor/coupon-products/uploads/route.js +7 -0
- package/.medusa/server/src/jobs/retry-coupon-media-deletes.js +14 -0
- package/.medusa/server/src/links/coupon-issuance-order-line-item.js +17 -0
- package/.medusa/server/src/links/coupon-issuance-order.js +15 -0
- package/.medusa/server/src/links/coupon-product-config-product.js +17 -0
- package/.medusa/server/src/links/coupon-product-variant-config-variant.js +17 -0
- package/.medusa/server/src/links/coupon-promotion-mirror-promotion.js +17 -0
- package/.medusa/server/src/links/customer-coupon-entitlement-customer.js +15 -0
- package/.medusa/server/src/modules/coupon/constants.js +46 -0
- package/.medusa/server/src/modules/coupon/index.js +16 -0
- package/.medusa/server/src/modules/coupon/loaders/reconcile-coupon-products.js +65 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260709000000.js +40 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260710000000.js +22 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260711000000.js +25 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260712000000.js +78 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260719000000.js +19 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260722000000.js +17 -0
- package/.medusa/server/src/modules/coupon/migrations/Migration20260723000000.js +18 -0
- package/.medusa/server/src/modules/coupon/models/coupon-entitlement-promotion.js +31 -0
- package/.medusa/server/src/modules/coupon/models/coupon-entitlement-seller.js +28 -0
- package/.medusa/server/src/modules/coupon/models/coupon-issuance.js +35 -0
- package/.medusa/server/src/modules/coupon/models/coupon-media-asset.js +41 -0
- package/.medusa/server/src/modules/coupon/models/coupon-product-config.js +45 -0
- package/.medusa/server/src/modules/coupon/models/coupon-product-variant-config.js +36 -0
- package/.medusa/server/src/modules/coupon/models/coupon-promotion-mirror.js +27 -0
- package/.medusa/server/src/modules/coupon/models/customer-coupon-entitlement.js +56 -0
- package/.medusa/server/src/modules/coupon/models/index.js +23 -0
- package/.medusa/server/src/modules/coupon/payment-order-utils.js +76 -0
- package/.medusa/server/src/modules/coupon/product-metadata.js +24 -0
- package/.medusa/server/src/modules/coupon/purchase-conditions.js +138 -0
- package/.medusa/server/src/modules/coupon/service.js +628 -0
- package/.medusa/server/src/modules/coupon/types.js +3 -0
- package/.medusa/server/src/modules/coupon/utils.js +302 -0
- package/.medusa/server/src/subscribers/issue-coupons-from-order.js +88 -0
- package/.medusa/server/src/vendor/index.mjs +3237 -0
- package/.medusa/server/src/workflows/hooks/validate-coupon-add-to-cart.js +13 -0
- package/.medusa/server/src/workflows/hooks/validate-coupon-complete-cart.js +8 -0
- package/.medusa/server/src/workflows/index.js +21 -0
- package/.medusa/server/src/workflows/steps.js +27 -0
- package/.medusa/server/src/workflows/validate-coupon-purchase.js +85 -0
- package/README.md +84 -0
- package/package.json +102 -0
|
@@ -0,0 +1,3207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/admin/index.ts
|
|
21
|
+
var admin_exports = {};
|
|
22
|
+
__export(admin_exports, {
|
|
23
|
+
default: () => admin_default
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(admin_exports);
|
|
26
|
+
|
|
27
|
+
// src/admin/i18n/en.json
|
|
28
|
+
var en_default = {
|
|
29
|
+
coupons: {
|
|
30
|
+
menu: "Coupons",
|
|
31
|
+
productsMenu: "Coupon Products"
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// src/admin/i18n/index.ts
|
|
36
|
+
var i18n_default = {
|
|
37
|
+
en: {
|
|
38
|
+
translation: en_default
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// src/admin/routes/coupons/page.tsx
|
|
43
|
+
var import_icons3 = require("@medusajs/icons");
|
|
44
|
+
|
|
45
|
+
// src/dashboard/coupons/coupon-manager.tsx
|
|
46
|
+
var import_react2 = require("react");
|
|
47
|
+
var import_icons2 = require("@medusajs/icons");
|
|
48
|
+
var import_ui3 = require("@medusajs/ui");
|
|
49
|
+
|
|
50
|
+
// src/dashboard/coupons/coupon-products-page.tsx
|
|
51
|
+
var import_react = require("react");
|
|
52
|
+
var import_icons = require("@medusajs/icons");
|
|
53
|
+
var import_ui2 = require("@medusajs/ui");
|
|
54
|
+
|
|
55
|
+
// src/dashboard/coupons/empty-state.tsx
|
|
56
|
+
var import_ui = require("@medusajs/ui");
|
|
57
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
58
|
+
function CouponEmptyState({
|
|
59
|
+
description,
|
|
60
|
+
title
|
|
61
|
+
}) {
|
|
62
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex w-full flex-1 flex-col overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex min-h-[250px] w-full flex-1 flex-col items-center justify-center px-6 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex size-full flex-col items-center justify-center gap-2 text-center", children: [
|
|
63
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.Text, { weight: "plus", children: title }),
|
|
64
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ui.Text, { children: description }) : null
|
|
65
|
+
] }) }) });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/dashboard/coupons/coupon-products-page.tsx
|
|
69
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
70
|
+
var NONE = "__none__";
|
|
71
|
+
var allSteps = ["details", "organize", "campaign", "prices"];
|
|
72
|
+
var conditionAttributes = [
|
|
73
|
+
{ value: "customer.groups.id", label: "Customer Group" },
|
|
74
|
+
{ value: "region.id", label: "Region" },
|
|
75
|
+
{ value: "shipping_address.country_code", label: "Country" },
|
|
76
|
+
{ value: "sales_channel_id", label: "Sales Channel" },
|
|
77
|
+
{ value: "currency_code", label: "Currency Code" }
|
|
78
|
+
];
|
|
79
|
+
var conditionOperators = [
|
|
80
|
+
{ value: "in", label: "In" },
|
|
81
|
+
{ value: "eq", label: "Equals" },
|
|
82
|
+
{ value: "ne", label: "Not In" }
|
|
83
|
+
];
|
|
84
|
+
var typeChoices = [
|
|
85
|
+
{
|
|
86
|
+
value: "amount_off_products",
|
|
87
|
+
label: "Amount off products",
|
|
88
|
+
description: "Discount specific products or a collection of products"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
value: "amount_off_order",
|
|
92
|
+
label: "Amount off order",
|
|
93
|
+
description: "Discount the total order amount"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
value: "percentage_off_product",
|
|
97
|
+
label: "Percentage off product",
|
|
98
|
+
description: "Discount a percentage off selected products"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
value: "percentage_off_order",
|
|
102
|
+
label: "Percentage off order",
|
|
103
|
+
description: "Discount a percentage off the total order amount"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
value: "buy_x_get_y",
|
|
107
|
+
label: "Buy X Get Y",
|
|
108
|
+
description: "Issue a Buy X Get Y coupon entitlement"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
value: "free_shipping",
|
|
112
|
+
label: "Free shipping",
|
|
113
|
+
description: "Apply a 100% discount to shipping fees"
|
|
114
|
+
}
|
|
115
|
+
];
|
|
116
|
+
var statusChoices = [
|
|
117
|
+
{
|
|
118
|
+
value: "draft",
|
|
119
|
+
label: "Draft",
|
|
120
|
+
description: "Customers will not be able to use the code yet"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
value: "active",
|
|
124
|
+
label: "Active",
|
|
125
|
+
description: "Customers will be able to use the code"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
value: "inactive",
|
|
129
|
+
label: "Inactive",
|
|
130
|
+
description: "Keep the promotion unavailable until reactivated"
|
|
131
|
+
}
|
|
132
|
+
];
|
|
133
|
+
function backendUrl() {
|
|
134
|
+
return typeof __BACKEND_URL__ === "string" ? __BACKEND_URL__.replace(/\/$/, "") : "";
|
|
135
|
+
}
|
|
136
|
+
function apiErrorMessage(payload, fallback) {
|
|
137
|
+
return [payload?.message, payload?.error?.message, payload?.error].find(
|
|
138
|
+
(candidate) => typeof candidate === "string" && candidate.trim()
|
|
139
|
+
) || fallback || "Request failed";
|
|
140
|
+
}
|
|
141
|
+
async function apiFetch(path, options = {}) {
|
|
142
|
+
const response = await fetch(`${backendUrl()}${path}`, {
|
|
143
|
+
...options,
|
|
144
|
+
credentials: "include",
|
|
145
|
+
headers: {
|
|
146
|
+
...options.body ? { "Content-Type": "application/json" } : {},
|
|
147
|
+
...options.headers
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
if (!response.ok) {
|
|
151
|
+
const payload = await response.json().catch(() => null);
|
|
152
|
+
throw new Error(apiErrorMessage(payload, response.statusText));
|
|
153
|
+
}
|
|
154
|
+
return response.json();
|
|
155
|
+
}
|
|
156
|
+
function optionLabel(option) {
|
|
157
|
+
return option.name || option.title || option.value || option.handle || option.id;
|
|
158
|
+
}
|
|
159
|
+
function numberOrNull(value) {
|
|
160
|
+
const parsed = Number(value);
|
|
161
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
|
|
162
|
+
}
|
|
163
|
+
function nonNegativeNumberOrNull(value) {
|
|
164
|
+
if (!value.trim()) return null;
|
|
165
|
+
const parsed = Number(value);
|
|
166
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
|
|
167
|
+
}
|
|
168
|
+
function toDateTimeLocal(value) {
|
|
169
|
+
if (!value) return "";
|
|
170
|
+
const date = new Date(value);
|
|
171
|
+
if (Number.isNaN(date.getTime())) return "";
|
|
172
|
+
const localDate = new Date(date.getTime() - date.getTimezoneOffset() * 6e4);
|
|
173
|
+
return localDate.toISOString().slice(0, 16);
|
|
174
|
+
}
|
|
175
|
+
function currencyDecimalDigits(code) {
|
|
176
|
+
try {
|
|
177
|
+
return new Intl.NumberFormat("en", {
|
|
178
|
+
style: "currency",
|
|
179
|
+
currency: code.toUpperCase()
|
|
180
|
+
}).resolvedOptions().maximumFractionDigits;
|
|
181
|
+
} catch {
|
|
182
|
+
return 2;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function currencySymbol(code) {
|
|
186
|
+
if (!code) return "";
|
|
187
|
+
try {
|
|
188
|
+
return new Intl.NumberFormat("en", {
|
|
189
|
+
style: "currency",
|
|
190
|
+
currency: code.toUpperCase(),
|
|
191
|
+
currencyDisplay: "narrowSymbol"
|
|
192
|
+
}).formatToParts(0).find((part) => part.type === "currency")?.value || code.toUpperCase();
|
|
193
|
+
} catch {
|
|
194
|
+
return code.toUpperCase();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function couponTypeFromConfig(config3) {
|
|
198
|
+
if (config3.benefit_type === "percentage") {
|
|
199
|
+
return config3.promotion_template?.application_method?.target_type === "order" ? "percentage_off_order" : "percentage_off_product";
|
|
200
|
+
}
|
|
201
|
+
if (config3.benefit_type === "buy_get") return "buy_x_get_y";
|
|
202
|
+
if (config3.benefit_type === "free_shipping") return "free_shipping";
|
|
203
|
+
return config3.promotion_template?.application_method?.target_type === "order" ? "amount_off_order" : "amount_off_products";
|
|
204
|
+
}
|
|
205
|
+
function benefitTypeFromCouponType(type) {
|
|
206
|
+
if (type === "percentage_off_product" || type === "percentage_off_order") return "percentage";
|
|
207
|
+
if (type === "buy_x_get_y") return "buy_get";
|
|
208
|
+
if (type === "free_shipping") return "free_shipping";
|
|
209
|
+
return "fixed_amount";
|
|
210
|
+
}
|
|
211
|
+
function couponTypeLabel(config3) {
|
|
212
|
+
return typeChoices.find(
|
|
213
|
+
(choice) => choice.value === couponTypeFromConfig(config3)
|
|
214
|
+
)?.label;
|
|
215
|
+
}
|
|
216
|
+
function couponStatusColor(status) {
|
|
217
|
+
if (status === "active") return "green";
|
|
218
|
+
if (status === "inactive") return "orange";
|
|
219
|
+
return "grey";
|
|
220
|
+
}
|
|
221
|
+
function productStatusFromCouponStatus(status) {
|
|
222
|
+
return status === "active" ? "published" : "draft";
|
|
223
|
+
}
|
|
224
|
+
function campaignLabel(config3) {
|
|
225
|
+
const name = config3.campaign_snapshot?.name;
|
|
226
|
+
return typeof name === "string" && name ? name : config3.campaign_id || "None";
|
|
227
|
+
}
|
|
228
|
+
function defaultCurrency(options) {
|
|
229
|
+
return options.currencies?.find((currency) => currency.is_default)?.code || options.currencies?.[0]?.code || "";
|
|
230
|
+
}
|
|
231
|
+
function conditionKey(prefix = "condition") {
|
|
232
|
+
return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
233
|
+
}
|
|
234
|
+
function isAmountCouponType(type) {
|
|
235
|
+
return type === "amount_off_products" || type === "amount_off_order";
|
|
236
|
+
}
|
|
237
|
+
function effectiveCouponCurrencies(conditions, currencies) {
|
|
238
|
+
const condition = conditions.find(
|
|
239
|
+
(item) => item.attribute === "currency_code"
|
|
240
|
+
);
|
|
241
|
+
if (!condition || !condition.operator) return [];
|
|
242
|
+
const selected = new Set(condition.values);
|
|
243
|
+
const supported = currencies.map((currency) => currency.code);
|
|
244
|
+
return condition.operator === "ne" ? supported.filter((code) => !selected.has(code)) : supported.filter((code) => selected.has(code));
|
|
245
|
+
}
|
|
246
|
+
function reconcileCouponAmounts(current, currencyCodes) {
|
|
247
|
+
const byCurrency = Object.fromEntries(
|
|
248
|
+
current.map((row) => [row.currency_code, row])
|
|
249
|
+
);
|
|
250
|
+
return currencyCodes.map((currencyCode) => ({
|
|
251
|
+
key: byCurrency[currencyCode]?.key || conditionKey("coupon-value"),
|
|
252
|
+
currency_code: currencyCode,
|
|
253
|
+
amount: byCurrency[currencyCode]?.amount || ""
|
|
254
|
+
}));
|
|
255
|
+
}
|
|
256
|
+
function defaultPurchaseConditions(options) {
|
|
257
|
+
const currencyCode = defaultCurrency(options);
|
|
258
|
+
return currencyCode ? [
|
|
259
|
+
{
|
|
260
|
+
key: conditionKey("currency"),
|
|
261
|
+
attribute: "currency_code",
|
|
262
|
+
operator: "eq",
|
|
263
|
+
values: [currencyCode]
|
|
264
|
+
}
|
|
265
|
+
] : [];
|
|
266
|
+
}
|
|
267
|
+
function emptyProduct(options) {
|
|
268
|
+
return {
|
|
269
|
+
title: "",
|
|
270
|
+
subtitle: "",
|
|
271
|
+
handle: "",
|
|
272
|
+
description: "",
|
|
273
|
+
media: [],
|
|
274
|
+
sku: "",
|
|
275
|
+
price_amounts: Object.fromEntries(
|
|
276
|
+
(options.currencies || []).map((currency) => [currency.code, ""])
|
|
277
|
+
),
|
|
278
|
+
status: "draft",
|
|
279
|
+
discountable: false,
|
|
280
|
+
seller_id: "",
|
|
281
|
+
type_id: "",
|
|
282
|
+
collection_id: "",
|
|
283
|
+
category_id: "",
|
|
284
|
+
tag_id: ""
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function emptyCoupon(options) {
|
|
288
|
+
const currencyCode = defaultCurrency(options);
|
|
289
|
+
const purchaseConditions = defaultPurchaseConditions(options);
|
|
290
|
+
return {
|
|
291
|
+
enabled: true,
|
|
292
|
+
type: "amount_off_products",
|
|
293
|
+
purchase_conditions: purchaseConditions,
|
|
294
|
+
amounts: currencyCode ? [
|
|
295
|
+
{
|
|
296
|
+
key: "coupon-value-default",
|
|
297
|
+
currency_code: currencyCode,
|
|
298
|
+
amount: ""
|
|
299
|
+
}
|
|
300
|
+
] : [],
|
|
301
|
+
percentage: "",
|
|
302
|
+
allocation: "each",
|
|
303
|
+
code_strategy: "unique_code",
|
|
304
|
+
code_prefix: "COUPON",
|
|
305
|
+
shared_code: "",
|
|
306
|
+
expiration_type: "duration",
|
|
307
|
+
expiration_days: "30",
|
|
308
|
+
expiration_date: "",
|
|
309
|
+
expiration_cap_by_campaign: true,
|
|
310
|
+
expiration_cap_at: "",
|
|
311
|
+
max_issuance_per_order_item: "1",
|
|
312
|
+
promotion_mirror_mode: "none",
|
|
313
|
+
promotion_status: "draft"
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
var emptyCampaign = {
|
|
317
|
+
mode: "none",
|
|
318
|
+
campaign_id: "",
|
|
319
|
+
name: "",
|
|
320
|
+
campaign_identifier: "",
|
|
321
|
+
starts_at: "",
|
|
322
|
+
ends_at: ""
|
|
323
|
+
};
|
|
324
|
+
function formsFromRow(row, options) {
|
|
325
|
+
const product = row.product;
|
|
326
|
+
const config3 = row.coupon_product_config;
|
|
327
|
+
const variant = product.variants?.[0];
|
|
328
|
+
const prices = Object.fromEntries(
|
|
329
|
+
(variant?.prices || []).filter((price) => price.currency_code).map((price) => [
|
|
330
|
+
String(price.currency_code).toLowerCase(),
|
|
331
|
+
price.amount == null ? "" : String(price.amount)
|
|
332
|
+
])
|
|
333
|
+
);
|
|
334
|
+
const media = Array.from(
|
|
335
|
+
new Map(
|
|
336
|
+
[
|
|
337
|
+
...product.thumbnail ? [
|
|
338
|
+
{
|
|
339
|
+
url: product.thumbnail,
|
|
340
|
+
asset_id: product.thumbnail_asset_id || void 0
|
|
341
|
+
}
|
|
342
|
+
] : [],
|
|
343
|
+
...(product.images || []).filter((image) => image.url).map((image) => ({
|
|
344
|
+
url: String(image.url),
|
|
345
|
+
asset_id: image.asset_id || void 0
|
|
346
|
+
}))
|
|
347
|
+
].map((item) => [item.url, item])
|
|
348
|
+
).values()
|
|
349
|
+
);
|
|
350
|
+
const configuredAmounts = Array.isArray(config3.amounts) && config3.amounts.length ? config3.amounts : config3.amount != null && config3.currency_code ? [{ amount: config3.amount, currency_code: config3.currency_code }] : [];
|
|
351
|
+
const configuredConditions = (config3.purchase_conditions || []).map(
|
|
352
|
+
(condition, index) => ({
|
|
353
|
+
key: `condition-${index}`,
|
|
354
|
+
attribute: condition.attribute,
|
|
355
|
+
operator: condition.operator,
|
|
356
|
+
values: condition.values.map(
|
|
357
|
+
(value) => condition.attribute === "currency_code" || condition.attribute === "shipping_address.country_code" ? value.toLowerCase() : value
|
|
358
|
+
)
|
|
359
|
+
})
|
|
360
|
+
);
|
|
361
|
+
if (!configuredConditions.some(
|
|
362
|
+
(condition) => condition.attribute === "currency_code"
|
|
363
|
+
) && config3.benefit_type === "fixed_amount" && configuredAmounts.length) {
|
|
364
|
+
configuredConditions.push({
|
|
365
|
+
key: "condition-legacy-currency",
|
|
366
|
+
attribute: "currency_code",
|
|
367
|
+
operator: configuredAmounts.length === 1 ? "eq" : "in",
|
|
368
|
+
values: configuredAmounts.map(
|
|
369
|
+
(amount) => amount.currency_code.toLowerCase()
|
|
370
|
+
)
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
if (!configuredConditions.some(
|
|
374
|
+
(condition) => condition.attribute === "sales_channel_id"
|
|
375
|
+
) && product.sales_channels?.length) {
|
|
376
|
+
configuredConditions.push({
|
|
377
|
+
key: "condition-legacy-sales-channel",
|
|
378
|
+
attribute: "sales_channel_id",
|
|
379
|
+
operator: product.sales_channels.length === 1 ? "eq" : "in",
|
|
380
|
+
values: product.sales_channels.map((channel) => channel.id)
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
const expirationPolicy = config3.expiration_policy;
|
|
384
|
+
const configuredAmountRows = configuredAmounts.map((row2, index) => ({
|
|
385
|
+
key: `coupon-value-${index}`,
|
|
386
|
+
amount: String(row2.amount),
|
|
387
|
+
currency_code: row2.currency_code.toLowerCase()
|
|
388
|
+
}));
|
|
389
|
+
const amountRows = config3.benefit_type === "fixed_amount" ? reconcileCouponAmounts(
|
|
390
|
+
configuredAmountRows,
|
|
391
|
+
effectiveCouponCurrencies(configuredConditions, options.currencies || [])
|
|
392
|
+
) : configuredAmountRows;
|
|
393
|
+
return {
|
|
394
|
+
product: {
|
|
395
|
+
...emptyProduct(options),
|
|
396
|
+
title: product.title || "",
|
|
397
|
+
subtitle: product.subtitle || "",
|
|
398
|
+
handle: product.handle || "",
|
|
399
|
+
description: product.description || "",
|
|
400
|
+
media,
|
|
401
|
+
sku: variant?.sku || "",
|
|
402
|
+
price_amounts: {
|
|
403
|
+
...emptyProduct(options).price_amounts,
|
|
404
|
+
...prices
|
|
405
|
+
},
|
|
406
|
+
status: product.status || "draft",
|
|
407
|
+
discountable: Boolean(product.discountable),
|
|
408
|
+
type_id: product.type_id || "",
|
|
409
|
+
collection_id: product.collection_id || "",
|
|
410
|
+
category_id: product.categories?.[0]?.id || "",
|
|
411
|
+
tag_id: product.tags?.[0]?.id || ""
|
|
412
|
+
},
|
|
413
|
+
coupon: {
|
|
414
|
+
...emptyCoupon(options),
|
|
415
|
+
enabled: config3.enabled,
|
|
416
|
+
type: couponTypeFromConfig(config3),
|
|
417
|
+
purchase_conditions: configuredConditions,
|
|
418
|
+
amounts: config3.benefit_type === "fixed_amount" ? amountRows : amountRows.length ? amountRows : emptyCoupon(options).amounts,
|
|
419
|
+
percentage: config3.percentage == null ? "" : String(config3.percentage),
|
|
420
|
+
allocation: config3.promotion_template?.application_method?.allocation === "once" ? "once" : "each",
|
|
421
|
+
code_strategy: config3.code_strategy,
|
|
422
|
+
code_prefix: config3.code_prefix || "",
|
|
423
|
+
shared_code: config3.shared_code || "",
|
|
424
|
+
expiration_type: config3.expiration_policy?.type || "duration",
|
|
425
|
+
expiration_days: config3.expiration_policy?.type === "duration" ? String(config3.expiration_policy.duration_days) : "30",
|
|
426
|
+
expiration_date: config3.expiration_policy?.type === "fixed" ? toDateTimeLocal(config3.expiration_policy.expires_at) : "",
|
|
427
|
+
expiration_cap_by_campaign: expirationPolicy.type === "none" || expirationPolicy.cap_by_campaign !== false,
|
|
428
|
+
expiration_cap_at: expirationPolicy.type === "none" ? "" : toDateTimeLocal(expirationPolicy.cap_at),
|
|
429
|
+
max_issuance_per_order_item: String(
|
|
430
|
+
config3.max_issuance_per_order_item || 1
|
|
431
|
+
),
|
|
432
|
+
promotion_mirror_mode: config3.promotion_mirror_mode || "none",
|
|
433
|
+
promotion_status: config3.promotion_status || "draft"
|
|
434
|
+
},
|
|
435
|
+
campaign: {
|
|
436
|
+
...emptyCampaign,
|
|
437
|
+
mode: config3.campaign_id ? "existing" : "none",
|
|
438
|
+
campaign_id: config3.campaign_id || ""
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
var modalContentStyle = {
|
|
443
|
+
display: "flex",
|
|
444
|
+
flexDirection: "column",
|
|
445
|
+
overflow: "hidden"
|
|
446
|
+
};
|
|
447
|
+
var modalWizardStyle = {
|
|
448
|
+
display: "flex",
|
|
449
|
+
flex: "1 1 auto",
|
|
450
|
+
flexDirection: "column",
|
|
451
|
+
minHeight: 0,
|
|
452
|
+
overflow: "hidden"
|
|
453
|
+
};
|
|
454
|
+
var visuallyHiddenStyle = {
|
|
455
|
+
clip: "rect(0 0 0 0)",
|
|
456
|
+
clipPath: "inset(50%)",
|
|
457
|
+
height: 1,
|
|
458
|
+
overflow: "hidden",
|
|
459
|
+
position: "absolute",
|
|
460
|
+
whiteSpace: "nowrap",
|
|
461
|
+
width: 1
|
|
462
|
+
};
|
|
463
|
+
var modalBodyStyle = {
|
|
464
|
+
flex: "1 1 auto",
|
|
465
|
+
minHeight: 0,
|
|
466
|
+
padding: 0
|
|
467
|
+
};
|
|
468
|
+
var modalScrollStyle = {
|
|
469
|
+
height: "100%",
|
|
470
|
+
overflowY: "auto",
|
|
471
|
+
padding: "64px 24px 112px",
|
|
472
|
+
width: "100%"
|
|
473
|
+
};
|
|
474
|
+
var modalFormStyle = {
|
|
475
|
+
margin: "0 auto",
|
|
476
|
+
maxWidth: 720,
|
|
477
|
+
width: "min(720px, 100%)"
|
|
478
|
+
};
|
|
479
|
+
var stackStyle = {
|
|
480
|
+
display: "flex",
|
|
481
|
+
flexDirection: "column",
|
|
482
|
+
gap: 24
|
|
483
|
+
};
|
|
484
|
+
var twoColumnGridStyle = {
|
|
485
|
+
display: "grid",
|
|
486
|
+
gap: 16,
|
|
487
|
+
gridTemplateColumns: "repeat(auto-fit, minmax(260px, 1fr))"
|
|
488
|
+
};
|
|
489
|
+
var threeColumnGridStyle = {
|
|
490
|
+
display: "grid",
|
|
491
|
+
gap: 16,
|
|
492
|
+
gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))"
|
|
493
|
+
};
|
|
494
|
+
var panelStyle = {
|
|
495
|
+
border: "1px solid var(--border-base)",
|
|
496
|
+
borderRadius: 8,
|
|
497
|
+
padding: 16
|
|
498
|
+
};
|
|
499
|
+
function Field({
|
|
500
|
+
children,
|
|
501
|
+
label,
|
|
502
|
+
optional,
|
|
503
|
+
tooltip
|
|
504
|
+
}) {
|
|
505
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-1", style: { minWidth: 0 }, children: [
|
|
506
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-x-1", children: [
|
|
507
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Label, { children: label }),
|
|
508
|
+
tooltip && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Tooltip, { content: tooltip, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
509
|
+
"button",
|
|
510
|
+
{
|
|
511
|
+
type: "button",
|
|
512
|
+
"aria-label": `${label} information`,
|
|
513
|
+
className: "text-ui-fg-muted",
|
|
514
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.InformationCircle, {})
|
|
515
|
+
}
|
|
516
|
+
) }),
|
|
517
|
+
optional && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "(Optional)" })
|
|
518
|
+
] }),
|
|
519
|
+
children
|
|
520
|
+
] });
|
|
521
|
+
}
|
|
522
|
+
function Section({
|
|
523
|
+
children,
|
|
524
|
+
description,
|
|
525
|
+
title
|
|
526
|
+
}) {
|
|
527
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("section", { className: "flex flex-col gap-y-4", children: [
|
|
528
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
529
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Heading, { level: "h2", children: title }),
|
|
530
|
+
description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: description })
|
|
531
|
+
] }),
|
|
532
|
+
children
|
|
533
|
+
] });
|
|
534
|
+
}
|
|
535
|
+
function OptionSelect({
|
|
536
|
+
onChange,
|
|
537
|
+
options,
|
|
538
|
+
value
|
|
539
|
+
}) {
|
|
540
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
541
|
+
import_ui2.Select,
|
|
542
|
+
{
|
|
543
|
+
value: value || NONE,
|
|
544
|
+
onValueChange: (next) => onChange(next === NONE ? "" : next),
|
|
545
|
+
children: [
|
|
546
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
|
|
547
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
|
|
548
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: NONE, children: "None" }),
|
|
549
|
+
options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: option.id, children: optionLabel(option) }, option.id))
|
|
550
|
+
] })
|
|
551
|
+
]
|
|
552
|
+
}
|
|
553
|
+
);
|
|
554
|
+
}
|
|
555
|
+
function CurrencyAmountField({
|
|
556
|
+
currencies,
|
|
557
|
+
currencyCode,
|
|
558
|
+
onChange,
|
|
559
|
+
value
|
|
560
|
+
}) {
|
|
561
|
+
const currency = currencies.find((item) => item.code === currencyCode);
|
|
562
|
+
const code = currencyCode.toUpperCase();
|
|
563
|
+
const decimals = currencyDecimalDigits(code || "USD");
|
|
564
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
565
|
+
import_ui2.CurrencyInput,
|
|
566
|
+
{
|
|
567
|
+
code: code || "USD",
|
|
568
|
+
symbol: currency?.symbol_native || currency?.symbol || currencySymbol(code || "USD"),
|
|
569
|
+
min: 0,
|
|
570
|
+
decimalScale: decimals,
|
|
571
|
+
decimalsLimit: decimals,
|
|
572
|
+
value,
|
|
573
|
+
disabled: !currencyCode,
|
|
574
|
+
onValueChange: (nextValue) => onChange(nextValue || "")
|
|
575
|
+
}
|
|
576
|
+
);
|
|
577
|
+
}
|
|
578
|
+
function PercentageInput({
|
|
579
|
+
onChange,
|
|
580
|
+
value
|
|
581
|
+
}) {
|
|
582
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex w-full items-stretch", style: { width: "100%" }, children: [
|
|
583
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
584
|
+
"div",
|
|
585
|
+
{
|
|
586
|
+
className: "bg-ui-bg-field text-ui-fg-muted flex items-center border",
|
|
587
|
+
style: {
|
|
588
|
+
borderColor: "var(--border-base)",
|
|
589
|
+
borderRadius: "6px 0 0 6px",
|
|
590
|
+
borderRight: 0,
|
|
591
|
+
padding: "0 12px"
|
|
592
|
+
},
|
|
593
|
+
children: "%"
|
|
594
|
+
}
|
|
595
|
+
),
|
|
596
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
597
|
+
"div",
|
|
598
|
+
{
|
|
599
|
+
className: "min-w-0 flex-1",
|
|
600
|
+
style: { flex: "1 1 0%", minWidth: 0 },
|
|
601
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
602
|
+
import_ui2.Input,
|
|
603
|
+
{
|
|
604
|
+
className: "w-full",
|
|
605
|
+
type: "number",
|
|
606
|
+
min: 1,
|
|
607
|
+
max: 100,
|
|
608
|
+
value,
|
|
609
|
+
style: {
|
|
610
|
+
borderRadius: "0 6px 6px 0",
|
|
611
|
+
width: "100%"
|
|
612
|
+
},
|
|
613
|
+
onChange: (event) => onChange(event.target.value)
|
|
614
|
+
}
|
|
615
|
+
)
|
|
616
|
+
}
|
|
617
|
+
)
|
|
618
|
+
] });
|
|
619
|
+
}
|
|
620
|
+
function HandleInput({
|
|
621
|
+
onChange,
|
|
622
|
+
value
|
|
623
|
+
}) {
|
|
624
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "relative", children: [
|
|
625
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "text-ui-fg-muted pointer-events-none absolute inset-y-0 left-0 z-10 flex min-w-8 items-center justify-center border-r px-2.5", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "txt-compact-small font-medium", children: "/" }) }),
|
|
626
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
627
|
+
import_ui2.Input,
|
|
628
|
+
{
|
|
629
|
+
value,
|
|
630
|
+
placeholder: "winter-jacket",
|
|
631
|
+
style: { paddingLeft: 34 },
|
|
632
|
+
onChange: (event) => onChange(event.target.value)
|
|
633
|
+
}
|
|
634
|
+
)
|
|
635
|
+
] });
|
|
636
|
+
}
|
|
637
|
+
function MediaUpload({
|
|
638
|
+
isUploading,
|
|
639
|
+
media,
|
|
640
|
+
onRemove,
|
|
641
|
+
onUpload
|
|
642
|
+
}) {
|
|
643
|
+
const inputRef = (0, import_react.useRef)(null);
|
|
644
|
+
const accept = "image/jpeg,image/png,image/gif,image/webp,image/heic,image/svg+xml";
|
|
645
|
+
const handleFiles = (files) => {
|
|
646
|
+
if (!files?.length) return;
|
|
647
|
+
onUpload(Array.from(files));
|
|
648
|
+
};
|
|
649
|
+
const handleDrop = (event) => {
|
|
650
|
+
event.preventDefault();
|
|
651
|
+
handleFiles(event.dataTransfer.files);
|
|
652
|
+
};
|
|
653
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-3", children: [
|
|
654
|
+
media.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
655
|
+
"div",
|
|
656
|
+
{
|
|
657
|
+
className: "grid gap-3",
|
|
658
|
+
style: {
|
|
659
|
+
gridTemplateColumns: "repeat(auto-fill, minmax(120px, 1fr))"
|
|
660
|
+
},
|
|
661
|
+
children: media.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
662
|
+
"div",
|
|
663
|
+
{
|
|
664
|
+
className: "relative overflow-hidden rounded-md border",
|
|
665
|
+
children: [
|
|
666
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
667
|
+
"img",
|
|
668
|
+
{
|
|
669
|
+
src: item.url,
|
|
670
|
+
alt: "",
|
|
671
|
+
className: "h-32 w-full object-cover",
|
|
672
|
+
style: { height: 128 }
|
|
673
|
+
}
|
|
674
|
+
),
|
|
675
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "absolute inset-x-0 bottom-0 flex items-center justify-between bg-black/60 px-2 py-1", children: [
|
|
676
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "xsmall", style: { color: "white" }, children: index === 0 ? "Thumbnail" : `Image ${index + 1}` }),
|
|
677
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
678
|
+
"button",
|
|
679
|
+
{
|
|
680
|
+
type: "button",
|
|
681
|
+
"aria-label": "Remove image",
|
|
682
|
+
style: { color: "white" },
|
|
683
|
+
onClick: () => onRemove(item),
|
|
684
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.XMarkMini, {})
|
|
685
|
+
}
|
|
686
|
+
)
|
|
687
|
+
] })
|
|
688
|
+
]
|
|
689
|
+
},
|
|
690
|
+
item.asset_id || item.url
|
|
691
|
+
))
|
|
692
|
+
}
|
|
693
|
+
),
|
|
694
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
695
|
+
"input",
|
|
696
|
+
{
|
|
697
|
+
ref: inputRef,
|
|
698
|
+
type: "file",
|
|
699
|
+
hidden: true,
|
|
700
|
+
multiple: true,
|
|
701
|
+
accept,
|
|
702
|
+
onChange: (event) => {
|
|
703
|
+
handleFiles(event.target.files);
|
|
704
|
+
event.target.value = "";
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
),
|
|
708
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
709
|
+
"button",
|
|
710
|
+
{
|
|
711
|
+
type: "button",
|
|
712
|
+
disabled: isUploading,
|
|
713
|
+
className: "text-ui-fg-muted flex w-full flex-col items-center justify-center gap-y-2 rounded-md border border-dashed p-8",
|
|
714
|
+
style: { minHeight: 148 },
|
|
715
|
+
onClick: () => inputRef.current?.click(),
|
|
716
|
+
onDragOver: (event) => event.preventDefault(),
|
|
717
|
+
onDrop: handleDrop,
|
|
718
|
+
children: [
|
|
719
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "text-ui-fg-base flex items-center gap-x-2", children: [
|
|
720
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.ArrowUpTray, {}),
|
|
721
|
+
isUploading ? "Uploading images..." : "Upload images"
|
|
722
|
+
] }),
|
|
723
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "Drag and drop images here or click to upload." })
|
|
724
|
+
]
|
|
725
|
+
}
|
|
726
|
+
)
|
|
727
|
+
] });
|
|
728
|
+
}
|
|
729
|
+
function conditionValueOptions(attribute, options) {
|
|
730
|
+
if (attribute === "currency_code") {
|
|
731
|
+
return (options.currencies || []).map((currency) => ({
|
|
732
|
+
value: currency.code,
|
|
733
|
+
label: `${currency.name} (${currency.code.toUpperCase()})`
|
|
734
|
+
}));
|
|
735
|
+
}
|
|
736
|
+
if (attribute === "shipping_address.country_code") {
|
|
737
|
+
return (options.countries || []).map((country) => ({
|
|
738
|
+
value: String(country.iso_2 || country.id).toLowerCase(),
|
|
739
|
+
label: country.display_name || country.name || country.id
|
|
740
|
+
}));
|
|
741
|
+
}
|
|
742
|
+
const records = attribute === "customer.groups.id" ? options.customer_groups : attribute === "region.id" ? options.regions : attribute === "sales_channel_id" ? options.sales_channels : [];
|
|
743
|
+
return (records || []).map((record) => ({
|
|
744
|
+
value: record.id,
|
|
745
|
+
label: optionLabel(record)
|
|
746
|
+
}));
|
|
747
|
+
}
|
|
748
|
+
function MultiConditionValues({
|
|
749
|
+
attribute,
|
|
750
|
+
onChange,
|
|
751
|
+
options,
|
|
752
|
+
value
|
|
753
|
+
}) {
|
|
754
|
+
const [open, setOpen] = (0, import_react.useState)(false);
|
|
755
|
+
const [draft, setDraft] = (0, import_react.useState)(value);
|
|
756
|
+
const [search, setSearch] = (0, import_react.useState)("");
|
|
757
|
+
const labels = Object.fromEntries(options.map((option) => [option.value, option.label]));
|
|
758
|
+
const filtered = options.filter(
|
|
759
|
+
(option) => option.label.toLowerCase().includes(search.trim().toLowerCase())
|
|
760
|
+
);
|
|
761
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
762
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
763
|
+
import_ui2.Button,
|
|
764
|
+
{
|
|
765
|
+
type: "button",
|
|
766
|
+
variant: "secondary",
|
|
767
|
+
className: "w-full justify-start",
|
|
768
|
+
onClick: () => {
|
|
769
|
+
setDraft(value);
|
|
770
|
+
setSearch("");
|
|
771
|
+
setOpen(true);
|
|
772
|
+
},
|
|
773
|
+
children: value.length ? value.length === 1 ? labels[value[0]] || value[0] : `${value.length} values selected` : "Select values"
|
|
774
|
+
}
|
|
775
|
+
),
|
|
776
|
+
value.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "mt-2 flex flex-wrap gap-1", children: value.map((item) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
777
|
+
"span",
|
|
778
|
+
{
|
|
779
|
+
className: "bg-ui-bg-component text-ui-fg-subtle flex items-center gap-x-1 rounded-md border px-2 py-1 text-xs",
|
|
780
|
+
children: [
|
|
781
|
+
labels[item] || item,
|
|
782
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
783
|
+
"button",
|
|
784
|
+
{
|
|
785
|
+
type: "button",
|
|
786
|
+
"aria-label": `Remove ${labels[item] || item}`,
|
|
787
|
+
onClick: () => onChange(value.filter((entry) => entry !== item)),
|
|
788
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.XMarkMini, {})
|
|
789
|
+
}
|
|
790
|
+
)
|
|
791
|
+
]
|
|
792
|
+
},
|
|
793
|
+
item
|
|
794
|
+
)) }),
|
|
795
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Drawer, { open, onOpenChange: setOpen, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Drawer.Content, { children: [
|
|
796
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Drawer.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Drawer.Title, { children: [
|
|
797
|
+
"Select ",
|
|
798
|
+
conditionAttributes.find((item) => item.value === attribute)?.label
|
|
799
|
+
] }) }),
|
|
800
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Drawer.Body, { className: "flex flex-col gap-y-3 overflow-y-auto", children: [
|
|
801
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
802
|
+
import_ui2.Input,
|
|
803
|
+
{
|
|
804
|
+
value: search,
|
|
805
|
+
placeholder: "Search values",
|
|
806
|
+
onChange: (event) => setSearch(event.target.value)
|
|
807
|
+
}
|
|
808
|
+
),
|
|
809
|
+
filtered.length ? filtered.map((option) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
810
|
+
"label",
|
|
811
|
+
{
|
|
812
|
+
className: "flex cursor-pointer items-center gap-x-3 rounded-md border p-3",
|
|
813
|
+
children: [
|
|
814
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
815
|
+
import_ui2.Checkbox,
|
|
816
|
+
{
|
|
817
|
+
checked: draft.includes(option.value),
|
|
818
|
+
onCheckedChange: (checked) => setDraft(
|
|
819
|
+
(current) => checked ? Array.from(/* @__PURE__ */ new Set([...current, option.value])) : current.filter((value2) => value2 !== option.value)
|
|
820
|
+
)
|
|
821
|
+
}
|
|
822
|
+
),
|
|
823
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { children: option.label })
|
|
824
|
+
]
|
|
825
|
+
},
|
|
826
|
+
option.value
|
|
827
|
+
)) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { className: "text-ui-fg-muted", children: "No matching values." })
|
|
828
|
+
] }),
|
|
829
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Drawer.Footer, { children: [
|
|
830
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Button, { type: "button", variant: "secondary", onClick: () => setOpen(false), children: "Cancel" }),
|
|
831
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
832
|
+
import_ui2.Button,
|
|
833
|
+
{
|
|
834
|
+
type: "button",
|
|
835
|
+
disabled: !draft.length,
|
|
836
|
+
onClick: () => {
|
|
837
|
+
onChange(draft);
|
|
838
|
+
setOpen(false);
|
|
839
|
+
},
|
|
840
|
+
children: "Apply"
|
|
841
|
+
}
|
|
842
|
+
)
|
|
843
|
+
] })
|
|
844
|
+
] }) })
|
|
845
|
+
] });
|
|
846
|
+
}
|
|
847
|
+
function PurchaseConditionsField({
|
|
848
|
+
fixedAmount,
|
|
849
|
+
onChange,
|
|
850
|
+
options,
|
|
851
|
+
value
|
|
852
|
+
}) {
|
|
853
|
+
const selectedAttributes = new Set(
|
|
854
|
+
value.map((condition) => condition.attribute).filter(Boolean)
|
|
855
|
+
);
|
|
856
|
+
const replace = (key, update) => onChange(
|
|
857
|
+
value.map(
|
|
858
|
+
(condition) => condition.key === key ? { ...condition, ...update } : condition
|
|
859
|
+
)
|
|
860
|
+
);
|
|
861
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
862
|
+
Section,
|
|
863
|
+
{
|
|
864
|
+
title: "Who can purchase this coupon?",
|
|
865
|
+
description: "Coupon products can be purchased by all customers when no conditions are configured. Conditions are combined with AND.",
|
|
866
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-3", children: [
|
|
867
|
+
value.map((condition, index) => {
|
|
868
|
+
const values = conditionValueOptions(condition.attribute, options);
|
|
869
|
+
const currencyRequired = fixedAmount && condition.attribute === "currency_code";
|
|
870
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
871
|
+
index > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "text-ui-fg-muted flex h-8 items-center text-xs font-medium", children: "AND" }),
|
|
872
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: panelStyle, className: "relative flex flex-col gap-y-3", children: [
|
|
873
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-start gap-x-2", children: [
|
|
874
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
875
|
+
import_ui2.Select,
|
|
876
|
+
{
|
|
877
|
+
value: condition.attribute || void 0,
|
|
878
|
+
disabled: currencyRequired,
|
|
879
|
+
onValueChange: (attribute) => replace(condition.key, {
|
|
880
|
+
attribute,
|
|
881
|
+
operator: "",
|
|
882
|
+
values: []
|
|
883
|
+
}),
|
|
884
|
+
children: [
|
|
885
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, { placeholder: "Select attribute" }) }),
|
|
886
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Content, { children: conditionAttributes.filter(
|
|
887
|
+
(attribute) => attribute.value === condition.attribute || !selectedAttributes.has(attribute.value)
|
|
888
|
+
).map((attribute) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: attribute.value, children: attribute.label }, attribute.value)) })
|
|
889
|
+
]
|
|
890
|
+
}
|
|
891
|
+
) }),
|
|
892
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
893
|
+
import_ui2.Button,
|
|
894
|
+
{
|
|
895
|
+
type: "button",
|
|
896
|
+
size: "small",
|
|
897
|
+
variant: "transparent",
|
|
898
|
+
disabled: currencyRequired,
|
|
899
|
+
"aria-label": "Remove condition",
|
|
900
|
+
onClick: () => onChange(value.filter((item) => item.key !== condition.key)),
|
|
901
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.XMarkMini, {})
|
|
902
|
+
}
|
|
903
|
+
)
|
|
904
|
+
] }),
|
|
905
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
|
|
906
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
907
|
+
import_ui2.Select,
|
|
908
|
+
{
|
|
909
|
+
value: condition.operator || void 0,
|
|
910
|
+
disabled: !condition.attribute,
|
|
911
|
+
onValueChange: (operator) => replace(condition.key, {
|
|
912
|
+
operator,
|
|
913
|
+
values: operator === "eq" ? condition.values.slice(0, 1) : condition.values
|
|
914
|
+
}),
|
|
915
|
+
children: [
|
|
916
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, { placeholder: "Select operator" }) }),
|
|
917
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Content, { children: conditionOperators.map((operator) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: operator.value, children: operator.label }, operator.value)) })
|
|
918
|
+
]
|
|
919
|
+
}
|
|
920
|
+
),
|
|
921
|
+
condition.attribute && condition.operator === "eq" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
922
|
+
import_ui2.Select,
|
|
923
|
+
{
|
|
924
|
+
value: condition.values[0] || void 0,
|
|
925
|
+
onValueChange: (selected) => replace(condition.key, { values: [selected] }),
|
|
926
|
+
children: [
|
|
927
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, { placeholder: "Select value" }) }),
|
|
928
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Content, { children: values.map((option) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: option.value, children: option.label }, option.value)) })
|
|
929
|
+
]
|
|
930
|
+
}
|
|
931
|
+
) : condition.attribute && condition.operator ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
932
|
+
MultiConditionValues,
|
|
933
|
+
{
|
|
934
|
+
attribute: condition.attribute,
|
|
935
|
+
options: values,
|
|
936
|
+
value: condition.values,
|
|
937
|
+
onChange: (values2) => replace(condition.key, { values: values2 })
|
|
938
|
+
}
|
|
939
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Button, { type: "button", variant: "secondary", disabled: true, className: "w-full", children: "Select values" })
|
|
940
|
+
] })
|
|
941
|
+
] })
|
|
942
|
+
] }, condition.key);
|
|
943
|
+
}),
|
|
944
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-x-2", children: [
|
|
945
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
946
|
+
import_ui2.Button,
|
|
947
|
+
{
|
|
948
|
+
type: "button",
|
|
949
|
+
variant: "secondary",
|
|
950
|
+
disabled: selectedAttributes.size >= conditionAttributes.length,
|
|
951
|
+
onClick: () => onChange([
|
|
952
|
+
...value,
|
|
953
|
+
{ key: conditionKey(), attribute: "", operator: "", values: [] }
|
|
954
|
+
]),
|
|
955
|
+
children: [
|
|
956
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.Plus, {}),
|
|
957
|
+
" Add condition"
|
|
958
|
+
]
|
|
959
|
+
}
|
|
960
|
+
),
|
|
961
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
962
|
+
import_ui2.Button,
|
|
963
|
+
{
|
|
964
|
+
type: "button",
|
|
965
|
+
variant: "transparent",
|
|
966
|
+
onClick: () => onChange(fixedAmount ? defaultPurchaseConditions(options) : []),
|
|
967
|
+
children: "Clear all"
|
|
968
|
+
}
|
|
969
|
+
)
|
|
970
|
+
] })
|
|
971
|
+
] })
|
|
972
|
+
}
|
|
973
|
+
);
|
|
974
|
+
}
|
|
975
|
+
function ProductPricesTable({
|
|
976
|
+
currencies,
|
|
977
|
+
couponValue,
|
|
978
|
+
onChange,
|
|
979
|
+
prices
|
|
980
|
+
}) {
|
|
981
|
+
const [visibleCurrencies, setVisibleCurrencies] = (0, import_react.useState)(
|
|
982
|
+
() => currencies.map((currency) => currency.code)
|
|
983
|
+
);
|
|
984
|
+
(0, import_react.useEffect)(() => {
|
|
985
|
+
setVisibleCurrencies((current) => {
|
|
986
|
+
const available = new Set(currencies.map((currency) => currency.code));
|
|
987
|
+
const retained = current.filter((code) => available.has(code));
|
|
988
|
+
const added = currencies.map((currency) => currency.code).filter((code) => !current.includes(code));
|
|
989
|
+
return [...retained, ...added];
|
|
990
|
+
});
|
|
991
|
+
}, [currencies]);
|
|
992
|
+
const shownCurrencies = currencies.filter(
|
|
993
|
+
(currency) => visibleCurrencies.includes(currency.code)
|
|
994
|
+
);
|
|
995
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex size-full flex-col divide-y overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-ui-bg-subtle flex size-full flex-col", children: [
|
|
996
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "bg-ui-bg-base flex items-center justify-between border-b p-4", children: [
|
|
997
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center gap-x-2", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.DropdownMenu, { children: [
|
|
998
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Button, { type: "button", size: "small", variant: "secondary", children: [
|
|
999
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.Adjustments, {}),
|
|
1000
|
+
"View"
|
|
1001
|
+
] }) }),
|
|
1002
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.DropdownMenu.Content, { align: "start", children: currencies.map((currency) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1003
|
+
import_ui2.DropdownMenu.CheckboxItem,
|
|
1004
|
+
{
|
|
1005
|
+
checked: visibleCurrencies.includes(currency.code),
|
|
1006
|
+
onCheckedChange: (checked) => setVisibleCurrencies(
|
|
1007
|
+
(current) => checked ? Array.from(/* @__PURE__ */ new Set([...current, currency.code])) : current.filter((code) => code !== currency.code)
|
|
1008
|
+
),
|
|
1009
|
+
children: [
|
|
1010
|
+
"Price ",
|
|
1011
|
+
currency.code.toUpperCase()
|
|
1012
|
+
]
|
|
1013
|
+
},
|
|
1014
|
+
currency.code
|
|
1015
|
+
)) })
|
|
1016
|
+
] }) }),
|
|
1017
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "flex items-center gap-x-2" })
|
|
1018
|
+
] }),
|
|
1019
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "size-full overflow-auto", children: [
|
|
1020
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1021
|
+
import_ui2.Table,
|
|
1022
|
+
{
|
|
1023
|
+
style: {
|
|
1024
|
+
borderCollapse: "collapse",
|
|
1025
|
+
tableLayout: "fixed",
|
|
1026
|
+
width: "max-content"
|
|
1027
|
+
},
|
|
1028
|
+
children: [
|
|
1029
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Header, { style: { borderTop: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Table.Row, { style: { height: 40 }, children: [
|
|
1030
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1031
|
+
import_ui2.Table.HeaderCell,
|
|
1032
|
+
{
|
|
1033
|
+
style: {
|
|
1034
|
+
background: "var(--bg-base)",
|
|
1035
|
+
borderBottom: "1px solid var(--border-base)",
|
|
1036
|
+
borderRight: "1px solid var(--border-base)",
|
|
1037
|
+
height: 40,
|
|
1038
|
+
left: 0,
|
|
1039
|
+
maxWidth: 200,
|
|
1040
|
+
minWidth: 200,
|
|
1041
|
+
padding: "0 16px",
|
|
1042
|
+
position: "sticky",
|
|
1043
|
+
width: 200,
|
|
1044
|
+
zIndex: 1
|
|
1045
|
+
},
|
|
1046
|
+
children: "Coupon Value"
|
|
1047
|
+
}
|
|
1048
|
+
),
|
|
1049
|
+
shownCurrencies.map((currency) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1050
|
+
import_ui2.Table.HeaderCell,
|
|
1051
|
+
{
|
|
1052
|
+
style: {
|
|
1053
|
+
background: "var(--bg-base)",
|
|
1054
|
+
borderBottom: "1px solid var(--border-base)",
|
|
1055
|
+
borderRight: "1px solid var(--border-base)",
|
|
1056
|
+
height: 40,
|
|
1057
|
+
maxWidth: 200,
|
|
1058
|
+
minWidth: 200,
|
|
1059
|
+
padding: "0 16px",
|
|
1060
|
+
width: 200
|
|
1061
|
+
},
|
|
1062
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex w-full items-center justify-between gap-3", children: [
|
|
1063
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "truncate", title: `Price ${currency.code.toUpperCase()}`, children: [
|
|
1064
|
+
"Price ",
|
|
1065
|
+
currency.code.toUpperCase()
|
|
1066
|
+
] }),
|
|
1067
|
+
currency.is_tax_inclusive ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.TaxInclusive, { className: "text-ui-fg-muted shrink-0" }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.TaxExclusive, { className: "text-ui-fg-muted shrink-0" })
|
|
1068
|
+
] })
|
|
1069
|
+
},
|
|
1070
|
+
currency.code
|
|
1071
|
+
))
|
|
1072
|
+
] }) }),
|
|
1073
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Body, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Table.Row, { className: "bg-ui-bg-subtle", style: { height: 40 }, children: [
|
|
1074
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1075
|
+
import_ui2.Table.Cell,
|
|
1076
|
+
{
|
|
1077
|
+
style: {
|
|
1078
|
+
background: "var(--bg-subtle)",
|
|
1079
|
+
borderBottom: "1px solid var(--border-base)",
|
|
1080
|
+
borderRight: "1px solid var(--border-base)",
|
|
1081
|
+
height: 40,
|
|
1082
|
+
left: 0,
|
|
1083
|
+
maxWidth: 200,
|
|
1084
|
+
minWidth: 200,
|
|
1085
|
+
padding: "0 16px",
|
|
1086
|
+
position: "sticky",
|
|
1087
|
+
width: 200,
|
|
1088
|
+
zIndex: 1
|
|
1089
|
+
},
|
|
1090
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "block truncate", children: couponValue })
|
|
1091
|
+
}
|
|
1092
|
+
),
|
|
1093
|
+
shownCurrencies.map((currency) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1094
|
+
import_ui2.Table.Cell,
|
|
1095
|
+
{
|
|
1096
|
+
style: {
|
|
1097
|
+
background: "var(--bg-base)",
|
|
1098
|
+
borderBottom: "1px solid var(--border-base)",
|
|
1099
|
+
borderRight: "1px solid var(--border-base)",
|
|
1100
|
+
height: 40,
|
|
1101
|
+
maxWidth: 200,
|
|
1102
|
+
minWidth: 200,
|
|
1103
|
+
padding: 0,
|
|
1104
|
+
width: 200
|
|
1105
|
+
},
|
|
1106
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1107
|
+
TablePriceInput,
|
|
1108
|
+
{
|
|
1109
|
+
currency,
|
|
1110
|
+
value: prices[currency.code] || "",
|
|
1111
|
+
onChange: (value) => onChange(currency.code, value)
|
|
1112
|
+
}
|
|
1113
|
+
)
|
|
1114
|
+
},
|
|
1115
|
+
currency.code
|
|
1116
|
+
))
|
|
1117
|
+
] }) })
|
|
1118
|
+
]
|
|
1119
|
+
}
|
|
1120
|
+
),
|
|
1121
|
+
!currencies.length && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "p-4", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { className: "text-ui-fg-muted", children: "Add a supported currency to the store before setting prices." }) })
|
|
1122
|
+
] })
|
|
1123
|
+
] }) });
|
|
1124
|
+
}
|
|
1125
|
+
function formatCouponValue(coupon, currencies) {
|
|
1126
|
+
if (coupon.type === "amount_off_products" || coupon.type === "amount_off_order") {
|
|
1127
|
+
const defaultCode = currencies.find((currency) => currency.is_default)?.code || currencies[0]?.code;
|
|
1128
|
+
const primary = coupon.amounts.find((row) => row.currency_code === defaultCode) || coupon.amounts[0];
|
|
1129
|
+
const amount = numberOrNull(primary?.amount);
|
|
1130
|
+
if (amount == null) return "\u2014";
|
|
1131
|
+
const additional = Math.max(0, coupon.amounts.length - 1);
|
|
1132
|
+
const formatted = `${amount}${primary.currency_code.toUpperCase()}`;
|
|
1133
|
+
return additional ? `${formatted} +${additional}` : formatted;
|
|
1134
|
+
}
|
|
1135
|
+
if (coupon.type === "percentage_off_product" || coupon.type === "percentage_off_order") {
|
|
1136
|
+
const percentage = numberOrNull(coupon.percentage);
|
|
1137
|
+
if (percentage == null) return "\u2014";
|
|
1138
|
+
return coupon.type === "percentage_off_order" ? `${percentage}% off order` : `${percentage}% off products`;
|
|
1139
|
+
}
|
|
1140
|
+
return coupon.type === "free_shipping" ? "Free shipping" : "Buy X Get Y";
|
|
1141
|
+
}
|
|
1142
|
+
function TablePriceInput({
|
|
1143
|
+
currency,
|
|
1144
|
+
onChange,
|
|
1145
|
+
value
|
|
1146
|
+
}) {
|
|
1147
|
+
const symbol = currency.symbol_native || currency.symbol || currencySymbol(currency.code || "USD");
|
|
1148
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1149
|
+
"label",
|
|
1150
|
+
{
|
|
1151
|
+
className: "bg-ui-bg-base hover:bg-ui-bg-subtle focus-within:shadow-borders-interactive-with-active text-ui-fg-base",
|
|
1152
|
+
style: {
|
|
1153
|
+
alignItems: "center",
|
|
1154
|
+
borderRadius: 0,
|
|
1155
|
+
display: "flex",
|
|
1156
|
+
height: 40,
|
|
1157
|
+
margin: 0,
|
|
1158
|
+
overflow: "hidden",
|
|
1159
|
+
width: 200
|
|
1160
|
+
},
|
|
1161
|
+
children: [
|
|
1162
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1163
|
+
"span",
|
|
1164
|
+
{
|
|
1165
|
+
className: "text-ui-fg-muted",
|
|
1166
|
+
"aria-hidden": "true",
|
|
1167
|
+
style: { flex: "0 0 40px", paddingLeft: 16 },
|
|
1168
|
+
children: symbol
|
|
1169
|
+
}
|
|
1170
|
+
),
|
|
1171
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1172
|
+
"input",
|
|
1173
|
+
{
|
|
1174
|
+
"aria-label": `Price ${currency.code.toUpperCase()}`,
|
|
1175
|
+
inputMode: "decimal",
|
|
1176
|
+
value,
|
|
1177
|
+
onChange: (event) => onChange(event.target.value),
|
|
1178
|
+
style: {
|
|
1179
|
+
appearance: "none",
|
|
1180
|
+
background: "transparent",
|
|
1181
|
+
border: 0,
|
|
1182
|
+
borderRadius: 0,
|
|
1183
|
+
flex: "1 1 auto",
|
|
1184
|
+
height: "100%",
|
|
1185
|
+
margin: 0,
|
|
1186
|
+
minWidth: 0,
|
|
1187
|
+
outline: "none",
|
|
1188
|
+
padding: "0 16px 0 0",
|
|
1189
|
+
textAlign: "right"
|
|
1190
|
+
},
|
|
1191
|
+
type: "text"
|
|
1192
|
+
}
|
|
1193
|
+
)
|
|
1194
|
+
]
|
|
1195
|
+
}
|
|
1196
|
+
);
|
|
1197
|
+
}
|
|
1198
|
+
function CouponProductModal({
|
|
1199
|
+
allowPromotionMirror,
|
|
1200
|
+
apiBase,
|
|
1201
|
+
onOpenChange,
|
|
1202
|
+
onSaved,
|
|
1203
|
+
open,
|
|
1204
|
+
options,
|
|
1205
|
+
row
|
|
1206
|
+
}) {
|
|
1207
|
+
const [activeStep, setActiveStep] = (0, import_react.useState)("details");
|
|
1208
|
+
const [product, setProduct] = (0, import_react.useState)(
|
|
1209
|
+
() => emptyProduct(options)
|
|
1210
|
+
);
|
|
1211
|
+
const [coupon, setCoupon] = (0, import_react.useState)(
|
|
1212
|
+
() => emptyCoupon(options)
|
|
1213
|
+
);
|
|
1214
|
+
const [campaign, setCampaign] = (0, import_react.useState)(emptyCampaign);
|
|
1215
|
+
const [saving, setSaving] = (0, import_react.useState)(false);
|
|
1216
|
+
const [uploading, setUploading] = (0, import_react.useState)(false);
|
|
1217
|
+
const [furthestStepIndex, setFurthestStepIndex] = (0, import_react.useState)(0);
|
|
1218
|
+
const visibleSteps = (0, import_react.useMemo)(
|
|
1219
|
+
() => allowPromotionMirror ? allSteps : allSteps.filter((step) => step !== "campaign"),
|
|
1220
|
+
[allowPromotionMirror]
|
|
1221
|
+
);
|
|
1222
|
+
const currentStepIndex = visibleSteps.indexOf(activeStep);
|
|
1223
|
+
const currencies = options.currencies || [];
|
|
1224
|
+
const supportedCurrencyCodes = (0, import_react.useMemo)(
|
|
1225
|
+
() => new Set(currencies.map((currency) => currency.code)),
|
|
1226
|
+
[currencies]
|
|
1227
|
+
);
|
|
1228
|
+
const isAmountType = coupon.type === "amount_off_products" || coupon.type === "amount_off_order";
|
|
1229
|
+
const isPercentageType = coupon.type === "percentage_off_product" || coupon.type === "percentage_off_order";
|
|
1230
|
+
const isItemScopedDiscount = coupon.type === "amount_off_products" || coupon.type === "percentage_off_product";
|
|
1231
|
+
const effectiveCurrencies = (0, import_react.useMemo)(
|
|
1232
|
+
() => effectiveCouponCurrencies(coupon.purchase_conditions, currencies),
|
|
1233
|
+
[coupon.purchase_conditions, currencies]
|
|
1234
|
+
);
|
|
1235
|
+
const productPrices = currencies.flatMap((currency) => {
|
|
1236
|
+
const value = product.price_amounts[currency.code] || "";
|
|
1237
|
+
const amount = nonNegativeNumberOrNull(value);
|
|
1238
|
+
return amount == null ? [] : [{ currency_code: currency.code, amount }];
|
|
1239
|
+
});
|
|
1240
|
+
(0, import_react.useEffect)(() => {
|
|
1241
|
+
if (!open) return;
|
|
1242
|
+
const forms = row ? formsFromRow(row, options) : {
|
|
1243
|
+
product: emptyProduct(options),
|
|
1244
|
+
coupon: emptyCoupon(options),
|
|
1245
|
+
campaign: emptyCampaign
|
|
1246
|
+
};
|
|
1247
|
+
setProduct(forms.product);
|
|
1248
|
+
setCoupon(forms.coupon);
|
|
1249
|
+
setCampaign(forms.campaign);
|
|
1250
|
+
setActiveStep("details");
|
|
1251
|
+
setFurthestStepIndex(0);
|
|
1252
|
+
}, [open, row, options]);
|
|
1253
|
+
const updatePurchaseConditions = (purchaseConditions) => {
|
|
1254
|
+
setCoupon((current) => ({
|
|
1255
|
+
...current,
|
|
1256
|
+
purchase_conditions: purchaseConditions,
|
|
1257
|
+
amounts: isAmountCouponType(current.type) ? reconcileCouponAmounts(
|
|
1258
|
+
current.amounts,
|
|
1259
|
+
effectiveCouponCurrencies(purchaseConditions, currencies)
|
|
1260
|
+
) : current.amounts
|
|
1261
|
+
}));
|
|
1262
|
+
};
|
|
1263
|
+
const updateCouponType = (type) => {
|
|
1264
|
+
setCoupon((current) => {
|
|
1265
|
+
let purchaseConditions = current.purchase_conditions;
|
|
1266
|
+
if (isAmountCouponType(type) && !purchaseConditions.some(
|
|
1267
|
+
(condition) => condition.attribute === "currency_code"
|
|
1268
|
+
)) {
|
|
1269
|
+
purchaseConditions = [
|
|
1270
|
+
...purchaseConditions,
|
|
1271
|
+
...defaultPurchaseConditions(options)
|
|
1272
|
+
];
|
|
1273
|
+
}
|
|
1274
|
+
return {
|
|
1275
|
+
...current,
|
|
1276
|
+
type,
|
|
1277
|
+
purchase_conditions: purchaseConditions,
|
|
1278
|
+
amounts: isAmountCouponType(type) ? reconcileCouponAmounts(
|
|
1279
|
+
current.amounts,
|
|
1280
|
+
effectiveCouponCurrencies(purchaseConditions, currencies)
|
|
1281
|
+
) : current.amounts,
|
|
1282
|
+
promotion_mirror_mode: type === "buy_x_get_y" ? "none" : current.promotion_mirror_mode
|
|
1283
|
+
};
|
|
1284
|
+
});
|
|
1285
|
+
};
|
|
1286
|
+
const uploadMedia = async (files) => {
|
|
1287
|
+
if (!files.length) return;
|
|
1288
|
+
const formData = new FormData();
|
|
1289
|
+
files.forEach((file) => formData.append("files", file));
|
|
1290
|
+
if (apiBase === "/admin" && product.seller_id) {
|
|
1291
|
+
formData.append("seller_id", product.seller_id);
|
|
1292
|
+
}
|
|
1293
|
+
setUploading(true);
|
|
1294
|
+
try {
|
|
1295
|
+
const response = await fetch(
|
|
1296
|
+
`${backendUrl()}${apiBase}/coupon-products/uploads`,
|
|
1297
|
+
{
|
|
1298
|
+
method: "POST",
|
|
1299
|
+
body: formData,
|
|
1300
|
+
credentials: "include"
|
|
1301
|
+
}
|
|
1302
|
+
);
|
|
1303
|
+
if (!response.ok) {
|
|
1304
|
+
const payload2 = await response.json().catch(() => null);
|
|
1305
|
+
throw new Error(apiErrorMessage(payload2, response.statusText));
|
|
1306
|
+
}
|
|
1307
|
+
const payload = await response.json();
|
|
1308
|
+
const uploaded = (payload.files || []).filter(
|
|
1309
|
+
(file) => Boolean(file.asset_id && file.url)
|
|
1310
|
+
).map((file) => ({ asset_id: file.asset_id, url: file.url }));
|
|
1311
|
+
if (!uploaded.length)
|
|
1312
|
+
throw new Error("The upload did not return an image URL");
|
|
1313
|
+
setProduct((current) => ({
|
|
1314
|
+
...current,
|
|
1315
|
+
media: Array.from(
|
|
1316
|
+
new Map(
|
|
1317
|
+
[...current.media, ...uploaded].map((item) => [item.url, item])
|
|
1318
|
+
).values()
|
|
1319
|
+
)
|
|
1320
|
+
}));
|
|
1321
|
+
} catch (error) {
|
|
1322
|
+
import_ui2.toast.error(
|
|
1323
|
+
error instanceof Error ? error.message : "Image upload failed"
|
|
1324
|
+
);
|
|
1325
|
+
} finally {
|
|
1326
|
+
setUploading(false);
|
|
1327
|
+
}
|
|
1328
|
+
};
|
|
1329
|
+
const detailsComplete = (0, import_react.useMemo)(() => {
|
|
1330
|
+
if (!product.title.trim()) return false;
|
|
1331
|
+
if (!currencies.length) return false;
|
|
1332
|
+
const attributes = /* @__PURE__ */ new Set();
|
|
1333
|
+
for (const condition of coupon.purchase_conditions) {
|
|
1334
|
+
if (!condition.attribute || !condition.operator || !condition.values.length || condition.operator === "eq" && condition.values.length !== 1 || attributes.has(condition.attribute)) {
|
|
1335
|
+
return false;
|
|
1336
|
+
}
|
|
1337
|
+
attributes.add(condition.attribute);
|
|
1338
|
+
}
|
|
1339
|
+
if (isAmountType) {
|
|
1340
|
+
if (!attributes.has("currency_code")) return false;
|
|
1341
|
+
if (!coupon.amounts.length) return false;
|
|
1342
|
+
if (coupon.amounts.length !== effectiveCurrencies.length) return false;
|
|
1343
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1344
|
+
for (const row2 of coupon.amounts) {
|
|
1345
|
+
if (!supportedCurrencyCodes.has(row2.currency_code)) return false;
|
|
1346
|
+
if (seen.has(row2.currency_code)) return false;
|
|
1347
|
+
if (numberOrNull(row2.amount) == null) return false;
|
|
1348
|
+
seen.add(row2.currency_code);
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
if (isPercentageType) {
|
|
1352
|
+
const value = numberOrNull(coupon.percentage);
|
|
1353
|
+
if (value == null || value > 100) return false;
|
|
1354
|
+
}
|
|
1355
|
+
if (coupon.code_strategy === "shared_code" && !coupon.shared_code.trim()) {
|
|
1356
|
+
return false;
|
|
1357
|
+
}
|
|
1358
|
+
if (coupon.expiration_type === "duration") {
|
|
1359
|
+
const days = Number(coupon.expiration_days);
|
|
1360
|
+
if (!Number.isInteger(days) || days < 1) return false;
|
|
1361
|
+
} else if (coupon.expiration_type === "fixed") {
|
|
1362
|
+
const expiration = new Date(coupon.expiration_date);
|
|
1363
|
+
if (!coupon.expiration_date || Number.isNaN(expiration.getTime())) {
|
|
1364
|
+
return false;
|
|
1365
|
+
}
|
|
1366
|
+
}
|
|
1367
|
+
if (coupon.expiration_type !== "none" && coupon.expiration_cap_at) {
|
|
1368
|
+
const cap = new Date(coupon.expiration_cap_at);
|
|
1369
|
+
if (Number.isNaN(cap.getTime())) return false;
|
|
1370
|
+
}
|
|
1371
|
+
const maxIssuance = Number(coupon.max_issuance_per_order_item);
|
|
1372
|
+
return Number.isInteger(maxIssuance) && maxIssuance > 0;
|
|
1373
|
+
}, [
|
|
1374
|
+
coupon,
|
|
1375
|
+
currencies.length,
|
|
1376
|
+
effectiveCurrencies.length,
|
|
1377
|
+
isAmountType,
|
|
1378
|
+
isPercentageType,
|
|
1379
|
+
product.title,
|
|
1380
|
+
supportedCurrencyCodes
|
|
1381
|
+
]);
|
|
1382
|
+
const campaignComplete = (0, import_react.useMemo)(() => {
|
|
1383
|
+
if (!allowPromotionMirror || campaign.mode === "none") return true;
|
|
1384
|
+
if (campaign.mode === "existing") return Boolean(campaign.campaign_id);
|
|
1385
|
+
if (!campaign.name.trim() || !campaign.campaign_identifier.trim()) {
|
|
1386
|
+
return false;
|
|
1387
|
+
}
|
|
1388
|
+
return [campaign.starts_at, campaign.ends_at].every((value) => {
|
|
1389
|
+
if (!value) return true;
|
|
1390
|
+
return !Number.isNaN(new Date(value).getTime());
|
|
1391
|
+
});
|
|
1392
|
+
}, [allowPromotionMirror, campaign]);
|
|
1393
|
+
const pricesComplete = (0, import_react.useMemo)(() => {
|
|
1394
|
+
if (!currencies.length || !productPrices.length) return false;
|
|
1395
|
+
return currencies.every((currency) => {
|
|
1396
|
+
const value = product.price_amounts[currency.code] || "";
|
|
1397
|
+
return !value.trim() || nonNegativeNumberOrNull(value) != null;
|
|
1398
|
+
});
|
|
1399
|
+
}, [currencies, product.price_amounts, productPrices.length]);
|
|
1400
|
+
const stepValidity = (0, import_react.useMemo)(
|
|
1401
|
+
() => ({
|
|
1402
|
+
details: detailsComplete,
|
|
1403
|
+
organize: true,
|
|
1404
|
+
campaign: campaignComplete,
|
|
1405
|
+
prices: pricesComplete
|
|
1406
|
+
}),
|
|
1407
|
+
[campaignComplete, detailsComplete, pricesComplete]
|
|
1408
|
+
);
|
|
1409
|
+
const activeStepComplete = stepValidity[activeStep];
|
|
1410
|
+
(0, import_react.useEffect)(() => {
|
|
1411
|
+
if (!open || !activeStepComplete) return;
|
|
1412
|
+
setFurthestStepIndex(
|
|
1413
|
+
(current) => Math.max(
|
|
1414
|
+
current,
|
|
1415
|
+
Math.min(currentStepIndex + 1, visibleSteps.length - 1)
|
|
1416
|
+
)
|
|
1417
|
+
);
|
|
1418
|
+
}, [activeStepComplete, currentStepIndex, open, visibleSteps.length]);
|
|
1419
|
+
const isStepDisabled = (index) => index > furthestStepIndex || visibleSteps.slice(0, index).some((previous) => !stepValidity[previous]);
|
|
1420
|
+
const validate = () => {
|
|
1421
|
+
if (!product.title.trim()) throw new Error("Product title is required");
|
|
1422
|
+
if (!currencies.length) {
|
|
1423
|
+
throw new Error("Add a supported currency to the store before continuing");
|
|
1424
|
+
}
|
|
1425
|
+
const invalidPrice = currencies.some((currency) => {
|
|
1426
|
+
const value = product.price_amounts[currency.code] || "";
|
|
1427
|
+
return value.trim() && nonNegativeNumberOrNull(value) == null;
|
|
1428
|
+
});
|
|
1429
|
+
if (invalidPrice) {
|
|
1430
|
+
throw new Error("Product prices must be 0 or more");
|
|
1431
|
+
}
|
|
1432
|
+
if (!productPrices.length) {
|
|
1433
|
+
throw new Error("Add at least one product price");
|
|
1434
|
+
}
|
|
1435
|
+
if (isAmountType) {
|
|
1436
|
+
if (!coupon.amounts.length) {
|
|
1437
|
+
throw new Error("Add at least one coupon value");
|
|
1438
|
+
}
|
|
1439
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1440
|
+
const currencyCondition = coupon.purchase_conditions.find(
|
|
1441
|
+
(condition) => condition.attribute === "currency_code"
|
|
1442
|
+
);
|
|
1443
|
+
if (!currencyCondition) {
|
|
1444
|
+
throw new Error("Add a Currency Code purchase condition");
|
|
1445
|
+
}
|
|
1446
|
+
if (coupon.amounts.length !== effectiveCurrencies.length) {
|
|
1447
|
+
throw new Error(
|
|
1448
|
+
"Coupon values must match every effective currency condition value"
|
|
1449
|
+
);
|
|
1450
|
+
}
|
|
1451
|
+
for (const row2 of coupon.amounts) {
|
|
1452
|
+
if (!supportedCurrencyCodes.has(row2.currency_code)) {
|
|
1453
|
+
throw new Error("Select an available coupon currency");
|
|
1454
|
+
}
|
|
1455
|
+
if (seen.has(row2.currency_code)) {
|
|
1456
|
+
throw new Error("Coupon value currencies cannot be duplicated");
|
|
1457
|
+
}
|
|
1458
|
+
if (numberOrNull(row2.amount) == null) {
|
|
1459
|
+
throw new Error("Coupon values must be greater than 0");
|
|
1460
|
+
}
|
|
1461
|
+
seen.add(row2.currency_code);
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
const seenAttributes = /* @__PURE__ */ new Set();
|
|
1465
|
+
for (const condition of coupon.purchase_conditions) {
|
|
1466
|
+
if (!condition.attribute || !condition.operator) {
|
|
1467
|
+
throw new Error("Complete every purchase condition");
|
|
1468
|
+
}
|
|
1469
|
+
if (!condition.values.length) {
|
|
1470
|
+
throw new Error("Select at least one value for every purchase condition");
|
|
1471
|
+
}
|
|
1472
|
+
if (condition.operator === "eq" && condition.values.length !== 1) {
|
|
1473
|
+
throw new Error("Equals conditions require exactly one value");
|
|
1474
|
+
}
|
|
1475
|
+
if (seenAttributes.has(condition.attribute)) {
|
|
1476
|
+
throw new Error("Purchase condition attributes cannot be duplicated");
|
|
1477
|
+
}
|
|
1478
|
+
seenAttributes.add(condition.attribute);
|
|
1479
|
+
}
|
|
1480
|
+
if (isPercentageType) {
|
|
1481
|
+
const value = numberOrNull(coupon.percentage);
|
|
1482
|
+
if (value == null || value > 100) {
|
|
1483
|
+
throw new Error("Coupon value must be between 1 and 100 percent");
|
|
1484
|
+
}
|
|
1485
|
+
}
|
|
1486
|
+
if (coupon.code_strategy === "shared_code" && !coupon.shared_code.trim()) {
|
|
1487
|
+
throw new Error("A shared coupon code is required");
|
|
1488
|
+
}
|
|
1489
|
+
if (coupon.expiration_type === "fixed") {
|
|
1490
|
+
const expiration = new Date(coupon.expiration_date);
|
|
1491
|
+
if (!coupon.expiration_date || Number.isNaN(expiration.getTime())) {
|
|
1492
|
+
throw new Error("A valid fixed expiration date is required");
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
if (coupon.expiration_type !== "none" && coupon.expiration_cap_at) {
|
|
1496
|
+
const cap = new Date(coupon.expiration_cap_at);
|
|
1497
|
+
if (Number.isNaN(cap.getTime())) {
|
|
1498
|
+
throw new Error("A valid expiration cap date is required");
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
if (campaign.mode === "existing" && !campaign.campaign_id) {
|
|
1502
|
+
throw new Error("Select an existing campaign");
|
|
1503
|
+
}
|
|
1504
|
+
if (campaign.mode === "new" && (!campaign.name.trim() || !campaign.campaign_identifier.trim())) {
|
|
1505
|
+
throw new Error("Campaign name and identifier are required");
|
|
1506
|
+
}
|
|
1507
|
+
};
|
|
1508
|
+
const save = async () => {
|
|
1509
|
+
setSaving(true);
|
|
1510
|
+
try {
|
|
1511
|
+
validate();
|
|
1512
|
+
const benefitType = benefitTypeFromCouponType(coupon.type);
|
|
1513
|
+
const targetType = coupon.type === "amount_off_order" || coupon.type === "percentage_off_order" ? "order" : "items";
|
|
1514
|
+
const payload = {
|
|
1515
|
+
product: {
|
|
1516
|
+
title: product.title.trim(),
|
|
1517
|
+
subtitle: product.subtitle.trim() || null,
|
|
1518
|
+
handle: product.handle.trim() || null,
|
|
1519
|
+
description: product.description.trim() || null,
|
|
1520
|
+
status: productStatusFromCouponStatus(coupon.promotion_status),
|
|
1521
|
+
thumbnail: product.media[0]?.url || null,
|
|
1522
|
+
thumbnail_asset_id: product.media[0]?.asset_id || null,
|
|
1523
|
+
images: product.media.slice(1).map((media) => ({
|
|
1524
|
+
url: media.url,
|
|
1525
|
+
...media.asset_id ? { asset_id: media.asset_id } : {}
|
|
1526
|
+
})),
|
|
1527
|
+
discountable: product.discountable,
|
|
1528
|
+
type_id: product.type_id || null,
|
|
1529
|
+
collection_id: product.collection_id || null,
|
|
1530
|
+
categories: product.category_id ? [{ id: product.category_id }] : [],
|
|
1531
|
+
tags: product.tag_id ? [{ id: product.tag_id }] : [],
|
|
1532
|
+
variants: [
|
|
1533
|
+
{
|
|
1534
|
+
title: "Default",
|
|
1535
|
+
sku: product.sku.trim() || null,
|
|
1536
|
+
manage_inventory: false,
|
|
1537
|
+
allow_backorder: true,
|
|
1538
|
+
prices: productPrices
|
|
1539
|
+
}
|
|
1540
|
+
]
|
|
1541
|
+
},
|
|
1542
|
+
coupon: {
|
|
1543
|
+
enabled: coupon.enabled,
|
|
1544
|
+
benefit_type: benefitType,
|
|
1545
|
+
purchase_conditions: coupon.purchase_conditions.map((condition) => ({
|
|
1546
|
+
attribute: condition.attribute,
|
|
1547
|
+
operator: condition.operator,
|
|
1548
|
+
values: condition.values
|
|
1549
|
+
})),
|
|
1550
|
+
amounts: isAmountType ? coupon.amounts.map((row2) => ({
|
|
1551
|
+
amount: numberOrNull(row2.amount),
|
|
1552
|
+
currency_code: row2.currency_code
|
|
1553
|
+
})) : null,
|
|
1554
|
+
amount: null,
|
|
1555
|
+
percentage: isPercentageType ? numberOrNull(coupon.percentage) : null,
|
|
1556
|
+
currency_code: null,
|
|
1557
|
+
code_strategy: coupon.code_strategy,
|
|
1558
|
+
code_prefix: coupon.code_strategy === "unique_code" ? coupon.code_prefix.trim() || "COUPON" : null,
|
|
1559
|
+
shared_code: coupon.code_strategy === "shared_code" ? coupon.shared_code.trim() : null,
|
|
1560
|
+
expiration_policy: coupon.expiration_type === "none" ? { type: "none" } : coupon.expiration_type === "fixed" ? {
|
|
1561
|
+
type: "fixed",
|
|
1562
|
+
expires_at: new Date(coupon.expiration_date).toISOString(),
|
|
1563
|
+
cap_by_campaign: coupon.expiration_cap_by_campaign,
|
|
1564
|
+
cap_at: coupon.expiration_cap_at ? new Date(coupon.expiration_cap_at).toISOString() : null
|
|
1565
|
+
} : {
|
|
1566
|
+
type: "duration",
|
|
1567
|
+
duration_days: Number(coupon.expiration_days) || 30,
|
|
1568
|
+
cap_by_campaign: coupon.expiration_cap_by_campaign,
|
|
1569
|
+
cap_at: coupon.expiration_cap_at ? new Date(coupon.expiration_cap_at).toISOString() : null
|
|
1570
|
+
},
|
|
1571
|
+
max_issuance_per_order_item: Number(coupon.max_issuance_per_order_item) || 1,
|
|
1572
|
+
promotion_template: benefitType === "fixed_amount" || benefitType === "percentage" ? {
|
|
1573
|
+
application_method: {
|
|
1574
|
+
target_type: targetType,
|
|
1575
|
+
allocation: targetType === "order" ? "across" : coupon.allocation
|
|
1576
|
+
}
|
|
1577
|
+
} : null,
|
|
1578
|
+
promotion_status: coupon.promotion_status,
|
|
1579
|
+
...allowPromotionMirror ? {
|
|
1580
|
+
promotion_mirror_mode: benefitType === "buy_get" || benefitType === "fixed_amount" && coupon.amounts.length > 1 ? "none" : coupon.promotion_mirror_mode
|
|
1581
|
+
} : {}
|
|
1582
|
+
},
|
|
1583
|
+
campaign: allowPromotionMirror ? campaign.mode === "existing" ? { mode: "existing", campaign_id: campaign.campaign_id } : campaign.mode === "new" ? {
|
|
1584
|
+
mode: "new",
|
|
1585
|
+
campaign: {
|
|
1586
|
+
name: campaign.name,
|
|
1587
|
+
campaign_identifier: campaign.campaign_identifier,
|
|
1588
|
+
starts_at: campaign.starts_at ? new Date(campaign.starts_at).toISOString() : null,
|
|
1589
|
+
ends_at: campaign.ends_at ? new Date(campaign.ends_at).toISOString() : null
|
|
1590
|
+
}
|
|
1591
|
+
} : { mode: "none" } : void 0,
|
|
1592
|
+
seller_id: product.seller_id || null,
|
|
1593
|
+
variant_overrides: []
|
|
1594
|
+
};
|
|
1595
|
+
await apiFetch(
|
|
1596
|
+
row ? `${apiBase}/coupon-products/${row.product.id}` : `${apiBase}/coupon-products`,
|
|
1597
|
+
{
|
|
1598
|
+
method: row ? "PATCH" : "POST",
|
|
1599
|
+
body: JSON.stringify(payload)
|
|
1600
|
+
}
|
|
1601
|
+
);
|
|
1602
|
+
import_ui2.toast.success(row ? "Coupon product updated" : "Coupon product created");
|
|
1603
|
+
onOpenChange(false);
|
|
1604
|
+
await onSaved();
|
|
1605
|
+
} catch (error) {
|
|
1606
|
+
import_ui2.toast.error(
|
|
1607
|
+
error instanceof Error ? error.message : "Failed to save coupon product"
|
|
1608
|
+
);
|
|
1609
|
+
} finally {
|
|
1610
|
+
setSaving(false);
|
|
1611
|
+
}
|
|
1612
|
+
};
|
|
1613
|
+
const stepStatus = (step) => {
|
|
1614
|
+
const index = visibleSteps.indexOf(step);
|
|
1615
|
+
if (index < currentStepIndex && stepValidity[step]) {
|
|
1616
|
+
return "completed";
|
|
1617
|
+
}
|
|
1618
|
+
if (index === currentStepIndex) return "in-progress";
|
|
1619
|
+
return "not-started";
|
|
1620
|
+
};
|
|
1621
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.FocusModal, { open, onOpenChange, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.FocusModal.Content, { style: modalContentStyle, children: [
|
|
1622
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.FocusModal.Title, { style: visuallyHiddenStyle, children: row ? "Edit Coupon Product" : "Create Coupon Product" }),
|
|
1623
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1624
|
+
import_ui2.ProgressTabs,
|
|
1625
|
+
{
|
|
1626
|
+
value: activeStep,
|
|
1627
|
+
onValueChange: (value) => {
|
|
1628
|
+
const step = value;
|
|
1629
|
+
const index = visibleSteps.indexOf(step);
|
|
1630
|
+
if (!isStepDisabled(index)) setActiveStep(step);
|
|
1631
|
+
},
|
|
1632
|
+
style: modalWizardStyle,
|
|
1633
|
+
children: [
|
|
1634
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.FocusModal.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "-my-2 w-full border-l", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.ProgressTabs.List, { className: "justify-start-start flex w-full items-center", children: visibleSteps.map((step, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1635
|
+
import_ui2.ProgressTabs.Trigger,
|
|
1636
|
+
{
|
|
1637
|
+
value: step,
|
|
1638
|
+
status: stepStatus(step),
|
|
1639
|
+
disabled: isStepDisabled(index),
|
|
1640
|
+
className: "max-w-[200px] truncate",
|
|
1641
|
+
children: step[0].toUpperCase() + step.slice(1)
|
|
1642
|
+
},
|
|
1643
|
+
step
|
|
1644
|
+
)) }) }) }),
|
|
1645
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.FocusModal.Body, { className: "overflow-hidden p-0", style: modalBodyStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1646
|
+
"div",
|
|
1647
|
+
{
|
|
1648
|
+
style: activeStep === "prices" ? { height: "100%", overflow: "hidden", width: "100%" } : modalScrollStyle,
|
|
1649
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1650
|
+
"div",
|
|
1651
|
+
{
|
|
1652
|
+
style: activeStep === "prices" ? { height: "100%", width: "100%" } : modalFormStyle,
|
|
1653
|
+
children: [
|
|
1654
|
+
activeStep === "details" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.ProgressTabs.Content, { value: "details", style: stackStyle, children: [
|
|
1655
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Heading, { level: "h1", children: row ? "Edit Coupon Product" : "Create Coupon Product" }),
|
|
1656
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Divider, {}),
|
|
1657
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Section, { title: "General", children: [
|
|
1658
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: threeColumnGridStyle, children: [
|
|
1659
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Title", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1660
|
+
import_ui2.Input,
|
|
1661
|
+
{
|
|
1662
|
+
value: product.title,
|
|
1663
|
+
placeholder: "Winter jacket",
|
|
1664
|
+
onChange: (event) => setProduct((current) => ({
|
|
1665
|
+
...current,
|
|
1666
|
+
title: event.target.value
|
|
1667
|
+
}))
|
|
1668
|
+
}
|
|
1669
|
+
) }),
|
|
1670
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Subtitle", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1671
|
+
import_ui2.Input,
|
|
1672
|
+
{
|
|
1673
|
+
value: product.subtitle,
|
|
1674
|
+
placeholder: "Warm and cozy",
|
|
1675
|
+
onChange: (event) => setProduct((current) => ({
|
|
1676
|
+
...current,
|
|
1677
|
+
subtitle: event.target.value
|
|
1678
|
+
}))
|
|
1679
|
+
}
|
|
1680
|
+
) }),
|
|
1681
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1682
|
+
Field,
|
|
1683
|
+
{
|
|
1684
|
+
label: "Handle",
|
|
1685
|
+
optional: true,
|
|
1686
|
+
tooltip: "The URL-friendly identifier for this product. If left empty, Medusa generates it from the title.",
|
|
1687
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1688
|
+
HandleInput,
|
|
1689
|
+
{
|
|
1690
|
+
value: product.handle,
|
|
1691
|
+
onChange: (handle) => setProduct((current) => ({ ...current, handle }))
|
|
1692
|
+
}
|
|
1693
|
+
)
|
|
1694
|
+
}
|
|
1695
|
+
)
|
|
1696
|
+
] }),
|
|
1697
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Description", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1698
|
+
import_ui2.Textarea,
|
|
1699
|
+
{
|
|
1700
|
+
value: product.description,
|
|
1701
|
+
placeholder: "A warm and cozy jacket",
|
|
1702
|
+
onChange: (event) => setProduct((current) => ({
|
|
1703
|
+
...current,
|
|
1704
|
+
description: event.target.value
|
|
1705
|
+
}))
|
|
1706
|
+
}
|
|
1707
|
+
) }),
|
|
1708
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Media", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1709
|
+
MediaUpload,
|
|
1710
|
+
{
|
|
1711
|
+
isUploading: uploading,
|
|
1712
|
+
media: product.media,
|
|
1713
|
+
onUpload: (files) => void uploadMedia(files),
|
|
1714
|
+
onRemove: (media) => setProduct((current) => ({
|
|
1715
|
+
...current,
|
|
1716
|
+
media: current.media.filter(
|
|
1717
|
+
(item) => media.asset_id && item.asset_id !== media.asset_id || !media.asset_id && item.url !== media.url
|
|
1718
|
+
)
|
|
1719
|
+
}))
|
|
1720
|
+
}
|
|
1721
|
+
) }),
|
|
1722
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "SKU", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1723
|
+
import_ui2.Input,
|
|
1724
|
+
{
|
|
1725
|
+
value: product.sku,
|
|
1726
|
+
placeholder: "COUPON-001",
|
|
1727
|
+
onChange: (event) => setProduct((current) => ({
|
|
1728
|
+
...current,
|
|
1729
|
+
sku: event.target.value
|
|
1730
|
+
}))
|
|
1731
|
+
}
|
|
1732
|
+
) })
|
|
1733
|
+
] }),
|
|
1734
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Divider, {}),
|
|
1735
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1736
|
+
PurchaseConditionsField,
|
|
1737
|
+
{
|
|
1738
|
+
fixedAmount: isAmountType,
|
|
1739
|
+
options,
|
|
1740
|
+
value: coupon.purchase_conditions,
|
|
1741
|
+
onChange: updatePurchaseConditions
|
|
1742
|
+
}
|
|
1743
|
+
)
|
|
1744
|
+
] }),
|
|
1745
|
+
activeStep === "organize" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.ProgressTabs.Content, { value: "organize", style: stackStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(Section, { title: "Organize", children: [
|
|
1746
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: panelStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between gap-x-4", children: [
|
|
1747
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1748
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { weight: "plus", children: "Discountable" }),
|
|
1749
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "Allow promotions to discount this product's sale price." })
|
|
1750
|
+
] }),
|
|
1751
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1752
|
+
import_ui2.Switch,
|
|
1753
|
+
{
|
|
1754
|
+
checked: product.discountable,
|
|
1755
|
+
onCheckedChange: (discountable) => setProduct((current) => ({
|
|
1756
|
+
...current,
|
|
1757
|
+
discountable: Boolean(discountable)
|
|
1758
|
+
}))
|
|
1759
|
+
}
|
|
1760
|
+
)
|
|
1761
|
+
] }) }),
|
|
1762
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
|
|
1763
|
+
allowPromotionMirror && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Seller", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1764
|
+
OptionSelect,
|
|
1765
|
+
{
|
|
1766
|
+
value: product.seller_id,
|
|
1767
|
+
options: options.sellers || [],
|
|
1768
|
+
onChange: (seller_id) => setProduct((current) => ({ ...current, seller_id }))
|
|
1769
|
+
}
|
|
1770
|
+
) }),
|
|
1771
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Type", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1772
|
+
OptionSelect,
|
|
1773
|
+
{
|
|
1774
|
+
value: product.type_id,
|
|
1775
|
+
options: options.product_types || [],
|
|
1776
|
+
onChange: (type_id) => setProduct((current) => ({ ...current, type_id }))
|
|
1777
|
+
}
|
|
1778
|
+
) }),
|
|
1779
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Collection", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1780
|
+
OptionSelect,
|
|
1781
|
+
{
|
|
1782
|
+
value: product.collection_id,
|
|
1783
|
+
options: options.product_collections || [],
|
|
1784
|
+
onChange: (collection_id) => setProduct((current) => ({
|
|
1785
|
+
...current,
|
|
1786
|
+
collection_id
|
|
1787
|
+
}))
|
|
1788
|
+
}
|
|
1789
|
+
) }),
|
|
1790
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Category", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1791
|
+
OptionSelect,
|
|
1792
|
+
{
|
|
1793
|
+
value: product.category_id,
|
|
1794
|
+
options: options.product_categories || [],
|
|
1795
|
+
onChange: (category_id) => setProduct((current) => ({ ...current, category_id }))
|
|
1796
|
+
}
|
|
1797
|
+
) }),
|
|
1798
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Tag", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1799
|
+
OptionSelect,
|
|
1800
|
+
{
|
|
1801
|
+
value: product.tag_id,
|
|
1802
|
+
options: options.product_tags || [],
|
|
1803
|
+
onChange: (tag_id) => setProduct((current) => ({ ...current, tag_id }))
|
|
1804
|
+
}
|
|
1805
|
+
) })
|
|
1806
|
+
] })
|
|
1807
|
+
] }) }),
|
|
1808
|
+
activeStep === "details" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { ...stackStyle, marginTop: 24 }, children: [
|
|
1809
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Divider, {}),
|
|
1810
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1811
|
+
Section,
|
|
1812
|
+
{
|
|
1813
|
+
title: "Coupon",
|
|
1814
|
+
description: "Configure the coupon issued when this product is purchased.",
|
|
1815
|
+
children: [
|
|
1816
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: panelStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between gap-x-4", children: [
|
|
1817
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { children: [
|
|
1818
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { weight: "plus", children: "Coupon issuance" }),
|
|
1819
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "Issue coupons when customers purchase this product." })
|
|
1820
|
+
] }),
|
|
1821
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1822
|
+
import_ui2.Switch,
|
|
1823
|
+
{
|
|
1824
|
+
checked: coupon.enabled,
|
|
1825
|
+
onCheckedChange: (enabled) => setCoupon((current) => ({
|
|
1826
|
+
...current,
|
|
1827
|
+
enabled: Boolean(enabled)
|
|
1828
|
+
}))
|
|
1829
|
+
}
|
|
1830
|
+
)
|
|
1831
|
+
] }) }),
|
|
1832
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Type", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1833
|
+
import_ui2.RadioGroup,
|
|
1834
|
+
{
|
|
1835
|
+
value: coupon.type,
|
|
1836
|
+
onValueChange: (type) => updateCouponType(type),
|
|
1837
|
+
className: "flex flex-col gap-y-3",
|
|
1838
|
+
children: typeChoices.map((choice) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1839
|
+
import_ui2.RadioGroup.ChoiceBox,
|
|
1840
|
+
{
|
|
1841
|
+
value: choice.value,
|
|
1842
|
+
label: choice.label,
|
|
1843
|
+
description: choice.description
|
|
1844
|
+
},
|
|
1845
|
+
choice.value
|
|
1846
|
+
))
|
|
1847
|
+
}
|
|
1848
|
+
) }),
|
|
1849
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Status", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1850
|
+
import_ui2.RadioGroup,
|
|
1851
|
+
{
|
|
1852
|
+
value: coupon.promotion_status,
|
|
1853
|
+
onValueChange: (promotion_status) => setCoupon((current) => ({
|
|
1854
|
+
...current,
|
|
1855
|
+
promotion_status
|
|
1856
|
+
})),
|
|
1857
|
+
style: twoColumnGridStyle,
|
|
1858
|
+
children: statusChoices.map((choice) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1859
|
+
import_ui2.RadioGroup.ChoiceBox,
|
|
1860
|
+
{
|
|
1861
|
+
value: choice.value,
|
|
1862
|
+
label: choice.label,
|
|
1863
|
+
description: choice.description
|
|
1864
|
+
},
|
|
1865
|
+
choice.value
|
|
1866
|
+
))
|
|
1867
|
+
}
|
|
1868
|
+
) }),
|
|
1869
|
+
(isAmountType || isPercentageType) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: isAmountType ? "Coupon Values" : "Value", children: isAmountType ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-2", children: [
|
|
1870
|
+
coupon.amounts.map((row2, rowIndex) => {
|
|
1871
|
+
const currency = currencies.find(
|
|
1872
|
+
(item) => item.code === row2.currency_code
|
|
1873
|
+
);
|
|
1874
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1875
|
+
"div",
|
|
1876
|
+
{
|
|
1877
|
+
className: "shadow-elevation-card-rest bg-ui-bg-component rounded-md px-4 py-3",
|
|
1878
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-y-2", children: [
|
|
1879
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
1880
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Label, { children: [
|
|
1881
|
+
row2.currency_code.toUpperCase(),
|
|
1882
|
+
" Coupon Value"
|
|
1883
|
+
] }),
|
|
1884
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: currency?.name || row2.currency_code.toUpperCase() })
|
|
1885
|
+
] }),
|
|
1886
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1887
|
+
CurrencyAmountField,
|
|
1888
|
+
{
|
|
1889
|
+
currencies,
|
|
1890
|
+
currencyCode: row2.currency_code,
|
|
1891
|
+
value: row2.amount,
|
|
1892
|
+
onChange: (amount) => setCoupon((current) => ({
|
|
1893
|
+
...current,
|
|
1894
|
+
amounts: current.amounts.map(
|
|
1895
|
+
(item, index) => index === rowIndex ? { ...item, amount } : item
|
|
1896
|
+
)
|
|
1897
|
+
}))
|
|
1898
|
+
}
|
|
1899
|
+
) })
|
|
1900
|
+
] })
|
|
1901
|
+
},
|
|
1902
|
+
row2.key
|
|
1903
|
+
);
|
|
1904
|
+
}),
|
|
1905
|
+
!coupon.amounts.length && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { className: "text-ui-fg-muted", children: "Select at least one effective Currency Code condition value." })
|
|
1906
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Coupon Value", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1907
|
+
PercentageInput,
|
|
1908
|
+
{
|
|
1909
|
+
value: coupon.percentage,
|
|
1910
|
+
onChange: (percentage) => setCoupon((current) => ({
|
|
1911
|
+
...current,
|
|
1912
|
+
percentage
|
|
1913
|
+
}))
|
|
1914
|
+
}
|
|
1915
|
+
) }) }),
|
|
1916
|
+
isItemScopedDiscount && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Allocation", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1917
|
+
import_ui2.RadioGroup,
|
|
1918
|
+
{
|
|
1919
|
+
value: coupon.allocation,
|
|
1920
|
+
onValueChange: (allocation) => setCoupon((current) => ({
|
|
1921
|
+
...current,
|
|
1922
|
+
allocation
|
|
1923
|
+
})),
|
|
1924
|
+
style: twoColumnGridStyle,
|
|
1925
|
+
children: [
|
|
1926
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1927
|
+
import_ui2.RadioGroup.ChoiceBox,
|
|
1928
|
+
{
|
|
1929
|
+
value: "each",
|
|
1930
|
+
label: "Each",
|
|
1931
|
+
description: "Applies value on each item"
|
|
1932
|
+
}
|
|
1933
|
+
),
|
|
1934
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1935
|
+
import_ui2.RadioGroup.ChoiceBox,
|
|
1936
|
+
{
|
|
1937
|
+
value: "once",
|
|
1938
|
+
label: "Once",
|
|
1939
|
+
description: "Limit discount to max quantity"
|
|
1940
|
+
}
|
|
1941
|
+
)
|
|
1942
|
+
]
|
|
1943
|
+
}
|
|
1944
|
+
) }),
|
|
1945
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1946
|
+
Section,
|
|
1947
|
+
{
|
|
1948
|
+
title: "Expiration",
|
|
1949
|
+
description: "Control when issued coupons expire.",
|
|
1950
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
|
|
1951
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Expiration policy", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1952
|
+
import_ui2.Select,
|
|
1953
|
+
{
|
|
1954
|
+
value: coupon.expiration_type,
|
|
1955
|
+
onValueChange: (expiration_type) => setCoupon((current) => ({
|
|
1956
|
+
...current,
|
|
1957
|
+
expiration_type
|
|
1958
|
+
})),
|
|
1959
|
+
children: [
|
|
1960
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
|
|
1961
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
|
|
1962
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "none", children: "None" }),
|
|
1963
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "duration", children: "Duration after issue" }),
|
|
1964
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "fixed", children: "Fixed date" })
|
|
1965
|
+
] })
|
|
1966
|
+
]
|
|
1967
|
+
}
|
|
1968
|
+
) }),
|
|
1969
|
+
coupon.expiration_type === "duration" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Expiration days", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1970
|
+
import_ui2.Input,
|
|
1971
|
+
{
|
|
1972
|
+
type: "number",
|
|
1973
|
+
min: 1,
|
|
1974
|
+
value: coupon.expiration_days,
|
|
1975
|
+
onChange: (event) => setCoupon((current) => ({
|
|
1976
|
+
...current,
|
|
1977
|
+
expiration_days: event.target.value
|
|
1978
|
+
}))
|
|
1979
|
+
}
|
|
1980
|
+
) }) : coupon.expiration_type === "fixed" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Expires at", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
1981
|
+
import_ui2.Input,
|
|
1982
|
+
{
|
|
1983
|
+
type: "datetime-local",
|
|
1984
|
+
value: coupon.expiration_date,
|
|
1985
|
+
onChange: (event) => setCoupon((current) => ({
|
|
1986
|
+
...current,
|
|
1987
|
+
expiration_date: event.target.value
|
|
1988
|
+
}))
|
|
1989
|
+
}
|
|
1990
|
+
) }) : null,
|
|
1991
|
+
coupon.expiration_type !== "none" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
1992
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Cap expiration", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
1993
|
+
"div",
|
|
1994
|
+
{
|
|
1995
|
+
className: "flex items-center justify-between gap-x-4",
|
|
1996
|
+
style: { ...panelStyle, padding: "8px 12px" },
|
|
1997
|
+
children: [
|
|
1998
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: "Campaign end or cap date" }),
|
|
1999
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2000
|
+
import_ui2.Switch,
|
|
2001
|
+
{
|
|
2002
|
+
checked: coupon.expiration_cap_by_campaign,
|
|
2003
|
+
onCheckedChange: (expiration_cap_by_campaign) => setCoupon((current) => ({
|
|
2004
|
+
...current,
|
|
2005
|
+
expiration_cap_by_campaign: Boolean(
|
|
2006
|
+
expiration_cap_by_campaign
|
|
2007
|
+
)
|
|
2008
|
+
}))
|
|
2009
|
+
}
|
|
2010
|
+
)
|
|
2011
|
+
]
|
|
2012
|
+
}
|
|
2013
|
+
) }),
|
|
2014
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Expiration cap date", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2015
|
+
import_ui2.Input,
|
|
2016
|
+
{
|
|
2017
|
+
type: "datetime-local",
|
|
2018
|
+
disabled: !coupon.expiration_cap_by_campaign,
|
|
2019
|
+
value: coupon.expiration_cap_at,
|
|
2020
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2021
|
+
...current,
|
|
2022
|
+
expiration_cap_at: event.target.value
|
|
2023
|
+
}))
|
|
2024
|
+
}
|
|
2025
|
+
) })
|
|
2026
|
+
] })
|
|
2027
|
+
] })
|
|
2028
|
+
}
|
|
2029
|
+
),
|
|
2030
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2031
|
+
Section,
|
|
2032
|
+
{
|
|
2033
|
+
title: "Code",
|
|
2034
|
+
description: "Choose whether every issued coupon is unique or shares one code.",
|
|
2035
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
|
|
2036
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Code strategy", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
2037
|
+
import_ui2.Select,
|
|
2038
|
+
{
|
|
2039
|
+
value: coupon.code_strategy,
|
|
2040
|
+
onValueChange: (code_strategy) => setCoupon((current) => ({
|
|
2041
|
+
...current,
|
|
2042
|
+
code_strategy
|
|
2043
|
+
})),
|
|
2044
|
+
children: [
|
|
2045
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
|
|
2046
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
|
|
2047
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "unique_code", children: "Unique code" }),
|
|
2048
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "shared_code", children: "Shared code" })
|
|
2049
|
+
] })
|
|
2050
|
+
]
|
|
2051
|
+
}
|
|
2052
|
+
) }),
|
|
2053
|
+
coupon.code_strategy === "unique_code" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Code prefix", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2054
|
+
import_ui2.Input,
|
|
2055
|
+
{
|
|
2056
|
+
value: coupon.code_prefix,
|
|
2057
|
+
placeholder: "COUPON",
|
|
2058
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2059
|
+
...current,
|
|
2060
|
+
code_prefix: event.target.value
|
|
2061
|
+
}))
|
|
2062
|
+
}
|
|
2063
|
+
) }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Shared code", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2064
|
+
import_ui2.Input,
|
|
2065
|
+
{
|
|
2066
|
+
value: coupon.shared_code,
|
|
2067
|
+
placeholder: "SUMMER15",
|
|
2068
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2069
|
+
...current,
|
|
2070
|
+
shared_code: event.target.value
|
|
2071
|
+
}))
|
|
2072
|
+
}
|
|
2073
|
+
) })
|
|
2074
|
+
] })
|
|
2075
|
+
}
|
|
2076
|
+
),
|
|
2077
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Issuance", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
|
|
2078
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Max issuance per item", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2079
|
+
import_ui2.Input,
|
|
2080
|
+
{
|
|
2081
|
+
type: "number",
|
|
2082
|
+
min: 1,
|
|
2083
|
+
value: coupon.max_issuance_per_order_item,
|
|
2084
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2085
|
+
...current,
|
|
2086
|
+
max_issuance_per_order_item: event.target.value
|
|
2087
|
+
}))
|
|
2088
|
+
}
|
|
2089
|
+
) }),
|
|
2090
|
+
allowPromotionMirror && !(isAmountType && coupon.amounts.length > 1) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Promotion mirror", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
2091
|
+
import_ui2.Select,
|
|
2092
|
+
{
|
|
2093
|
+
value: coupon.promotion_mirror_mode,
|
|
2094
|
+
disabled: coupon.type === "buy_x_get_y",
|
|
2095
|
+
onValueChange: (promotion_mirror_mode) => setCoupon((current) => ({
|
|
2096
|
+
...current,
|
|
2097
|
+
promotion_mirror_mode
|
|
2098
|
+
})),
|
|
2099
|
+
children: [
|
|
2100
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
|
|
2101
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
|
|
2102
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "none", children: "None" }),
|
|
2103
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "manual", children: "Manual" }),
|
|
2104
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "auto", children: "Auto" })
|
|
2105
|
+
] })
|
|
2106
|
+
]
|
|
2107
|
+
}
|
|
2108
|
+
) })
|
|
2109
|
+
] }) })
|
|
2110
|
+
]
|
|
2111
|
+
}
|
|
2112
|
+
)
|
|
2113
|
+
] }),
|
|
2114
|
+
allowPromotionMirror && activeStep === "campaign" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.ProgressTabs.Content, { value: "campaign", style: stackStyle, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Section, { title: "Campaign", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: twoColumnGridStyle, children: [
|
|
2115
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Campaign mode", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
2116
|
+
import_ui2.Select,
|
|
2117
|
+
{
|
|
2118
|
+
value: campaign.mode,
|
|
2119
|
+
onValueChange: (mode) => setCampaign((current) => ({
|
|
2120
|
+
...current,
|
|
2121
|
+
mode
|
|
2122
|
+
})),
|
|
2123
|
+
children: [
|
|
2124
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Value, {}) }),
|
|
2125
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Select.Content, { children: [
|
|
2126
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "none", children: "No campaign" }),
|
|
2127
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "existing", children: "Existing campaign" }),
|
|
2128
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Select.Item, { value: "new", children: "New campaign" })
|
|
2129
|
+
] })
|
|
2130
|
+
]
|
|
2131
|
+
}
|
|
2132
|
+
) }),
|
|
2133
|
+
campaign.mode === "existing" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Existing campaign", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2134
|
+
OptionSelect,
|
|
2135
|
+
{
|
|
2136
|
+
value: campaign.campaign_id,
|
|
2137
|
+
options: options.campaigns || [],
|
|
2138
|
+
onChange: (campaign_id) => setCampaign((current) => ({
|
|
2139
|
+
...current,
|
|
2140
|
+
campaign_id
|
|
2141
|
+
}))
|
|
2142
|
+
}
|
|
2143
|
+
) }),
|
|
2144
|
+
campaign.mode === "new" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
|
|
2145
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Name", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2146
|
+
import_ui2.Input,
|
|
2147
|
+
{
|
|
2148
|
+
value: campaign.name,
|
|
2149
|
+
onChange: (event) => setCampaign((current) => ({
|
|
2150
|
+
...current,
|
|
2151
|
+
name: event.target.value
|
|
2152
|
+
}))
|
|
2153
|
+
}
|
|
2154
|
+
) }),
|
|
2155
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Identifier", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2156
|
+
import_ui2.Input,
|
|
2157
|
+
{
|
|
2158
|
+
value: campaign.campaign_identifier,
|
|
2159
|
+
onChange: (event) => setCampaign((current) => ({
|
|
2160
|
+
...current,
|
|
2161
|
+
campaign_identifier: event.target.value
|
|
2162
|
+
}))
|
|
2163
|
+
}
|
|
2164
|
+
) }),
|
|
2165
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Starts at", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2166
|
+
import_ui2.Input,
|
|
2167
|
+
{
|
|
2168
|
+
type: "datetime-local",
|
|
2169
|
+
value: campaign.starts_at,
|
|
2170
|
+
onChange: (event) => setCampaign((current) => ({
|
|
2171
|
+
...current,
|
|
2172
|
+
starts_at: event.target.value
|
|
2173
|
+
}))
|
|
2174
|
+
}
|
|
2175
|
+
) }),
|
|
2176
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Field, { label: "Ends at", optional: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2177
|
+
import_ui2.Input,
|
|
2178
|
+
{
|
|
2179
|
+
type: "datetime-local",
|
|
2180
|
+
value: campaign.ends_at,
|
|
2181
|
+
onChange: (event) => setCampaign((current) => ({
|
|
2182
|
+
...current,
|
|
2183
|
+
ends_at: event.target.value
|
|
2184
|
+
}))
|
|
2185
|
+
}
|
|
2186
|
+
) })
|
|
2187
|
+
] })
|
|
2188
|
+
] }) }) }),
|
|
2189
|
+
activeStep === "prices" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.ProgressTabs.Content, { value: "prices", style: { height: "100%" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2190
|
+
ProductPricesTable,
|
|
2191
|
+
{
|
|
2192
|
+
currencies,
|
|
2193
|
+
couponValue: formatCouponValue(coupon, currencies),
|
|
2194
|
+
prices: product.price_amounts,
|
|
2195
|
+
onChange: (currencyCode, value) => setProduct((current) => ({
|
|
2196
|
+
...current,
|
|
2197
|
+
price_amounts: {
|
|
2198
|
+
...current.price_amounts,
|
|
2199
|
+
[currencyCode]: value
|
|
2200
|
+
}
|
|
2201
|
+
}))
|
|
2202
|
+
}
|
|
2203
|
+
) })
|
|
2204
|
+
]
|
|
2205
|
+
}
|
|
2206
|
+
)
|
|
2207
|
+
}
|
|
2208
|
+
) }),
|
|
2209
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.FocusModal.Footer, { style: { flexShrink: 0 }, children: [
|
|
2210
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Button, { variant: "secondary", onClick: () => onOpenChange(false), children: "Cancel" }),
|
|
2211
|
+
currentStepIndex > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2212
|
+
import_ui2.Button,
|
|
2213
|
+
{
|
|
2214
|
+
variant: "secondary",
|
|
2215
|
+
onClick: () => setActiveStep(visibleSteps[currentStepIndex - 1]),
|
|
2216
|
+
children: "Back"
|
|
2217
|
+
}
|
|
2218
|
+
),
|
|
2219
|
+
currentStepIndex < visibleSteps.length - 1 ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2220
|
+
import_ui2.Button,
|
|
2221
|
+
{
|
|
2222
|
+
disabled: !activeStepComplete,
|
|
2223
|
+
onClick: () => {
|
|
2224
|
+
const nextIndex = currentStepIndex + 1;
|
|
2225
|
+
setFurthestStepIndex(
|
|
2226
|
+
(current) => Math.max(current, nextIndex)
|
|
2227
|
+
);
|
|
2228
|
+
setActiveStep(visibleSteps[nextIndex]);
|
|
2229
|
+
},
|
|
2230
|
+
children: "Continue"
|
|
2231
|
+
}
|
|
2232
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2233
|
+
import_ui2.Button,
|
|
2234
|
+
{
|
|
2235
|
+
disabled: !activeStepComplete,
|
|
2236
|
+
isLoading: saving,
|
|
2237
|
+
onClick: () => void save(),
|
|
2238
|
+
children: "Save"
|
|
2239
|
+
}
|
|
2240
|
+
)
|
|
2241
|
+
] })
|
|
2242
|
+
]
|
|
2243
|
+
}
|
|
2244
|
+
)
|
|
2245
|
+
] }) });
|
|
2246
|
+
}
|
|
2247
|
+
function CouponProductsPage({
|
|
2248
|
+
allowPromotionMirror = false,
|
|
2249
|
+
apiBase,
|
|
2250
|
+
title
|
|
2251
|
+
}) {
|
|
2252
|
+
const [products, setProducts] = (0, import_react.useState)([]);
|
|
2253
|
+
const [options, setOptions] = (0, import_react.useState)({});
|
|
2254
|
+
const [loading, setLoading] = (0, import_react.useState)(true);
|
|
2255
|
+
const [loadError, setLoadError] = (0, import_react.useState)(null);
|
|
2256
|
+
const [modalOpen, setModalOpen] = (0, import_react.useState)(false);
|
|
2257
|
+
const [editingRow, setEditingRow] = (0, import_react.useState)(null);
|
|
2258
|
+
const prompt = (0, import_ui2.usePrompt)();
|
|
2259
|
+
const couponBase = `${apiBase}/coupon-products`;
|
|
2260
|
+
const load = (0, import_react.useCallback)(async () => {
|
|
2261
|
+
setLoading(true);
|
|
2262
|
+
setLoadError(null);
|
|
2263
|
+
try {
|
|
2264
|
+
const [productsPayload, optionsPayload] = await Promise.all([
|
|
2265
|
+
apiFetch(couponBase),
|
|
2266
|
+
apiFetch(`${couponBase}/options`)
|
|
2267
|
+
]);
|
|
2268
|
+
setProducts(productsPayload.coupon_products || []);
|
|
2269
|
+
setOptions(optionsPayload || {});
|
|
2270
|
+
} catch (error) {
|
|
2271
|
+
const message = error instanceof Error ? error.message : "Failed to load coupon products";
|
|
2272
|
+
setLoadError(message);
|
|
2273
|
+
import_ui2.toast.error(message);
|
|
2274
|
+
} finally {
|
|
2275
|
+
setLoading(false);
|
|
2276
|
+
}
|
|
2277
|
+
}, [couponBase]);
|
|
2278
|
+
(0, import_react.useEffect)(() => {
|
|
2279
|
+
void load();
|
|
2280
|
+
}, [load]);
|
|
2281
|
+
const remove = async (row) => {
|
|
2282
|
+
const confirmed = await prompt({
|
|
2283
|
+
title: "Remove coupon product?",
|
|
2284
|
+
description: `This removes coupon issuance from ${row.product.title || row.product.id}. The underlying Medusa product will remain available.`,
|
|
2285
|
+
confirmText: "Remove product",
|
|
2286
|
+
cancelText: "Cancel",
|
|
2287
|
+
variant: "danger"
|
|
2288
|
+
});
|
|
2289
|
+
if (!confirmed) return;
|
|
2290
|
+
try {
|
|
2291
|
+
await apiFetch(`${couponBase}/${row.product.id}`, { method: "DELETE" });
|
|
2292
|
+
import_ui2.toast.success("Coupon configuration removed");
|
|
2293
|
+
await load();
|
|
2294
|
+
} catch (error) {
|
|
2295
|
+
import_ui2.toast.error(error instanceof Error ? error.message : "Delete failed");
|
|
2296
|
+
}
|
|
2297
|
+
};
|
|
2298
|
+
const mirror = async (row) => {
|
|
2299
|
+
try {
|
|
2300
|
+
await apiFetch(
|
|
2301
|
+
`/admin/coupon-products/${row.product.id}/mirror-promotion`,
|
|
2302
|
+
{
|
|
2303
|
+
method: "POST",
|
|
2304
|
+
body: JSON.stringify({})
|
|
2305
|
+
}
|
|
2306
|
+
);
|
|
2307
|
+
import_ui2.toast.success("Promotion mirror created");
|
|
2308
|
+
} catch (error) {
|
|
2309
|
+
import_ui2.toast.error(error instanceof Error ? error.message : "Mirror failed");
|
|
2310
|
+
}
|
|
2311
|
+
};
|
|
2312
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Container, { className: "divide-y p-0", children: [
|
|
2313
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
2314
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Heading, { level: "h1", children: title }),
|
|
2315
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex items-center gap-x-2", children: [
|
|
2316
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Button, { size: "small", variant: "secondary", onClick: () => void load(), children: [
|
|
2317
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.ArrowPath, {}),
|
|
2318
|
+
" Refresh"
|
|
2319
|
+
] }),
|
|
2320
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
2321
|
+
import_ui2.Button,
|
|
2322
|
+
{
|
|
2323
|
+
size: "small",
|
|
2324
|
+
onClick: () => {
|
|
2325
|
+
setEditingRow(null);
|
|
2326
|
+
setModalOpen(true);
|
|
2327
|
+
},
|
|
2328
|
+
children: [
|
|
2329
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.Plus, {}),
|
|
2330
|
+
" Create"
|
|
2331
|
+
]
|
|
2332
|
+
}
|
|
2333
|
+
)
|
|
2334
|
+
] })
|
|
2335
|
+
] }),
|
|
2336
|
+
loading ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(CouponEmptyState, { title: "Loading coupon products" }) : loadError ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(CouponEmptyState, { title: loadError }) : products.length ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Table, { children: [
|
|
2337
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui2.Table.Row, { children: [
|
|
2338
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Product" }),
|
|
2339
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Status" }),
|
|
2340
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Type" }),
|
|
2341
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Code" }),
|
|
2342
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Campaign" }),
|
|
2343
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, { children: "Issued" }),
|
|
2344
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.HeaderCell, {})
|
|
2345
|
+
] }) }),
|
|
2346
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2347
|
+
import_ui2.Table.Body,
|
|
2348
|
+
{
|
|
2349
|
+
style: { borderBottom: "none" },
|
|
2350
|
+
children: products.map((row) => {
|
|
2351
|
+
const config3 = row.coupon_product_config;
|
|
2352
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
2353
|
+
import_ui2.Table.Row,
|
|
2354
|
+
{
|
|
2355
|
+
style: { borderBottom: "none", background: "none" },
|
|
2356
|
+
children: [
|
|
2357
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col", children: [
|
|
2358
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { weight: "plus", children: row.product.title || row.product.id }),
|
|
2359
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Text, { size: "small", className: "text-ui-fg-muted", children: row.product.handle || row.product.id })
|
|
2360
|
+
] }) }),
|
|
2361
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2362
|
+
import_ui2.StatusBadge,
|
|
2363
|
+
{
|
|
2364
|
+
color: couponStatusColor(config3.promotion_status),
|
|
2365
|
+
children: config3.promotion_status || "draft"
|
|
2366
|
+
}
|
|
2367
|
+
) }),
|
|
2368
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: couponTypeLabel(config3) }),
|
|
2369
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: config3.code_strategy === "shared_code" ? config3.shared_code || "Shared" : `${config3.code_prefix || "COUPON"}-*` }),
|
|
2370
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: campaignLabel(config3) }),
|
|
2371
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: row.entitlements_count || 0 }),
|
|
2372
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui2.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "flex justify-end gap-x-2", children: [
|
|
2373
|
+
allowPromotionMirror && !(config3.benefit_type === "fixed_amount" && (config3.amounts?.length || 0) > 1) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2374
|
+
import_ui2.Button,
|
|
2375
|
+
{
|
|
2376
|
+
size: "small",
|
|
2377
|
+
variant: "secondary",
|
|
2378
|
+
onClick: () => void mirror(row),
|
|
2379
|
+
children: "Mirror"
|
|
2380
|
+
}
|
|
2381
|
+
),
|
|
2382
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2383
|
+
import_ui2.Button,
|
|
2384
|
+
{
|
|
2385
|
+
size: "small",
|
|
2386
|
+
variant: "secondary",
|
|
2387
|
+
onClick: () => {
|
|
2388
|
+
setEditingRow(row);
|
|
2389
|
+
setModalOpen(true);
|
|
2390
|
+
},
|
|
2391
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.PencilSquare, {})
|
|
2392
|
+
}
|
|
2393
|
+
),
|
|
2394
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2395
|
+
import_ui2.Button,
|
|
2396
|
+
{
|
|
2397
|
+
size: "small",
|
|
2398
|
+
variant: "danger",
|
|
2399
|
+
onClick: () => void remove(row),
|
|
2400
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_icons.Trash, {})
|
|
2401
|
+
}
|
|
2402
|
+
)
|
|
2403
|
+
] }) })
|
|
2404
|
+
]
|
|
2405
|
+
},
|
|
2406
|
+
row.id
|
|
2407
|
+
);
|
|
2408
|
+
})
|
|
2409
|
+
}
|
|
2410
|
+
)
|
|
2411
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2412
|
+
CouponEmptyState,
|
|
2413
|
+
{
|
|
2414
|
+
title: "No coupon products found",
|
|
2415
|
+
description: "Create a new coupon product to get started."
|
|
2416
|
+
}
|
|
2417
|
+
),
|
|
2418
|
+
/* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
|
2419
|
+
CouponProductModal,
|
|
2420
|
+
{
|
|
2421
|
+
open: modalOpen,
|
|
2422
|
+
row: editingRow,
|
|
2423
|
+
apiBase,
|
|
2424
|
+
options,
|
|
2425
|
+
allowPromotionMirror,
|
|
2426
|
+
onOpenChange: setModalOpen,
|
|
2427
|
+
onSaved: load
|
|
2428
|
+
}
|
|
2429
|
+
)
|
|
2430
|
+
] });
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2433
|
+
// src/dashboard/coupons/coupon-manager.tsx
|
|
2434
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
2435
|
+
function backendUrl2() {
|
|
2436
|
+
return typeof __BACKEND_URL__ === "string" ? __BACKEND_URL__.replace(/\/$/, "") : "";
|
|
2437
|
+
}
|
|
2438
|
+
function apiErrorMessage2(payload, fallback) {
|
|
2439
|
+
const candidates = [
|
|
2440
|
+
payload?.message,
|
|
2441
|
+
payload?.error?.message,
|
|
2442
|
+
payload?.error,
|
|
2443
|
+
payload?.errors?.[0]?.message
|
|
2444
|
+
];
|
|
2445
|
+
const message = candidates.find(
|
|
2446
|
+
(candidate) => typeof candidate === "string" && candidate.trim()
|
|
2447
|
+
);
|
|
2448
|
+
return message || fallback || "Request failed";
|
|
2449
|
+
}
|
|
2450
|
+
async function apiFetch2(path, options = {}) {
|
|
2451
|
+
const response = await fetch(`${backendUrl2()}${path}`, {
|
|
2452
|
+
...options,
|
|
2453
|
+
credentials: "include",
|
|
2454
|
+
headers: {
|
|
2455
|
+
...options.body ? { "Content-Type": "application/json" } : {},
|
|
2456
|
+
...options.headers
|
|
2457
|
+
}
|
|
2458
|
+
});
|
|
2459
|
+
if (!response.ok) {
|
|
2460
|
+
const payload = await response.json().catch(() => null);
|
|
2461
|
+
throw new Error(apiErrorMessage2(payload, response.statusText));
|
|
2462
|
+
}
|
|
2463
|
+
return response.json();
|
|
2464
|
+
}
|
|
2465
|
+
function formatDate(value) {
|
|
2466
|
+
if (!value) return "-";
|
|
2467
|
+
const date = new Date(value);
|
|
2468
|
+
if (Number.isNaN(date.getTime())) return "-";
|
|
2469
|
+
return date.toLocaleDateString();
|
|
2470
|
+
}
|
|
2471
|
+
function formatDateTime(value) {
|
|
2472
|
+
if (!value) return "-";
|
|
2473
|
+
const date = new Date(value);
|
|
2474
|
+
if (Number.isNaN(date.getTime())) return "-";
|
|
2475
|
+
return date.toLocaleString();
|
|
2476
|
+
}
|
|
2477
|
+
function formatFullDate(value) {
|
|
2478
|
+
if (!value) return "-";
|
|
2479
|
+
const date = new Date(value);
|
|
2480
|
+
if (Number.isNaN(date.getTime())) return "-";
|
|
2481
|
+
return date.toLocaleString(void 0, {
|
|
2482
|
+
day: "numeric",
|
|
2483
|
+
hour: "numeric",
|
|
2484
|
+
minute: "2-digit",
|
|
2485
|
+
month: "short",
|
|
2486
|
+
year: "numeric"
|
|
2487
|
+
});
|
|
2488
|
+
}
|
|
2489
|
+
function formatRelativeDate(value) {
|
|
2490
|
+
if (!value) return "-";
|
|
2491
|
+
const date = new Date(value);
|
|
2492
|
+
if (Number.isNaN(date.getTime())) return "-";
|
|
2493
|
+
const diffSeconds = Math.round((date.getTime() - Date.now()) / 1e3);
|
|
2494
|
+
const absSeconds = Math.abs(diffSeconds);
|
|
2495
|
+
const units = [
|
|
2496
|
+
["year", 60 * 60 * 24 * 365],
|
|
2497
|
+
["month", 60 * 60 * 24 * 30],
|
|
2498
|
+
["week", 60 * 60 * 24 * 7],
|
|
2499
|
+
["day", 60 * 60 * 24],
|
|
2500
|
+
["hour", 60 * 60],
|
|
2501
|
+
["minute", 60]
|
|
2502
|
+
];
|
|
2503
|
+
const [unit, seconds] = units.find(([, secondsPerUnit]) => absSeconds >= secondsPerUnit) || [];
|
|
2504
|
+
if (!unit || !seconds) {
|
|
2505
|
+
return "just now";
|
|
2506
|
+
}
|
|
2507
|
+
return new Intl.RelativeTimeFormat(void 0, { numeric: "auto" }).format(
|
|
2508
|
+
Math.round(diffSeconds / seconds),
|
|
2509
|
+
unit
|
|
2510
|
+
);
|
|
2511
|
+
}
|
|
2512
|
+
function formatSnapshotAmount(amount, currency) {
|
|
2513
|
+
if (amount == null) return "-";
|
|
2514
|
+
const code = currency ? currency.toUpperCase() : "";
|
|
2515
|
+
return [code, amount.toLocaleString(void 0, { maximumFractionDigits: 2 })].filter(Boolean).join(" ");
|
|
2516
|
+
}
|
|
2517
|
+
function entitlementStatusColor(status) {
|
|
2518
|
+
if (status === "issued") return "green";
|
|
2519
|
+
if (status === "redeemed") return "blue";
|
|
2520
|
+
if (status === "expired" || status === "canceled") return "grey";
|
|
2521
|
+
return "orange";
|
|
2522
|
+
}
|
|
2523
|
+
function snapshotString(snapshot, key) {
|
|
2524
|
+
const value = snapshot?.[key];
|
|
2525
|
+
if (typeof value === "string" && value.trim()) return value;
|
|
2526
|
+
if (typeof value === "number") return String(value);
|
|
2527
|
+
return "";
|
|
2528
|
+
}
|
|
2529
|
+
function snapshotNumber(snapshot, key) {
|
|
2530
|
+
const value = snapshot?.[key];
|
|
2531
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
2532
|
+
}
|
|
2533
|
+
function jsonBlock(value) {
|
|
2534
|
+
if (value == null) return "{}";
|
|
2535
|
+
return JSON.stringify(value, null, 2);
|
|
2536
|
+
}
|
|
2537
|
+
function couponCode(entitlement) {
|
|
2538
|
+
return entitlement.code || entitlement.shared_code || "-";
|
|
2539
|
+
}
|
|
2540
|
+
function entitlementSource(entitlement) {
|
|
2541
|
+
if (entitlement.origin === "external") return "External";
|
|
2542
|
+
return "Purchase";
|
|
2543
|
+
}
|
|
2544
|
+
function entitlementSellerScope(entitlement) {
|
|
2545
|
+
const count = entitlement.seller_targets?.length || 0;
|
|
2546
|
+
if (entitlement.origin !== "external") {
|
|
2547
|
+
if (!count) return "Product seller";
|
|
2548
|
+
return `Product seller + ${count} linked`;
|
|
2549
|
+
}
|
|
2550
|
+
if (!count) return "Admin only";
|
|
2551
|
+
return count === 1 ? "1 linked seller" : `${count} linked sellers`;
|
|
2552
|
+
}
|
|
2553
|
+
function orderDisplayId(order) {
|
|
2554
|
+
if (!order) return "-";
|
|
2555
|
+
return order.display_id == null ? order.id : `#${order.display_id}`;
|
|
2556
|
+
}
|
|
2557
|
+
function dashboardBasePath(apiBase) {
|
|
2558
|
+
return apiBase === "/vendor" ? "/seller" : "/dashboard";
|
|
2559
|
+
}
|
|
2560
|
+
function couponDetailPath(apiBase, entitlementId) {
|
|
2561
|
+
return `${dashboardBasePath(apiBase)}/coupons/${encodeURIComponent(
|
|
2562
|
+
entitlementId
|
|
2563
|
+
)}`;
|
|
2564
|
+
}
|
|
2565
|
+
function orderDetailPath(apiBase, orderId) {
|
|
2566
|
+
return `${dashboardBasePath(apiBase)}/orders/${encodeURIComponent(orderId)}`;
|
|
2567
|
+
}
|
|
2568
|
+
function currentCouponDetailId(apiBase) {
|
|
2569
|
+
if (typeof window === "undefined") {
|
|
2570
|
+
return "";
|
|
2571
|
+
}
|
|
2572
|
+
const prefix = `${dashboardBasePath(apiBase)}/coupons/`;
|
|
2573
|
+
const path = window.location.pathname;
|
|
2574
|
+
const index = path.indexOf(prefix);
|
|
2575
|
+
if (index === -1) {
|
|
2576
|
+
return "";
|
|
2577
|
+
}
|
|
2578
|
+
const id = path.slice(index + prefix.length).split("/")[0];
|
|
2579
|
+
if (!id || id === "products") {
|
|
2580
|
+
return "";
|
|
2581
|
+
}
|
|
2582
|
+
try {
|
|
2583
|
+
return decodeURIComponent(id);
|
|
2584
|
+
} catch {
|
|
2585
|
+
return id;
|
|
2586
|
+
}
|
|
2587
|
+
}
|
|
2588
|
+
function benefitSnapshotLabel(snapshot) {
|
|
2589
|
+
const type = snapshotString(snapshot, "benefit_type");
|
|
2590
|
+
if (type === "fixed_amount") {
|
|
2591
|
+
const amounts = Array.isArray(snapshot?.amounts) ? snapshot.amounts : [];
|
|
2592
|
+
if (amounts.length) {
|
|
2593
|
+
return amounts.map((row) => {
|
|
2594
|
+
const amount2 = snapshotNumber(row, "amount");
|
|
2595
|
+
const currency2 = snapshotString(row, "currency_code").toUpperCase();
|
|
2596
|
+
return `${amount2 ?? 0} ${currency2}`.trim();
|
|
2597
|
+
}).join(", ");
|
|
2598
|
+
}
|
|
2599
|
+
const amount = snapshotNumber(snapshot, "amount");
|
|
2600
|
+
const currency = snapshotString(snapshot, "currency_code").toUpperCase();
|
|
2601
|
+
return `${amount ?? 0} ${currency}`.trim();
|
|
2602
|
+
}
|
|
2603
|
+
if (type === "percentage") {
|
|
2604
|
+
const template = snapshot?.promotion_template;
|
|
2605
|
+
const method = template?.application_method;
|
|
2606
|
+
const scope = snapshotString(method, "target_type") === "order" ? "order" : "products";
|
|
2607
|
+
return `${snapshotNumber(snapshot, "percentage") ?? 0}% off ${scope}`;
|
|
2608
|
+
}
|
|
2609
|
+
if (type === "free_shipping") {
|
|
2610
|
+
return "Free shipping";
|
|
2611
|
+
}
|
|
2612
|
+
if (type === "buy_get") {
|
|
2613
|
+
return "Buy X Get Y";
|
|
2614
|
+
}
|
|
2615
|
+
return "Unknown";
|
|
2616
|
+
}
|
|
2617
|
+
function expirationPolicyLabel(snapshot) {
|
|
2618
|
+
const policy = snapshot?.expiration_policy;
|
|
2619
|
+
const type = snapshotString(policy, "type");
|
|
2620
|
+
if (type === "none") return "No expiration";
|
|
2621
|
+
if (type === "duration") {
|
|
2622
|
+
const days = snapshotNumber(policy, "duration_days") ?? 0;
|
|
2623
|
+
return `${days} days after issuance`;
|
|
2624
|
+
}
|
|
2625
|
+
if (type === "fixed") {
|
|
2626
|
+
return `Fixed date ${formatDateTime(snapshotString(policy, "expires_at"))}`;
|
|
2627
|
+
}
|
|
2628
|
+
return "-";
|
|
2629
|
+
}
|
|
2630
|
+
function campaignSnapshotLabel(snapshot) {
|
|
2631
|
+
const campaignSnapshot = snapshot?.campaign_snapshot;
|
|
2632
|
+
return snapshotString(campaignSnapshot, "name") || snapshotString(campaignSnapshot, "campaign_identifier") || snapshotString(snapshot, "campaign_id") || "None";
|
|
2633
|
+
}
|
|
2634
|
+
function promotionSnapshotLabel(snapshot) {
|
|
2635
|
+
const template = snapshot?.promotion_template;
|
|
2636
|
+
const method = template?.application_method;
|
|
2637
|
+
const target = snapshotString(method, "target_type");
|
|
2638
|
+
const allocation = snapshotString(method, "allocation");
|
|
2639
|
+
return [target, allocation].filter(Boolean).join(" / ") || "None";
|
|
2640
|
+
}
|
|
2641
|
+
var entitlementFilters = [
|
|
2642
|
+
{ label: "All", value: "all" },
|
|
2643
|
+
{ label: "Issued", value: "issued" },
|
|
2644
|
+
{ label: "Redeemed", value: "redeemed" },
|
|
2645
|
+
{ label: "Expired", value: "expired" },
|
|
2646
|
+
{ label: "Canceled", value: "canceled" }
|
|
2647
|
+
];
|
|
2648
|
+
function SnapshotBlock({ title, value }) {
|
|
2649
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("details", { className: "rounded-lg border p-3", children: [
|
|
2650
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("summary", { className: "cursor-pointer text-ui-fg-base txt-small-plus", children: title }),
|
|
2651
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2652
|
+
"pre",
|
|
2653
|
+
{
|
|
2654
|
+
className: "mt-3 rounded-md bg-ui-bg-subtle p-3 text-ui-fg-subtle txt-compact-xsmall",
|
|
2655
|
+
style: {
|
|
2656
|
+
maxHeight: 220,
|
|
2657
|
+
overflow: "auto",
|
|
2658
|
+
whiteSpace: "pre-wrap",
|
|
2659
|
+
wordBreak: "break-word"
|
|
2660
|
+
},
|
|
2661
|
+
children: jsonBlock(value)
|
|
2662
|
+
}
|
|
2663
|
+
)
|
|
2664
|
+
] });
|
|
2665
|
+
}
|
|
2666
|
+
function TwoColumnLayout({
|
|
2667
|
+
firstCol,
|
|
2668
|
+
secondCol
|
|
2669
|
+
}) {
|
|
2670
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-col gap-x-4 gap-y-3 xl:flex-row xl:items-start", children: [
|
|
2671
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex w-full flex-col gap-y-3", children: firstCol }),
|
|
2672
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex w-full max-w-[100%] flex-col gap-y-3 xl:mt-0 xl:max-w-[440px]", children: secondCol })
|
|
2673
|
+
] });
|
|
2674
|
+
}
|
|
2675
|
+
function SectionRow({
|
|
2676
|
+
title,
|
|
2677
|
+
value
|
|
2678
|
+
}) {
|
|
2679
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "text-ui-fg-subtle grid grid-cols-2 items-center gap-x-4 px-6 py-4", children: [
|
|
2680
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Text, { size: "small", weight: "plus", leading: "compact", children: title }),
|
|
2681
|
+
typeof value === "string" || value == null ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2682
|
+
import_ui3.Text,
|
|
2683
|
+
{
|
|
2684
|
+
size: "small",
|
|
2685
|
+
leading: "compact",
|
|
2686
|
+
className: "text-pretty whitespace-pre-line",
|
|
2687
|
+
children: value || "-"
|
|
2688
|
+
}
|
|
2689
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "min-w-0", children: value })
|
|
2690
|
+
] });
|
|
2691
|
+
}
|
|
2692
|
+
function WidgetHeader({ title }) {
|
|
2693
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Heading, { level: "h2", children: title }) });
|
|
2694
|
+
}
|
|
2695
|
+
function SidebarLink({
|
|
2696
|
+
href,
|
|
2697
|
+
label,
|
|
2698
|
+
description,
|
|
2699
|
+
icon
|
|
2700
|
+
}) {
|
|
2701
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("a", { href, className: "group outline-none", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex flex-col gap-2 px-2 pb-2", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "shadow-elevation-card-rest bg-ui-bg-component transition-fg hover:bg-ui-bg-component-hover active:bg-ui-bg-component-pressed group-focus-visible:shadow-borders-interactive-with-active rounded-md px-4 py-2", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center gap-4", children: [
|
|
2702
|
+
icon && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { children: icon }),
|
|
2703
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-1 flex-col", children: [
|
|
2704
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Text, { size: "small", leading: "compact", weight: "plus", children: label }),
|
|
2705
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2706
|
+
import_ui3.Text,
|
|
2707
|
+
{
|
|
2708
|
+
size: "small",
|
|
2709
|
+
leading: "compact",
|
|
2710
|
+
className: "text-ui-fg-subtle",
|
|
2711
|
+
children: description
|
|
2712
|
+
}
|
|
2713
|
+
)
|
|
2714
|
+
] }),
|
|
2715
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_icons2.TriangleRightMini, { className: "text-ui-fg-muted" }) })
|
|
2716
|
+
] }) }) }) });
|
|
2717
|
+
}
|
|
2718
|
+
function SummaryWidget({
|
|
2719
|
+
label,
|
|
2720
|
+
value,
|
|
2721
|
+
tone = "green"
|
|
2722
|
+
}) {
|
|
2723
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Container, { className: "px-6 py-4", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "text-ui-fg-subtle flex items-center gap-x-3", children: [
|
|
2724
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2725
|
+
"div",
|
|
2726
|
+
{
|
|
2727
|
+
className: `h-8 w-1 rounded-full ${tone === "green" ? "bg-ui-tag-green-icon" : "bg-ui-tag-neutral-icon"}`
|
|
2728
|
+
}
|
|
2729
|
+
),
|
|
2730
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "min-w-0", children: [
|
|
2731
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Text, { weight: "plus", size: "small", className: "text-ui-fg-subtle", children: label }),
|
|
2732
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2733
|
+
import_ui3.Text,
|
|
2734
|
+
{
|
|
2735
|
+
weight: "plus",
|
|
2736
|
+
size: "xlarge",
|
|
2737
|
+
className: "tabular-nums text-ui-fg-base break-words",
|
|
2738
|
+
children: value
|
|
2739
|
+
}
|
|
2740
|
+
)
|
|
2741
|
+
] })
|
|
2742
|
+
] }) });
|
|
2743
|
+
}
|
|
2744
|
+
function CouponGeneralSection({ detail }) {
|
|
2745
|
+
const entitlement = detail.customer_coupon_entitlement;
|
|
2746
|
+
const issuance = detail.coupon_issuance || null;
|
|
2747
|
+
const benefitSnapshot = entitlement.benefit_snapshot || null;
|
|
2748
|
+
const sourceSnapshot = entitlement.source_snapshot || null;
|
|
2749
|
+
const code = couponCode(entitlement);
|
|
2750
|
+
const external = entitlement.origin === "external";
|
|
2751
|
+
const productLabel = snapshotString(sourceSnapshot, "title") || snapshotString(sourceSnapshot, "source") || entitlement.product_id || "External";
|
|
2752
|
+
const variantLabel = snapshotString(sourceSnapshot, "variant_id") || entitlement.variant_id || "-";
|
|
2753
|
+
const issuedDate = entitlement.created_at || issuance?.created_at || null;
|
|
2754
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "divide-y p-0", children: [
|
|
2755
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
2756
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "min-w-0", children: [
|
|
2757
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center gap-x-1", children: [
|
|
2758
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Heading, { className: "break-all", children: [
|
|
2759
|
+
"#",
|
|
2760
|
+
code
|
|
2761
|
+
] }),
|
|
2762
|
+
code !== "-" && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Copy, { content: code, className: "text-ui-fg-muted" })
|
|
2763
|
+
] }),
|
|
2764
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Text, { size: "small", className: "text-ui-fg-subtle", children: formatFullDate(issuedDate) })
|
|
2765
|
+
] }),
|
|
2766
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.StatusBadge, { color: entitlementStatusColor(entitlement.status), children: entitlement.status })
|
|
2767
|
+
] }),
|
|
2768
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Date issued", value: formatRelativeDate(issuedDate) }),
|
|
2769
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2770
|
+
SectionRow,
|
|
2771
|
+
{
|
|
2772
|
+
title: "Customer",
|
|
2773
|
+
value: entitlement.email || entitlement.customer_id || "-"
|
|
2774
|
+
}
|
|
2775
|
+
),
|
|
2776
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Origin", value: entitlementSource(entitlement) }),
|
|
2777
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2778
|
+
SectionRow,
|
|
2779
|
+
{
|
|
2780
|
+
title: external ? "Source" : "Coupon product",
|
|
2781
|
+
value: productLabel
|
|
2782
|
+
}
|
|
2783
|
+
),
|
|
2784
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Seller scope", value: entitlementSellerScope(entitlement) }),
|
|
2785
|
+
!external && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Variant", value: variantLabel }),
|
|
2786
|
+
!external && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2787
|
+
SectionRow,
|
|
2788
|
+
{
|
|
2789
|
+
title: "Quantity",
|
|
2790
|
+
value: String(
|
|
2791
|
+
snapshotNumber(sourceSnapshot, "quantity") ?? issuance?.quantity ?? 1
|
|
2792
|
+
)
|
|
2793
|
+
}
|
|
2794
|
+
),
|
|
2795
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2796
|
+
SectionRow,
|
|
2797
|
+
{
|
|
2798
|
+
title: "Benefit",
|
|
2799
|
+
value: benefitSnapshotLabel(benefitSnapshot)
|
|
2800
|
+
}
|
|
2801
|
+
),
|
|
2802
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2803
|
+
SectionRow,
|
|
2804
|
+
{
|
|
2805
|
+
title: "Expiration policy",
|
|
2806
|
+
value: expirationPolicyLabel(benefitSnapshot)
|
|
2807
|
+
}
|
|
2808
|
+
),
|
|
2809
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Expiration Date", value: formatDate(entitlement.expires_at) }),
|
|
2810
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Redeemed Date", value: formatDate(entitlement.redeemed_at) })
|
|
2811
|
+
] });
|
|
2812
|
+
}
|
|
2813
|
+
function RelatedOrderSection({
|
|
2814
|
+
apiBase,
|
|
2815
|
+
detail
|
|
2816
|
+
}) {
|
|
2817
|
+
const entitlement = detail.customer_coupon_entitlement;
|
|
2818
|
+
const order = detail.order || null;
|
|
2819
|
+
const orderId = order?.id || entitlement.order_id;
|
|
2820
|
+
if (!orderId) {
|
|
2821
|
+
return null;
|
|
2822
|
+
}
|
|
2823
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "p-0", children: [
|
|
2824
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(WidgetHeader, { title: "Related Order" }),
|
|
2825
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2826
|
+
SidebarLink,
|
|
2827
|
+
{
|
|
2828
|
+
href: orderDetailPath(apiBase, orderId),
|
|
2829
|
+
label: order ? orderDisplayId(order) : orderId,
|
|
2830
|
+
description: order?.created_at ? `Order placed ${formatRelativeDate(order.created_at)}` : "Purchased coupon order",
|
|
2831
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_icons2.ShoppingCart, {})
|
|
2832
|
+
}
|
|
2833
|
+
)
|
|
2834
|
+
] });
|
|
2835
|
+
}
|
|
2836
|
+
function CouponSnapshotsSection({
|
|
2837
|
+
detail
|
|
2838
|
+
}) {
|
|
2839
|
+
const entitlement = detail.customer_coupon_entitlement;
|
|
2840
|
+
const issuance = detail.coupon_issuance || null;
|
|
2841
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "p-0", children: [
|
|
2842
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(WidgetHeader, { title: "JSON" }),
|
|
2843
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-col gap-y-3 px-6 pb-6", children: [
|
|
2844
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2845
|
+
SnapshotBlock,
|
|
2846
|
+
{
|
|
2847
|
+
title: "Benefit snapshot",
|
|
2848
|
+
value: entitlement.benefit_snapshot
|
|
2849
|
+
}
|
|
2850
|
+
),
|
|
2851
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2852
|
+
SnapshotBlock,
|
|
2853
|
+
{
|
|
2854
|
+
title: "Source snapshot",
|
|
2855
|
+
value: entitlement.source_snapshot
|
|
2856
|
+
}
|
|
2857
|
+
),
|
|
2858
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2859
|
+
SnapshotBlock,
|
|
2860
|
+
{
|
|
2861
|
+
title: "Issuance config snapshot",
|
|
2862
|
+
value: issuance?.config_snapshot
|
|
2863
|
+
}
|
|
2864
|
+
),
|
|
2865
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SnapshotBlock, { title: "Seller targets", value: entitlement.seller_targets }),
|
|
2866
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SnapshotBlock, { title: "Metadata", value: entitlement.metadata })
|
|
2867
|
+
] })
|
|
2868
|
+
] });
|
|
2869
|
+
}
|
|
2870
|
+
function CouponSummarySections({
|
|
2871
|
+
detail
|
|
2872
|
+
}) {
|
|
2873
|
+
const entitlement = detail.customer_coupon_entitlement;
|
|
2874
|
+
const issuance = detail.coupon_issuance || null;
|
|
2875
|
+
const benefitSnapshot = entitlement.benefit_snapshot || null;
|
|
2876
|
+
const sourceSnapshot = entitlement.source_snapshot || null;
|
|
2877
|
+
const order = detail.order || null;
|
|
2878
|
+
const lineTotal = snapshotNumber(sourceSnapshot, "total");
|
|
2879
|
+
const external = entitlement.origin === "external";
|
|
2880
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
|
|
2881
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2882
|
+
SummaryWidget,
|
|
2883
|
+
{
|
|
2884
|
+
label: "Benefit",
|
|
2885
|
+
value: benefitSnapshotLabel(benefitSnapshot)
|
|
2886
|
+
}
|
|
2887
|
+
),
|
|
2888
|
+
!external && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2889
|
+
SummaryWidget,
|
|
2890
|
+
{
|
|
2891
|
+
label: "Line Total",
|
|
2892
|
+
value: formatSnapshotAmount(lineTotal, order?.currency_code),
|
|
2893
|
+
tone: "neutral"
|
|
2894
|
+
}
|
|
2895
|
+
),
|
|
2896
|
+
!external && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "divide-y p-0", children: [
|
|
2897
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(WidgetHeader, { title: "Campaign" }),
|
|
2898
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Campaign", value: campaignSnapshotLabel(benefitSnapshot) }),
|
|
2899
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Promotion", value: promotionSnapshotLabel(benefitSnapshot) }),
|
|
2900
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2901
|
+
SectionRow,
|
|
2902
|
+
{
|
|
2903
|
+
title: "Promotion status",
|
|
2904
|
+
value: snapshotString(benefitSnapshot, "promotion_status") || "-"
|
|
2905
|
+
}
|
|
2906
|
+
)
|
|
2907
|
+
] }),
|
|
2908
|
+
!external && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "divide-y p-0", children: [
|
|
2909
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(WidgetHeader, { title: "Issuance" }),
|
|
2910
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Status", value: issuance?.status || "-" }),
|
|
2911
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2912
|
+
SectionRow,
|
|
2913
|
+
{
|
|
2914
|
+
title: "Issued / failed",
|
|
2915
|
+
value: issuance ? `${issuance.issued_count ?? 0} / ${issuance.failed_count ?? 0}` : "-"
|
|
2916
|
+
}
|
|
2917
|
+
),
|
|
2918
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionRow, { title: "Config", value: entitlement.config_id || "-" }),
|
|
2919
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2920
|
+
SectionRow,
|
|
2921
|
+
{
|
|
2922
|
+
title: "Variant config",
|
|
2923
|
+
value: entitlement.variant_config_id || "-"
|
|
2924
|
+
}
|
|
2925
|
+
)
|
|
2926
|
+
] })
|
|
2927
|
+
] });
|
|
2928
|
+
}
|
|
2929
|
+
function CouponDetailPageView({ apiBase }) {
|
|
2930
|
+
const id = currentCouponDetailId(apiBase);
|
|
2931
|
+
const [detail, setDetail] = (0, import_react2.useState)(null);
|
|
2932
|
+
const [loading, setLoading] = (0, import_react2.useState)(true);
|
|
2933
|
+
const [loadError, setLoadError] = (0, import_react2.useState)(null);
|
|
2934
|
+
(0, import_react2.useEffect)(() => {
|
|
2935
|
+
let active = true;
|
|
2936
|
+
async function load() {
|
|
2937
|
+
if (!id) {
|
|
2938
|
+
setLoadError("Missing coupon id");
|
|
2939
|
+
setLoading(false);
|
|
2940
|
+
return;
|
|
2941
|
+
}
|
|
2942
|
+
setLoading(true);
|
|
2943
|
+
setLoadError(null);
|
|
2944
|
+
try {
|
|
2945
|
+
const payload = await apiFetch2(
|
|
2946
|
+
`${apiBase}/coupon-products/entitlements/${encodeURIComponent(id)}`
|
|
2947
|
+
);
|
|
2948
|
+
if (active) {
|
|
2949
|
+
setDetail(payload);
|
|
2950
|
+
}
|
|
2951
|
+
} catch (error) {
|
|
2952
|
+
const message = error instanceof Error ? error.message : "Failed to load coupon details";
|
|
2953
|
+
if (active) {
|
|
2954
|
+
setLoadError(message);
|
|
2955
|
+
import_ui3.toast.error(message);
|
|
2956
|
+
}
|
|
2957
|
+
} finally {
|
|
2958
|
+
if (active) {
|
|
2959
|
+
setLoading(false);
|
|
2960
|
+
}
|
|
2961
|
+
}
|
|
2962
|
+
}
|
|
2963
|
+
void load();
|
|
2964
|
+
return () => {
|
|
2965
|
+
active = false;
|
|
2966
|
+
};
|
|
2967
|
+
}, [apiBase, id]);
|
|
2968
|
+
if (loading) {
|
|
2969
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: "Loading coupon" });
|
|
2970
|
+
}
|
|
2971
|
+
if (loadError) {
|
|
2972
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: loadError });
|
|
2973
|
+
}
|
|
2974
|
+
if (!detail) {
|
|
2975
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: "Coupon not found" });
|
|
2976
|
+
}
|
|
2977
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
2978
|
+
TwoColumnLayout,
|
|
2979
|
+
{
|
|
2980
|
+
firstCol: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
|
|
2981
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponGeneralSection, { detail }),
|
|
2982
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(RelatedOrderSection, { apiBase, detail }),
|
|
2983
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponSnapshotsSection, { detail })
|
|
2984
|
+
] }),
|
|
2985
|
+
secondCol: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponSummarySections, { detail })
|
|
2986
|
+
}
|
|
2987
|
+
);
|
|
2988
|
+
}
|
|
2989
|
+
function EntitlementsTable({
|
|
2990
|
+
entitlements,
|
|
2991
|
+
loading,
|
|
2992
|
+
error,
|
|
2993
|
+
onOpen
|
|
2994
|
+
}) {
|
|
2995
|
+
if (loading) {
|
|
2996
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: "Loading coupons" });
|
|
2997
|
+
}
|
|
2998
|
+
if (error) {
|
|
2999
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(CouponEmptyState, { title: error });
|
|
3000
|
+
}
|
|
3001
|
+
if (!entitlements.length) {
|
|
3002
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
3003
|
+
CouponEmptyState,
|
|
3004
|
+
{
|
|
3005
|
+
title: "No coupons found",
|
|
3006
|
+
description: "Purchased coupons will appear here after they are issued."
|
|
3007
|
+
}
|
|
3008
|
+
);
|
|
3009
|
+
}
|
|
3010
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Table, { children: [
|
|
3011
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Table.Row, { children: [
|
|
3012
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Status" }),
|
|
3013
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Code" }),
|
|
3014
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Date issued" }),
|
|
3015
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Order" }),
|
|
3016
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Customer" }),
|
|
3017
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Origin" }),
|
|
3018
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Seller scope" }),
|
|
3019
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Source" }),
|
|
3020
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.HeaderCell, { children: "Expires" })
|
|
3021
|
+
] }) }),
|
|
3022
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Body, { children: entitlements.map((item) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
3023
|
+
import_ui3.Table.Row,
|
|
3024
|
+
{
|
|
3025
|
+
className: "cursor-pointer hover:bg-ui-bg-subtle",
|
|
3026
|
+
onClick: () => onOpen(item),
|
|
3027
|
+
children: [
|
|
3028
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.StatusBadge, { color: entitlementStatusColor(item.status), children: item.status }) }),
|
|
3029
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: item.code || item.shared_code || "-" }),
|
|
3030
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { title: formatFullDate(item.created_at), children: formatRelativeDate(item.created_at) }),
|
|
3031
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: item.order_id || "-" }),
|
|
3032
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: item.email || item.customer_id || "-" }),
|
|
3033
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: entitlementSource(item) }),
|
|
3034
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: entitlementSellerScope(item) }),
|
|
3035
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: snapshotString(item.source_snapshot, "title") || snapshotString(item.source_snapshot, "source") || item.product_id || "External" }),
|
|
3036
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Table.Cell, { children: formatDate(item.expires_at) })
|
|
3037
|
+
]
|
|
3038
|
+
},
|
|
3039
|
+
item.id
|
|
3040
|
+
)) })
|
|
3041
|
+
] });
|
|
3042
|
+
}
|
|
3043
|
+
function CouponsPageView({
|
|
3044
|
+
apiBase,
|
|
3045
|
+
title
|
|
3046
|
+
}) {
|
|
3047
|
+
const [entitlements, setEntitlements] = (0, import_react2.useState)([]);
|
|
3048
|
+
const [loading, setLoading] = (0, import_react2.useState)(true);
|
|
3049
|
+
const [loadError, setLoadError] = (0, import_react2.useState)(null);
|
|
3050
|
+
const [filter, setFilter] = (0, import_react2.useState)("all");
|
|
3051
|
+
const load = (0, import_react2.useCallback)(async () => {
|
|
3052
|
+
setLoading(true);
|
|
3053
|
+
setLoadError(null);
|
|
3054
|
+
try {
|
|
3055
|
+
const payload = await apiFetch2(`${apiBase}/coupon-products/entitlements`);
|
|
3056
|
+
setEntitlements(payload.customer_coupon_entitlements || []);
|
|
3057
|
+
} catch (error) {
|
|
3058
|
+
const message = error instanceof Error ? error.message : "Failed to load coupons";
|
|
3059
|
+
setLoadError(message);
|
|
3060
|
+
import_ui3.toast.error(message);
|
|
3061
|
+
} finally {
|
|
3062
|
+
setLoading(false);
|
|
3063
|
+
}
|
|
3064
|
+
}, [apiBase]);
|
|
3065
|
+
(0, import_react2.useEffect)(() => {
|
|
3066
|
+
void load();
|
|
3067
|
+
}, [load]);
|
|
3068
|
+
const openDetail = (0, import_react2.useCallback)(
|
|
3069
|
+
(entitlement) => {
|
|
3070
|
+
window.location.assign(couponDetailPath(apiBase, entitlement.id));
|
|
3071
|
+
},
|
|
3072
|
+
[apiBase]
|
|
3073
|
+
);
|
|
3074
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Container, { className: "divide-y p-0", children: [
|
|
3075
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
3076
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Heading, { level: "h1", children: title }),
|
|
3077
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_ui3.Button, { size: "small", variant: "secondary", onClick: () => void load(), children: [
|
|
3078
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_icons2.ArrowPath, {}),
|
|
3079
|
+
"Refresh"
|
|
3080
|
+
] })
|
|
3081
|
+
] }),
|
|
3082
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
3083
|
+
import_ui3.Tabs,
|
|
3084
|
+
{
|
|
3085
|
+
value: filter,
|
|
3086
|
+
onValueChange: (value) => setFilter(value),
|
|
3087
|
+
children: [
|
|
3088
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "px-6 py-2 border-b", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Tabs.List, { children: entitlementFilters.map((item) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Tabs.Trigger, { value: item.value, children: item.label }, item.value)) }) }),
|
|
3089
|
+
entitlementFilters.map((item) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_ui3.Tabs.Content, { value: item.value, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
3090
|
+
EntitlementsTable,
|
|
3091
|
+
{
|
|
3092
|
+
loading,
|
|
3093
|
+
error: loadError,
|
|
3094
|
+
onOpen: openDetail,
|
|
3095
|
+
entitlements: item.value === "all" ? entitlements : entitlements.filter(
|
|
3096
|
+
(entitlement) => entitlement.status === item.value
|
|
3097
|
+
)
|
|
3098
|
+
}
|
|
3099
|
+
) }, item.value))
|
|
3100
|
+
]
|
|
3101
|
+
}
|
|
3102
|
+
)
|
|
3103
|
+
] });
|
|
3104
|
+
}
|
|
3105
|
+
function CouponProductsPageView({
|
|
3106
|
+
apiBase,
|
|
3107
|
+
title,
|
|
3108
|
+
allowPromotionMirror = false
|
|
3109
|
+
}) {
|
|
3110
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
3111
|
+
CouponProductsPage,
|
|
3112
|
+
{
|
|
3113
|
+
apiBase,
|
|
3114
|
+
title,
|
|
3115
|
+
allowPromotionMirror
|
|
3116
|
+
}
|
|
3117
|
+
);
|
|
3118
|
+
}
|
|
3119
|
+
|
|
3120
|
+
// src/admin/routes/coupons/page.tsx
|
|
3121
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
3122
|
+
var config = {
|
|
3123
|
+
label: "Coupons",
|
|
3124
|
+
icon: import_icons3.ReceiptPercent
|
|
3125
|
+
};
|
|
3126
|
+
function CouponsPage() {
|
|
3127
|
+
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(CouponsPageView, { apiBase: "/admin", title: "Coupons" });
|
|
3128
|
+
}
|
|
3129
|
+
|
|
3130
|
+
// src/admin/routes/coupons/[id]/page.tsx
|
|
3131
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
3132
|
+
function CouponDetailPage() {
|
|
3133
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(CouponDetailPageView, { apiBase: "/admin" });
|
|
3134
|
+
}
|
|
3135
|
+
|
|
3136
|
+
// src/admin/routes/coupons/products/page.tsx
|
|
3137
|
+
var import_icons4 = require("@medusajs/icons");
|
|
3138
|
+
var import_jsx_runtime6 = require("react/jsx-runtime");
|
|
3139
|
+
var config2 = {
|
|
3140
|
+
label: "Coupon Products",
|
|
3141
|
+
icon: import_icons4.ReceiptPercent
|
|
3142
|
+
};
|
|
3143
|
+
function CouponProductsPage2() {
|
|
3144
|
+
return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
|
|
3145
|
+
CouponProductsPageView,
|
|
3146
|
+
{
|
|
3147
|
+
apiBase: "/admin",
|
|
3148
|
+
title: "Coupon Products",
|
|
3149
|
+
allowPromotionMirror: true
|
|
3150
|
+
}
|
|
3151
|
+
);
|
|
3152
|
+
}
|
|
3153
|
+
|
|
3154
|
+
// src/admin/index.ts
|
|
3155
|
+
var routeModule = {
|
|
3156
|
+
routes: [
|
|
3157
|
+
{
|
|
3158
|
+
Component: CouponsPage,
|
|
3159
|
+
path: "/coupons"
|
|
3160
|
+
},
|
|
3161
|
+
{
|
|
3162
|
+
Component: CouponProductsPage2,
|
|
3163
|
+
path: "/coupons/products"
|
|
3164
|
+
},
|
|
3165
|
+
{
|
|
3166
|
+
Component: CouponDetailPage,
|
|
3167
|
+
path: "/coupons/:id"
|
|
3168
|
+
}
|
|
3169
|
+
]
|
|
3170
|
+
};
|
|
3171
|
+
var menuItemModule = {
|
|
3172
|
+
menuItems: [
|
|
3173
|
+
{
|
|
3174
|
+
label: config.label,
|
|
3175
|
+
icon: config.icon,
|
|
3176
|
+
path: "/coupons",
|
|
3177
|
+
rank: config.rank,
|
|
3178
|
+
nested: config.nested,
|
|
3179
|
+
translationNs: config.translationNs
|
|
3180
|
+
},
|
|
3181
|
+
{
|
|
3182
|
+
label: config2.label,
|
|
3183
|
+
icon: config2.icon,
|
|
3184
|
+
path: "/coupons/products",
|
|
3185
|
+
rank: 11,
|
|
3186
|
+
nested: "/coupons",
|
|
3187
|
+
translationNs: config2.translationNs
|
|
3188
|
+
}
|
|
3189
|
+
]
|
|
3190
|
+
};
|
|
3191
|
+
var admin_default = {
|
|
3192
|
+
widgetModule: {
|
|
3193
|
+
widgets: []
|
|
3194
|
+
},
|
|
3195
|
+
routeModule,
|
|
3196
|
+
menuItemModule,
|
|
3197
|
+
formModule: {
|
|
3198
|
+
customFields: {}
|
|
3199
|
+
},
|
|
3200
|
+
displayModule: {
|
|
3201
|
+
displays: {}
|
|
3202
|
+
},
|
|
3203
|
+
i18nModule: i18n_default
|
|
3204
|
+
};
|
|
3205
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2FkbWluL2luZGV4LnRzIiwgIi4uLy4uLy4uLy4uL3NyYy9hZG1pbi9pMThuL2VuLmpzb24iLCAiLi4vLi4vLi4vLi4vc3JjL2FkbWluL2kxOG4vaW5kZXgudHMiLCAiLi4vLi4vLi4vLi4vc3JjL2FkbWluL3JvdXRlcy9jb3Vwb25zL3BhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9kYXNoYm9hcmQvY291cG9ucy9jb3Vwb24tbWFuYWdlci50c3giLCAiLi4vLi4vLi4vLi4vc3JjL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1wcm9kdWN0cy1wYWdlLnRzeCIsICIuLi8uLi8uLi8uLi9zcmMvZGFzaGJvYXJkL2NvdXBvbnMvZW1wdHktc3RhdGUudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9hZG1pbi9yb3V0ZXMvY291cG9ucy9baWRdL3BhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9hZG1pbi9yb3V0ZXMvY291cG9ucy9wcm9kdWN0cy9wYWdlLnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IGkxOG5SZXNvdXJjZXMgZnJvbSBcIi4vaTE4blwiXG5pbXBvcnQgQ291cG9uc1BhZ2UsIHsgY29uZmlnIGFzIGNvdXBvbnNDb25maWcgfSBmcm9tIFwiLi9yb3V0ZXMvY291cG9ucy9wYWdlXCJcbmltcG9ydCBDb3Vwb25EZXRhaWxQYWdlIGZyb20gXCIuL3JvdXRlcy9jb3Vwb25zL1tpZF0vcGFnZVwiXG5pbXBvcnQgQ291cG9uUHJvZHVjdHNQYWdlLCB7XG4gIGNvbmZpZyBhcyBjb3Vwb25Qcm9kdWN0c0NvbmZpZyxcbn0gZnJvbSBcIi4vcm91dGVzL2NvdXBvbnMvcHJvZHVjdHMvcGFnZVwiXG5cbmNvbnN0IHJvdXRlTW9kdWxlID0ge1xuICByb3V0ZXM6IFtcbiAgICB7XG4gICAgICBDb21wb25lbnQ6IENvdXBvbnNQYWdlLFxuICAgICAgcGF0aDogXCIvY291cG9uc1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgQ29tcG9uZW50OiBDb3Vwb25Qcm9kdWN0c1BhZ2UsXG4gICAgICBwYXRoOiBcIi9jb3Vwb25zL3Byb2R1Y3RzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBDb21wb25lbnQ6IENvdXBvbkRldGFpbFBhZ2UsXG4gICAgICBwYXRoOiBcIi9jb3Vwb25zLzppZFwiLFxuICAgIH0sXG4gIF0sXG59XG5cbmNvbnN0IG1lbnVJdGVtTW9kdWxlID0ge1xuICBtZW51SXRlbXM6IFtcbiAgICB7XG4gICAgICBsYWJlbDogY291cG9uc0NvbmZpZy5sYWJlbCxcbiAgICAgIGljb246IGNvdXBvbnNDb25maWcuaWNvbixcbiAgICAgIHBhdGg6IFwiL2NvdXBvbnNcIixcbiAgICAgIHJhbms6IGNvdXBvbnNDb25maWcucmFuayxcbiAgICAgIG5lc3RlZDogY291cG9uc0NvbmZpZy5uZXN0ZWQsXG4gICAgICB0cmFuc2xhdGlvbk5zOiBjb3Vwb25zQ29uZmlnLnRyYW5zbGF0aW9uTnMsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogY291cG9uUHJvZHVjdHNDb25maWcubGFiZWwsXG4gICAgICBpY29uOiBjb3Vwb25Qcm9kdWN0c0NvbmZpZy5pY29uLFxuICAgICAgcGF0aDogXCIvY291cG9ucy9wcm9kdWN0c1wiLFxuICAgICAgcmFuazogMTEsXG4gICAgICBuZXN0ZWQ6IFwiL2NvdXBvbnNcIixcbiAgICAgIHRyYW5zbGF0aW9uTnM6IGNvdXBvblByb2R1Y3RzQ29uZmlnLnRyYW5zbGF0aW9uTnMsXG4gICAgfSxcbiAgXSxcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICB3aWRnZXRNb2R1bGU6IHtcbiAgICB3aWRnZXRzOiBbXSxcbiAgfSxcbiAgcm91dGVNb2R1bGUsXG4gIG1lbnVJdGVtTW9kdWxlLFxuICBmb3JtTW9kdWxlOiB7XG4gICAgY3VzdG9tRmllbGRzOiB7fSxcbiAgfSxcbiAgZGlzcGxheU1vZHVsZToge1xuICAgIGRpc3BsYXlzOiB7fSxcbiAgfSxcbiAgaTE4bk1vZHVsZTogaTE4blJlc291cmNlcyxcbn1cbiIsICJ7XG4gIFwiY291cG9uc1wiOiB7XG4gICAgXCJtZW51XCI6IFwiQ291cG9uc1wiLFxuICAgIFwicHJvZHVjdHNNZW51XCI6IFwiQ291cG9uIFByb2R1Y3RzXCJcbiAgfVxufVxuIiwgImltcG9ydCBlbiBmcm9tIFwiLi9lbi5qc29uXCJcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbjoge1xuICAgIHRyYW5zbGF0aW9uOiBlbixcbiAgfSxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFJvdXRlQ29uZmlnIH0gZnJvbSBcIkBtZXJjdXJqcy9kYXNoYm9hcmQtc2RrXCJcbmltcG9ydCB7IFJlY2VpcHRQZXJjZW50IH0gZnJvbSBcIkBtZWR1c2Fqcy9pY29uc1wiXG5pbXBvcnQgeyBDb3Vwb25zUGFnZVZpZXcgfSBmcm9tIFwiLi4vLi4vLi4vZGFzaGJvYXJkL2NvdXBvbnMvY291cG9uLW1hbmFnZXJcIlxuXG5leHBvcnQgY29uc3QgY29uZmlnOiBSb3V0ZUNvbmZpZyA9IHtcbiAgbGFiZWw6IFwiQ291cG9uc1wiLFxuICBpY29uOiBSZWNlaXB0UGVyY2VudCxcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ291cG9uc1BhZ2UoKSB7XG4gIHJldHVybiA8Q291cG9uc1BhZ2VWaWV3IGFwaUJhc2U9XCIvYWRtaW5cIiB0aXRsZT1cIkNvdXBvbnNcIiAvPlxufVxuIiwgImltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVN0YXRlLFxuICB0eXBlIENoYW5nZUV2ZW50LFxuICB0eXBlIENTU1Byb3BlcnRpZXMsXG4gIHR5cGUgUmVhY3ROb2RlLFxufSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtcbiAgQXJyb3dQYXRoLFxuICBQZW5jaWxTcXVhcmUsXG4gIFBsdXMsXG4gIFNob3BwaW5nQ2FydCxcbiAgVHJhc2gsXG4gIFRyaWFuZ2xlUmlnaHRNaW5pLFxufSBmcm9tIFwiQG1lZHVzYWpzL2ljb25zXCJcbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgQ29udGFpbmVyLFxuICBDb3B5LFxuICBDdXJyZW5jeUlucHV0LFxuICBGb2N1c01vZGFsLFxuICBIZWFkaW5nLFxuICBJbnB1dCxcbiAgTGFiZWwsXG4gIFByb2dyZXNzVGFicyxcbiAgU2VsZWN0LFxuICBTdGF0dXNCYWRnZSxcbiAgU3dpdGNoLFxuICBUYWJsZSxcbiAgVGFicyxcbiAgVGV4dCxcbiAgVGV4dGFyZWEsXG4gIHRvYXN0LFxuICB1c2VQcm9tcHQsXG59IGZyb20gXCJAbWVkdXNhanMvdWlcIlxuaW1wb3J0IHsgQ291cG9uUHJvZHVjdHNQYWdlIH0gZnJvbSBcIi4vY291cG9uLXByb2R1Y3RzLXBhZ2VcIlxuaW1wb3J0IHsgQ291cG9uRW1wdHlTdGF0ZSB9IGZyb20gXCIuL2VtcHR5LXN0YXRlXCJcblxuZGVjbGFyZSBjb25zdCBfX0JBQ0tFTkRfVVJMX186IHN0cmluZ1xuXG50eXBlIEFwaUJhc2UgPSBcIi9hZG1pblwiIHwgXCIvdmVuZG9yXCJcbnR5cGUgQmVuZWZpdFR5cGUgPSBcImZpeGVkX2Ftb3VudFwiIHwgXCJwZXJjZW50YWdlXCIgfCBcImZyZWVfc2hpcHBpbmdcIiB8IFwiYnV5X2dldFwiXG50eXBlIENvZGVTdHJhdGVneSA9IFwidW5pcXVlX2NvZGVcIiB8IFwic2hhcmVkX2NvZGVcIlxudHlwZSBNaXJyb3JNb2RlID0gXCJub25lXCIgfCBcIm1hbnVhbFwiIHwgXCJhdXRvXCJcbnR5cGUgUHJvbW90aW9uU3RhdHVzID0gXCJkcmFmdFwiIHwgXCJhY3RpdmVcIiB8IFwiaW5hY3RpdmVcIlxudHlwZSBDYW1wYWlnbk1vZGUgPSBcIm5vbmVcIiB8IFwiZXhpc3RpbmdcIiB8IFwibmV3XCJcbnR5cGUgRXhwaXJhdGlvblBvbGljeVR5cGUgPSBcImR1cmF0aW9uXCIgfCBcImZpeGVkXCJcbnR5cGUgV2l6YXJkU3RlcCA9IFwiZGV0YWlsc1wiIHwgXCJvcmdhbml6ZVwiIHwgXCJ2YXJpYW50c1wiIHwgXCJjb3Vwb25cIiB8IFwiY2FtcGFpZ25cIlxuXG50eXBlIENvdXBvblByb2R1Y3RDb25maWcgPSB7XG4gIGlkOiBzdHJpbmdcbiAgZW5hYmxlZDogYm9vbGVhblxuICBwcm9kdWN0X2lkOiBzdHJpbmdcbiAgYmVuZWZpdF90eXBlOiBCZW5lZml0VHlwZVxuICBhbW91bnQ6IG51bWJlciB8IG51bGxcbiAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbFxuICBjdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIGNvZGVfc3RyYXRlZ3k6IENvZGVTdHJhdGVneVxuICBjb2RlX3ByZWZpeDogc3RyaW5nIHwgbnVsbFxuICBzaGFyZWRfY29kZTogc3RyaW5nIHwgbnVsbFxuICBleHBpcmF0aW9uX3BvbGljeTpcbiAgICB8IHtcbiAgICAgICAgdHlwZTogXCJkdXJhdGlvblwiXG4gICAgICAgIGR1cmF0aW9uX2RheXM6IG51bWJlclxuICAgICAgICBjYXBfYnlfY2FtcGFpZ24/OiBib29sZWFuXG4gICAgICAgIGNhcF9hdD86IHN0cmluZyB8IG51bGxcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogXCJmaXhlZFwiXG4gICAgICAgIGV4cGlyZXNfYXQ6IHN0cmluZ1xuICAgICAgICBjYXBfYnlfY2FtcGFpZ24/OiBib29sZWFuXG4gICAgICAgIGNhcF9hdD86IHN0cmluZyB8IG51bGxcbiAgICAgIH1cbiAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBudW1iZXJcbiAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBNaXJyb3JNb2RlXG4gIHByb21vdGlvbl9zdGF0dXM/OiBQcm9tb3Rpb25TdGF0dXMgfCBudWxsXG4gIGNhbXBhaWduX21vZGU/OiBDYW1wYWlnbk1vZGUgfCBudWxsXG4gIGNhbXBhaWduX2lkPzogc3RyaW5nIHwgbnVsbFxuICBjYW1wYWlnbl9zbmFwc2hvdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICBjb25maWdfdmVyc2lvbjogbnVtYmVyXG59XG5cbnR5cGUgQ291cG9uVmFyaWFudENvbmZpZyA9IFBhcnRpYWw8Q291cG9uUHJvZHVjdENvbmZpZz4gJiB7XG4gIGlkOiBzdHJpbmdcbiAgcHJvZHVjdF9jb25maWdfaWQ6IHN0cmluZ1xuICB2YXJpYW50X2lkOiBzdHJpbmdcbn1cblxudHlwZSBQcm9kdWN0VmFyaWFudCA9IHtcbiAgaWQ6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nIHwgbnVsbFxuICBza3U/OiBzdHJpbmcgfCBudWxsXG4gIHByaWNlcz86IHsgY3VycmVuY3lfY29kZT86IHN0cmluZzsgYW1vdW50PzogbnVtYmVyIH1bXVxufVxuXG50eXBlIFByb2R1Y3RSZWNvcmQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZyB8IG51bGxcbiAgc3VidGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIGhhbmRsZTogc3RyaW5nIHwgbnVsbFxuICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGxcbiAgc3RhdHVzOiBzdHJpbmcgfCBudWxsXG4gIHRodW1ibmFpbDogc3RyaW5nIHwgbnVsbFxuICBkaXNjb3VudGFibGU/OiBib29sZWFuXG4gIHR5cGVfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIGNvbGxlY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsXG4gIHNoaXBwaW5nX3Byb2ZpbGVfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIHZhcmlhbnRzPzogUHJvZHVjdFZhcmlhbnRbXVxuICBjYXRlZ29yaWVzPzogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9W11cbiAgdGFncz86IHsgaWQ6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfCBudWxsIH1bXVxuICBzYWxlc19jaGFubmVscz86IHsgaWQ6IHN0cmluZzsgbmFtZT86IHN0cmluZyB8IG51bGwgfVtdXG59XG5cbnR5cGUgQ291cG9uUHJvZHVjdFJvdyA9IHtcbiAgaWQ6IHN0cmluZ1xuICBwcm9kdWN0OiBQcm9kdWN0UmVjb3JkXG4gIGNvdXBvbl9wcm9kdWN0X2NvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZ1xuICBjb3Vwb25fcHJvZHVjdF92YXJpYW50X2NvbmZpZ3M6IENvdXBvblZhcmlhbnRDb25maWdbXVxuICBlbnRpdGxlbWVudHNfY291bnQ6IG51bWJlclxufVxuXG50eXBlIENvdXBvbkVudGl0bGVtZW50ID0ge1xuICBpZDogc3RyaW5nXG4gIG9yaWdpbj86IFwicHVyY2hhc2VcIiB8IFwiZXh0ZXJuYWxcIlxuICBjdXN0b21lcl9pZDogc3RyaW5nIHwgbnVsbFxuICBlbWFpbDogc3RyaW5nIHwgbnVsbFxuICBjb2RlOiBzdHJpbmcgfCBudWxsXG4gIHNoYXJlZF9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIHN0YXR1czogc3RyaW5nXG4gIHByb2R1Y3RfaWQ6IHN0cmluZyB8IG51bGxcbiAgdmFyaWFudF9pZDogc3RyaW5nIHwgbnVsbFxuICBvcmRlcl9pZDogc3RyaW5nIHwgbnVsbFxuICBsaW5lX2l0ZW1faWQ6IHN0cmluZyB8IG51bGxcbiAgaXNzdWFuY2VfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIGNvbmZpZ19pZD86IHN0cmluZyB8IG51bGxcbiAgdmFyaWFudF9jb25maWdfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIGV4cGlyZXNfYXQ6IHN0cmluZyB8IG51bGxcbiAgcmVkZWVtZWRfYXQ6IHN0cmluZyB8IG51bGxcbiAgY3JlYXRlZF9hdD86IHN0cmluZ1xuICBiZW5lZml0X3NuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIHNvdXJjZV9zbmFwc2hvdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICBleHRlcm5hbF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIHNlbGxlcl90YXJnZXRzPzogQXJyYXk8e1xuICAgIHNlbGxlcl9pZDogc3RyaW5nXG4gICAgc2VsbGVyX21lbWJlcl9pZD86IHN0cmluZyB8IG51bGxcbiAgfT5cbn1cblxudHlwZSBDb3Vwb25Jc3N1YW5jZVJlY29yZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICBzdGF0dXM/OiBzdHJpbmcgfCBudWxsXG4gIHF1YW50aXR5PzogbnVtYmVyIHwgbnVsbFxuICBjb25maWdfc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgaXNzdWVkX2NvdW50PzogbnVtYmVyIHwgbnVsbFxuICBmYWlsZWRfY291bnQ/OiBudW1iZXIgfCBudWxsXG4gIGNyZWF0ZWRfYXQ/OiBzdHJpbmdcbiAgdXBkYXRlZF9hdD86IHN0cmluZ1xufVxuXG50eXBlIENvdXBvbk9yZGVyU3VtbWFyeSA9IHtcbiAgaWQ6IHN0cmluZ1xuICBkaXNwbGF5X2lkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsXG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsXG4gIGN1c3RvbWVyX2lkOiBzdHJpbmcgfCBudWxsXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGxcbiAgdG90YWw6IG51bWJlciB8IG51bGxcbiAgY3JlYXRlZF9hdDogc3RyaW5nIHwgbnVsbFxufVxuXG50eXBlIENvdXBvbkVudGl0bGVtZW50RGV0YWlsID0ge1xuICBjdXN0b21lcl9jb3Vwb25fZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50XG4gIGNvdXBvbl9pc3N1YW5jZT86IENvdXBvbklzc3VhbmNlUmVjb3JkIHwgbnVsbFxuICBvcmRlcj86IENvdXBvbk9yZGVyU3VtbWFyeSB8IG51bGxcbn1cblxudHlwZSBPcHRpb25SZWNvcmQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZyB8IG51bGxcbiAgdGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIHZhbHVlPzogc3RyaW5nIHwgbnVsbFxuICBoYW5kbGU/OiBzdHJpbmcgfCBudWxsXG4gIGNhbXBhaWduX2lkZW50aWZpZXI/OiBzdHJpbmcgfCBudWxsXG59XG5cbnR5cGUgQ3VycmVuY3lPcHRpb24gPSB7XG4gIGNvZGU6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgc3ltYm9sOiBzdHJpbmdcbiAgc3ltYm9sX25hdGl2ZTogc3RyaW5nXG4gIGlzX2RlZmF1bHQ6IGJvb2xlYW5cbn1cblxudHlwZSBPcHRpb25zUGF5bG9hZCA9IHtcbiAgY3VycmVuY2llcz86IEN1cnJlbmN5T3B0aW9uW11cbiAgcHJvZHVjdF90eXBlcz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfY29sbGVjdGlvbnM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X2NhdGVnb3JpZXM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X3RhZ3M/OiBPcHRpb25SZWNvcmRbXVxuICBzYWxlc19jaGFubmVscz86IE9wdGlvblJlY29yZFtdXG4gIHNoaXBwaW5nX3Byb2ZpbGVzPzogT3B0aW9uUmVjb3JkW11cbiAgY2FtcGFpZ25zPzogT3B0aW9uUmVjb3JkW11cbiAgc2VsbGVycz86IE9wdGlvblJlY29yZFtdXG59XG5cbnR5cGUgUHJvZHVjdEZvcm1TdGF0ZSA9IHtcbiAgaWQ6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIHN1YnRpdGxlOiBzdHJpbmdcbiAgaGFuZGxlOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICB0aHVtYm5haWw6IHN0cmluZ1xuICBzdGF0dXM6IHN0cmluZ1xuICBkaXNjb3VudGFibGU6IGJvb2xlYW5cbiAgc2VsbGVyX2lkOiBzdHJpbmdcbiAgdHlwZV9pZDogc3RyaW5nXG4gIGNvbGxlY3Rpb25faWQ6IHN0cmluZ1xuICBjYXRlZ29yeV9pZDogc3RyaW5nXG4gIHRhZ19pZDogc3RyaW5nXG4gIHNhbGVzX2NoYW5uZWxfaWQ6IHN0cmluZ1xuICB2YXJpYW50czogVmFyaWFudEZvcm1TdGF0ZVtdXG59XG5cbnR5cGUgVmFyaWFudEZvcm1TdGF0ZSA9IHtcbiAgaWQ/OiBzdHJpbmdcbiAgb3ZlcnJpZGVfY29uZmlnX2lkPzogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbiAgc2t1OiBzdHJpbmdcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nXG4gIGFtb3VudDogc3RyaW5nXG4gIG92ZXJyaWRlX2VuYWJsZWQ6IGJvb2xlYW5cbiAgb3ZlcnJpZGVfYmVuZWZpdF90eXBlOiBCZW5lZml0VHlwZVxuICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlOiBzdHJpbmdcbiAgb3ZlcnJpZGVfYW1vdW50OiBzdHJpbmdcbiAgb3ZlcnJpZGVfcGVyY2VudGFnZTogc3RyaW5nXG59XG5cbnR5cGUgQ291cG9uRm9ybVN0YXRlID0ge1xuICBlbmFibGVkOiBib29sZWFuXG4gIGJlbmVmaXRfdHlwZTogQmVuZWZpdFR5cGVcbiAgYW1vdW50OiBzdHJpbmdcbiAgcGVyY2VudGFnZTogc3RyaW5nXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZ1xuICBjb2RlX3N0cmF0ZWd5OiBDb2RlU3RyYXRlZ3lcbiAgY29kZV9wcmVmaXg6IHN0cmluZ1xuICBzaGFyZWRfY29kZTogc3RyaW5nXG4gIGV4cGlyYXRpb25fdHlwZTogRXhwaXJhdGlvblBvbGljeVR5cGVcbiAgZXhwaXJhdGlvbl9kYXlzOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl9kYXRlOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IGJvb2xlYW5cbiAgZXhwaXJhdGlvbl9jYXBfYXQ6IHN0cmluZ1xuICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IHN0cmluZ1xuICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IE1pcnJvck1vZGVcbiAgcHJvbW90aW9uX3N0YXR1czogUHJvbW90aW9uU3RhdHVzXG59XG5cbnR5cGUgQ2FtcGFpZ25Gb3JtU3RhdGUgPSB7XG4gIG1vZGU6IENhbXBhaWduTW9kZVxuICBjYW1wYWlnbl9pZDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBjYW1wYWlnbl9pZGVudGlmaWVyOiBzdHJpbmdcbiAgc3RhcnRzX2F0OiBzdHJpbmdcbiAgZW5kc19hdDogc3RyaW5nXG59XG5cbmNvbnN0IE5PTkUgPSBcIl9fbm9uZV9fXCJcbmNvbnN0IHN0ZXBzOiBXaXphcmRTdGVwW10gPSBbXG4gIFwiZGV0YWlsc1wiLFxuICBcIm9yZ2FuaXplXCIsXG4gIFwidmFyaWFudHNcIixcbiAgXCJjb3Vwb25cIixcbiAgXCJjYW1wYWlnblwiLFxuXVxuXG5jb25zdCBlbXB0eVZhcmlhbnQ6IFZhcmlhbnRGb3JtU3RhdGUgPSB7XG4gIHRpdGxlOiBcIkRlZmF1bHQgdmFyaWFudFwiLFxuICBza3U6IFwiXCIsXG4gIGN1cnJlbmN5X2NvZGU6IFwiXCIsXG4gIGFtb3VudDogXCJcIixcbiAgb3ZlcnJpZGVfZW5hYmxlZDogZmFsc2UsXG4gIG92ZXJyaWRlX2JlbmVmaXRfdHlwZTogXCJmaXhlZF9hbW91bnRcIixcbiAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZTogXCJcIixcbiAgb3ZlcnJpZGVfYW1vdW50OiBcIlwiLFxuICBvdmVycmlkZV9wZXJjZW50YWdlOiBcIlwiLFxufVxuXG5jb25zdCBlbXB0eVByb2R1Y3Q6IFByb2R1Y3RGb3JtU3RhdGUgPSB7XG4gIGlkOiBcIlwiLFxuICB0aXRsZTogXCJcIixcbiAgc3VidGl0bGU6IFwiXCIsXG4gIGhhbmRsZTogXCJcIixcbiAgZGVzY3JpcHRpb246IFwiXCIsXG4gIHRodW1ibmFpbDogXCJcIixcbiAgc3RhdHVzOiBcImRyYWZ0XCIsXG4gIGRpc2NvdW50YWJsZTogZmFsc2UsXG4gIHNlbGxlcl9pZDogXCJcIixcbiAgdHlwZV9pZDogXCJcIixcbiAgY29sbGVjdGlvbl9pZDogXCJcIixcbiAgY2F0ZWdvcnlfaWQ6IFwiXCIsXG4gIHRhZ19pZDogXCJcIixcbiAgc2FsZXNfY2hhbm5lbF9pZDogXCJcIixcbiAgdmFyaWFudHM6IFtlbXB0eVZhcmlhbnRdLFxufVxuXG5jb25zdCBlbXB0eUNvdXBvbjogQ291cG9uRm9ybVN0YXRlID0ge1xuICBlbmFibGVkOiB0cnVlLFxuICBiZW5lZml0X3R5cGU6IFwiZml4ZWRfYW1vdW50XCIsXG4gIGFtb3VudDogXCJcIixcbiAgcGVyY2VudGFnZTogXCJcIixcbiAgY3VycmVuY3lfY29kZTogXCJcIixcbiAgY29kZV9zdHJhdGVneTogXCJ1bmlxdWVfY29kZVwiLFxuICBjb2RlX3ByZWZpeDogXCJDT1VQT05cIixcbiAgc2hhcmVkX2NvZGU6IFwiXCIsXG4gIGV4cGlyYXRpb25fdHlwZTogXCJkdXJhdGlvblwiLFxuICBleHBpcmF0aW9uX2RheXM6IFwiMzBcIixcbiAgZXhwaXJhdGlvbl9kYXRlOiBcIlwiLFxuICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogdHJ1ZSxcbiAgZXhwaXJhdGlvbl9jYXBfYXQ6IFwiXCIsXG4gIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogXCIxXCIsXG4gIHByb21vdGlvbl9taXJyb3JfbW9kZTogXCJub25lXCIsXG4gIHByb21vdGlvbl9zdGF0dXM6IFwiZHJhZnRcIixcbn1cblxuY29uc3QgZW1wdHlDYW1wYWlnbjogQ2FtcGFpZ25Gb3JtU3RhdGUgPSB7XG4gIG1vZGU6IFwibm9uZVwiLFxuICBjYW1wYWlnbl9pZDogXCJcIixcbiAgbmFtZTogXCJcIixcbiAgY2FtcGFpZ25faWRlbnRpZmllcjogXCJcIixcbiAgc3RhcnRzX2F0OiBcIlwiLFxuICBlbmRzX2F0OiBcIlwiLFxufVxuXG5jb25zdCBtb2RhbENvbnRlbnRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIGhlaWdodDogXCIxMDAlXCIsXG4gIG92ZXJmbG93OiBcImhpZGRlblwiLFxufVxuXG5jb25zdCBtb2RhbFN0YXRpY1Jvd1N0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBmbGV4U2hyaW5rOiAwLFxufVxuXG5jb25zdCBtb2RhbFdpemFyZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleDogXCIxIDEgYXV0b1wiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBtaW5IZWlnaHQ6IDAsXG59XG5cbmNvbnN0IG1vZGFsQm9keVN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBmbGV4OiBcIjEgMSBhdXRvXCIsXG4gIG1pbkhlaWdodDogMCxcbiAgb3ZlcmZsb3dZOiBcImF1dG9cIixcbiAgcGFkZGluZzogXCIzMnB4IDI0cHhcIixcbn1cblxuY29uc3QgbW9kYWxGb3JtU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIG1hcmdpbjogXCIwIGF1dG9cIixcbiAgbWF4V2lkdGg6IDkyMCxcbiAgd2lkdGg6IFwibWluKDkyMHB4LCAxMDAlKVwiLFxufVxuXG5jb25zdCBzdGFja1N0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgZ2FwOiAxNixcbn1cblxuY29uc3QgdHdvQ29sdW1uR3JpZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImdyaWRcIixcbiAgZ2FwOiAxNixcbiAgZ3JpZFRlbXBsYXRlQ29sdW1uczogXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNjBweCwgMWZyKSlcIixcbn1cblxuY29uc3QgdGhyZWVDb2x1bW5HcmlkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICBnYXA6IDE2LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIyMHB4LCAxZnIpKVwiLFxufVxuXG5jb25zdCBmb3VyQ29sdW1uR3JpZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImdyaWRcIixcbiAgZ2FwOiAxNixcbiAgZ3JpZFRlbXBsYXRlQ29sdW1uczogXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heCgxNjBweCwgMWZyKSlcIixcbn1cblxuY29uc3QgcGFuZWxTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgYm9yZGVyOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgYm9yZGVyUmFkaXVzOiA4LFxuICBwYWRkaW5nOiAxNixcbn1cblxuY29uc3Qgcm93QmV0d2VlblN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZ2FwOiAxNixcbiAganVzdGlmeUNvbnRlbnQ6IFwic3BhY2UtYmV0d2VlblwiLFxufVxuXG5mdW5jdGlvbiBiYWNrZW5kVXJsKCkge1xuICByZXR1cm4gdHlwZW9mIF9fQkFDS0VORF9VUkxfXyA9PT0gXCJzdHJpbmdcIlxuICAgID8gX19CQUNLRU5EX1VSTF9fLnJlcGxhY2UoL1xcLyQvLCBcIlwiKVxuICAgIDogXCJcIlxufVxuXG5mdW5jdGlvbiBhcGlFcnJvck1lc3NhZ2UocGF5bG9hZDogYW55LCBmYWxsYmFjazogc3RyaW5nKSB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXG4gICAgcGF5bG9hZD8ubWVzc2FnZSxcbiAgICBwYXlsb2FkPy5lcnJvcj8ubWVzc2FnZSxcbiAgICBwYXlsb2FkPy5lcnJvcixcbiAgICBwYXlsb2FkPy5lcnJvcnM/LlswXT8ubWVzc2FnZSxcbiAgXVxuICBjb25zdCBtZXNzYWdlID0gY2FuZGlkYXRlcy5maW5kKFxuICAgIChjYW5kaWRhdGUpID0+IHR5cGVvZiBjYW5kaWRhdGUgPT09IFwic3RyaW5nXCIgJiYgY2FuZGlkYXRlLnRyaW0oKSxcbiAgKVxuXG4gIHJldHVybiBtZXNzYWdlIHx8IGZhbGxiYWNrIHx8IFwiUmVxdWVzdCBmYWlsZWRcIlxufVxuXG5hc3luYyBmdW5jdGlvbiBhcGlGZXRjaDxUPihcbiAgcGF0aDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9LFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFja2VuZFVybCgpfSR7cGF0aH1gLCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgaGVhZGVyczoge1xuICAgICAgLi4uKG9wdGlvbnMuYm9keSA/IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSA6IHt9KSxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9LFxuICB9KVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgdGhyb3cgbmV3IEVycm9yKGFwaUVycm9yTWVzc2FnZShwYXlsb2FkLCByZXNwb25zZS5zdGF0dXNUZXh0KSlcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKClcbn1cblxuZnVuY3Rpb24gbnVtYmVyT3JOdWxsKHZhbHVlOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKVxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgcGFyc2VkID4gMCA/IHBhcnNlZCA6IG51bGxcbn1cblxuZnVuY3Rpb24gb3B0aW9uTGFiZWwob3B0aW9uOiBPcHRpb25SZWNvcmQpIHtcbiAgcmV0dXJuIChcbiAgICBvcHRpb24ubmFtZSB8fCBvcHRpb24udGl0bGUgfHwgb3B0aW9uLnZhbHVlIHx8IG9wdGlvbi5oYW5kbGUgfHwgb3B0aW9uLmlkXG4gIClcbn1cblxuZnVuY3Rpb24gYmVuZWZpdExhYmVsKFxuICBjb25maWc6IFBpY2s8XG4gICAgQ291cG9uUHJvZHVjdENvbmZpZyxcbiAgICBcImJlbmVmaXRfdHlwZVwiIHwgXCJhbW91bnRcIiB8IFwicGVyY2VudGFnZVwiIHwgXCJjdXJyZW5jeV9jb2RlXCJcbiAgPixcbikge1xuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIikge1xuICAgIHJldHVybiBgJHtjb25maWcuYW1vdW50IHx8IDB9ICR7KGNvbmZpZy5jdXJyZW5jeV9jb2RlIHx8IFwiXCIpLnRvVXBwZXJDYXNlKCl9YFxuICB9XG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIikge1xuICAgIHJldHVybiBgJHtjb25maWcucGVyY2VudGFnZSB8fCAwfSVgXG4gIH1cbiAgaWYgKGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZnJlZV9zaGlwcGluZ1wiKSB7XG4gICAgcmV0dXJuIFwiRnJlZSBzaGlwcGluZ1wiXG4gIH1cbiAgcmV0dXJuIFwiQnV5IGdldFwiXG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGUodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIi1cIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCItXCJcbiAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKClcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWUodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIi1cIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCItXCJcbiAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBmb3JtYXRGdWxsRGF0ZSh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiLVwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIi1cIlxuICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHtcbiAgICBkYXk6IFwibnVtZXJpY1wiLFxuICAgIGhvdXI6IFwibnVtZXJpY1wiLFxuICAgIG1pbnV0ZTogXCIyLWRpZ2l0XCIsXG4gICAgbW9udGg6IFwic2hvcnRcIixcbiAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgfSlcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVsYXRpdmVEYXRlKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCItXCJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIFwiLVwiXG5cbiAgY29uc3QgZGlmZlNlY29uZHMgPSBNYXRoLnJvdW5kKChkYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMClcbiAgY29uc3QgYWJzU2Vjb25kcyA9IE1hdGguYWJzKGRpZmZTZWNvbmRzKVxuICBjb25zdCB1bml0czogQXJyYXk8W0ludGwuUmVsYXRpdmVUaW1lRm9ybWF0VW5pdCwgbnVtYmVyXT4gPSBbXG4gICAgW1wieWVhclwiLCA2MCAqIDYwICogMjQgKiAzNjVdLFxuICAgIFtcIm1vbnRoXCIsIDYwICogNjAgKiAyNCAqIDMwXSxcbiAgICBbXCJ3ZWVrXCIsIDYwICogNjAgKiAyNCAqIDddLFxuICAgIFtcImRheVwiLCA2MCAqIDYwICogMjRdLFxuICAgIFtcImhvdXJcIiwgNjAgKiA2MF0sXG4gICAgW1wibWludXRlXCIsIDYwXSxcbiAgXVxuICBjb25zdCBbdW5pdCwgc2Vjb25kc10gPVxuICAgIHVuaXRzLmZpbmQoKFssIHNlY29uZHNQZXJVbml0XSkgPT4gYWJzU2Vjb25kcyA+PSBzZWNvbmRzUGVyVW5pdCkgfHwgW11cblxuICBpZiAoIXVuaXQgfHwgIXNlY29uZHMpIHtcbiAgICByZXR1cm4gXCJqdXN0IG5vd1wiXG4gIH1cblxuICByZXR1cm4gbmV3IEludGwuUmVsYXRpdmVUaW1lRm9ybWF0KHVuZGVmaW5lZCwgeyBudW1lcmljOiBcImF1dG9cIiB9KS5mb3JtYXQoXG4gICAgTWF0aC5yb3VuZChkaWZmU2Vjb25kcyAvIHNlY29uZHMpLFxuICAgIHVuaXQsXG4gIClcbn1cblxuZnVuY3Rpb24gZm9ybWF0U25hcHNob3RBbW91bnQoYW1vdW50OiBudW1iZXIgfCBudWxsLCBjdXJyZW5jeT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKGFtb3VudCA9PSBudWxsKSByZXR1cm4gXCItXCJcbiAgY29uc3QgY29kZSA9IGN1cnJlbmN5ID8gY3VycmVuY3kudG9VcHBlckNhc2UoKSA6IFwiXCJcbiAgcmV0dXJuIFtjb2RlLCBhbW91bnQudG9Mb2NhbGVTdHJpbmcodW5kZWZpbmVkLCB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KV1cbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oXCIgXCIpXG59XG5cbmZ1bmN0aW9uIHRvRGF0ZVRpbWVMb2NhbCh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIFwiXCJcbiAgY29uc3QgbG9jYWxEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MF8wMDApXG4gIHJldHVybiBsb2NhbERhdGUudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxNilcbn1cblxuZnVuY3Rpb24gZW50aXRsZW1lbnRTdGF0dXNDb2xvcihzdGF0dXM6IHN0cmluZykge1xuICBpZiAoc3RhdHVzID09PSBcImlzc3VlZFwiKSByZXR1cm4gXCJncmVlblwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwicmVkZWVtZWRcIikgcmV0dXJuIFwiYmx1ZVwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwiZXhwaXJlZFwiIHx8IHN0YXR1cyA9PT0gXCJjYW5jZWxlZFwiKSByZXR1cm4gXCJncmV5XCIgYXMgY29uc3RcbiAgcmV0dXJuIFwib3JhbmdlXCIgYXMgY29uc3Rcbn1cblxuZnVuY3Rpb24gcHJvZHVjdFN0YXR1c0NvbG9yKHN0YXR1cz86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKHN0YXR1cyA9PT0gXCJwdWJsaXNoZWRcIikgcmV0dXJuIFwiZ3JlZW5cIiBhcyBjb25zdFxuICBpZiAoc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHJldHVybiBcInJlZFwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwicHJvcG9zZWRcIikgcmV0dXJuIFwib3JhbmdlXCIgYXMgY29uc3RcbiAgcmV0dXJuIFwiZ3JleVwiIGFzIGNvbnN0XG59XG5cbmZ1bmN0aW9uIHNuYXBzaG90U3RyaW5nKFxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbikge1xuICBjb25zdCB2YWx1ZSA9IHNuYXBzaG90Py5ba2V5XVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSkgcmV0dXJuIHZhbHVlXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHJldHVybiBTdHJpbmcodmFsdWUpXG4gIHJldHVybiBcIlwiXG59XG5cbmZ1bmN0aW9uIHNuYXBzaG90TnVtYmVyKFxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBrZXk6IHN0cmluZyxcbikge1xuICBjb25zdCB2YWx1ZSA9IHNuYXBzaG90Py5ba2V5XVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IG51bGxcbn1cblxuZnVuY3Rpb24ganNvbkJsb2NrKHZhbHVlOiB1bmtub3duKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gXCJ7fVwiXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMilcbn1cblxuZnVuY3Rpb24gY291cG9uQ29kZShlbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnQpIHtcbiAgcmV0dXJuIGVudGl0bGVtZW50LmNvZGUgfHwgZW50aXRsZW1lbnQuc2hhcmVkX2NvZGUgfHwgXCItXCJcbn1cblxuZnVuY3Rpb24gZW50aXRsZW1lbnRTb3VyY2UoZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50KSB7XG4gIGlmIChlbnRpdGxlbWVudC5vcmlnaW4gPT09IFwiZXh0ZXJuYWxcIikgcmV0dXJuIFwiRXh0ZXJuYWxcIlxuICByZXR1cm4gXCJQdXJjaGFzZVwiXG59XG5cbmZ1bmN0aW9uIGVudGl0bGVtZW50U2VsbGVyU2NvcGUoZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50KSB7XG4gIGNvbnN0IGNvdW50ID0gZW50aXRsZW1lbnQuc2VsbGVyX3RhcmdldHM/Lmxlbmd0aCB8fCAwXG4gIGlmIChlbnRpdGxlbWVudC5vcmlnaW4gIT09IFwiZXh0ZXJuYWxcIikge1xuICAgIGlmICghY291bnQpIHJldHVybiBcIlByb2R1Y3Qgc2VsbGVyXCJcbiAgICByZXR1cm4gYFByb2R1Y3Qgc2VsbGVyICsgJHtjb3VudH0gbGlua2VkYFxuICB9XG4gIGlmICghY291bnQpIHJldHVybiBcIkFkbWluIG9ubHlcIlxuICByZXR1cm4gY291bnQgPT09IDEgPyBcIjEgbGlua2VkIHNlbGxlclwiIDogYCR7Y291bnR9IGxpbmtlZCBzZWxsZXJzYFxufVxuXG5mdW5jdGlvbiBvcmRlckRpc3BsYXlJZChvcmRlcjogQ291cG9uT3JkZXJTdW1tYXJ5IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICBpZiAoIW9yZGVyKSByZXR1cm4gXCItXCJcbiAgcmV0dXJuIG9yZGVyLmRpc3BsYXlfaWQgPT0gbnVsbCA/IG9yZGVyLmlkIDogYCMke29yZGVyLmRpc3BsYXlfaWR9YFxufVxuXG5mdW5jdGlvbiBkYXNoYm9hcmRCYXNlUGF0aChhcGlCYXNlOiBBcGlCYXNlKSB7XG4gIHJldHVybiBhcGlCYXNlID09PSBcIi92ZW5kb3JcIiA/IFwiL3NlbGxlclwiIDogXCIvZGFzaGJvYXJkXCJcbn1cblxuZnVuY3Rpb24gY291cG9uRGV0YWlsUGF0aChhcGlCYXNlOiBBcGlCYXNlLCBlbnRpdGxlbWVudElkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGAke2Rhc2hib2FyZEJhc2VQYXRoKGFwaUJhc2UpfS9jb3Vwb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgIGVudGl0bGVtZW50SWQsXG4gICl9YFxufVxuXG5mdW5jdGlvbiBvcmRlckRldGFpbFBhdGgoYXBpQmFzZTogQXBpQmFzZSwgb3JkZXJJZDogc3RyaW5nKSB7XG4gIHJldHVybiBgJHtkYXNoYm9hcmRCYXNlUGF0aChhcGlCYXNlKX0vb3JkZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZGVySWQpfWBcbn1cblxuZnVuY3Rpb24gY3VycmVudENvdXBvbkRldGFpbElkKGFwaUJhc2U6IEFwaUJhc2UpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gYCR7ZGFzaGJvYXJkQmFzZVBhdGgoYXBpQmFzZSl9L2NvdXBvbnMvYFxuICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lXG4gIGNvbnN0IGluZGV4ID0gcGF0aC5pbmRleE9mKHByZWZpeClcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBpZCA9IHBhdGguc2xpY2UoaW5kZXggKyBwcmVmaXgubGVuZ3RoKS5zcGxpdChcIi9cIilbMF1cbiAgaWYgKCFpZCB8fCBpZCA9PT0gXCJwcm9kdWN0c1wiKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpZClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGlkXG4gIH1cbn1cblxuZnVuY3Rpb24gYmVuZWZpdFNuYXBzaG90TGFiZWwoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgdHlwZSA9IHNuYXBzaG90U3RyaW5nKHNuYXBzaG90LCBcImJlbmVmaXRfdHlwZVwiKVxuICBpZiAodHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIikge1xuICAgIGNvbnN0IGFtb3VudHMgPSBBcnJheS5pc0FycmF5KHNuYXBzaG90Py5hbW91bnRzKVxuICAgICAgPyAoc25hcHNob3QuYW1vdW50cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pXG4gICAgICA6IFtdXG4gICAgaWYgKGFtb3VudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYW1vdW50c1xuICAgICAgICAubWFwKChyb3cpID0+IHtcbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBzbmFwc2hvdE51bWJlcihyb3csIFwiYW1vdW50XCIpXG4gICAgICAgICAgY29uc3QgY3VycmVuY3kgPSBzbmFwc2hvdFN0cmluZyhyb3csIFwiY3VycmVuY3lfY29kZVwiKS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgcmV0dXJuIGAke2Ftb3VudCA/PyAwfSAke2N1cnJlbmN5fWAudHJpbSgpXG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiLCBcIilcbiAgICB9XG5cbiAgICBjb25zdCBhbW91bnQgPSBzbmFwc2hvdE51bWJlcihzbmFwc2hvdCwgXCJhbW91bnRcIilcbiAgICBjb25zdCBjdXJyZW5jeSA9IHNuYXBzaG90U3RyaW5nKHNuYXBzaG90LCBcImN1cnJlbmN5X2NvZGVcIikudG9VcHBlckNhc2UoKVxuICAgIHJldHVybiBgJHthbW91bnQgPz8gMH0gJHtjdXJyZW5jeX1gLnRyaW0oKVxuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwicGVyY2VudGFnZVwiKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBzbmFwc2hvdD8ucHJvbW90aW9uX3RlbXBsYXRlIGFzXG4gICAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICB8IG51bGxcbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgY29uc3QgbWV0aG9kID0gdGVtcGxhdGU/LmFwcGxpY2F0aW9uX21ldGhvZCBhc1xuICAgICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgfCBudWxsXG4gICAgICB8IHVuZGVmaW5lZFxuICAgIGNvbnN0IHNjb3BlID0gc25hcHNob3RTdHJpbmcobWV0aG9kLCBcInRhcmdldF90eXBlXCIpID09PSBcIm9yZGVyXCJcbiAgICAgID8gXCJvcmRlclwiXG4gICAgICA6IFwicHJvZHVjdHNcIlxuICAgIHJldHVybiBgJHtzbmFwc2hvdE51bWJlcihzbmFwc2hvdCwgXCJwZXJjZW50YWdlXCIpID8/IDB9JSBvZmYgJHtzY29wZX1gXG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJmcmVlX3NoaXBwaW5nXCIpIHtcbiAgICByZXR1cm4gXCJGcmVlIHNoaXBwaW5nXCJcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImJ1eV9nZXRcIikge1xuICAgIHJldHVybiBcIkJ1eSBYIEdldCBZXCJcbiAgfVxuXG4gIHJldHVybiBcIlVua25vd25cIlxufVxuXG5mdW5jdGlvbiBleHBpcmF0aW9uUG9saWN5TGFiZWwoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgcG9saWN5ID0gc25hcHNob3Q/LmV4cGlyYXRpb25fcG9saWN5IGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkXG4gIGNvbnN0IHR5cGUgPSBzbmFwc2hvdFN0cmluZyhwb2xpY3ksIFwidHlwZVwiKVxuXG4gIGlmICh0eXBlID09PSBcIm5vbmVcIikgcmV0dXJuIFwiTm8gZXhwaXJhdGlvblwiXG4gIGlmICh0eXBlID09PSBcImR1cmF0aW9uXCIpIHtcbiAgICBjb25zdCBkYXlzID0gc25hcHNob3ROdW1iZXIocG9saWN5LCBcImR1cmF0aW9uX2RheXNcIikgPz8gMFxuICAgIHJldHVybiBgJHtkYXlzfSBkYXlzIGFmdGVyIGlzc3VhbmNlYFxuICB9XG4gIGlmICh0eXBlID09PSBcImZpeGVkXCIpIHtcbiAgICByZXR1cm4gYEZpeGVkIGRhdGUgJHtmb3JtYXREYXRlVGltZShzbmFwc2hvdFN0cmluZyhwb2xpY3ksIFwiZXhwaXJlc19hdFwiKSl9YFxuICB9XG5cbiAgcmV0dXJuIFwiLVwiXG59XG5cbmZ1bmN0aW9uIGNhbXBhaWduU25hcHNob3RMYWJlbChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBjYW1wYWlnblNuYXBzaG90ID0gc25hcHNob3Q/LmNhbXBhaWduX3NuYXBzaG90IGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkXG4gIHJldHVybiAoXG4gICAgc25hcHNob3RTdHJpbmcoY2FtcGFpZ25TbmFwc2hvdCwgXCJuYW1lXCIpIHx8XG4gICAgc25hcHNob3RTdHJpbmcoY2FtcGFpZ25TbmFwc2hvdCwgXCJjYW1wYWlnbl9pZGVudGlmaWVyXCIpIHx8XG4gICAgc25hcHNob3RTdHJpbmcoc25hcHNob3QsIFwiY2FtcGFpZ25faWRcIikgfHxcbiAgICBcIk5vbmVcIlxuICApXG59XG5cbmZ1bmN0aW9uIHByb21vdGlvblNuYXBzaG90TGFiZWwoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4pIHtcbiAgY29uc3QgdGVtcGxhdGUgPSBzbmFwc2hvdD8ucHJvbW90aW9uX3RlbXBsYXRlIGFzXG4gICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkXG4gIGNvbnN0IG1ldGhvZCA9IHRlbXBsYXRlPy5hcHBsaWNhdGlvbl9tZXRob2QgYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWRcbiAgY29uc3QgdGFyZ2V0ID0gc25hcHNob3RTdHJpbmcobWV0aG9kLCBcInRhcmdldF90eXBlXCIpXG4gIGNvbnN0IGFsbG9jYXRpb24gPSBzbmFwc2hvdFN0cmluZyhtZXRob2QsIFwiYWxsb2NhdGlvblwiKVxuXG4gIHJldHVybiBbdGFyZ2V0LCBhbGxvY2F0aW9uXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiAvIFwiKSB8fCBcIk5vbmVcIlxufVxuXG5mdW5jdGlvbiBjYW1wYWlnbkxhYmVsKGNvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZykge1xuICBjb25zdCBuYW1lID0gY29uZmlnLmNhbXBhaWduX3NuYXBzaG90Py5uYW1lXG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWVcbiAgfVxuXG4gIHJldHVybiBjb25maWcuY2FtcGFpZ25faWQgfHwgXCJOb25lXCJcbn1cblxuZnVuY3Rpb24gZm9ybUZyb21Sb3cocm93OiBDb3Vwb25Qcm9kdWN0Um93LCBkZWZhdWx0Q3VycmVuY3lDb2RlOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJvZHVjdCA9IHJvdy5wcm9kdWN0IHx8ICh7fSBhcyBQcm9kdWN0UmVjb3JkKVxuICBjb25zdCBjb25maWcgPSByb3cuY291cG9uX3Byb2R1Y3RfY29uZmlnXG4gIGNvbnN0IHZhcmlhbnRDb25maWdCeVZhcmlhbnRJZCA9IG5ldyBNYXAoXG4gICAgKHJvdy5jb3Vwb25fcHJvZHVjdF92YXJpYW50X2NvbmZpZ3MgfHwgW10pLm1hcCgodmFyaWFudENvbmZpZykgPT4gW1xuICAgICAgdmFyaWFudENvbmZpZy52YXJpYW50X2lkLFxuICAgICAgdmFyaWFudENvbmZpZyxcbiAgICBdKSxcbiAgKVxuICBjb25zdCBkdXJhdGlvbkRheXMgPVxuICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSA9PT0gXCJkdXJhdGlvblwiXG4gICAgICA/IGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeS5kdXJhdGlvbl9kYXlzXG4gICAgICA6IDMwXG5cbiAgcmV0dXJuIHtcbiAgICBwcm9kdWN0OiB7XG4gICAgICAuLi5lbXB0eVByb2R1Y3QsXG4gICAgICBpZDogcHJvZHVjdC5pZCB8fCBcIlwiLFxuICAgICAgdGl0bGU6IHByb2R1Y3QudGl0bGUgfHwgXCJcIixcbiAgICAgIHN1YnRpdGxlOiBwcm9kdWN0LnN1YnRpdGxlIHx8IFwiXCIsXG4gICAgICBoYW5kbGU6IHByb2R1Y3QuaGFuZGxlIHx8IFwiXCIsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdC5kZXNjcmlwdGlvbiB8fCBcIlwiLFxuICAgICAgdGh1bWJuYWlsOiBwcm9kdWN0LnRodW1ibmFpbCB8fCBcIlwiLFxuICAgICAgc3RhdHVzOiBwcm9kdWN0LnN0YXR1cyB8fCBcImRyYWZ0XCIsXG4gICAgICBkaXNjb3VudGFibGU6IEJvb2xlYW4ocHJvZHVjdC5kaXNjb3VudGFibGUpLFxuICAgICAgdHlwZV9pZDogcHJvZHVjdC50eXBlX2lkIHx8IFwiXCIsXG4gICAgICBjb2xsZWN0aW9uX2lkOiBwcm9kdWN0LmNvbGxlY3Rpb25faWQgfHwgXCJcIixcbiAgICAgIGNhdGVnb3J5X2lkOiBwcm9kdWN0LmNhdGVnb3JpZXM/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIHRhZ19pZDogcHJvZHVjdC50YWdzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgICBzYWxlc19jaGFubmVsX2lkOiBwcm9kdWN0LnNhbGVzX2NoYW5uZWxzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgICB2YXJpYW50czogKHByb2R1Y3QudmFyaWFudHM/Lmxlbmd0aCA/IHByb2R1Y3QudmFyaWFudHMgOiBbXSkubWFwKFxuICAgICAgICAodmFyaWFudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG92ZXJyaWRlID0gdmFyaWFudENvbmZpZ0J5VmFyaWFudElkLmdldCh2YXJpYW50LmlkKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5lbXB0eVZhcmlhbnQsXG4gICAgICAgICAgICBpZDogdmFyaWFudC5pZCxcbiAgICAgICAgICAgIG92ZXJyaWRlX2NvbmZpZ19pZDogb3ZlcnJpZGU/LmlkLFxuICAgICAgICAgICAgdGl0bGU6IHZhcmlhbnQudGl0bGUgfHwgXCJcIixcbiAgICAgICAgICAgIHNrdTogdmFyaWFudC5za3UgfHwgXCJcIixcbiAgICAgICAgICAgIGN1cnJlbmN5X2NvZGU6XG4gICAgICAgICAgICAgIHZhcmlhbnQucHJpY2VzPy5bMF0/LmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgb3ZlcnJpZGU/LmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgY29uZmlnLmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdEN1cnJlbmN5Q29kZSxcbiAgICAgICAgICAgIGFtb3VudDpcbiAgICAgICAgICAgICAgdmFyaWFudC5wcmljZXM/LlswXT8uYW1vdW50ID09IG51bGxcbiAgICAgICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgICAgICA6IFN0cmluZyh2YXJpYW50LnByaWNlcz8uWzBdPy5hbW91bnQpLFxuICAgICAgICAgICAgb3ZlcnJpZGVfZW5hYmxlZDogb3ZlcnJpZGUgPyBvdmVycmlkZS5lbmFibGVkICE9PSBmYWxzZSA6IGZhbHNlLFxuICAgICAgICAgICAgb3ZlcnJpZGVfYmVuZWZpdF90eXBlOlxuICAgICAgICAgICAgICBvdmVycmlkZT8uYmVuZWZpdF90eXBlIHx8IGNvbmZpZy5iZW5lZml0X3R5cGUgfHwgXCJmaXhlZF9hbW91bnRcIixcbiAgICAgICAgICAgIG92ZXJyaWRlX2N1cnJlbmN5X2NvZGU6XG4gICAgICAgICAgICAgIG92ZXJyaWRlPy5jdXJyZW5jeV9jb2RlIHx8XG4gICAgICAgICAgICAgIGNvbmZpZy5jdXJyZW5jeV9jb2RlIHx8XG4gICAgICAgICAgICAgIGRlZmF1bHRDdXJyZW5jeUNvZGUsXG4gICAgICAgICAgICBvdmVycmlkZV9hbW91bnQ6XG4gICAgICAgICAgICAgIG92ZXJyaWRlPy5hbW91bnQgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcob3ZlcnJpZGUuYW1vdW50KSxcbiAgICAgICAgICAgIG92ZXJyaWRlX3BlcmNlbnRhZ2U6XG4gICAgICAgICAgICAgIG92ZXJyaWRlPy5wZXJjZW50YWdlID09IG51bGwgPyBcIlwiIDogU3RyaW5nKG92ZXJyaWRlLnBlcmNlbnRhZ2UpLFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfSxcbiAgICBjb3Vwb246IHtcbiAgICAgIC4uLmVtcHR5Q291cG9uLFxuICAgICAgZW5hYmxlZDogY29uZmlnLmVuYWJsZWQsXG4gICAgICBiZW5lZml0X3R5cGU6IGNvbmZpZy5iZW5lZml0X3R5cGUsXG4gICAgICBhbW91bnQ6IGNvbmZpZy5hbW91bnQgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcoY29uZmlnLmFtb3VudCksXG4gICAgICBwZXJjZW50YWdlOiBjb25maWcucGVyY2VudGFnZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhjb25maWcucGVyY2VudGFnZSksXG4gICAgICBjdXJyZW5jeV9jb2RlOiBjb25maWcuY3VycmVuY3lfY29kZSB8fCBkZWZhdWx0Q3VycmVuY3lDb2RlLFxuICAgICAgY29kZV9zdHJhdGVneTogY29uZmlnLmNvZGVfc3RyYXRlZ3ksXG4gICAgICBjb2RlX3ByZWZpeDogY29uZmlnLmNvZGVfcHJlZml4IHx8IFwiXCIsXG4gICAgICBzaGFyZWRfY29kZTogY29uZmlnLnNoYXJlZF9jb2RlIHx8IFwiXCIsXG4gICAgICBleHBpcmF0aW9uX3R5cGU6IGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSB8fCBcImR1cmF0aW9uXCIsXG4gICAgICBleHBpcmF0aW9uX2RheXM6IFN0cmluZyhkdXJhdGlvbkRheXMpLFxuICAgICAgZXhwaXJhdGlvbl9kYXRlOlxuICAgICAgICBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LnR5cGUgPT09IFwiZml4ZWRcIlxuICAgICAgICAgID8gdG9EYXRlVGltZUxvY2FsKGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeS5leHBpcmVzX2F0KVxuICAgICAgICAgIDogXCJcIixcbiAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOlxuICAgICAgICBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LmNhcF9ieV9jYW1wYWlnbiAhPT0gZmFsc2UsXG4gICAgICBleHBpcmF0aW9uX2NhcF9hdDogY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py5jYXBfYXRcbiAgICAgICAgPyB0b0RhdGVUaW1lTG9jYWwoY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmNhcF9hdClcbiAgICAgICAgOiBcIlwiLFxuICAgICAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBTdHJpbmcoXG4gICAgICAgIGNvbmZpZy5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW0gfHwgMSxcbiAgICAgICksXG4gICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IGNvbmZpZy5wcm9tb3Rpb25fbWlycm9yX21vZGUgfHwgXCJub25lXCIsXG4gICAgICBwcm9tb3Rpb25fc3RhdHVzOiBjb25maWcucHJvbW90aW9uX3N0YXR1cyB8fCBcImRyYWZ0XCIsXG4gICAgfSxcbiAgICBjYW1wYWlnbjoge1xuICAgICAgLi4uZW1wdHlDYW1wYWlnbixcbiAgICAgIG1vZGU6IGNvbmZpZy5jYW1wYWlnbl9pZCA/IFwiZXhpc3RpbmdcIiA6IFwibm9uZVwiLFxuICAgICAgY2FtcGFpZ25faWQ6IGNvbmZpZy5jYW1wYWlnbl9pZCB8fCBcIlwiLFxuICAgIH0sXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDb3Vwb25QYXlsb2FkKFxuICBjb3Vwb246IENvdXBvbkZvcm1TdGF0ZSxcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3I6IGJvb2xlYW4sXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiBjb3Vwb24uZW5hYmxlZCxcbiAgICBiZW5lZml0X3R5cGU6IGNvdXBvbi5iZW5lZml0X3R5cGUsXG4gICAgYW1vdW50OlxuICAgICAgY291cG9uLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICA/IG51bWJlck9yTnVsbChjb3Vwb24uYW1vdW50KVxuICAgICAgICA6IG51bGwsXG4gICAgcGVyY2VudGFnZTpcbiAgICAgIGNvdXBvbi5iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiXG4gICAgICAgID8gbnVtYmVyT3JOdWxsKGNvdXBvbi5wZXJjZW50YWdlKVxuICAgICAgICA6IG51bGwsXG4gICAgY3VycmVuY3lfY29kZTpcbiAgICAgIGNvdXBvbi5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgPyBjb3Vwb24uY3VycmVuY3lfY29kZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICA6IG51bGwsXG4gICAgY29kZV9zdHJhdGVneTogY291cG9uLmNvZGVfc3RyYXRlZ3ksXG4gICAgY29kZV9wcmVmaXg6XG4gICAgICBjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJ1bmlxdWVfY29kZVwiXG4gICAgICAgID8gY291cG9uLmNvZGVfcHJlZml4LnRyaW0oKSB8fCBcIkNPVVBPTlwiXG4gICAgICAgIDogbnVsbCxcbiAgICBzaGFyZWRfY29kZTpcbiAgICAgIGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCIgPyBjb3Vwb24uc2hhcmVkX2NvZGUudHJpbSgpIDogbnVsbCxcbiAgICBleHBpcmF0aW9uX3BvbGljeTpcbiAgICAgIGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZml4ZWRcIlxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIiBhcyBjb25zdCxcbiAgICAgICAgICAgIGV4cGlyZXNfYXQ6IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2RhdGUpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICBjYXBfYnlfY2FtcGFpZ246IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgIGNhcF9hdDogY291cG9uLmV4cGlyYXRpb25fY2FwX2F0XG4gICAgICAgICAgICAgID8gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdHlwZTogXCJkdXJhdGlvblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZHVyYXRpb25fZGF5czogTnVtYmVyKGNvdXBvbi5leHBpcmF0aW9uX2RheXMpIHx8IDMwLFxuICAgICAgICAgICAgY2FwX2J5X2NhbXBhaWduOiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ24sXG4gICAgICAgICAgICBjYXBfYXQ6IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdFxuICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06XG4gICAgICBOdW1iZXIoY291cG9uLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSkgfHwgMSxcbiAgICAuLi4oYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgICAgID8ge1xuICAgICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogY291cG9uLnByb21vdGlvbl9taXJyb3JfbW9kZSxcbiAgICAgICAgICBwcm9tb3Rpb25fc3RhdHVzOiBjb3Vwb24ucHJvbW90aW9uX3N0YXR1cyxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDYW1wYWlnblBheWxvYWQoXG4gIGNhbXBhaWduOiBDYW1wYWlnbkZvcm1TdGF0ZSxcbiAgYWxsb3dDYW1wYWlnbjogYm9vbGVhbixcbikge1xuICBpZiAoIWFsbG93Q2FtcGFpZ24pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbiAgaWYgKGNhbXBhaWduLm1vZGUgPT09IFwiZXhpc3RpbmdcIikge1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlOiBcImV4aXN0aW5nXCIsXG4gICAgICBjYW1wYWlnbl9pZDogY2FtcGFpZ24uY2FtcGFpZ25faWQgfHwgbnVsbCxcbiAgICB9XG4gIH1cbiAgaWYgKGNhbXBhaWduLm1vZGUgPT09IFwibmV3XCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kZTogXCJuZXdcIixcbiAgICAgIGNhbXBhaWduOiB7XG4gICAgICAgIG5hbWU6IGNhbXBhaWduLm5hbWUsXG4gICAgICAgIGNhbXBhaWduX2lkZW50aWZpZXI6IGNhbXBhaWduLmNhbXBhaWduX2lkZW50aWZpZXIsXG4gICAgICAgIHN0YXJ0c19hdDogY2FtcGFpZ24uc3RhcnRzX2F0XG4gICAgICAgICAgPyBuZXcgRGF0ZShjYW1wYWlnbi5zdGFydHNfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGVuZHNfYXQ6IGNhbXBhaWduLmVuZHNfYXRcbiAgICAgICAgICA/IG5ldyBEYXRlKGNhbXBhaWduLmVuZHNfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG51bGwsXG4gICAgICB9LFxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtb2RlOiBcIm5vbmVcIiB9XG59XG5cbmZ1bmN0aW9uIHN0ZXBTdGF0dXMoc3RlcDogV2l6YXJkU3RlcCwgYWN0aXZlOiBXaXphcmRTdGVwKSB7XG4gIGNvbnN0IHN0ZXBJbmRleCA9IHN0ZXBzLmluZGV4T2Yoc3RlcClcbiAgY29uc3QgYWN0aXZlSW5kZXggPSBzdGVwcy5pbmRleE9mKGFjdGl2ZSlcbiAgaWYgKHN0ZXBJbmRleCA8IGFjdGl2ZUluZGV4KSByZXR1cm4gXCJjb21wbGV0ZWRcIlxuICBpZiAoc3RlcEluZGV4ID09PSBhY3RpdmVJbmRleCkgcmV0dXJuIFwiaW4tcHJvZ3Jlc3NcIlxuICByZXR1cm4gXCJub3Qtc3RhcnRlZFwiXG59XG5cbmZ1bmN0aW9uIEZpZWxkKHsgbGFiZWwsIGNoaWxkcmVuIH06IHsgbGFiZWw6IHN0cmluZzsgY2hpbGRyZW46IFJlYWN0Tm9kZSB9KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTFcIiBzdHlsZT17eyBtaW5XaWR0aDogMCB9fT5cbiAgICAgIDxMYWJlbD57bGFiZWx9PC9MYWJlbD5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBjdXJyZW5jeURlY2ltYWxEaWdpdHMoY29kZTogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChcImVuXCIsIHtcbiAgICAgIHN0eWxlOiBcImN1cnJlbmN5XCIsXG4gICAgICBjdXJyZW5jeTogY29kZS50b1VwcGVyQ2FzZSgpLFxuICAgIH0pLnJlc29sdmVkT3B0aW9ucygpLm1heGltdW1GcmFjdGlvbkRpZ2l0c1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gMlxuICB9XG59XG5cbmZ1bmN0aW9uIGN1cnJlbmN5U3ltYm9sKGNvZGU6IHN0cmluZykge1xuICBpZiAoIWNvZGUpIHJldHVybiBcIlwiXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgbmV3IEludGwuTnVtYmVyRm9ybWF0KFwiZW5cIiwge1xuICAgICAgICBzdHlsZTogXCJjdXJyZW5jeVwiLFxuICAgICAgICBjdXJyZW5jeTogY29kZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICBjdXJyZW5jeURpc3BsYXk6IFwibmFycm93U3ltYm9sXCIsXG4gICAgICB9KVxuICAgICAgICAuZm9ybWF0VG9QYXJ0cygwKVxuICAgICAgICAuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSBcImN1cnJlbmN5XCIpPy52YWx1ZSB8fCBjb2RlLnRvVXBwZXJDYXNlKClcbiAgICApXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjb2RlLnRvVXBwZXJDYXNlKClcbiAgfVxufVxuXG5mdW5jdGlvbiBDdXJyZW5jeVNlbGVjdCh7XG4gIGN1cnJlbmNpZXMsXG4gIGRpc2FibGVkLFxuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5T3B0aW9uW11cbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFxuICAgICAgdmFsdWU9e3ZhbHVlIHx8IHVuZGVmaW5lZH1cbiAgICAgIGRpc2FibGVkPXtkaXNhYmxlZCB8fCAhY3VycmVuY2llcy5sZW5ndGh9XG4gICAgICBvblZhbHVlQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICA+XG4gICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgIDxTZWxlY3QuVmFsdWVcbiAgICAgICAgICBwbGFjZWhvbGRlcj17XG4gICAgICAgICAgICBjdXJyZW5jaWVzLmxlbmd0aCA/IFwiU2VsZWN0IGN1cnJlbmN5XCIgOiBcIk5vIGN1cnJlbmNpZXMgYXZhaWxhYmxlXCJcbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICB7Y3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiAoXG4gICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17Y3VycmVuY3kuY29kZX0gdmFsdWU9e2N1cnJlbmN5LmNvZGV9PlxuICAgICAgICAgICAge2N1cnJlbmN5Lm5hbWV9ICh7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfSlcbiAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICApKX1cbiAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgPC9TZWxlY3Q+XG4gIClcbn1cblxuZnVuY3Rpb24gQ3VycmVuY3lBbW91bnRJbnB1dCh7XG4gIGN1cnJlbmNpZXMsXG4gIGN1cnJlbmN5Q29kZSxcbiAgZGlzYWJsZWQsXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXVxuICBjdXJyZW5jeUNvZGU6IHN0cmluZ1xuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgY29uc3QgY3VycmVuY3kgPSBjdXJyZW5jaWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0gY3VycmVuY3lDb2RlKVxuICBjb25zdCBjb2RlID0gY3VycmVuY3lDb2RlLnRvVXBwZXJDYXNlKClcbiAgY29uc3QgZGVjaW1hbHMgPSBjdXJyZW5jeURlY2ltYWxEaWdpdHMoY29kZSB8fCBcIlVTRFwiKVxuXG4gIHJldHVybiAoXG4gICAgPEN1cnJlbmN5SW5wdXRcbiAgICAgIGNvZGU9e2NvZGUgfHwgXCJVU0RcIn1cbiAgICAgIHN5bWJvbD17XG4gICAgICAgIGN1cnJlbmN5Py5zeW1ib2xfbmF0aXZlIHx8XG4gICAgICAgIGN1cnJlbmN5Py5zeW1ib2wgfHxcbiAgICAgICAgY3VycmVuY3lTeW1ib2woY29kZSB8fCBcIlVTRFwiKVxuICAgICAgfVxuICAgICAgbWluPXswfVxuICAgICAgZGVjaW1hbFNjYWxlPXtkZWNpbWFsc31cbiAgICAgIGRlY2ltYWxzTGltaXQ9e2RlY2ltYWxzfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8ICFjdXJyZW5jeUNvZGV9XG4gICAgICBvblZhbHVlQ2hhbmdlPXsobmV4dFZhbHVlKSA9PiBvbkNoYW5nZShuZXh0VmFsdWUgfHwgXCJcIil9XG4gICAgLz5cbiAgKVxufVxuXG5jb25zdCBlbnRpdGxlbWVudEZpbHRlcnMgPSBbXG4gIHsgbGFiZWw6IFwiQWxsXCIsIHZhbHVlOiBcImFsbFwiIH0sXG4gIHsgbGFiZWw6IFwiSXNzdWVkXCIsIHZhbHVlOiBcImlzc3VlZFwiIH0sXG4gIHsgbGFiZWw6IFwiUmVkZWVtZWRcIiwgdmFsdWU6IFwicmVkZWVtZWRcIiB9LFxuICB7IGxhYmVsOiBcIkV4cGlyZWRcIiwgdmFsdWU6IFwiZXhwaXJlZFwiIH0sXG4gIHsgbGFiZWw6IFwiQ2FuY2VsZWRcIiwgdmFsdWU6IFwiY2FuY2VsZWRcIiB9LFxuXSBhcyBjb25zdFxuXG50eXBlIEVudGl0bGVtZW50RmlsdGVyID0gKHR5cGVvZiBlbnRpdGxlbWVudEZpbHRlcnMpW251bWJlcl1bXCJ2YWx1ZVwiXVxuXG5mdW5jdGlvbiBTbmFwc2hvdEJsb2NrKHsgdGl0bGUsIHZhbHVlIH06IHsgdGl0bGU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfSkge1xuICByZXR1cm4gKFxuICAgIDxkZXRhaWxzIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIHAtM1wiPlxuICAgICAgPHN1bW1hcnkgY2xhc3NOYW1lPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC11aS1mZy1iYXNlIHR4dC1zbWFsbC1wbHVzXCI+XG4gICAgICAgIHt0aXRsZX1cbiAgICAgIDwvc3VtbWFyeT5cbiAgICAgIDxwcmVcbiAgICAgICAgY2xhc3NOYW1lPVwibXQtMyByb3VuZGVkLW1kIGJnLXVpLWJnLXN1YnRsZSBwLTMgdGV4dC11aS1mZy1zdWJ0bGUgdHh0LWNvbXBhY3QteHNtYWxsXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBtYXhIZWlnaHQ6IDIyMCxcbiAgICAgICAgICBvdmVyZmxvdzogXCJhdXRvXCIsXG4gICAgICAgICAgd2hpdGVTcGFjZTogXCJwcmUtd3JhcFwiLFxuICAgICAgICAgIHdvcmRCcmVhazogXCJicmVhay13b3JkXCIsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHtqc29uQmxvY2sodmFsdWUpfVxuICAgICAgPC9wcmU+XG4gICAgPC9kZXRhaWxzPlxuICApXG59XG5cbmZ1bmN0aW9uIFR3b0NvbHVtbkxheW91dCh7XG4gIGZpcnN0Q29sLFxuICBzZWNvbmRDb2wsXG59OiB7XG4gIGZpcnN0Q29sOiBSZWFjdE5vZGVcbiAgc2Vjb25kQ29sOiBSZWFjdE5vZGVcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXgtNCBnYXAteS0zIHhsOmZsZXgtcm93IHhsOml0ZW1zLXN0YXJ0XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGZsZXgtY29sIGdhcC15LTNcIj57Zmlyc3RDb2x9PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIG1heC13LVsxMDAlXSBmbGV4LWNvbCBnYXAteS0zIHhsOm10LTAgeGw6bWF4LXctWzQ0MHB4XVwiPlxuICAgICAgICB7c2Vjb25kQ29sfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VjdGlvblJvdyh7XG4gIHRpdGxlLFxuICB2YWx1ZSxcbn06IHtcbiAgdGl0bGU6IHN0cmluZ1xuICB2YWx1ZTogUmVhY3ROb2RlXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLXN1YnRsZSBncmlkIGdyaWQtY29scy0yIGl0ZW1zLWNlbnRlciBnYXAteC00IHB4LTYgcHktNFwiPlxuICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgd2VpZ2h0PVwicGx1c1wiIGxlYWRpbmc9XCJjb21wYWN0XCI+XG4gICAgICAgIHt0aXRsZX1cbiAgICAgIDwvVGV4dD5cbiAgICAgIHt0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgPT0gbnVsbCA/IChcbiAgICAgICAgPFRleHRcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIGxlYWRpbmc9XCJjb21wYWN0XCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXByZXR0eSB3aGl0ZXNwYWNlLXByZS1saW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt2YWx1ZSB8fCBcIi1cIn1cbiAgICAgICAgPC9UZXh0PlxuICAgICAgKSA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+e3ZhbHVlfTwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBXaWRnZXRIZWFkZXIoeyB0aXRsZSB9OiB7IHRpdGxlOiBzdHJpbmcgfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTYgcHktNFwiPlxuICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMlwiPnt0aXRsZX08L0hlYWRpbmc+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gU2lkZWJhckxpbmsoe1xuICBocmVmLFxuICBsYWJlbCxcbiAgZGVzY3JpcHRpb24sXG4gIGljb24sXG59OiB7XG4gIGhyZWY6IHN0cmluZ1xuICBsYWJlbDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgaWNvbj86IFJlYWN0Tm9kZVxufSkge1xuICByZXR1cm4gKFxuICAgIDxhIGhyZWY9e2hyZWZ9IGNsYXNzTmFtZT1cImdyb3VwIG91dGxpbmUtbm9uZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIHB4LTIgcGItMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNoYWRvdy1lbGV2YXRpb24tY2FyZC1yZXN0IGJnLXVpLWJnLWNvbXBvbmVudCB0cmFuc2l0aW9uLWZnIGhvdmVyOmJnLXVpLWJnLWNvbXBvbmVudC1ob3ZlciBhY3RpdmU6YmctdWktYmctY29tcG9uZW50LXByZXNzZWQgZ3JvdXAtZm9jdXMtdmlzaWJsZTpzaGFkb3ctYm9yZGVycy1pbnRlcmFjdGl2ZS13aXRoLWFjdGl2ZSByb3VuZGVkLW1kIHB4LTQgcHktMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgIHtpY29uICYmIDxkaXY+e2ljb259PC9kaXY+fVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBsZWFkaW5nPVwiY29tcGFjdFwiIHdlaWdodD1cInBsdXNcIj5cbiAgICAgICAgICAgICAgICB7bGFiZWx9XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgPFRleHRcbiAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgIGxlYWRpbmc9XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLXN1YnRsZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8VHJpYW5nbGVSaWdodE1pbmkgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2E+XG4gIClcbn1cblxuZnVuY3Rpb24gU3VtbWFyeVdpZGdldCh7XG4gIGxhYmVsLFxuICB2YWx1ZSxcbiAgdG9uZSA9IFwiZ3JlZW5cIixcbn06IHtcbiAgbGFiZWw6IHN0cmluZ1xuICB2YWx1ZTogc3RyaW5nXG4gIHRvbmU/OiBcImdyZWVuXCIgfCBcIm5ldXRyYWxcIlxufSkge1xuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwicHgtNiBweS00XCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdWktZmctc3VidGxlIGZsZXggaXRlbXMtY2VudGVyIGdhcC14LTNcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17YGgtOCB3LTEgcm91bmRlZC1mdWxsICR7XG4gICAgICAgICAgICB0b25lID09PSBcImdyZWVuXCJcbiAgICAgICAgICAgICAgPyBcImJnLXVpLXRhZy1ncmVlbi1pY29uXCJcbiAgICAgICAgICAgICAgOiBcImJnLXVpLXRhZy1uZXV0cmFsLWljb25cIlxuICAgICAgICAgIH1gfVxuICAgICAgICAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTBcIj5cbiAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCIgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1zdWJ0bGVcIj5cbiAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgPFRleHRcbiAgICAgICAgICAgIHdlaWdodD1cInBsdXNcIlxuICAgICAgICAgICAgc2l6ZT1cInhsYXJnZVwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0YWJ1bGFyLW51bXMgdGV4dC11aS1mZy1iYXNlIGJyZWFrLXdvcmRzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dmFsdWV9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvQ29udGFpbmVyPlxuICApXG59XG5cbmZ1bmN0aW9uIENvdXBvbkdlbmVyYWxTZWN0aW9uKHsgZGV0YWlsIH06IHsgZGV0YWlsOiBDb3Vwb25FbnRpdGxlbWVudERldGFpbCB9KSB7XG4gIGNvbnN0IGVudGl0bGVtZW50ID0gZGV0YWlsLmN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudFxuICBjb25zdCBpc3N1YW5jZSA9IGRldGFpbC5jb3Vwb25faXNzdWFuY2UgfHwgbnVsbFxuICBjb25zdCBiZW5lZml0U25hcHNob3QgPSBlbnRpdGxlbWVudC5iZW5lZml0X3NuYXBzaG90IHx8IG51bGxcbiAgY29uc3Qgc291cmNlU25hcHNob3QgPSBlbnRpdGxlbWVudC5zb3VyY2Vfc25hcHNob3QgfHwgbnVsbFxuICBjb25zdCBjb2RlID0gY291cG9uQ29kZShlbnRpdGxlbWVudClcbiAgY29uc3QgZXh0ZXJuYWwgPSBlbnRpdGxlbWVudC5vcmlnaW4gPT09IFwiZXh0ZXJuYWxcIlxuICBjb25zdCBwcm9kdWN0TGFiZWwgPVxuICAgIHNuYXBzaG90U3RyaW5nKHNvdXJjZVNuYXBzaG90LCBcInRpdGxlXCIpIHx8XG4gICAgc25hcHNob3RTdHJpbmcoc291cmNlU25hcHNob3QsIFwic291cmNlXCIpIHx8XG4gICAgZW50aXRsZW1lbnQucHJvZHVjdF9pZCB8fFxuICAgIFwiRXh0ZXJuYWxcIlxuICBjb25zdCB2YXJpYW50TGFiZWwgPVxuICAgIHNuYXBzaG90U3RyaW5nKHNvdXJjZVNuYXBzaG90LCBcInZhcmlhbnRfaWRcIikgfHwgZW50aXRsZW1lbnQudmFyaWFudF9pZCB8fCBcIi1cIlxuICBjb25zdCBpc3N1ZWREYXRlID0gZW50aXRsZW1lbnQuY3JlYXRlZF9hdCB8fCBpc3N1YW5jZT8uY3JlYXRlZF9hdCB8fCBudWxsXG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMVwiPlxuICAgICAgICAgICAgPEhlYWRpbmcgY2xhc3NOYW1lPVwiYnJlYWstYWxsXCI+I3tjb2RlfTwvSGVhZGluZz5cbiAgICAgICAgICAgIHtjb2RlICE9PSBcIi1cIiAmJiAoXG4gICAgICAgICAgICAgIDxDb3B5IGNvbnRlbnQ9e2NvZGV9IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIiAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLXN1YnRsZVwiPlxuICAgICAgICAgICAge2Zvcm1hdEZ1bGxEYXRlKGlzc3VlZERhdGUpfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxTdGF0dXNCYWRnZSBjb2xvcj17ZW50aXRsZW1lbnRTdGF0dXNDb2xvcihlbnRpdGxlbWVudC5zdGF0dXMpfT5cbiAgICAgICAgICB7ZW50aXRsZW1lbnQuc3RhdHVzfVxuICAgICAgICA8L1N0YXR1c0JhZGdlPlxuICAgICAgPC9kaXY+XG4gICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIkRhdGUgaXNzdWVkXCIgdmFsdWU9e2Zvcm1hdFJlbGF0aXZlRGF0ZShpc3N1ZWREYXRlKX0gLz5cbiAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgIHRpdGxlPVwiQ3VzdG9tZXJcIlxuICAgICAgICB2YWx1ZT17ZW50aXRsZW1lbnQuZW1haWwgfHwgZW50aXRsZW1lbnQuY3VzdG9tZXJfaWQgfHwgXCItXCJ9XG4gICAgICAvPlxuICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJPcmlnaW5cIiB2YWx1ZT17ZW50aXRsZW1lbnRTb3VyY2UoZW50aXRsZW1lbnQpfSAvPlxuICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgdGl0bGU9e2V4dGVybmFsID8gXCJTb3VyY2VcIiA6IFwiQ291cG9uIHByb2R1Y3RcIn1cbiAgICAgICAgdmFsdWU9e3Byb2R1Y3RMYWJlbH1cbiAgICAgIC8+XG4gICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIlNlbGxlciBzY29wZVwiIHZhbHVlPXtlbnRpdGxlbWVudFNlbGxlclNjb3BlKGVudGl0bGVtZW50KX0gLz5cbiAgICAgIHshZXh0ZXJuYWwgJiYgPFNlY3Rpb25Sb3cgdGl0bGU9XCJWYXJpYW50XCIgdmFsdWU9e3ZhcmlhbnRMYWJlbH0gLz59XG4gICAgICB7IWV4dGVybmFsICYmIChcbiAgICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgICB0aXRsZT1cIlF1YW50aXR5XCJcbiAgICAgICAgICB2YWx1ZT17U3RyaW5nKFxuICAgICAgICAgICAgc25hcHNob3ROdW1iZXIoc291cmNlU25hcHNob3QsIFwicXVhbnRpdHlcIikgPz8gaXNzdWFuY2U/LnF1YW50aXR5ID8/IDEsXG4gICAgICAgICAgKX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICA8U2VjdGlvblJvd1xuICAgICAgICB0aXRsZT1cIkJlbmVmaXRcIlxuICAgICAgICB2YWx1ZT17YmVuZWZpdFNuYXBzaG90TGFiZWwoYmVuZWZpdFNuYXBzaG90KX1cbiAgICAgIC8+XG4gICAgICA8U2VjdGlvblJvd1xuICAgICAgICB0aXRsZT1cIkV4cGlyYXRpb24gcG9saWN5XCJcbiAgICAgICAgdmFsdWU9e2V4cGlyYXRpb25Qb2xpY3lMYWJlbChiZW5lZml0U25hcHNob3QpfVxuICAgICAgLz5cbiAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiRXhwaXJhdGlvbiBEYXRlXCIgdmFsdWU9e2Zvcm1hdERhdGUoZW50aXRsZW1lbnQuZXhwaXJlc19hdCl9IC8+XG4gICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIlJlZGVlbWVkIERhdGVcIiB2YWx1ZT17Zm9ybWF0RGF0ZShlbnRpdGxlbWVudC5yZWRlZW1lZF9hdCl9IC8+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gUmVsYXRlZE9yZGVyU2VjdGlvbih7XG4gIGFwaUJhc2UsXG4gIGRldGFpbCxcbn06IHtcbiAgYXBpQmFzZTogQXBpQmFzZVxuICBkZXRhaWw6IENvdXBvbkVudGl0bGVtZW50RGV0YWlsXG59KSB7XG4gIGNvbnN0IGVudGl0bGVtZW50ID0gZGV0YWlsLmN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudFxuICBjb25zdCBvcmRlciA9IGRldGFpbC5vcmRlciB8fCBudWxsXG4gIGNvbnN0IG9yZGVySWQgPSBvcmRlcj8uaWQgfHwgZW50aXRsZW1lbnQub3JkZXJfaWRcbiAgaWYgKCFvcmRlcklkKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJwLTBcIj5cbiAgICAgIDxXaWRnZXRIZWFkZXIgdGl0bGU9XCJSZWxhdGVkIE9yZGVyXCIgLz5cbiAgICAgIDxTaWRlYmFyTGlua1xuICAgICAgICBocmVmPXtvcmRlckRldGFpbFBhdGgoYXBpQmFzZSwgb3JkZXJJZCl9XG4gICAgICAgIGxhYmVsPXtvcmRlciA/IG9yZGVyRGlzcGxheUlkKG9yZGVyKSA6IG9yZGVySWR9XG4gICAgICAgIGRlc2NyaXB0aW9uPXtcbiAgICAgICAgICBvcmRlcj8uY3JlYXRlZF9hdFxuICAgICAgICAgICAgPyBgT3JkZXIgcGxhY2VkICR7Zm9ybWF0UmVsYXRpdmVEYXRlKG9yZGVyLmNyZWF0ZWRfYXQpfWBcbiAgICAgICAgICAgIDogXCJQdXJjaGFzZWQgY291cG9uIG9yZGVyXCJcbiAgICAgICAgfVxuICAgICAgICBpY29uPXs8U2hvcHBpbmdDYXJ0IC8+fVxuICAgICAgLz5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBDb3Vwb25TbmFwc2hvdHNTZWN0aW9uKHtcbiAgZGV0YWlsLFxufToge1xuICBkZXRhaWw6IENvdXBvbkVudGl0bGVtZW50RGV0YWlsXG59KSB7XG4gIGNvbnN0IGVudGl0bGVtZW50ID0gZGV0YWlsLmN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudFxuICBjb25zdCBpc3N1YW5jZSA9IGRldGFpbC5jb3Vwb25faXNzdWFuY2UgfHwgbnVsbFxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJwLTBcIj5cbiAgICAgIDxXaWRnZXRIZWFkZXIgdGl0bGU9XCJKU09OXCIgLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0zIHB4LTYgcGItNlwiPlxuICAgICAgICA8U25hcHNob3RCbG9ja1xuICAgICAgICAgIHRpdGxlPVwiQmVuZWZpdCBzbmFwc2hvdFwiXG4gICAgICAgICAgdmFsdWU9e2VudGl0bGVtZW50LmJlbmVmaXRfc25hcHNob3R9XG4gICAgICAgIC8+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrXG4gICAgICAgICAgdGl0bGU9XCJTb3VyY2Ugc25hcHNob3RcIlxuICAgICAgICAgIHZhbHVlPXtlbnRpdGxlbWVudC5zb3VyY2Vfc25hcHNob3R9XG4gICAgICAgIC8+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrXG4gICAgICAgICAgdGl0bGU9XCJJc3N1YW5jZSBjb25maWcgc25hcHNob3RcIlxuICAgICAgICAgIHZhbHVlPXtpc3N1YW5jZT8uY29uZmlnX3NuYXBzaG90fVxuICAgICAgICAvPlxuICAgICAgICA8U25hcHNob3RCbG9jayB0aXRsZT1cIlNlbGxlciB0YXJnZXRzXCIgdmFsdWU9e2VudGl0bGVtZW50LnNlbGxlcl90YXJnZXRzfSAvPlxuICAgICAgICA8U25hcHNob3RCbG9jayB0aXRsZT1cIk1ldGFkYXRhXCIgdmFsdWU9e2VudGl0bGVtZW50Lm1ldGFkYXRhfSAvPlxuICAgICAgPC9kaXY+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gQ291cG9uU3VtbWFyeVNlY3Rpb25zKHtcbiAgZGV0YWlsLFxufToge1xuICBkZXRhaWw6IENvdXBvbkVudGl0bGVtZW50RGV0YWlsXG59KSB7XG4gIGNvbnN0IGVudGl0bGVtZW50ID0gZGV0YWlsLmN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudFxuICBjb25zdCBpc3N1YW5jZSA9IGRldGFpbC5jb3Vwb25faXNzdWFuY2UgfHwgbnVsbFxuICBjb25zdCBiZW5lZml0U25hcHNob3QgPSBlbnRpdGxlbWVudC5iZW5lZml0X3NuYXBzaG90IHx8IG51bGxcbiAgY29uc3Qgc291cmNlU25hcHNob3QgPSBlbnRpdGxlbWVudC5zb3VyY2Vfc25hcHNob3QgfHwgbnVsbFxuICBjb25zdCBvcmRlciA9IGRldGFpbC5vcmRlciB8fCBudWxsXG4gIGNvbnN0IGxpbmVUb3RhbCA9IHNuYXBzaG90TnVtYmVyKHNvdXJjZVNuYXBzaG90LCBcInRvdGFsXCIpXG4gIGNvbnN0IGV4dGVybmFsID0gZW50aXRsZW1lbnQub3JpZ2luID09PSBcImV4dGVybmFsXCJcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8U3VtbWFyeVdpZGdldFxuICAgICAgICBsYWJlbD1cIkJlbmVmaXRcIlxuICAgICAgICB2YWx1ZT17YmVuZWZpdFNuYXBzaG90TGFiZWwoYmVuZWZpdFNuYXBzaG90KX1cbiAgICAgIC8+XG4gICAgICB7IWV4dGVybmFsICYmIChcbiAgICAgICAgPFN1bW1hcnlXaWRnZXRcbiAgICAgICAgICBsYWJlbD1cIkxpbmUgVG90YWxcIlxuICAgICAgICAgIHZhbHVlPXtmb3JtYXRTbmFwc2hvdEFtb3VudChsaW5lVG90YWwsIG9yZGVyPy5jdXJyZW5jeV9jb2RlKX1cbiAgICAgICAgICB0b25lPVwibmV1dHJhbFwiXG4gICAgICAgIC8+XG4gICAgICApfVxuICAgICAgeyFleHRlcm5hbCAmJiAoXG4gICAgICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwiZGl2aWRlLXkgcC0wXCI+XG4gICAgICAgICAgPFdpZGdldEhlYWRlciB0aXRsZT1cIkNhbXBhaWduXCIgLz5cbiAgICAgICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIkNhbXBhaWduXCIgdmFsdWU9e2NhbXBhaWduU25hcHNob3RMYWJlbChiZW5lZml0U25hcHNob3QpfSAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiUHJvbW90aW9uXCIgdmFsdWU9e3Byb21vdGlvblNuYXBzaG90TGFiZWwoYmVuZWZpdFNuYXBzaG90KX0gLz5cbiAgICAgICAgICA8U2VjdGlvblJvd1xuICAgICAgICAgICAgdGl0bGU9XCJQcm9tb3Rpb24gc3RhdHVzXCJcbiAgICAgICAgICAgIHZhbHVlPXtzbmFwc2hvdFN0cmluZyhiZW5lZml0U25hcHNob3QsIFwicHJvbW90aW9uX3N0YXR1c1wiKSB8fCBcIi1cIn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0NvbnRhaW5lcj5cbiAgICAgICl9XG4gICAgICB7IWV4dGVybmFsICYmIChcbiAgICAgICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgICAgICA8V2lkZ2V0SGVhZGVyIHRpdGxlPVwiSXNzdWFuY2VcIiAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiU3RhdHVzXCIgdmFsdWU9e2lzc3VhbmNlPy5zdGF0dXMgfHwgXCItXCJ9IC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgICAgIHRpdGxlPVwiSXNzdWVkIC8gZmFpbGVkXCJcbiAgICAgICAgICAgIHZhbHVlPXtcbiAgICAgICAgICAgICAgaXNzdWFuY2VcbiAgICAgICAgICAgICAgICA/IGAke2lzc3VhbmNlLmlzc3VlZF9jb3VudCA/PyAwfSAvICR7aXNzdWFuY2UuZmFpbGVkX2NvdW50ID8/IDB9YFxuICAgICAgICAgICAgICAgIDogXCItXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiQ29uZmlnXCIgdmFsdWU9e2VudGl0bGVtZW50LmNvbmZpZ19pZCB8fCBcIi1cIn0gLz5cbiAgICAgICAgICA8U2VjdGlvblJvd1xuICAgICAgICAgICAgdGl0bGU9XCJWYXJpYW50IGNvbmZpZ1wiXG4gICAgICAgICAgICB2YWx1ZT17ZW50aXRsZW1lbnQudmFyaWFudF9jb25maWdfaWQgfHwgXCItXCJ9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Db250YWluZXI+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb3Vwb25EZXRhaWxQYWdlVmlldyh7IGFwaUJhc2UgfTogeyBhcGlCYXNlOiBBcGlCYXNlIH0pIHtcbiAgY29uc3QgaWQgPSBjdXJyZW50Q291cG9uRGV0YWlsSWQoYXBpQmFzZSlcbiAgY29uc3QgW2RldGFpbCwgc2V0RGV0YWlsXSA9IHVzZVN0YXRlPENvdXBvbkVudGl0bGVtZW50RGV0YWlsIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgYWN0aXZlID0gdHJ1ZVxuICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWQoKSB7XG4gICAgICBpZiAoIWlkKSB7XG4gICAgICAgIHNldExvYWRFcnJvcihcIk1pc3NpbmcgY291cG9uIGlkXCIpXG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICBzZXRMb2FkRXJyb3IobnVsbClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGFwaUZldGNoPENvdXBvbkVudGl0bGVtZW50RGV0YWlsPihcbiAgICAgICAgICBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHMvZW50aXRsZW1lbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLFxuICAgICAgICApXG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICBzZXREZXRhaWwocGF5bG9hZClcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICA6IFwiRmFpbGVkIHRvIGxvYWQgY291cG9uIGRldGFpbHNcIlxuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgc2V0TG9hZEVycm9yKG1lc3NhZ2UpXG4gICAgICAgICAgdG9hc3QuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2b2lkIGxvYWQoKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlXG4gICAgfVxuICB9LCBbYXBpQmFzZSwgaWRdKVxuXG4gIGlmIChsb2FkaW5nKSB7XG4gICAgcmV0dXJuIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPVwiTG9hZGluZyBjb3Vwb25cIiAvPlxuICB9XG5cbiAgaWYgKGxvYWRFcnJvcikge1xuICAgIHJldHVybiA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT17bG9hZEVycm9yfSAvPlxuICB9XG5cbiAgaWYgKCFkZXRhaWwpIHtcbiAgICByZXR1cm4gPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9XCJDb3Vwb24gbm90IGZvdW5kXCIgLz5cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFR3b0NvbHVtbkxheW91dFxuICAgICAgZmlyc3RDb2w9e1xuICAgICAgICA8PlxuICAgICAgICAgIDxDb3Vwb25HZW5lcmFsU2VjdGlvbiBkZXRhaWw9e2RldGFpbH0gLz5cbiAgICAgICAgICA8UmVsYXRlZE9yZGVyU2VjdGlvbiBhcGlCYXNlPXthcGlCYXNlfSBkZXRhaWw9e2RldGFpbH0gLz5cbiAgICAgICAgICA8Q291cG9uU25hcHNob3RzU2VjdGlvbiBkZXRhaWw9e2RldGFpbH0gLz5cbiAgICAgICAgPC8+XG4gICAgICB9XG4gICAgICBzZWNvbmRDb2w9ezxDb3Vwb25TdW1tYXJ5U2VjdGlvbnMgZGV0YWlsPXtkZXRhaWx9IC8+fVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRW50aXRsZW1lbnRzVGFibGUoe1xuICBlbnRpdGxlbWVudHMsXG4gIGxvYWRpbmcsXG4gIGVycm9yLFxuICBvbk9wZW4sXG59OiB7XG4gIGVudGl0bGVtZW50czogQ291cG9uRW50aXRsZW1lbnRbXVxuICBsb2FkaW5nOiBib29sZWFuXG4gIGVycm9yOiBzdHJpbmcgfCBudWxsXG4gIG9uT3BlbjogKGVudGl0bGVtZW50OiBDb3Vwb25FbnRpdGxlbWVudCkgPT4gdm9pZFxufSkge1xuICBpZiAobG9hZGluZykge1xuICAgIHJldHVybiA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT1cIkxvYWRpbmcgY291cG9uc1wiIC8+XG4gIH1cbiAgaWYgKGVycm9yKSB7XG4gICAgcmV0dXJuIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPXtlcnJvcn0gLz5cbiAgfVxuICBpZiAoIWVudGl0bGVtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPENvdXBvbkVtcHR5U3RhdGVcbiAgICAgICAgdGl0bGU9XCJObyBjb3Vwb25zIGZvdW5kXCJcbiAgICAgICAgZGVzY3JpcHRpb249XCJQdXJjaGFzZWQgY291cG9ucyB3aWxsIGFwcGVhciBoZXJlIGFmdGVyIHRoZXkgYXJlIGlzc3VlZC5cIlxuICAgICAgLz5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxUYWJsZT5cbiAgICAgIDxUYWJsZS5IZWFkZXI+XG4gICAgICAgIDxUYWJsZS5Sb3c+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+U3RhdHVzPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkNvZGU8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+RGF0ZSBpc3N1ZWQ8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+T3JkZXI8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q3VzdG9tZXI8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+T3JpZ2luPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlNlbGxlciBzY29wZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Tb3VyY2U8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+RXhwaXJlczwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICA8L1RhYmxlLkhlYWRlcj5cbiAgICAgIDxUYWJsZS5Cb2R5PlxuICAgICAgICB7ZW50aXRsZW1lbnRzLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgIDxUYWJsZS5Sb3dcbiAgICAgICAgICAgIGtleT17aXRlbS5pZH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImN1cnNvci1wb2ludGVyIGhvdmVyOmJnLXVpLWJnLXN1YnRsZVwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbk9wZW4oaXRlbSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgIDxTdGF0dXNCYWRnZSBjb2xvcj17ZW50aXRsZW1lbnRTdGF0dXNDb2xvcihpdGVtLnN0YXR1cyl9PlxuICAgICAgICAgICAgICAgIHtpdGVtLnN0YXR1c31cbiAgICAgICAgICAgICAgPC9TdGF0dXNCYWRnZT5cbiAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntpdGVtLmNvZGUgfHwgaXRlbS5zaGFyZWRfY29kZSB8fCBcIi1cIn08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbCB0aXRsZT17Zm9ybWF0RnVsbERhdGUoaXRlbS5jcmVhdGVkX2F0KX0+XG4gICAgICAgICAgICAgIHtmb3JtYXRSZWxhdGl2ZURhdGUoaXRlbS5jcmVhdGVkX2F0KX1cbiAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntpdGVtLm9yZGVyX2lkIHx8IFwiLVwifTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntpdGVtLmVtYWlsIHx8IGl0ZW0uY3VzdG9tZXJfaWQgfHwgXCItXCJ9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2VudGl0bGVtZW50U291cmNlKGl0ZW0pfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntlbnRpdGxlbWVudFNlbGxlclNjb3BlKGl0ZW0pfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICB7c25hcHNob3RTdHJpbmcoaXRlbS5zb3VyY2Vfc25hcHNob3QsIFwidGl0bGVcIikgfHxcbiAgICAgICAgICAgICAgICBzbmFwc2hvdFN0cmluZyhpdGVtLnNvdXJjZV9zbmFwc2hvdCwgXCJzb3VyY2VcIikgfHxcbiAgICAgICAgICAgICAgICBpdGVtLnByb2R1Y3RfaWQgfHxcbiAgICAgICAgICAgICAgICBcIkV4dGVybmFsXCJ9XG4gICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD57Zm9ybWF0RGF0ZShpdGVtLmV4cGlyZXNfYXQpfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgKSl9XG4gICAgICA8L1RhYmxlLkJvZHk+XG4gICAgPC9UYWJsZT5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQ291cG9uc1BhZ2VWaWV3KHtcbiAgYXBpQmFzZSxcbiAgdGl0bGUsXG59OiB7XG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgdGl0bGU6IHN0cmluZ1xufSkge1xuICBjb25zdCBbZW50aXRsZW1lbnRzLCBzZXRFbnRpdGxlbWVudHNdID0gdXNlU3RhdGU8Q291cG9uRW50aXRsZW1lbnRbXT4oW10pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbZmlsdGVyLCBzZXRGaWx0ZXJdID0gdXNlU3RhdGU8RW50aXRsZW1lbnRGaWx0ZXI+KFwiYWxsXCIpXG5cbiAgY29uc3QgbG9hZCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0TG9hZEVycm9yKG51bGwpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBhcGlGZXRjaDx7XG4gICAgICAgIGN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudHM6IENvdXBvbkVudGl0bGVtZW50W11cbiAgICAgIH0+KGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0cy9lbnRpdGxlbWVudHNgKVxuICAgICAgc2V0RW50aXRsZW1lbnRzKHBheWxvYWQuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50cyB8fCBbXSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJGYWlsZWQgdG8gbG9hZCBjb3Vwb25zXCJcbiAgICAgIHNldExvYWRFcnJvcihtZXNzYWdlKVxuICAgICAgdG9hc3QuZXJyb3IobWVzc2FnZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFthcGlCYXNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZvaWQgbG9hZCgpXG4gIH0sIFtsb2FkXSlcblxuICBjb25zdCBvcGVuRGV0YWlsID0gdXNlQ2FsbGJhY2soXG4gICAgKGVudGl0bGVtZW50OiBDb3Vwb25FbnRpdGxlbWVudCkgPT4ge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihjb3Vwb25EZXRhaWxQYXRoKGFwaUJhc2UsIGVudGl0bGVtZW50LmlkKSlcbiAgICB9LFxuICAgIFthcGlCYXNlXSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTYgcHktNFwiPlxuICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgxXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICAgICAgPEJ1dHRvbiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gdm9pZCBsb2FkKCl9PlxuICAgICAgICAgIDxBcnJvd1BhdGggLz5cbiAgICAgICAgICBSZWZyZXNoXG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8VGFic1xuICAgICAgICB2YWx1ZT17ZmlsdGVyfVxuICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+IHNldEZpbHRlcih2YWx1ZSBhcyBFbnRpdGxlbWVudEZpbHRlcil9XG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtNiBweS0yIGJvcmRlci1iXCI+XG4gICAgICAgICAgPFRhYnMuTGlzdD5cbiAgICAgICAgICAgIHtlbnRpdGxlbWVudEZpbHRlcnMubWFwKChpdGVtKSA9PiAoXG4gICAgICAgICAgICAgIDxUYWJzLlRyaWdnZXIga2V5PXtpdGVtLnZhbHVlfSB2YWx1ZT17aXRlbS52YWx1ZX0+XG4gICAgICAgICAgICAgICAge2l0ZW0ubGFiZWx9XG4gICAgICAgICAgICAgIDwvVGFicy5UcmlnZ2VyPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9UYWJzLkxpc3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7ZW50aXRsZW1lbnRGaWx0ZXJzLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgIDxUYWJzLkNvbnRlbnQga2V5PXtpdGVtLnZhbHVlfSB2YWx1ZT17aXRlbS52YWx1ZX0+XG4gICAgICAgICAgICA8RW50aXRsZW1lbnRzVGFibGVcbiAgICAgICAgICAgICAgbG9hZGluZz17bG9hZGluZ31cbiAgICAgICAgICAgICAgZXJyb3I9e2xvYWRFcnJvcn1cbiAgICAgICAgICAgICAgb25PcGVuPXtvcGVuRGV0YWlsfVxuICAgICAgICAgICAgICBlbnRpdGxlbWVudHM9e1xuICAgICAgICAgICAgICAgIGl0ZW0udmFsdWUgPT09IFwiYWxsXCJcbiAgICAgICAgICAgICAgICAgID8gZW50aXRsZW1lbnRzXG4gICAgICAgICAgICAgICAgICA6IGVudGl0bGVtZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgKGVudGl0bGVtZW50KSA9PiBlbnRpdGxlbWVudC5zdGF0dXMgPT09IGl0ZW0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1RhYnMuQ29udGVudD5cbiAgICAgICAgKSl9XG4gICAgICA8L1RhYnM+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvdXBvblByb2R1Y3RzUGFnZVZpZXcoe1xuICBhcGlCYXNlLFxuICB0aXRsZSxcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgPSBmYWxzZSxcbn06IHtcbiAgYXBpQmFzZTogQXBpQmFzZVxuICB0aXRsZTogc3RyaW5nXG4gIGFsbG93UHJvbW90aW9uTWlycm9yPzogYm9vbGVhblxufSkge1xuICByZXR1cm4gKFxuICAgIDxDb3Vwb25Qcm9kdWN0c1BhZ2VcbiAgICAgIGFwaUJhc2U9e2FwaUJhc2V9XG4gICAgICB0aXRsZT17dGl0bGV9XG4gICAgICBhbGxvd1Byb21vdGlvbk1pcnJvcj17YWxsb3dQcm9tb3Rpb25NaXJyb3J9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBMZWdhY3lDb3Vwb25Qcm9kdWN0c1BhZ2VWaWV3KHtcbiAgYXBpQmFzZSxcbiAgdGl0bGUsXG4gIGFsbG93UHJvbW90aW9uTWlycm9yID0gZmFsc2UsXG59OiB7XG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgdGl0bGU6IHN0cmluZ1xuICBhbGxvd1Byb21vdGlvbk1pcnJvcj86IGJvb2xlYW5cbn0pIHtcbiAgY29uc3QgW3Byb2R1Y3RzLCBzZXRQcm9kdWN0c10gPSB1c2VTdGF0ZTxDb3Vwb25Qcm9kdWN0Um93W10+KFtdKVxuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxPcHRpb25zUGF5bG9hZD4oe30pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbW9kYWxPcGVuLCBzZXRNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2FjdGl2ZVN0ZXAsIHNldEFjdGl2ZVN0ZXBdID0gdXNlU3RhdGU8V2l6YXJkU3RlcD4oXCJkZXRhaWxzXCIpXG4gIGNvbnN0IFtwcm9kdWN0Rm9ybSwgc2V0UHJvZHVjdEZvcm1dID0gdXNlU3RhdGU8UHJvZHVjdEZvcm1TdGF0ZT4oZW1wdHlQcm9kdWN0KVxuICBjb25zdCBbY291cG9uRm9ybSwgc2V0Q291cG9uRm9ybV0gPSB1c2VTdGF0ZTxDb3Vwb25Gb3JtU3RhdGU+KGVtcHR5Q291cG9uKVxuICBjb25zdCBbY2FtcGFpZ25Gb3JtLCBzZXRDYW1wYWlnbkZvcm1dID1cbiAgICB1c2VTdGF0ZTxDYW1wYWlnbkZvcm1TdGF0ZT4oZW1wdHlDYW1wYWlnbilcbiAgY29uc3QgcHJvbXB0ID0gdXNlUHJvbXB0KClcblxuICBjb25zdCBjb3Vwb25CYXNlID0gYCR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzYFxuXG4gIGNvbnN0IGxvYWQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0TG9hZGluZyh0cnVlKVxuICAgIHNldExvYWRFcnJvcihudWxsKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbcHJvZHVjdHNQYXlsb2FkLCBvcHRpb25zUGF5bG9hZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGFwaUZldGNoPHsgY291cG9uX3Byb2R1Y3RzOiBDb3Vwb25Qcm9kdWN0Um93W10gfT4oY291cG9uQmFzZSksXG4gICAgICAgIGFwaUZldGNoPE9wdGlvbnNQYXlsb2FkPihgJHtjb3Vwb25CYXNlfS9vcHRpb25zYCksXG4gICAgICBdKVxuICAgICAgc2V0UHJvZHVjdHMocHJvZHVjdHNQYXlsb2FkLmNvdXBvbl9wcm9kdWN0cyB8fCBbXSlcbiAgICAgIHNldE9wdGlvbnMob3B0aW9uc1BheWxvYWQgfHwge30pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBcIkZhaWxlZCB0byBsb2FkIGNvdXBvbiBwcm9kdWN0c1wiXG4gICAgICBzZXRMb2FkRXJyb3IobWVzc2FnZSlcbiAgICAgIHRvYXN0LmVycm9yKG1lc3NhZ2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9LCBbY291cG9uQmFzZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB2b2lkIGxvYWQoKVxuICB9LCBbbG9hZF0pXG5cbiAgY29uc3Qgb3B0aW9uRGVmYXVsdHMgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBzYWxlc19jaGFubmVsX2lkOiBvcHRpb25zLnNhbGVzX2NoYW5uZWxzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgICBjdXJyZW5jeV9jb2RlOlxuICAgICAgICBvcHRpb25zLmN1cnJlbmNpZXM/LmZpbmQoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5pc19kZWZhdWx0KT8uY29kZSB8fFxuICAgICAgICBvcHRpb25zLmN1cnJlbmNpZXM/LlswXT8uY29kZSB8fFxuICAgICAgICBcIlwiLFxuICAgIH0pLFxuICAgIFtvcHRpb25zXSxcbiAgKVxuXG4gIGNvbnN0IGN1cnJlbmNpZXMgPSBvcHRpb25zLmN1cnJlbmNpZXMgfHwgW11cbiAgY29uc3Qgc3VwcG9ydGVkQ3VycmVuY3lDb2RlcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gbmV3IFNldChjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpKSxcbiAgICBbY3VycmVuY2llc10sXG4gIClcblxuICBjb25zdCB1cGRhdGVQcm9kdWN0ID1cbiAgICAoZmllbGQ6IGtleW9mIFByb2R1Y3RGb3JtU3RhdGUpID0+XG4gICAgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4pID0+IHtcbiAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICBbZmllbGRdOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICB9KSlcbiAgICB9XG5cbiAgY29uc3QgdXBkYXRlQ291cG9uID1cbiAgICAoZmllbGQ6IGtleW9mIENvdXBvbkZvcm1TdGF0ZSkgPT5cbiAgICAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBbZmllbGRdOiBldmVudC50YXJnZXQudmFsdWUgfSkpXG4gICAgfVxuXG4gIGNvbnN0IHVwZGF0ZUNhbXBhaWduID1cbiAgICAoZmllbGQ6IGtleW9mIENhbXBhaWduRm9ybVN0YXRlKSA9PlxuICAgIChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIHNldENhbXBhaWduRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgW2ZpZWxkXTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgfSkpXG4gICAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5DcmVhdGUoKSB7XG4gICAgY29uc3QgY3VycmVuY3lDb2RlID0gb3B0aW9uRGVmYXVsdHMuY3VycmVuY3lfY29kZVxuICAgIHNldFByb2R1Y3RGb3JtKHtcbiAgICAgIC4uLmVtcHR5UHJvZHVjdCxcbiAgICAgIC4uLm9wdGlvbkRlZmF1bHRzLFxuICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIC4uLmVtcHR5VmFyaWFudCxcbiAgICAgICAgICBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgICAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuICAgIHNldENvdXBvbkZvcm0oeyAuLi5lbXB0eUNvdXBvbiwgY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlIH0pXG4gICAgc2V0Q2FtcGFpZ25Gb3JtKGVtcHR5Q2FtcGFpZ24pXG4gICAgc2V0QWN0aXZlU3RlcChcImRldGFpbHNcIilcbiAgICBzZXRNb2RhbE9wZW4odHJ1ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5FZGl0KHJvdzogQ291cG9uUHJvZHVjdFJvdykge1xuICAgIGNvbnN0IGZvcm1zID0gZm9ybUZyb21Sb3cocm93LCBvcHRpb25EZWZhdWx0cy5jdXJyZW5jeV9jb2RlKVxuICAgIHNldFByb2R1Y3RGb3JtKHtcbiAgICAgIC4uLmZvcm1zLnByb2R1Y3QsXG4gICAgICB2YXJpYW50czogZm9ybXMucHJvZHVjdC52YXJpYW50cy5sZW5ndGhcbiAgICAgICAgPyBmb3Jtcy5wcm9kdWN0LnZhcmlhbnRzXG4gICAgICAgIDogW3sgLi4uZW1wdHlWYXJpYW50IH1dLFxuICAgIH0pXG4gICAgc2V0Q291cG9uRm9ybShmb3Jtcy5jb3Vwb24pXG4gICAgc2V0Q2FtcGFpZ25Gb3JtKGZvcm1zLmNhbXBhaWduKVxuICAgIHNldEFjdGl2ZVN0ZXAoXCJkZXRhaWxzXCIpXG4gICAgc2V0TW9kYWxPcGVuKHRydWUpXG4gIH1cblxuICBmdW5jdGlvbiBzZXRWYXJpYW50KGluZGV4OiBudW1iZXIsIHBhdGNoOiBQYXJ0aWFsPFZhcmlhbnRGb3JtU3RhdGU+KSB7XG4gICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgdmFyaWFudHM6IGN1cnJlbnQudmFyaWFudHMubWFwKCh2YXJpYW50LCB2YXJpYW50SW5kZXgpID0+XG4gICAgICAgIHZhcmlhbnRJbmRleCA9PT0gaW5kZXggPyB7IC4uLnZhcmlhbnQsIC4uLnBhdGNoIH0gOiB2YXJpYW50LFxuICAgICAgKSxcbiAgICB9KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFZhcmlhbnQoKSB7XG4gICAgY29uc3QgY3VycmVuY3lDb2RlID1cbiAgICAgIGNvdXBvbkZvcm0uY3VycmVuY3lfY29kZSB8fCBvcHRpb25EZWZhdWx0cy5jdXJyZW5jeV9jb2RlXG4gICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgLi4uY3VycmVudC52YXJpYW50cyxcbiAgICAgICAge1xuICAgICAgICAgIC4uLmVtcHR5VmFyaWFudCxcbiAgICAgICAgICBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgICAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZVZhcmlhbnQoaW5kZXg6IG51bWJlcikge1xuICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgLi4uY3VycmVudCxcbiAgICAgIHZhcmlhbnRzOiBjdXJyZW50LnZhcmlhbnRzLmZpbHRlcihcbiAgICAgICAgKF8sIHZhcmlhbnRJbmRleCkgPT4gdmFyaWFudEluZGV4ICE9PSBpbmRleCxcbiAgICAgICksXG4gICAgfSkpXG4gIH1cblxuICBmdW5jdGlvbiBwcm9kdWN0UGF5bG9hZChpbmNsdWRlVmFyaWFudHM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwcm9kdWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIHRpdGxlOiBwcm9kdWN0Rm9ybS50aXRsZSxcbiAgICAgIHN1YnRpdGxlOiBwcm9kdWN0Rm9ybS5zdWJ0aXRsZSB8fCBudWxsLFxuICAgICAgaGFuZGxlOiBwcm9kdWN0Rm9ybS5oYW5kbGUgfHwgbnVsbCxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9kdWN0Rm9ybS5kZXNjcmlwdGlvbiB8fCBudWxsLFxuICAgICAgc3RhdHVzOiBwcm9kdWN0Rm9ybS5zdGF0dXMsXG4gICAgICB0aHVtYm5haWw6IHByb2R1Y3RGb3JtLnRodW1ibmFpbCB8fCBudWxsLFxuICAgICAgZGlzY291bnRhYmxlOiBwcm9kdWN0Rm9ybS5kaXNjb3VudGFibGUsXG4gICAgICB0eXBlX2lkOiBwcm9kdWN0Rm9ybS50eXBlX2lkIHx8IG51bGwsXG4gICAgICBjb2xsZWN0aW9uX2lkOiBwcm9kdWN0Rm9ybS5jb2xsZWN0aW9uX2lkIHx8IG51bGwsXG4gICAgICBjYXRlZ29yaWVzOiBwcm9kdWN0Rm9ybS5jYXRlZ29yeV9pZFxuICAgICAgICA/IFt7IGlkOiBwcm9kdWN0Rm9ybS5jYXRlZ29yeV9pZCB9XVxuICAgICAgICA6IFtdLFxuICAgICAgdGFnczogcHJvZHVjdEZvcm0udGFnX2lkID8gW3sgaWQ6IHByb2R1Y3RGb3JtLnRhZ19pZCB9XSA6IFtdLFxuICAgICAgc2FsZXNfY2hhbm5lbHM6IHByb2R1Y3RGb3JtLnNhbGVzX2NoYW5uZWxfaWRcbiAgICAgICAgPyBbeyBpZDogcHJvZHVjdEZvcm0uc2FsZXNfY2hhbm5lbF9pZCB9XVxuICAgICAgICA6IFtdLFxuICAgIH1cblxuICAgIGlmIChpbmNsdWRlVmFyaWFudHMpIHtcbiAgICAgIHByb2R1Y3QudmFyaWFudHMgPSBwcm9kdWN0Rm9ybS52YXJpYW50cy5tYXAoKHZhcmlhbnQpID0+ICh7XG4gICAgICAgIHRpdGxlOiB2YXJpYW50LnRpdGxlLFxuICAgICAgICBza3U6IHZhcmlhbnQuc2t1IHx8IG51bGwsXG4gICAgICAgIG1hbmFnZV9pbnZlbnRvcnk6IGZhbHNlLFxuICAgICAgICBhbGxvd19iYWNrb3JkZXI6IHRydWUsXG4gICAgICAgIHByaWNlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IHZhcmlhbnQuY3VycmVuY3lfY29kZS50cmltKCkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIGFtb3VudDogTnVtYmVyKHZhcmlhbnQuYW1vdW50KSB8fCAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KSlcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvZHVjdFxuICB9XG5cbiAgZnVuY3Rpb24gdmFyaWFudE92ZXJyaWRlcygpIHtcbiAgICByZXR1cm4gcHJvZHVjdEZvcm0udmFyaWFudHNcbiAgICAgIC5tYXAoKHZhcmlhbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmICghdmFyaWFudC5vdmVycmlkZV9lbmFibGVkKSByZXR1cm4gbnVsbFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhcmlhbnRfaW5kZXg6IGluZGV4LFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYmVuZWZpdF90eXBlOiB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSxcbiAgICAgICAgICBhbW91bnQ6XG4gICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICAgICAgICA/IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX2Ftb3VudClcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHBlcmNlbnRhZ2U6XG4gICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCJcbiAgICAgICAgICAgICAgPyBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9wZXJjZW50YWdlKVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgY3VycmVuY3lfY29kZTpcbiAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgID8gdmFyaWFudC5vdmVycmlkZV9jdXJyZW5jeV9jb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICAgICAgICAgICAgY291cG9uRm9ybS5jdXJyZW5jeV9jb2RlXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRm9ybSgpIHtcbiAgICBpZiAoIXByb2R1Y3RGb3JtLnRpdGxlLnRyaW0oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvZHVjdCB0aXRsZSBpcyByZXF1aXJlZFwiKVxuICAgIH1cbiAgICBpZiAoIXByb2R1Y3RGb3JtLmlkICYmICFwcm9kdWN0Rm9ybS52YXJpYW50cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSBwcm9kdWN0IHZhcmlhbnQgaXMgcmVxdWlyZWRcIilcbiAgICB9XG4gICAgaWYgKCFjdXJyZW5jaWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGEgc3VwcG9ydGVkIGN1cnJlbmN5IHRvIHRoZSBzdG9yZSBiZWZvcmUgY29udGludWluZ1wiKVxuICAgIH1cbiAgICBpZiAoIXByb2R1Y3RGb3JtLmlkKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhcmlhbnQgb2YgcHJvZHVjdEZvcm0udmFyaWFudHMpIHtcbiAgICAgICAgaWYgKCFzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLmhhcyh2YXJpYW50LmN1cnJlbmN5X2NvZGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZWxlY3QgYW4gYXZhaWxhYmxlIGN1cnJlbmN5IGZvciAke3ZhcmlhbnQudGl0bGV9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgICAgbnVtYmVyT3JOdWxsKGNvdXBvbkZvcm0uYW1vdW50KSA9PSBudWxsXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHBvc2l0aXZlIGNvdXBvbiBhbW91bnQgaXMgcmVxdWlyZWRcIilcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY291cG9uRm9ybS5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiZcbiAgICAgICFzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLmhhcyhjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3QgYW4gYXZhaWxhYmxlIGNvdXBvbiBjdXJyZW5jeVwiKVxuICAgIH1cbiAgICBpZiAoY291cG9uRm9ybS5iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiKSB7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gbnVtYmVyT3JOdWxsKGNvdXBvbkZvcm0ucGVyY2VudGFnZSlcbiAgICAgIGlmIChwZXJjZW50YWdlID09IG51bGwgfHwgcGVyY2VudGFnZSA+IDEwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3Vwb24gcGVyY2VudGFnZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvdXBvbkZvcm0uY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiICYmXG4gICAgICAhY291cG9uRm9ybS5zaGFyZWRfY29kZS50cmltKClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgc2hhcmVkIGNvdXBvbiBjb2RlIGlzIHJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmIChjb3Vwb25Gb3JtLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiKSB7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gbmV3IERhdGUoY291cG9uRm9ybS5leHBpcmF0aW9uX2RhdGUpXG4gICAgICBpZiAoIWNvdXBvbkZvcm0uZXhwaXJhdGlvbl9kYXRlIHx8IE51bWJlci5pc05hTihleHBpcmF0aW9uLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB2YWxpZCBmaXhlZCBleHBpcmF0aW9uIGRhdGUgaXMgcmVxdWlyZWRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYXQpIHtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb25DYXAgPSBuZXcgRGF0ZShjb3Vwb25Gb3JtLmV4cGlyYXRpb25fY2FwX2F0KVxuICAgICAgaWYgKE51bWJlci5pc05hTihleHBpcmF0aW9uQ2FwLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB2YWxpZCBleHBpcmF0aW9uIGNhcCBkYXRlIGlzIHJlcXVpcmVkXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFudCBvZiBwcm9kdWN0Rm9ybS52YXJpYW50cykge1xuICAgICAgaWYgKCF2YXJpYW50Lm92ZXJyaWRlX2VuYWJsZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgICAgIG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX2Ftb3VudCkgPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQSBwb3NpdGl2ZSBjb3Vwb24gYW1vdW50IGlzIHJlcXVpcmVkIGZvciAke3ZhcmlhbnQudGl0bGV9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgICAgICAhc3VwcG9ydGVkQ3VycmVuY3lDb2Rlcy5oYXModmFyaWFudC5vdmVycmlkZV9jdXJyZW5jeV9jb2RlKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2VsZWN0IGFuIGF2YWlsYWJsZSBjb3Vwb24gY3VycmVuY3kgZm9yICR7dmFyaWFudC50aXRsZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAodmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9wZXJjZW50YWdlKVxuICAgICAgICBpZiAocGVyY2VudGFnZSA9PSBudWxsIHx8IHBlcmNlbnRhZ2UgPiAxMDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ291cG9uIHBlcmNlbnRhZ2UgZm9yICR7dmFyaWFudC50aXRsZX0gbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMGAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGFsbG93UHJvbW90aW9uTWlycm9yICYmXG4gICAgICBjYW1wYWlnbkZvcm0ubW9kZSA9PT0gXCJleGlzdGluZ1wiICYmXG4gICAgICAhY2FtcGFpZ25Gb3JtLmNhbXBhaWduX2lkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3QgYW4gZXhpc3RpbmcgY2FtcGFpZ25cIilcbiAgICB9XG4gICAgaWYgKFxuICAgICAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgJiZcbiAgICAgIGNhbXBhaWduRm9ybS5tb2RlID09PSBcIm5ld1wiICYmXG4gICAgICAoIWNhbXBhaWduRm9ybS5uYW1lLnRyaW0oKSB8fCAhY2FtcGFpZ25Gb3JtLmNhbXBhaWduX2lkZW50aWZpZXIudHJpbSgpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FtcGFpZ24gbmFtZSBhbmQgaWRlbnRpZmllciBhcmUgcmVxdWlyZWRcIilcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzeW5jVmFyaWFudE92ZXJyaWRlcyhwcm9kdWN0SWQ6IHN0cmluZykge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcHJvZHVjdEZvcm0udmFyaWFudHMubWFwKGFzeW5jICh2YXJpYW50KSA9PiB7XG4gICAgICAgIGlmICghdmFyaWFudC5pZCkgcmV0dXJuXG5cbiAgICAgICAgaWYgKCF2YXJpYW50Lm92ZXJyaWRlX2VuYWJsZWQpIHtcbiAgICAgICAgICBpZiAodmFyaWFudC5vdmVycmlkZV9jb25maWdfaWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGFwaUZldGNoKGAke2NvdXBvbkJhc2V9LyR7cHJvZHVjdElkfS92YXJpYW50c2AsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHZhcmlhbnRfaWQ6IHZhcmlhbnQuaWQsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBhcGlGZXRjaChgJHtjb3Vwb25CYXNlfS8ke3Byb2R1Y3RJZH0vdmFyaWFudHNgLCB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB2YXJpYW50X2lkOiB2YXJpYW50LmlkLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGJlbmVmaXRfdHlwZTogdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUsXG4gICAgICAgICAgICBhbW91bnQ6XG4gICAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgICAgPyBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9hbW91bnQpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgcGVyY2VudGFnZTpcbiAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiXG4gICAgICAgICAgICAgICAgPyBudW1iZXJPck51bGwodmFyaWFudC5vdmVycmlkZV9wZXJjZW50YWdlKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbmN5X2NvZGU6XG4gICAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgICAgPyB2YXJpYW50Lm92ZXJyaWRlX2N1cnJlbmN5X2NvZGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgICAgICAgIGNvdXBvbkZvcm0uY3VycmVuY3lfY29kZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSlcbiAgICAgIH0pLFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNhdmVQcm9kdWN0KCkge1xuICAgIHNldFNhdmluZyh0cnVlKVxuICAgIHRyeSB7XG4gICAgICB2YWxpZGF0ZUZvcm0oKVxuICAgICAgY29uc3QgaXNFZGl0ID0gQm9vbGVhbihwcm9kdWN0Rm9ybS5pZClcbiAgICAgIGNvbnN0IHBhdGggPSBpc0VkaXQgPyBgJHtjb3Vwb25CYXNlfS8ke3Byb2R1Y3RGb3JtLmlkfWAgOiBjb3Vwb25CYXNlXG4gICAgICBjb25zdCBtZXRob2QgPSBpc0VkaXQgPyBcIlBBVENIXCIgOiBcIlBPU1RcIlxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcHJvZHVjdDogcHJvZHVjdFBheWxvYWQoIWlzRWRpdCksXG4gICAgICAgIGNvdXBvbjogYnVpbGRDb3Vwb25QYXlsb2FkKGNvdXBvbkZvcm0sIGFsbG93UHJvbW90aW9uTWlycm9yKSxcbiAgICAgICAgY2FtcGFpZ246IGJ1aWxkQ2FtcGFpZ25QYXlsb2FkKGNhbXBhaWduRm9ybSwgYWxsb3dQcm9tb3Rpb25NaXJyb3IpLFxuICAgICAgICBzZWxsZXJfaWQ6IHByb2R1Y3RGb3JtLnNlbGxlcl9pZCB8fCBudWxsLFxuICAgICAgICB2YXJpYW50X292ZXJyaWRlczogaXNFZGl0ID8gW10gOiB2YXJpYW50T3ZlcnJpZGVzKCksXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGFwaUZldGNoKHBhdGgsIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgIH0pXG4gICAgICBpZiAoaXNFZGl0KSB7XG4gICAgICAgIGF3YWl0IHN5bmNWYXJpYW50T3ZlcnJpZGVzKHByb2R1Y3RGb3JtLmlkKVxuICAgICAgfVxuICAgICAgdG9hc3Quc3VjY2VzcyhcbiAgICAgICAgaXNFZGl0ID8gXCJDb3Vwb24gcHJvZHVjdCB1cGRhdGVkXCIgOiBcIkNvdXBvbiBwcm9kdWN0IGNyZWF0ZWRcIixcbiAgICAgIClcbiAgICAgIHNldE1vZGFsT3BlbihmYWxzZSlcbiAgICAgIGF3YWl0IGxvYWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgIDogXCJGYWlsZWQgdG8gc2F2ZSBjb3Vwb24gcHJvZHVjdFwiLFxuICAgICAgKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTYXZpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlUHJvZHVjdChyb3c6IENvdXBvblByb2R1Y3RSb3cpIHtcbiAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBwcm9tcHQoe1xuICAgICAgdGl0bGU6IFwiUmVtb3ZlIGNvdXBvbiBwcm9kdWN0P1wiLFxuICAgICAgZGVzY3JpcHRpb246IGBUaGlzIHJlbW92ZXMgY291cG9uIGlzc3VhbmNlIGZyb20gJHtcbiAgICAgICAgcm93LnByb2R1Y3QudGl0bGUgfHwgcm93LnByb2R1Y3QuaWRcbiAgICAgIH0uIFRoZSB1bmRlcmx5aW5nIE1lZHVzYSBwcm9kdWN0IHdpbGwgcmVtYWluIGF2YWlsYWJsZS5gLFxuICAgICAgY29uZmlybVRleHQ6IFwiUmVtb3ZlIHByb2R1Y3RcIixcbiAgICAgIGNhbmNlbFRleHQ6IFwiQ2FuY2VsXCIsXG4gICAgICB2YXJpYW50OiBcImRhbmdlclwiLFxuICAgIH0pXG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUZldGNoKGAke2NvdXBvbkJhc2V9LyR7cm93LnByb2R1Y3QuaWR9YCwgeyBtZXRob2Q6IFwiREVMRVRFXCIgfSlcbiAgICAgIHRvYXN0LnN1Y2Nlc3MoXCJDb3Vwb24gY29uZmlndXJhdGlvbiByZW1vdmVkXCIpXG4gICAgICBhd2FpdCBsb2FkKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFwiRmFpbGVkIHRvIHJlbW92ZSBjb3Vwb24gcHJvZHVjdFwiLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG1pcnJvclByb21vdGlvbihyb3c6IENvdXBvblByb2R1Y3RSb3cpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXBpRmV0Y2goXG4gICAgICAgIGAvYWRtaW4vY291cG9uLXByb2R1Y3RzLyR7cm93LnByb2R1Y3QuaWR9L21pcnJvci1wcm9tb3Rpb25gLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7fSksXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICB0b2FzdC5zdWNjZXNzKFwiUHJvbW90aW9uIG1pcnJvciBjcmVhdGVkXCIpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJNaXJyb3IgZmFpbGVkXCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgY3VycmVudFN0ZXBJbmRleCA9IHN0ZXBzLmluZGV4T2YoYWN0aXZlU3RlcClcbiAgY29uc3QgY2FuR29CYWNrID0gY3VycmVudFN0ZXBJbmRleCA+IDBcbiAgY29uc3QgY2FuR29OZXh0ID0gY3VycmVudFN0ZXBJbmRleCA8IHN0ZXBzLmxlbmd0aCAtIDFcbiAgY29uc3Qgc2hvd0NhbXBhaWduU3RlcCA9IGFsbG93UHJvbW90aW9uTWlycm9yXG4gIGNvbnN0IHZpc2libGVTdGVwcyA9IHNob3dDYW1wYWlnblN0ZXBcbiAgICA/IHN0ZXBzXG4gICAgOiBzdGVwcy5maWx0ZXIoKHN0ZXApID0+IHN0ZXAgIT09IFwiY2FtcGFpZ25cIilcblxuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwiZGl2aWRlLXkgcC0wXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC02IHB5LTRcIj5cbiAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMVwiPnt0aXRsZX08L0hlYWRpbmc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMlwiPlxuICAgICAgICAgIDxCdXR0b24gc2l6ZT1cInNtYWxsXCIgdmFyaWFudD1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpID0+IHZvaWQgbG9hZCgpfT5cbiAgICAgICAgICAgIDxBcnJvd1BhdGggLz5cbiAgICAgICAgICAgIFJlZnJlc2hcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8QnV0dG9uIHNpemU9XCJzbWFsbFwiIG9uQ2xpY2s9e29wZW5DcmVhdGV9PlxuICAgICAgICAgICAgPFBsdXMgLz5cbiAgICAgICAgICAgIENyZWF0ZVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPVwiTG9hZGluZyBjb3Vwb24gcHJvZHVjdHNcIiAvPlxuICAgICAgKSA6IGxvYWRFcnJvciA/IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9e2xvYWRFcnJvcn0gLz5cbiAgICAgICkgOiBwcm9kdWN0cy5sZW5ndGggPyAoXG4gICAgICAgIDxUYWJsZT5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyPlxuICAgICAgICAgICAgPFRhYmxlLlJvdz5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+UHJvZHVjdDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+U3RhdHVzPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5CZW5lZml0PC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Db2RlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5DYW1wYWlnbjwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+SXNzdWVkPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbCAvPlxuICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgPC9UYWJsZS5IZWFkZXI+XG4gICAgICAgICAgPFRhYmxlLkJvZHk+XG4gICAgICAgICAgICB7cHJvZHVjdHMubWFwKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gcm93LmNvdXBvbl9wcm9kdWN0X2NvbmZpZ1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxUYWJsZS5Sb3cga2V5PXtyb3cuaWR9PlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtyb3cucHJvZHVjdC50aXRsZSB8fCByb3cucHJvZHVjdC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3Jvdy5wcm9kdWN0LmhhbmRsZSB8fCByb3cucHJvZHVjdC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxTdGF0dXNCYWRnZSBjb2xvcj17cHJvZHVjdFN0YXR1c0NvbG9yKHJvdy5wcm9kdWN0LnN0YXR1cyl9PlxuICAgICAgICAgICAgICAgICAgICAgIHtyb3cucHJvZHVjdC5zdGF0dXMgfHwgXCJkcmFmdFwifVxuICAgICAgICAgICAgICAgICAgICA8L1N0YXR1c0JhZGdlPlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2JlbmVmaXRMYWJlbChjb25maWcpfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICB7Y29uZmlnLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgID8gY29uZmlnLnNoYXJlZF9jb2RlIHx8IFwiLVwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBjb25maWcuY29kZV9wcmVmaXggfHwgXCJDT1VQT05cIn1cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPntjYW1wYWlnbkxhYmVsKGNvbmZpZyl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e3Jvdy5lbnRpdGxlbWVudHNfY291bnQgfHwgMH08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBtaXJyb3JQcm9tb3Rpb24ocm93KX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgTWlycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9wZW5FZGl0KHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBlbmNpbFNxdWFyZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgZGVsZXRlUHJvZHVjdChyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUcmFzaCAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9UYWJsZS5Cb2R5PlxuICAgICAgICA8L1RhYmxlPlxuICAgICAgKSA6IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGVcbiAgICAgICAgICB0aXRsZT1cIk5vIGNvdXBvbiBwcm9kdWN0cyBmb3VuZFwiXG4gICAgICAgICAgZGVzY3JpcHRpb249XCJDcmVhdGUgYSBuZXcgY291cG9uIHByb2R1Y3QgdG8gZ2V0IHN0YXJ0ZWQuXCJcbiAgICAgICAgLz5cbiAgICAgICl9XG5cbiAgICAgIDxGb2N1c01vZGFsIG9wZW49e21vZGFsT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXRNb2RhbE9wZW59PlxuICAgICAgICA8Rm9jdXNNb2RhbC5Db250ZW50IHN0eWxlPXttb2RhbENvbnRlbnRTdHlsZX0+XG4gICAgICAgICAgPEZvY3VzTW9kYWwuSGVhZGVyIHN0eWxlPXttb2RhbFN0YXRpY1Jvd1N0eWxlfT5cbiAgICAgICAgICAgIDxGb2N1c01vZGFsLlRpdGxlPlxuICAgICAgICAgICAgICB7cHJvZHVjdEZvcm0uaWQgPyBcIkVkaXQgQ291cG9uIFByb2R1Y3RcIiA6IFwiQ3JlYXRlIENvdXBvbiBQcm9kdWN0XCJ9XG4gICAgICAgICAgICA8L0ZvY3VzTW9kYWwuVGl0bGU+XG4gICAgICAgICAgPC9Gb2N1c01vZGFsLkhlYWRlcj5cbiAgICAgICAgICA8UHJvZ3Jlc3NUYWJzXG4gICAgICAgICAgICB2YWx1ZT17YWN0aXZlU3RlcH1cbiAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT4gc2V0QWN0aXZlU3RlcCh2YWx1ZSBhcyBXaXphcmRTdGVwKX1cbiAgICAgICAgICAgIHN0eWxlPXttb2RhbFdpemFyZFN0eWxlfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuTGlzdCBjbGFzc05hbWU9XCJib3JkZXItYlwiIHN0eWxlPXttb2RhbFN0YXRpY1Jvd1N0eWxlfT5cbiAgICAgICAgICAgICAge3Zpc2libGVTdGVwcy5tYXAoKHN0ZXApID0+IChcbiAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLlRyaWdnZXJcbiAgICAgICAgICAgICAgICAgIGtleT17c3RlcH1cbiAgICAgICAgICAgICAgICAgIHZhbHVlPXtzdGVwfVxuICAgICAgICAgICAgICAgICAgc3RhdHVzPXtzdGVwU3RhdHVzKHN0ZXAsIGFjdGl2ZVN0ZXApfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtzdGVwID09PSBcImRldGFpbHNcIlxuICAgICAgICAgICAgICAgICAgICA/IFwiRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgIDogc3RlcCA9PT0gXCJvcmdhbml6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIk9yZ2FuaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IHN0ZXAgPT09IFwidmFyaWFudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIlZhcmlhbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogc3RlcCA9PT0gXCJjb3Vwb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiQ291cG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIkNhbXBhaWduXCJ9XG4gICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5MaXN0PlxuICAgICAgICAgICAgPEZvY3VzTW9kYWwuQm9keSBzdHlsZT17bW9kYWxCb2R5U3R5bGV9PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXttb2RhbEZvcm1TdHlsZX0+XG4gICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwiZGV0YWlsc1wiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3RocmVlQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQcm9kdWN0KFwidGl0bGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU3VidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5zdWJ0aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQcm9kdWN0KFwic3VidGl0bGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiSGFuZGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uaGFuZGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVByb2R1Y3QoXCJoYW5kbGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlUHJvZHVjdChcImRlc2NyaXB0aW9uXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk1lZGlhIFVSTFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnRodW1ibmFpbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQcm9kdWN0KFwidGh1bWJuYWlsXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuXG4gICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwib3JnYW5pemVcIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uc3RhdHVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZHJhZnRcIj5EcmFmdDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInB1Ymxpc2hlZFwiPlB1Ymxpc2hlZDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInByb3Bvc2VkXCI+UHJvcG9zZWQ8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJyZWplY3RlZFwiPlJlamVjdGVkPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIHthcGlCYXNlID09PSBcIi9hZG1pblwiICYmICFwcm9kdWN0Rm9ybS5pZCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU2VsbGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5zZWxsZXJfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMuc2VsbGVycyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxsZXJfaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0udHlwZV9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF90eXBlcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvbGxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uY29sbGVjdGlvbl9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF9jb2xsZWN0aW9ucyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbl9pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLmNhdGVnb3J5X2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X2NhdGVnb3JpZXMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5X2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVGFnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnRhZ19pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF90YWdzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdfaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTYWxlcyBjaGFubmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnNhbGVzX2NoYW5uZWxfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnNhbGVzX2NoYW5uZWxzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWxlc19jaGFubmVsX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cGFuZWxTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3Jvd0JldHdlZW5TdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5EaXNjb3VudGFibGU8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdW50cyBjYW4gYXBwbHkgdG8gdGhpcyBwcm9kdWN0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17cHJvZHVjdEZvcm0uZGlzY291bnRhYmxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudGFibGU6IEJvb2xlYW4oY2hlY2tlZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cblxuICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cInZhcmlhbnRzXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMlwiPlZhcmlhbnRzPC9IZWFkaW5nPlxuICAgICAgICAgICAgICAgICAgICB7IXByb2R1Y3RGb3JtLmlkICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXthZGRWYXJpYW50fVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQbHVzIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICBBZGQgdmFyaWFudFxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktNFwiPlxuICAgICAgICAgICAgICAgICAgICB7cHJvZHVjdEZvcm0udmFyaWFudHMubWFwKCh2YXJpYW50LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtgJHt2YXJpYW50LmlkIHx8IGluZGV4fWB9IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e2ZvdXJDb2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUaXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQudGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Qm9vbGVhbihwcm9kdWN0Rm9ybS5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7IHRpdGxlOiBldmVudC50YXJnZXQudmFsdWUgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTS1VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50LnNrdX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKHByb2R1Y3RGb3JtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHsgc2t1OiBldmVudC50YXJnZXQudmFsdWUgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDdXJyZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50LmN1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Qm9vbGVhbihwcm9kdWN0Rm9ybS5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGN1cnJlbmN5X2NvZGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeV9jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlByaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5QW1vdW50SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU9e3ZhcmlhbnQuY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50LmFtb3VudH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKHByb2R1Y3RGb3JtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoYW1vdW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogMTYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogMTYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3Jvd0JldHdlZW5TdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPkNvdXBvbiBiZW5lZml0IG92ZXJyaWRlPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3ZhcmlhbnQub3ZlcnJpZGVfZW5hYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9lbmFibGVkOiBCb29sZWFuKGNoZWNrZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFyaWFudC5vdmVycmlkZV9lbmFibGVkICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyAuLi5mb3VyQ29sdW1uR3JpZFN0eWxlLCBtYXJnaW5Ub3A6IDEyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQmVuZWZpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVfYmVuZWZpdF90eXBlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFzIEJlbmVmaXRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmaXhlZF9hbW91bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWQgYW1vdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwicGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJjZW50YWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZnJlZV9zaGlwcGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIHNoaXBwaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkN1cnJlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQub3ZlcnJpZGVfY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhvdmVycmlkZV9jdXJyZW5jeV9jb2RlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQW1vdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeUFtb3VudElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU9e3ZhcmlhbnQub3ZlcnJpZGVfY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5vdmVycmlkZV9hbW91bnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgIT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsob3ZlcnJpZGVfYW1vdW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9hbW91bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQZXJjZW50YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50Lm92ZXJyaWRlX3BlcmNlbnRhZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgIT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBlcmNlbnRhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9wZXJjZW50YWdlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHshcHJvZHVjdEZvcm0uaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Rm9ybS52YXJpYW50cy5sZW5ndGggPiAxICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IG1hcmdpblRvcDogMTYgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHJlbW92ZVZhcmlhbnQoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgdmFyaWFudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG5cbiAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJjb3Vwb25cIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPkNvdXBvbiBpc3N1YW5jZTwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgSXNzdWUgY291cG9ucyB3aGVuIGN1c3RvbWVycyBwdXJjaGFzZSB0aGlzIHByb2R1Y3RcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtjb3Vwb25Gb3JtLmVuYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogQm9vbGVhbihjaGVja2VkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkJlbmVmaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5iZW5lZml0X3R5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZW5lZml0X3R5cGU6IHZhbHVlIGFzIEJlbmVmaXRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZpeGVkX2Ftb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIGFtb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJwZXJjZW50YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyY2VudGFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmcmVlX3NoaXBwaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBzaGlwcGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQcm9tb3Rpb24gc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLnByb21vdGlvbl9zdGF0dXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9zdGF0dXM6IHZhbHVlIGFzIFByb21vdGlvblN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZHJhZnRcIj5EcmFmdDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiYWN0aXZlXCI+QWN0aXZlPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJpbmFjdGl2ZVwiPkluYWN0aXZlPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkFtb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeUFtb3VudElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlPXtjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uRm9ybS5iZW5lZml0X3R5cGUgIT09IFwiZml4ZWRfYW1vdW50XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5hbW91bnR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGFtb3VudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgYW1vdW50IH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlBlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2NvdXBvbkZvcm0uYmVuZWZpdF90eXBlICE9PSBcInBlcmNlbnRhZ2VcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLnBlcmNlbnRhZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwicGVyY2VudGFnZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDdXJyZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uRm9ybS5iZW5lZml0X3R5cGUgIT09IFwiZml4ZWRfYW1vdW50XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGN1cnJlbmN5X2NvZGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeV9jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIHBvbGljeVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmV4cGlyYXRpb25fdHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fdHlwZTogdmFsdWUgYXMgRXhwaXJhdGlvblBvbGljeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZHVyYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiBhZnRlciBpc3N1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmaXhlZFwiPkZpeGVkIGRhdGU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAge2NvdXBvbkZvcm0uZXhwaXJhdGlvbl90eXBlID09PSBcImR1cmF0aW9uXCIgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJhdGlvbiBkYXlzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1pbj17MX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uZXhwaXJhdGlvbl9kYXlzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwiZXhwaXJhdGlvbl9kYXlzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyZXMgYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5leHBpcmF0aW9uX2RhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJleHBpcmF0aW9uX2RhdGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhcCBleHBpcmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtcGFpZ24gZW5kIG9yIGNhcCBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2NvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ259XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogQm9vbGVhbihjaGVja2VkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJhdGlvbiBjYXAgZGF0ZSAob3B0aW9uYWwpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjb3Vwb25Gb3JtLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwiZXhwaXJhdGlvbl9jYXBfYXRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ29kZSBzdHJhdGVneVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmNvZGVfc3RyYXRlZ3l9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX3N0cmF0ZWd5OiB2YWx1ZSBhcyBDb2RlU3RyYXRlZ3ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwidW5pcXVlX2NvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWUgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJzaGFyZWRfY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZCBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2RlIHByZWZpeFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2NvdXBvbkZvcm0uY29kZV9zdHJhdGVneSAhPT0gXCJ1bmlxdWVfY29kZVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uY29kZV9wcmVmaXh9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwiY29kZV9wcmVmaXhcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU2hhcmVkIGNvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb25Gb3JtLmNvZGVfc3RyYXRlZ3kgIT09IFwic2hhcmVkX2NvZGVcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLnNoYXJlZF9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNvdXBvbihcInNoYXJlZF9jb2RlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk1heCBpc3N1YW5jZSBwZXIgaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW19XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwibWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiUHJvbW90aW9uIG1pcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5wcm9tb3Rpb25fbWlycm9yX21vZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogdmFsdWUgYXMgTWlycm9yTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibm9uZVwiPk5vbmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm1hbnVhbFwiPk1hbnVhbDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiYXV0b1wiPkF1dG88L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG5cbiAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwiY2FtcGFpZ25cIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2FtcGFpZ25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduRm9ybS5tb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IHZhbHVlIGFzIENhbXBhaWduTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibm9uZVwiPk5vIGNhbXBhaWduPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJleGlzdGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpc3RpbmcgY2FtcGFpZ25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5ld1wiPk5ldyBjYW1wYWlnbjwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIHtjYW1wYWlnbkZvcm0ubW9kZSA9PT0gXCJleGlzdGluZ1wiICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4aXN0aW5nIGNhbXBhaWduXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLmNhbXBhaWduX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMuY2FtcGFpZ25zIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICB7Y2FtcGFpZ25Gb3JtLm1vZGUgPT09IFwibmV3XCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduRm9ybS5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNhbXBhaWduKFwibmFtZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJJZGVudGlmaWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLmNhbXBhaWduX2lkZW50aWZpZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ2FtcGFpZ24oXCJjYW1wYWlnbl9pZGVudGlmaWVyXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlN0YXJ0cyBhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0uc3RhcnRzX2F0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNhbXBhaWduKFwic3RhcnRzX2F0XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkVuZHMgYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLmVuZHNfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ2FtcGFpZ24oXCJlbmRzX2F0XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0ZvY3VzTW9kYWwuQm9keT5cbiAgICAgICAgICA8L1Byb2dyZXNzVGFicz5cbiAgICAgICAgICA8Rm9jdXNNb2RhbC5Gb290ZXIgc3R5bGU9e21vZGFsU3RhdGljUm93U3R5bGV9PlxuICAgICAgICAgICAgPEJ1dHRvbiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gc2V0TW9kYWxPcGVuKGZhbHNlKX0+XG4gICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICB7Y2FuR29CYWNrICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICBzZXRBY3RpdmVTdGVwKHZpc2libGVTdGVwc1tjdXJyZW50U3RlcEluZGV4IC0gMV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQmFja1xuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7Y2FuR29OZXh0ICYmXG4gICAgICAgICAgICBhY3RpdmVTdGVwICE9PSB2aXNpYmxlU3RlcHNbdmlzaWJsZVN0ZXBzLmxlbmd0aCAtIDFdID8gKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZVN0ZXAodmlzaWJsZVN0ZXBzW2N1cnJlbnRTdGVwSW5kZXggKyAxXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDb250aW51ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxCdXR0b24gaXNMb2FkaW5nPXtzYXZpbmd9IG9uQ2xpY2s9eygpID0+IHZvaWQgc2F2ZVByb2R1Y3QoKX0+XG4gICAgICAgICAgICAgICAgU2F2ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9Gb2N1c01vZGFsLkZvb3Rlcj5cbiAgICAgICAgPC9Gb2N1c01vZGFsLkNvbnRlbnQ+XG4gICAgICA8L0ZvY3VzTW9kYWw+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gT3B0aW9uU2VsZWN0KHtcbiAgdmFsdWUsXG4gIG9wdGlvbnMsXG4gIG9uQ2hhbmdlLFxufToge1xuICB2YWx1ZTogc3RyaW5nXG4gIG9wdGlvbnM6IE9wdGlvblJlY29yZFtdXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxufSkge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RcbiAgICAgIHZhbHVlPXt2YWx1ZSB8fCBOT05FfVxuICAgICAgb25WYWx1ZUNoYW5nZT17KG5leHQpID0+IG9uQ2hhbmdlKG5leHQgPT09IE5PTkUgPyBcIlwiIDogbmV4dCl9XG4gICAgPlxuICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9e05PTkV9Pk5vbmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICB7b3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e29wdGlvbi5pZH0gdmFsdWU9e29wdGlvbi5pZH0+XG4gICAgICAgICAgICB7b3B0aW9uTGFiZWwob3B0aW9uKX1cbiAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICApKX1cbiAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgPC9TZWxlY3Q+XG4gIClcbn1cbiIsICJpbXBvcnQge1xuICB1c2VDYWxsYmFjayxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxuICB0eXBlIENoYW5nZUV2ZW50LFxuICB0eXBlIENTU1Byb3BlcnRpZXMsXG4gIHR5cGUgRHJhZ0V2ZW50LFxuICB0eXBlIFJlYWN0Tm9kZSxcbn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7XG4gIEFkanVzdG1lbnRzLFxuICBBcnJvd1BhdGgsXG4gIEFycm93VXBUcmF5LFxuICBJbmZvcm1hdGlvbkNpcmNsZSxcbiAgUGVuY2lsU3F1YXJlLFxuICBQbHVzLFxuICBUYXhFeGNsdXNpdmUsXG4gIFRheEluY2x1c2l2ZSxcbiAgVHJhc2gsXG4gIFhNYXJrTWluaSxcbn0gZnJvbSBcIkBtZWR1c2Fqcy9pY29uc1wiXG5pbXBvcnQge1xuICBCdXR0b24sXG4gIENoZWNrYm94LFxuICBDb250YWluZXIsXG4gIEN1cnJlbmN5SW5wdXQsXG4gIERpdmlkZXIsXG4gIERyb3Bkb3duTWVudSxcbiAgRHJhd2VyLFxuICBGb2N1c01vZGFsLFxuICBIZWFkaW5nLFxuICBJbnB1dCxcbiAgTGFiZWwsXG4gIFByb2dyZXNzVGFicyxcbiAgUmFkaW9Hcm91cCxcbiAgU2VsZWN0LFxuICBTdGF0dXNCYWRnZSxcbiAgU3dpdGNoLFxuICBUYWJsZSxcbiAgVGV4dCxcbiAgVGV4dGFyZWEsXG4gIFRvb2x0aXAsXG4gIHRvYXN0LFxuICB1c2VQcm9tcHQsXG59IGZyb20gXCJAbWVkdXNhanMvdWlcIlxuaW1wb3J0IHsgQ291cG9uRW1wdHlTdGF0ZSB9IGZyb20gXCIuL2VtcHR5LXN0YXRlXCJcblxuZGVjbGFyZSBjb25zdCBfX0JBQ0tFTkRfVVJMX186IHN0cmluZ1xuXG50eXBlIEFwaUJhc2UgPSBcIi9hZG1pblwiIHwgXCIvdmVuZG9yXCJcbnR5cGUgQmVuZWZpdFR5cGUgPSBcImZpeGVkX2Ftb3VudFwiIHwgXCJwZXJjZW50YWdlXCIgfCBcImZyZWVfc2hpcHBpbmdcIiB8IFwiYnV5X2dldFwiXG50eXBlIENvdXBvblR5cGUgPVxuICB8IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiXG4gIHwgXCJhbW91bnRfb2ZmX29yZGVyXCJcbiAgfCBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIlxuICB8IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICB8IFwiYnV5X3hfZ2V0X3lcIlxuICB8IFwiZnJlZV9zaGlwcGluZ1wiXG50eXBlIENvZGVTdHJhdGVneSA9IFwidW5pcXVlX2NvZGVcIiB8IFwic2hhcmVkX2NvZGVcIlxudHlwZSBNaXJyb3JNb2RlID0gXCJub25lXCIgfCBcIm1hbnVhbFwiIHwgXCJhdXRvXCJcbnR5cGUgUHJvbW90aW9uU3RhdHVzID0gXCJkcmFmdFwiIHwgXCJhY3RpdmVcIiB8IFwiaW5hY3RpdmVcIlxudHlwZSBDYW1wYWlnbk1vZGUgPSBcIm5vbmVcIiB8IFwiZXhpc3RpbmdcIiB8IFwibmV3XCJcbnR5cGUgRXhwaXJhdGlvblBvbGljeVR5cGUgPSBcIm5vbmVcIiB8IFwiZHVyYXRpb25cIiB8IFwiZml4ZWRcIlxudHlwZSBDb3Vwb25BbGxvY2F0aW9uID0gXCJlYWNoXCIgfCBcIm9uY2VcIlxudHlwZSBXaXphcmRTdGVwID0gXCJkZXRhaWxzXCIgfCBcIm9yZ2FuaXplXCIgfCBcImNhbXBhaWduXCIgfCBcInByaWNlc1wiXG50eXBlIFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlID1cbiAgfCBcImN1c3RvbWVyLmdyb3Vwcy5pZFwiXG4gIHwgXCJyZWdpb24uaWRcIlxuICB8IFwic2hpcHBpbmdfYWRkcmVzcy5jb3VudHJ5X2NvZGVcIlxuICB8IFwic2FsZXNfY2hhbm5lbF9pZFwiXG4gIHwgXCJjdXJyZW5jeV9jb2RlXCJcbnR5cGUgUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvciA9IFwiaW5cIiB8IFwiZXFcIiB8IFwibmVcIlxuXG50eXBlIFB1cmNoYXNlQ29uZGl0aW9uRm9ybSA9IHtcbiAga2V5OiBzdHJpbmdcbiAgYXR0cmlidXRlOiBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZSB8IFwiXCJcbiAgb3BlcmF0b3I6IFB1cmNoYXNlQ29uZGl0aW9uT3BlcmF0b3IgfCBcIlwiXG4gIHZhbHVlczogc3RyaW5nW11cbn1cblxudHlwZSBPcHRpb25SZWNvcmQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZyB8IG51bGxcbiAgdGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIHZhbHVlPzogc3RyaW5nIHwgbnVsbFxuICBoYW5kbGU/OiBzdHJpbmcgfCBudWxsXG4gIGNhbXBhaWduX2lkZW50aWZpZXI/OiBzdHJpbmcgfCBudWxsXG4gIGRpc3BsYXlfbmFtZT86IHN0cmluZyB8IG51bGxcbiAgaXNvXzI/OiBzdHJpbmcgfCBudWxsXG59XG5cbnR5cGUgQ3VycmVuY3lPcHRpb24gPSB7XG4gIGNvZGU6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgc3ltYm9sOiBzdHJpbmdcbiAgc3ltYm9sX25hdGl2ZTogc3RyaW5nXG4gIGlzX2RlZmF1bHQ6IGJvb2xlYW5cbiAgaXNfdGF4X2luY2x1c2l2ZT86IGJvb2xlYW5cbn1cblxudHlwZSBPcHRpb25zUGF5bG9hZCA9IHtcbiAgY3VycmVuY2llcz86IEN1cnJlbmN5T3B0aW9uW11cbiAgcHJvZHVjdF90eXBlcz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfY29sbGVjdGlvbnM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X2NhdGVnb3JpZXM/OiBPcHRpb25SZWNvcmRbXVxuICBwcm9kdWN0X3RhZ3M/OiBPcHRpb25SZWNvcmRbXVxuICBzYWxlc19jaGFubmVscz86IE9wdGlvblJlY29yZFtdXG4gIHNoaXBwaW5nX3Byb2ZpbGVzPzogT3B0aW9uUmVjb3JkW11cbiAgY2FtcGFpZ25zPzogT3B0aW9uUmVjb3JkW11cbiAgc2VsbGVycz86IE9wdGlvblJlY29yZFtdXG4gIGN1c3RvbWVyX2dyb3Vwcz86IE9wdGlvblJlY29yZFtdXG4gIHJlZ2lvbnM/OiBPcHRpb25SZWNvcmRbXVxuICBjb3VudHJpZXM/OiBPcHRpb25SZWNvcmRbXVxufVxuXG50eXBlIENvdXBvblByb2R1Y3RDb25maWcgPSB7XG4gIGlkOiBzdHJpbmdcbiAgZW5hYmxlZDogYm9vbGVhblxuICBwcm9kdWN0X2lkOiBzdHJpbmdcbiAgYmVuZWZpdF90eXBlOiBCZW5lZml0VHlwZVxuICBwdXJjaGFzZV9jb25kaXRpb25zPzogQXJyYXk8e1xuICAgIGF0dHJpYnV0ZTogUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGVcbiAgICBvcGVyYXRvcjogUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvclxuICAgIHZhbHVlczogc3RyaW5nW11cbiAgfT4gfCBudWxsXG4gIGFtb3VudHM/OiB7IGN1cnJlbmN5X2NvZGU6IHN0cmluZzsgYW1vdW50OiBudW1iZXIgfVtdIHwgbnVsbFxuICBhbW91bnQ6IG51bWJlciB8IG51bGxcbiAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbFxuICBjdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIGNvZGVfc3RyYXRlZ3k6IENvZGVTdHJhdGVneVxuICBjb2RlX3ByZWZpeDogc3RyaW5nIHwgbnVsbFxuICBzaGFyZWRfY29kZTogc3RyaW5nIHwgbnVsbFxuICBleHBpcmF0aW9uX3BvbGljeTpcbiAgfCB7IHR5cGU6IFwibm9uZVwiIH1cbiAgfCB7XG4gICAgdHlwZTogXCJkdXJhdGlvblwiXG4gICAgZHVyYXRpb25fZGF5czogbnVtYmVyXG4gICAgY2FwX2J5X2NhbXBhaWduPzogYm9vbGVhblxuICAgIGNhcF9hdD86IHN0cmluZyB8IG51bGxcbiAgfVxuICB8IHtcbiAgICB0eXBlOiBcImZpeGVkXCJcbiAgICBleHBpcmVzX2F0OiBzdHJpbmdcbiAgICBjYXBfYnlfY2FtcGFpZ24/OiBib29sZWFuXG4gICAgY2FwX2F0Pzogc3RyaW5nIHwgbnVsbFxuICB9XG4gIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogbnVtYmVyXG4gIHByb21vdGlvbl9taXJyb3JfbW9kZTogTWlycm9yTW9kZVxuICBwcm9tb3Rpb25fc3RhdHVzPzogUHJvbW90aW9uU3RhdHVzIHwgbnVsbFxuICBwcm9tb3Rpb25fdGVtcGxhdGU/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbFxuICBjYW1wYWlnbl9pZD86IHN0cmluZyB8IG51bGxcbiAgY2FtcGFpZ25fc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbn1cblxudHlwZSBQcm9kdWN0UmVjb3JkID0ge1xuICBpZDogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmcgfCBudWxsXG4gIHN1YnRpdGxlPzogc3RyaW5nIHwgbnVsbFxuICBoYW5kbGU6IHN0cmluZyB8IG51bGxcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsXG4gIHN0YXR1czogc3RyaW5nIHwgbnVsbFxuICB0aHVtYm5haWw6IHN0cmluZyB8IG51bGxcbiAgdGh1bWJuYWlsX2Fzc2V0X2lkPzogc3RyaW5nIHwgbnVsbFxuICBpbWFnZXM/OiB7IGlkPzogc3RyaW5nOyB1cmw/OiBzdHJpbmcgfCBudWxsOyBhc3NldF9pZD86IHN0cmluZyB8IG51bGwgfVtdXG4gIGRpc2NvdW50YWJsZT86IGJvb2xlYW5cbiAgdHlwZV9pZD86IHN0cmluZyB8IG51bGxcbiAgY29sbGVjdGlvbl9pZD86IHN0cmluZyB8IG51bGxcbiAgc2hpcHBpbmdfcHJvZmlsZV9pZD86IHN0cmluZyB8IG51bGxcbiAgdmFyaWFudHM/OiB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHNrdT86IHN0cmluZyB8IG51bGxcbiAgICBwcmljZXM/OiB7IGN1cnJlbmN5X2NvZGU/OiBzdHJpbmc7IGFtb3VudD86IG51bWJlciB9W11cbiAgfVtdXG4gIGNhdGVnb3JpZXM/OiB7IGlkOiBzdHJpbmcgfVtdXG4gIHRhZ3M/OiB7IGlkOiBzdHJpbmcgfVtdXG4gIHNhbGVzX2NoYW5uZWxzPzogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9W11cbn1cblxudHlwZSBQcm9kdWN0TWVkaWEgPSB7XG4gIHVybDogc3RyaW5nXG4gIGFzc2V0X2lkPzogc3RyaW5nXG59XG5cbnR5cGUgQ291cG9uUHJvZHVjdFJvdyA9IHtcbiAgaWQ6IHN0cmluZ1xuICBwcm9kdWN0OiBQcm9kdWN0UmVjb3JkXG4gIGNvdXBvbl9wcm9kdWN0X2NvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZ1xuICBlbnRpdGxlbWVudHNfY291bnQ6IG51bWJlclxufVxuXG50eXBlIFByb2R1Y3RGb3JtU3RhdGUgPSB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgc3VidGl0bGU6IHN0cmluZ1xuICBoYW5kbGU6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIG1lZGlhOiBQcm9kdWN0TWVkaWFbXVxuICBza3U6IHN0cmluZ1xuICBwcmljZV9hbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHN0YXR1czogc3RyaW5nXG4gIGRpc2NvdW50YWJsZTogYm9vbGVhblxuICBzZWxsZXJfaWQ6IHN0cmluZ1xuICB0eXBlX2lkOiBzdHJpbmdcbiAgY29sbGVjdGlvbl9pZDogc3RyaW5nXG4gIGNhdGVnb3J5X2lkOiBzdHJpbmdcbiAgdGFnX2lkOiBzdHJpbmdcbn1cblxudHlwZSBDb3Vwb25Gb3JtU3RhdGUgPSB7XG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgdHlwZTogQ291cG9uVHlwZVxuICBwdXJjaGFzZV9jb25kaXRpb25zOiBQdXJjaGFzZUNvbmRpdGlvbkZvcm1bXVxuICBhbW91bnRzOiBDb3Vwb25BbW91bnRGb3JtUm93W11cbiAgcGVyY2VudGFnZTogc3RyaW5nXG4gIGFsbG9jYXRpb246IENvdXBvbkFsbG9jYXRpb25cbiAgY29kZV9zdHJhdGVneTogQ29kZVN0cmF0ZWd5XG4gIGNvZGVfcHJlZml4OiBzdHJpbmdcbiAgc2hhcmVkX2NvZGU6IHN0cmluZ1xuICBleHBpcmF0aW9uX3R5cGU6IEV4cGlyYXRpb25Qb2xpY3lUeXBlXG4gIGV4cGlyYXRpb25fZGF5czogc3RyaW5nXG4gIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nXG4gIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOiBib29sZWFuXG4gIGV4cGlyYXRpb25fY2FwX2F0OiBzdHJpbmdcbiAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBzdHJpbmdcbiAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBNaXJyb3JNb2RlXG4gIHByb21vdGlvbl9zdGF0dXM6IFByb21vdGlvblN0YXR1c1xufVxuXG50eXBlIENvdXBvbkFtb3VudEZvcm1Sb3cgPSB7XG4gIGtleTogc3RyaW5nXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZ1xuICBhbW91bnQ6IHN0cmluZ1xufVxuXG50eXBlIENhbXBhaWduRm9ybVN0YXRlID0ge1xuICBtb2RlOiBDYW1wYWlnbk1vZGVcbiAgY2FtcGFpZ25faWQ6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgY2FtcGFpZ25faWRlbnRpZmllcjogc3RyaW5nXG4gIHN0YXJ0c19hdDogc3RyaW5nXG4gIGVuZHNfYXQ6IHN0cmluZ1xufVxuXG5jb25zdCBOT05FID0gXCJfX25vbmVfX1wiXG5jb25zdCBhbGxTdGVwczogV2l6YXJkU3RlcFtdID0gW1wiZGV0YWlsc1wiLCBcIm9yZ2FuaXplXCIsIFwiY2FtcGFpZ25cIiwgXCJwcmljZXNcIl1cblxuY29uc3QgY29uZGl0aW9uQXR0cmlidXRlczogQXJyYXk8e1xuICB2YWx1ZTogUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGVcbiAgbGFiZWw6IHN0cmluZ1xufT4gPSBbXG4gIHsgdmFsdWU6IFwiY3VzdG9tZXIuZ3JvdXBzLmlkXCIsIGxhYmVsOiBcIkN1c3RvbWVyIEdyb3VwXCIgfSxcbiAgeyB2YWx1ZTogXCJyZWdpb24uaWRcIiwgbGFiZWw6IFwiUmVnaW9uXCIgfSxcbiAgeyB2YWx1ZTogXCJzaGlwcGluZ19hZGRyZXNzLmNvdW50cnlfY29kZVwiLCBsYWJlbDogXCJDb3VudHJ5XCIgfSxcbiAgeyB2YWx1ZTogXCJzYWxlc19jaGFubmVsX2lkXCIsIGxhYmVsOiBcIlNhbGVzIENoYW5uZWxcIiB9LFxuICB7IHZhbHVlOiBcImN1cnJlbmN5X2NvZGVcIiwgbGFiZWw6IFwiQ3VycmVuY3kgQ29kZVwiIH0sXG5dXG5cbmNvbnN0IGNvbmRpdGlvbk9wZXJhdG9yczogQXJyYXk8e1xuICB2YWx1ZTogUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvclxuICBsYWJlbDogc3RyaW5nXG59PiA9IFtcbiAgeyB2YWx1ZTogXCJpblwiLCBsYWJlbDogXCJJblwiIH0sXG4gIHsgdmFsdWU6IFwiZXFcIiwgbGFiZWw6IFwiRXF1YWxzXCIgfSxcbiAgeyB2YWx1ZTogXCJuZVwiLCBsYWJlbDogXCJOb3QgSW5cIiB9LFxuXVxuXG5leHBvcnQgY29uc3QgdHlwZUNob2ljZXM6IHtcbiAgdmFsdWU6IENvdXBvblR5cGVcbiAgbGFiZWw6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG59W10gPSBbXG4gICAge1xuICAgICAgdmFsdWU6IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiLFxuICAgICAgbGFiZWw6IFwiQW1vdW50IG9mZiBwcm9kdWN0c1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRGlzY291bnQgc3BlY2lmaWMgcHJvZHVjdHMgb3IgYSBjb2xsZWN0aW9uIG9mIHByb2R1Y3RzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJhbW91bnRfb2ZmX29yZGVyXCIsXG4gICAgICBsYWJlbDogXCJBbW91bnQgb2ZmIG9yZGVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEaXNjb3VudCB0aGUgdG90YWwgb3JkZXIgYW1vdW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJwZXJjZW50YWdlX29mZl9wcm9kdWN0XCIsXG4gICAgICBsYWJlbDogXCJQZXJjZW50YWdlIG9mZiBwcm9kdWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEaXNjb3VudCBhIHBlcmNlbnRhZ2Ugb2ZmIHNlbGVjdGVkIHByb2R1Y3RzXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJwZXJjZW50YWdlX29mZl9vcmRlclwiLFxuICAgICAgbGFiZWw6IFwiUGVyY2VudGFnZSBvZmYgb3JkZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRpc2NvdW50IGEgcGVyY2VudGFnZSBvZmYgdGhlIHRvdGFsIG9yZGVyIGFtb3VudFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwiYnV5X3hfZ2V0X3lcIixcbiAgICAgIGxhYmVsOiBcIkJ1eSBYIEdldCBZXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJJc3N1ZSBhIEJ1eSBYIEdldCBZIGNvdXBvbiBlbnRpdGxlbWVudFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwiZnJlZV9zaGlwcGluZ1wiLFxuICAgICAgbGFiZWw6IFwiRnJlZSBzaGlwcGluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQXBwbHkgYSAxMDAlIGRpc2NvdW50IHRvIHNoaXBwaW5nIGZlZXNcIixcbiAgICB9LFxuICBdXG5cbmNvbnN0IHN0YXR1c0Nob2ljZXM6IHtcbiAgdmFsdWU6IFByb21vdGlvblN0YXR1c1xuICBsYWJlbDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbn1bXSA9IFtcbiAgICB7XG4gICAgICB2YWx1ZTogXCJkcmFmdFwiLFxuICAgICAgbGFiZWw6IFwiRHJhZnRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkN1c3RvbWVycyB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSB0aGUgY29kZSB5ZXRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcImFjdGl2ZVwiLFxuICAgICAgbGFiZWw6IFwiQWN0aXZlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDdXN0b21lcnMgd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgY29kZVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwiaW5hY3RpdmVcIixcbiAgICAgIGxhYmVsOiBcIkluYWN0aXZlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJLZWVwIHRoZSBwcm9tb3Rpb24gdW5hdmFpbGFibGUgdW50aWwgcmVhY3RpdmF0ZWRcIixcbiAgICB9LFxuICBdXG5cbmZ1bmN0aW9uIGJhY2tlbmRVcmwoKSB7XG4gIHJldHVybiB0eXBlb2YgX19CQUNLRU5EX1VSTF9fID09PSBcInN0cmluZ1wiXG4gICAgPyBfX0JBQ0tFTkRfVVJMX18ucmVwbGFjZSgvXFwvJC8sIFwiXCIpXG4gICAgOiBcIlwiXG59XG5cbmZ1bmN0aW9uIGFwaUVycm9yTWVzc2FnZShwYXlsb2FkOiBhbnksIGZhbGxiYWNrOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICBbcGF5bG9hZD8ubWVzc2FnZSwgcGF5bG9hZD8uZXJyb3I/Lm1lc3NhZ2UsIHBheWxvYWQ/LmVycm9yXS5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT4gdHlwZW9mIGNhbmRpZGF0ZSA9PT0gXCJzdHJpbmdcIiAmJiBjYW5kaWRhdGUudHJpbSgpLFxuICAgICkgfHxcbiAgICBmYWxsYmFjayB8fFxuICAgIFwiUmVxdWVzdCBmYWlsZWRcIlxuICApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwaUZldGNoPFQ+KFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge30sXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYWNrZW5kVXJsKCl9JHtwYXRofWAsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICAuLi4ob3B0aW9ucy5ib2R5ID8geyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IDoge30pLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH0sXG4gIH0pXG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXBpRXJyb3JNZXNzYWdlKHBheWxvYWQsIHJlc3BvbnNlLnN0YXR1c1RleHQpKVxuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKVxufVxuXG5mdW5jdGlvbiBvcHRpb25MYWJlbChvcHRpb246IE9wdGlvblJlY29yZCkge1xuICByZXR1cm4gKFxuICAgIG9wdGlvbi5uYW1lIHx8IG9wdGlvbi50aXRsZSB8fCBvcHRpb24udmFsdWUgfHwgb3B0aW9uLmhhbmRsZSB8fCBvcHRpb24uaWRcbiAgKVxufVxuXG5mdW5jdGlvbiBudW1iZXJPck51bGwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPiAwID8gcGFyc2VkIDogbnVsbFxufVxuXG5mdW5jdGlvbiBub25OZWdhdGl2ZU51bWJlck9yTnVsbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUudHJpbSgpKSByZXR1cm4gbnVsbFxuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPj0gMCA/IHBhcnNlZCA6IG51bGxcbn1cblxuZnVuY3Rpb24gdG9EYXRlVGltZUxvY2FsKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCJcIlxuICBjb25zdCBsb2NhbERhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwXzAwMClcbiAgcmV0dXJuIGxvY2FsRGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDE2KVxufVxuXG5mdW5jdGlvbiBjdXJyZW5jeURlY2ltYWxEaWdpdHMoY29kZTogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdChcImVuXCIsIHtcbiAgICAgIHN0eWxlOiBcImN1cnJlbmN5XCIsXG4gICAgICBjdXJyZW5jeTogY29kZS50b1VwcGVyQ2FzZSgpLFxuICAgIH0pLnJlc29sdmVkT3B0aW9ucygpLm1heGltdW1GcmFjdGlvbkRpZ2l0c1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gMlxuICB9XG59XG5cbmZ1bmN0aW9uIGN1cnJlbmN5U3ltYm9sKGNvZGU6IHN0cmluZykge1xuICBpZiAoIWNvZGUpIHJldHVybiBcIlwiXG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5ldyBJbnRsLk51bWJlckZvcm1hdChcImVuXCIsIHtcbiAgICAgICAgc3R5bGU6IFwiY3VycmVuY3lcIixcbiAgICAgICAgY3VycmVuY3k6IGNvZGUudG9VcHBlckNhc2UoKSxcbiAgICAgICAgY3VycmVuY3lEaXNwbGF5OiBcIm5hcnJvd1N5bWJvbFwiLFxuICAgICAgfSlcbiAgICAgICAgLmZvcm1hdFRvUGFydHMoMClcbiAgICAgICAgLmZpbmQoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gXCJjdXJyZW5jeVwiKT8udmFsdWUgfHwgY29kZS50b1VwcGVyQ2FzZSgpXG4gICAgKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gY29kZS50b1VwcGVyQ2FzZSgpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvdXBvblR5cGVGcm9tQ29uZmlnKGNvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZyk6IENvdXBvblR5cGUge1xuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCIpIHtcbiAgICByZXR1cm4gY29uZmlnLnByb21vdGlvbl90ZW1wbGF0ZT8uYXBwbGljYXRpb25fbWV0aG9kPy50YXJnZXRfdHlwZSA9PT0gXCJvcmRlclwiXG4gICAgICA/IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICAgICAgOiBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIlxuICB9XG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcImJ1eV9nZXRcIikgcmV0dXJuIFwiYnV5X3hfZ2V0X3lcIlxuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmcmVlX3NoaXBwaW5nXCIpIHJldHVybiBcImZyZWVfc2hpcHBpbmdcIlxuXG4gIHJldHVybiBjb25maWcucHJvbW90aW9uX3RlbXBsYXRlPy5hcHBsaWNhdGlvbl9tZXRob2Q/LnRhcmdldF90eXBlID09PSBcIm9yZGVyXCJcbiAgICA/IFwiYW1vdW50X29mZl9vcmRlclwiXG4gICAgOiBcImFtb3VudF9vZmZfcHJvZHVjdHNcIlxufVxuXG5mdW5jdGlvbiBiZW5lZml0VHlwZUZyb21Db3Vwb25UeXBlKHR5cGU6IENvdXBvblR5cGUpOiBCZW5lZml0VHlwZSB7XG4gIGlmIChcbiAgICB0eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIiB8fFxuICAgIHR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICApIHJldHVybiBcInBlcmNlbnRhZ2VcIlxuICBpZiAodHlwZSA9PT0gXCJidXlfeF9nZXRfeVwiKSByZXR1cm4gXCJidXlfZ2V0XCJcbiAgaWYgKHR5cGUgPT09IFwiZnJlZV9zaGlwcGluZ1wiKSByZXR1cm4gXCJmcmVlX3NoaXBwaW5nXCJcbiAgcmV0dXJuIFwiZml4ZWRfYW1vdW50XCJcbn1cblxuZnVuY3Rpb24gY291cG9uVHlwZUxhYmVsKGNvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZykge1xuICByZXR1cm4gdHlwZUNob2ljZXMuZmluZChcbiAgICAoY2hvaWNlKSA9PiBjaG9pY2UudmFsdWUgPT09IGNvdXBvblR5cGVGcm9tQ29uZmlnKGNvbmZpZyksXG4gICk/LmxhYmVsXG59XG5cbmZ1bmN0aW9uIGNvdXBvblN0YXR1c0NvbG9yKHN0YXR1cz86IFByb21vdGlvblN0YXR1cyB8IG51bGwpIHtcbiAgaWYgKHN0YXR1cyA9PT0gXCJhY3RpdmVcIikgcmV0dXJuIFwiZ3JlZW5cIiBhcyBjb25zdFxuICBpZiAoc3RhdHVzID09PSBcImluYWN0aXZlXCIpIHJldHVybiBcIm9yYW5nZVwiIGFzIGNvbnN0XG4gIHJldHVybiBcImdyZXlcIiBhcyBjb25zdFxufVxuXG5mdW5jdGlvbiBwcm9kdWN0U3RhdHVzRnJvbUNvdXBvblN0YXR1cyhzdGF0dXM6IFByb21vdGlvblN0YXR1cykge1xuICByZXR1cm4gc3RhdHVzID09PSBcImFjdGl2ZVwiID8gXCJwdWJsaXNoZWRcIiA6IFwiZHJhZnRcIlxufVxuXG5mdW5jdGlvbiBjYW1wYWlnbkxhYmVsKGNvbmZpZzogQ291cG9uUHJvZHVjdENvbmZpZykge1xuICBjb25zdCBuYW1lID0gY29uZmlnLmNhbXBhaWduX3NuYXBzaG90Py5uYW1lXG4gIHJldHVybiB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBuYW1lID8gbmFtZSA6IGNvbmZpZy5jYW1wYWlnbl9pZCB8fCBcIk5vbmVcIlxufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q3VycmVuY3kob3B0aW9uczogT3B0aW9uc1BheWxvYWQpIHtcbiAgcmV0dXJuIChcbiAgICBvcHRpb25zLmN1cnJlbmNpZXM/LmZpbmQoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5pc19kZWZhdWx0KT8uY29kZSB8fFxuICAgIG9wdGlvbnMuY3VycmVuY2llcz8uWzBdPy5jb2RlIHx8XG4gICAgXCJcIlxuICApXG59XG5cbmZ1bmN0aW9uIGNvbmRpdGlvbktleShwcmVmaXggPSBcImNvbmRpdGlvblwiKSB7XG4gIHJldHVybiBgJHtwcmVmaXh9LSR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KX1gXG59XG5cbmZ1bmN0aW9uIGlzQW1vdW50Q291cG9uVHlwZSh0eXBlOiBDb3Vwb25UeXBlKSB7XG4gIHJldHVybiB0eXBlID09PSBcImFtb3VudF9vZmZfcHJvZHVjdHNcIiB8fCB0eXBlID09PSBcImFtb3VudF9vZmZfb3JkZXJcIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZWZmZWN0aXZlQ291cG9uQ3VycmVuY2llcyhcbiAgY29uZGl0aW9uczogUHVyY2hhc2VDb25kaXRpb25Gb3JtW10sXG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5T3B0aW9uW10sXG4pIHtcbiAgY29uc3QgY29uZGl0aW9uID0gY29uZGl0aW9ucy5maW5kKFxuICAgIChpdGVtKSA9PiBpdGVtLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIsXG4gIClcbiAgaWYgKCFjb25kaXRpb24gfHwgIWNvbmRpdGlvbi5vcGVyYXRvcikgcmV0dXJuIFtdXG4gIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldChjb25kaXRpb24udmFsdWVzKVxuICBjb25zdCBzdXBwb3J0ZWQgPSBjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpXG5cbiAgcmV0dXJuIGNvbmRpdGlvbi5vcGVyYXRvciA9PT0gXCJuZVwiXG4gICAgPyBzdXBwb3J0ZWQuZmlsdGVyKChjb2RlKSA9PiAhc2VsZWN0ZWQuaGFzKGNvZGUpKVxuICAgIDogc3VwcG9ydGVkLmZpbHRlcigoY29kZSkgPT4gc2VsZWN0ZWQuaGFzKGNvZGUpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjb25jaWxlQ291cG9uQW1vdW50cyhcbiAgY3VycmVudDogQ291cG9uQW1vdW50Rm9ybVJvd1tdLFxuICBjdXJyZW5jeUNvZGVzOiBzdHJpbmdbXSxcbikge1xuICBjb25zdCBieUN1cnJlbmN5ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIGN1cnJlbnQubWFwKChyb3cpID0+IFtyb3cuY3VycmVuY3lfY29kZSwgcm93XSksXG4gIClcbiAgcmV0dXJuIGN1cnJlbmN5Q29kZXMubWFwKChjdXJyZW5jeUNvZGUpID0+ICh7XG4gICAga2V5OiBieUN1cnJlbmN5W2N1cnJlbmN5Q29kZV0/LmtleSB8fCBjb25kaXRpb25LZXkoXCJjb3Vwb24tdmFsdWVcIiksXG4gICAgY3VycmVuY3lfY29kZTogY3VycmVuY3lDb2RlLFxuICAgIGFtb3VudDogYnlDdXJyZW5jeVtjdXJyZW5jeUNvZGVdPy5hbW91bnQgfHwgXCJcIixcbiAgfSkpXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRQdXJjaGFzZUNvbmRpdGlvbnMob3B0aW9uczogT3B0aW9uc1BheWxvYWQpIHtcbiAgY29uc3QgY3VycmVuY3lDb2RlID0gZGVmYXVsdEN1cnJlbmN5KG9wdGlvbnMpXG4gIHJldHVybiBjdXJyZW5jeUNvZGVcbiAgICA/IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiBjb25kaXRpb25LZXkoXCJjdXJyZW5jeVwiKSxcbiAgICAgICAgYXR0cmlidXRlOiBcImN1cnJlbmN5X2NvZGVcIiBhcyBjb25zdCxcbiAgICAgICAgb3BlcmF0b3I6IFwiZXFcIiBhcyBjb25zdCxcbiAgICAgICAgdmFsdWVzOiBbY3VycmVuY3lDb2RlXSxcbiAgICAgIH0sXG4gICAgXVxuICAgIDogW11cbn1cblxuZnVuY3Rpb24gZW1wdHlQcm9kdWN0KG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkKTogUHJvZHVjdEZvcm1TdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgdGl0bGU6IFwiXCIsXG4gICAgc3VidGl0bGU6IFwiXCIsXG4gICAgaGFuZGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgIG1lZGlhOiBbXSxcbiAgICBza3U6IFwiXCIsXG4gICAgcHJpY2VfYW1vdW50czogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgKG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXSkubWFwKChjdXJyZW5jeSkgPT4gW2N1cnJlbmN5LmNvZGUsIFwiXCJdKSxcbiAgICApLFxuICAgIHN0YXR1czogXCJkcmFmdFwiLFxuICAgIGRpc2NvdW50YWJsZTogZmFsc2UsXG4gICAgc2VsbGVyX2lkOiBcIlwiLFxuICAgIHR5cGVfaWQ6IFwiXCIsXG4gICAgY29sbGVjdGlvbl9pZDogXCJcIixcbiAgICBjYXRlZ29yeV9pZDogXCJcIixcbiAgICB0YWdfaWQ6IFwiXCIsXG4gIH1cbn1cblxuZnVuY3Rpb24gZW1wdHlDb3Vwb24ob3B0aW9uczogT3B0aW9uc1BheWxvYWQpOiBDb3Vwb25Gb3JtU3RhdGUge1xuICBjb25zdCBjdXJyZW5jeUNvZGUgPSBkZWZhdWx0Q3VycmVuY3kob3B0aW9ucylcbiAgY29uc3QgcHVyY2hhc2VDb25kaXRpb25zID0gZGVmYXVsdFB1cmNoYXNlQ29uZGl0aW9ucyhvcHRpb25zKVxuICByZXR1cm4ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgdHlwZTogXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIsXG4gICAgcHVyY2hhc2VfY29uZGl0aW9uczogcHVyY2hhc2VDb25kaXRpb25zLFxuICAgIGFtb3VudHM6IGN1cnJlbmN5Q29kZVxuICAgICAgPyBbXG4gICAgICAgIHtcbiAgICAgICAgICBrZXk6IFwiY291cG9uLXZhbHVlLWRlZmF1bHRcIixcbiAgICAgICAgICBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgICAgYW1vdW50OiBcIlwiLFxuICAgICAgICB9LFxuICAgICAgXVxuICAgICAgOiBbXSxcbiAgICBwZXJjZW50YWdlOiBcIlwiLFxuICAgIGFsbG9jYXRpb246IFwiZWFjaFwiLFxuICAgIGNvZGVfc3RyYXRlZ3k6IFwidW5pcXVlX2NvZGVcIixcbiAgICBjb2RlX3ByZWZpeDogXCJDT1VQT05cIixcbiAgICBzaGFyZWRfY29kZTogXCJcIixcbiAgICBleHBpcmF0aW9uX3R5cGU6IFwiZHVyYXRpb25cIixcbiAgICBleHBpcmF0aW9uX2RheXM6IFwiMzBcIixcbiAgICBleHBpcmF0aW9uX2RhdGU6IFwiXCIsXG4gICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IHRydWUsXG4gICAgZXhwaXJhdGlvbl9jYXBfYXQ6IFwiXCIsXG4gICAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBcIjFcIixcbiAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IFwibm9uZVwiLFxuICAgIHByb21vdGlvbl9zdGF0dXM6IFwiZHJhZnRcIixcbiAgfVxufVxuXG5jb25zdCBlbXB0eUNhbXBhaWduOiBDYW1wYWlnbkZvcm1TdGF0ZSA9IHtcbiAgbW9kZTogXCJub25lXCIsXG4gIGNhbXBhaWduX2lkOiBcIlwiLFxuICBuYW1lOiBcIlwiLFxuICBjYW1wYWlnbl9pZGVudGlmaWVyOiBcIlwiLFxuICBzdGFydHNfYXQ6IFwiXCIsXG4gIGVuZHNfYXQ6IFwiXCIsXG59XG5cbmZ1bmN0aW9uIGZvcm1zRnJvbVJvdyhcbiAgcm93OiBDb3Vwb25Qcm9kdWN0Um93LFxuICBvcHRpb25zOiBPcHRpb25zUGF5bG9hZCxcbik6IHtcbiAgcHJvZHVjdDogUHJvZHVjdEZvcm1TdGF0ZVxuICBjb3Vwb246IENvdXBvbkZvcm1TdGF0ZVxuICBjYW1wYWlnbjogQ2FtcGFpZ25Gb3JtU3RhdGVcbn0ge1xuICBjb25zdCBwcm9kdWN0ID0gcm93LnByb2R1Y3RcbiAgY29uc3QgY29uZmlnID0gcm93LmNvdXBvbl9wcm9kdWN0X2NvbmZpZ1xuICBjb25zdCB2YXJpYW50ID0gcHJvZHVjdC52YXJpYW50cz8uWzBdXG4gIGNvbnN0IHByaWNlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAodmFyaWFudD8ucHJpY2VzIHx8IFtdKVxuICAgICAgLmZpbHRlcigocHJpY2UpID0+IHByaWNlLmN1cnJlbmN5X2NvZGUpXG4gICAgICAubWFwKChwcmljZSkgPT4gW1xuICAgICAgICBTdHJpbmcocHJpY2UuY3VycmVuY3lfY29kZSkudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgcHJpY2UuYW1vdW50ID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHByaWNlLmFtb3VudCksXG4gICAgICBdKSxcbiAgKVxuICBjb25zdCBtZWRpYSA9IEFycmF5LmZyb20oXG4gICAgbmV3IE1hcChcbiAgICAgIFtcbiAgICAgICAgLi4uKHByb2R1Y3QudGh1bWJuYWlsXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1cmw6IHByb2R1Y3QudGh1bWJuYWlsLFxuICAgICAgICAgICAgICAgIGFzc2V0X2lkOiBwcm9kdWN0LnRodW1ibmFpbF9hc3NldF9pZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihwcm9kdWN0LmltYWdlcyB8fCBbXSlcbiAgICAgICAgICAuZmlsdGVyKChpbWFnZSkgPT4gaW1hZ2UudXJsKVxuICAgICAgICAgIC5tYXAoKGltYWdlKSA9PiAoe1xuICAgICAgICAgICAgdXJsOiBTdHJpbmcoaW1hZ2UudXJsKSxcbiAgICAgICAgICAgIGFzc2V0X2lkOiBpbWFnZS5hc3NldF9pZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgfSkpLFxuICAgICAgXS5tYXAoKGl0ZW0pID0+IFtpdGVtLnVybCwgaXRlbV0pLFxuICAgICkudmFsdWVzKCksXG4gIClcbiAgY29uc3QgY29uZmlndXJlZEFtb3VudHMgPVxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLmFtb3VudHMpICYmIGNvbmZpZy5hbW91bnRzLmxlbmd0aFxuICAgICAgPyBjb25maWcuYW1vdW50c1xuICAgICAgOiBjb25maWcuYW1vdW50ICE9IG51bGwgJiYgY29uZmlnLmN1cnJlbmN5X2NvZGVcbiAgICAgICAgPyBbeyBhbW91bnQ6IGNvbmZpZy5hbW91bnQsIGN1cnJlbmN5X2NvZGU6IGNvbmZpZy5jdXJyZW5jeV9jb2RlIH1dXG4gICAgICAgIDogW11cbiAgY29uc3QgY29uZmlndXJlZENvbmRpdGlvbnMgPSAoY29uZmlnLnB1cmNoYXNlX2NvbmRpdGlvbnMgfHwgW10pLm1hcChcbiAgICAoY29uZGl0aW9uLCBpbmRleCkgPT4gKHtcbiAgICAgIGtleTogYGNvbmRpdGlvbi0ke2luZGV4fWAsXG4gICAgICBhdHRyaWJ1dGU6IGNvbmRpdGlvbi5hdHRyaWJ1dGUsXG4gICAgICBvcGVyYXRvcjogY29uZGl0aW9uLm9wZXJhdG9yLFxuICAgICAgdmFsdWVzOiBjb25kaXRpb24udmFsdWVzLm1hcCgodmFsdWUpID0+XG4gICAgICAgIGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiIHx8XG4gICAgICAgICAgY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJzaGlwcGluZ19hZGRyZXNzLmNvdW50cnlfY29kZVwiXG4gICAgICAgICAgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgOiB2YWx1ZSxcbiAgICAgICksXG4gICAgfSksXG4gIClcbiAgaWYgKFxuICAgICFjb25maWd1cmVkQ29uZGl0aW9ucy5zb21lKFxuICAgICAgKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIsXG4gICAgKSAmJlxuICAgIGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiZcbiAgICBjb25maWd1cmVkQW1vdW50cy5sZW5ndGhcbiAgKSB7XG4gICAgY29uZmlndXJlZENvbmRpdGlvbnMucHVzaCh7XG4gICAgICBrZXk6IFwiY29uZGl0aW9uLWxlZ2FjeS1jdXJyZW5jeVwiLFxuICAgICAgYXR0cmlidXRlOiBcImN1cnJlbmN5X2NvZGVcIixcbiAgICAgIG9wZXJhdG9yOiBjb25maWd1cmVkQW1vdW50cy5sZW5ndGggPT09IDEgPyBcImVxXCIgOiBcImluXCIsXG4gICAgICB2YWx1ZXM6IGNvbmZpZ3VyZWRBbW91bnRzLm1hcCgoYW1vdW50KSA9PlxuICAgICAgICBhbW91bnQuY3VycmVuY3lfY29kZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgKSxcbiAgICB9KVxuICB9XG4gIGlmIChcbiAgICAhY29uZmlndXJlZENvbmRpdGlvbnMuc29tZShcbiAgICAgIChjb25kaXRpb24pID0+IGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwic2FsZXNfY2hhbm5lbF9pZFwiLFxuICAgICkgJiZcbiAgICBwcm9kdWN0LnNhbGVzX2NoYW5uZWxzPy5sZW5ndGhcbiAgKSB7XG4gICAgY29uZmlndXJlZENvbmRpdGlvbnMucHVzaCh7XG4gICAgICBrZXk6IFwiY29uZGl0aW9uLWxlZ2FjeS1zYWxlcy1jaGFubmVsXCIsXG4gICAgICBhdHRyaWJ1dGU6IFwic2FsZXNfY2hhbm5lbF9pZFwiLFxuICAgICAgb3BlcmF0b3I6IHByb2R1Y3Quc2FsZXNfY2hhbm5lbHMubGVuZ3RoID09PSAxID8gXCJlcVwiIDogXCJpblwiLFxuICAgICAgdmFsdWVzOiBwcm9kdWN0LnNhbGVzX2NoYW5uZWxzLm1hcCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5pZCksXG4gICAgfSlcbiAgfVxuICBjb25zdCBleHBpcmF0aW9uUG9saWN5ID0gY29uZmlnLmV4cGlyYXRpb25fcG9saWN5XG4gIGNvbnN0IGNvbmZpZ3VyZWRBbW91bnRSb3dzID0gY29uZmlndXJlZEFtb3VudHMubWFwKChyb3csIGluZGV4KSA9PiAoe1xuICAgIGtleTogYGNvdXBvbi12YWx1ZS0ke2luZGV4fWAsXG4gICAgYW1vdW50OiBTdHJpbmcocm93LmFtb3VudCksXG4gICAgY3VycmVuY3lfY29kZTogcm93LmN1cnJlbmN5X2NvZGUudG9Mb3dlckNhc2UoKSxcbiAgfSkpXG4gIGNvbnN0IGFtb3VudFJvd3MgPVxuICAgIGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgID8gcmVjb25jaWxlQ291cG9uQW1vdW50cyhcbiAgICAgICAgY29uZmlndXJlZEFtb3VudFJvd3MsXG4gICAgICAgIGVmZmVjdGl2ZUNvdXBvbkN1cnJlbmNpZXMoY29uZmlndXJlZENvbmRpdGlvbnMsIG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXSksXG4gICAgICApXG4gICAgICA6IGNvbmZpZ3VyZWRBbW91bnRSb3dzXG5cbiAgcmV0dXJuIHtcbiAgICBwcm9kdWN0OiB7XG4gICAgICAuLi5lbXB0eVByb2R1Y3Qob3B0aW9ucyksXG4gICAgICB0aXRsZTogcHJvZHVjdC50aXRsZSB8fCBcIlwiLFxuICAgICAgc3VidGl0bGU6IHByb2R1Y3Quc3VidGl0bGUgfHwgXCJcIixcbiAgICAgIGhhbmRsZTogcHJvZHVjdC5oYW5kbGUgfHwgXCJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9kdWN0LmRlc2NyaXB0aW9uIHx8IFwiXCIsXG4gICAgICBtZWRpYSxcbiAgICAgIHNrdTogdmFyaWFudD8uc2t1IHx8IFwiXCIsXG4gICAgICBwcmljZV9hbW91bnRzOiB7XG4gICAgICAgIC4uLmVtcHR5UHJvZHVjdChvcHRpb25zKS5wcmljZV9hbW91bnRzLFxuICAgICAgICAuLi5wcmljZXMsXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiBwcm9kdWN0LnN0YXR1cyB8fCBcImRyYWZ0XCIsXG4gICAgICBkaXNjb3VudGFibGU6IEJvb2xlYW4ocHJvZHVjdC5kaXNjb3VudGFibGUpLFxuICAgICAgdHlwZV9pZDogcHJvZHVjdC50eXBlX2lkIHx8IFwiXCIsXG4gICAgICBjb2xsZWN0aW9uX2lkOiBwcm9kdWN0LmNvbGxlY3Rpb25faWQgfHwgXCJcIixcbiAgICAgIGNhdGVnb3J5X2lkOiBwcm9kdWN0LmNhdGVnb3JpZXM/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIHRhZ19pZDogcHJvZHVjdC50YWdzPy5bMF0/LmlkIHx8IFwiXCIsXG4gICAgfSxcbiAgICBjb3Vwb246IHtcbiAgICAgIC4uLmVtcHR5Q291cG9uKG9wdGlvbnMpLFxuICAgICAgZW5hYmxlZDogY29uZmlnLmVuYWJsZWQsXG4gICAgICB0eXBlOiBjb3Vwb25UeXBlRnJvbUNvbmZpZyhjb25maWcpLFxuICAgICAgcHVyY2hhc2VfY29uZGl0aW9uczogY29uZmlndXJlZENvbmRpdGlvbnMsXG4gICAgICBhbW91bnRzOlxuICAgICAgICBjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgPyBhbW91bnRSb3dzXG4gICAgICAgICAgOiBhbW91bnRSb3dzLmxlbmd0aFxuICAgICAgICAgICAgPyBhbW91bnRSb3dzXG4gICAgICAgICAgICA6IGVtcHR5Q291cG9uKG9wdGlvbnMpLmFtb3VudHMsXG4gICAgICBwZXJjZW50YWdlOiBjb25maWcucGVyY2VudGFnZSA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhjb25maWcucGVyY2VudGFnZSksXG4gICAgICBhbGxvY2F0aW9uOlxuICAgICAgICBjb25maWcucHJvbW90aW9uX3RlbXBsYXRlPy5hcHBsaWNhdGlvbl9tZXRob2Q/LmFsbG9jYXRpb24gPT09IFwib25jZVwiXG4gICAgICAgICAgPyAoXCJvbmNlXCIgYXMgY29uc3QpXG4gICAgICAgICAgOiAoXCJlYWNoXCIgYXMgY29uc3QpLFxuICAgICAgY29kZV9zdHJhdGVneTogY29uZmlnLmNvZGVfc3RyYXRlZ3ksXG4gICAgICBjb2RlX3ByZWZpeDogY29uZmlnLmNvZGVfcHJlZml4IHx8IFwiXCIsXG4gICAgICBzaGFyZWRfY29kZTogY29uZmlnLnNoYXJlZF9jb2RlIHx8IFwiXCIsXG4gICAgICBleHBpcmF0aW9uX3R5cGU6IGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSB8fCBcImR1cmF0aW9uXCIsXG4gICAgICBleHBpcmF0aW9uX2RheXM6XG4gICAgICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSA9PT0gXCJkdXJhdGlvblwiXG4gICAgICAgICAgPyBTdHJpbmcoY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmR1cmF0aW9uX2RheXMpXG4gICAgICAgICAgOiBcIjMwXCIsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6XG4gICAgICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSA9PT0gXCJmaXhlZFwiXG4gICAgICAgICAgPyB0b0RhdGVUaW1lTG9jYWwoY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmV4cGlyZXNfYXQpXG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246XG4gICAgICAgIGV4cGlyYXRpb25Qb2xpY3kudHlwZSA9PT0gXCJub25lXCIgfHxcbiAgICAgICAgZXhwaXJhdGlvblBvbGljeS5jYXBfYnlfY2FtcGFpZ24gIT09IGZhbHNlLFxuICAgICAgZXhwaXJhdGlvbl9jYXBfYXQ6XG4gICAgICAgIGV4cGlyYXRpb25Qb2xpY3kudHlwZSA9PT0gXCJub25lXCJcbiAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICA6IHRvRGF0ZVRpbWVMb2NhbChleHBpcmF0aW9uUG9saWN5LmNhcF9hdCksXG4gICAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IFN0cmluZyhcbiAgICAgICAgY29uZmlnLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSB8fCAxLFxuICAgICAgKSxcbiAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogY29uZmlnLnByb21vdGlvbl9taXJyb3JfbW9kZSB8fCBcIm5vbmVcIixcbiAgICAgIHByb21vdGlvbl9zdGF0dXM6IGNvbmZpZy5wcm9tb3Rpb25fc3RhdHVzIHx8IFwiZHJhZnRcIixcbiAgICB9LFxuICAgIGNhbXBhaWduOiB7XG4gICAgICAuLi5lbXB0eUNhbXBhaWduLFxuICAgICAgbW9kZTogY29uZmlnLmNhbXBhaWduX2lkID8gKFwiZXhpc3RpbmdcIiBhcyBjb25zdCkgOiAoXCJub25lXCIgYXMgY29uc3QpLFxuICAgICAgY2FtcGFpZ25faWQ6IGNvbmZpZy5jYW1wYWlnbl9pZCB8fCBcIlwiLFxuICAgIH0sXG4gIH1cbn1cblxuY29uc3QgbW9kYWxDb250ZW50U3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbn1cblxuY29uc3QgbW9kYWxXaXphcmRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXg6IFwiMSAxIGF1dG9cIixcbiAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgbWluSGVpZ2h0OiAwLFxuICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbn1cblxuY29uc3QgdmlzdWFsbHlIaWRkZW5TdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgY2xpcDogXCJyZWN0KDAgMCAwIDApXCIsXG4gIGNsaXBQYXRoOiBcImluc2V0KDUwJSlcIixcbiAgaGVpZ2h0OiAxLFxuICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgd2hpdGVTcGFjZTogXCJub3dyYXBcIixcbiAgd2lkdGg6IDEsXG59XG5cbmNvbnN0IG1vZGFsQm9keVN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBmbGV4OiBcIjEgMSBhdXRvXCIsXG4gIG1pbkhlaWdodDogMCxcbiAgcGFkZGluZzogMCxcbn1cblxuY29uc3QgbW9kYWxTY3JvbGxTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgb3ZlcmZsb3dZOiBcImF1dG9cIixcbiAgcGFkZGluZzogXCI2NHB4IDI0cHggMTEycHhcIixcbiAgd2lkdGg6IFwiMTAwJVwiLFxufVxuXG5jb25zdCBtb2RhbEZvcm1TdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgbWFyZ2luOiBcIjAgYXV0b1wiLFxuICBtYXhXaWR0aDogNzIwLFxuICB3aWR0aDogXCJtaW4oNzIwcHgsIDEwMCUpXCIsXG59XG5cbmNvbnN0IHN0YWNrU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBnYXA6IDI0LFxufVxuXG5jb25zdCB0d29Db2x1bW5HcmlkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICBnYXA6IDE2LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDI2MHB4LCAxZnIpKVwiLFxufVxuXG5jb25zdCB0aHJlZUNvbHVtbkdyaWRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJncmlkXCIsXG4gIGdhcDogMTYsXG4gIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMTgwcHgsIDFmcikpXCIsXG59XG5cbmNvbnN0IHBhbmVsU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGJvcmRlcjogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gIGJvcmRlclJhZGl1czogOCxcbiAgcGFkZGluZzogMTYsXG59XG5cbmZ1bmN0aW9uIEZpZWxkKHtcbiAgY2hpbGRyZW4sXG4gIGxhYmVsLFxuICBvcHRpb25hbCxcbiAgdG9vbHRpcCxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZVxuICBsYWJlbDogc3RyaW5nXG4gIG9wdGlvbmFsPzogYm9vbGVhblxuICB0b29sdGlwPzogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTFcIiBzdHlsZT17eyBtaW5XaWR0aDogMCB9fT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMVwiPlxuICAgICAgICA8TGFiZWw+e2xhYmVsfTwvTGFiZWw+XG4gICAgICAgIHt0b29sdGlwICYmIChcbiAgICAgICAgICA8VG9vbHRpcCBjb250ZW50PXt0b29sdGlwfT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2Ake2xhYmVsfSBpbmZvcm1hdGlvbmB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8SW5mb3JtYXRpb25DaXJjbGUgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgKX1cbiAgICAgICAge29wdGlvbmFsICYmIChcbiAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAoT3B0aW9uYWwpXG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VjdGlvbih7XG4gIGNoaWxkcmVuLFxuICBkZXNjcmlwdGlvbixcbiAgdGl0bGUsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktNFwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMlwiPnt0aXRsZX08L0hlYWRpbmc+XG4gICAgICAgIHtkZXNjcmlwdGlvbiAmJiAoXG4gICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAge2Rlc2NyaXB0aW9ufVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvc2VjdGlvbj5cbiAgKVxufVxuXG5mdW5jdGlvbiBPcHRpb25TZWxlY3Qoe1xuICBvbkNoYW5nZSxcbiAgb3B0aW9ucyxcbiAgdmFsdWUsXG59OiB7XG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICBvcHRpb25zOiBPcHRpb25SZWNvcmRbXVxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFxuICAgICAgdmFsdWU9e3ZhbHVlIHx8IE5PTkV9XG4gICAgICBvblZhbHVlQ2hhbmdlPXsobmV4dCkgPT4gb25DaGFuZ2UobmV4dCA9PT0gTk9ORSA/IFwiXCIgOiBuZXh0KX1cbiAgICA+XG4gICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT17Tk9ORX0+Tm9uZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgIHtvcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17b3B0aW9uLmlkfSB2YWx1ZT17b3B0aW9uLmlkfT5cbiAgICAgICAgICAgIHtvcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICkpfVxuICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICA8L1NlbGVjdD5cbiAgKVxufVxuXG5mdW5jdGlvbiBDdXJyZW5jeVNlbGVjdCh7XG4gIGN1cnJlbmNpZXMsXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXVxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RcbiAgICAgIHZhbHVlPXt2YWx1ZSB8fCB1bmRlZmluZWR9XG4gICAgICBkaXNhYmxlZD17IWN1cnJlbmNpZXMubGVuZ3RofVxuICAgICAgb25WYWx1ZUNoYW5nZT17b25DaGFuZ2V9XG4gICAgPlxuICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICA8U2VsZWN0LlZhbHVlXG4gICAgICAgICAgcGxhY2Vob2xkZXI9e1xuICAgICAgICAgICAgY3VycmVuY2llcy5sZW5ndGggPyBcIlNlbGVjdCBjdXJyZW5jeVwiIDogXCJObyBjdXJyZW5jaWVzIGF2YWlsYWJsZVwiXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAge2N1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gKFxuICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e2N1cnJlbmN5LmNvZGV9IHZhbHVlPXtjdXJyZW5jeS5jb2RlfT5cbiAgICAgICAgICAgIHtjdXJyZW5jeS5uYW1lfSAoe2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX0pXG4gICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgKSl9XG4gICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgIDwvU2VsZWN0PlxuICApXG59XG5cbmZ1bmN0aW9uIEN1cnJlbmN5QW1vdW50RmllbGQoe1xuICBjdXJyZW5jaWVzLFxuICBjdXJyZW5jeUNvZGUsXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXVxuICBjdXJyZW5jeUNvZGU6IHN0cmluZ1xuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBjdXJyZW5jeUNvZGUpXG4gIGNvbnN0IGNvZGUgPSBjdXJyZW5jeUNvZGUudG9VcHBlckNhc2UoKVxuICBjb25zdCBkZWNpbWFscyA9IGN1cnJlbmN5RGVjaW1hbERpZ2l0cyhjb2RlIHx8IFwiVVNEXCIpXG4gIHJldHVybiAoXG4gICAgPEN1cnJlbmN5SW5wdXRcbiAgICAgIGNvZGU9e2NvZGUgfHwgXCJVU0RcIn1cbiAgICAgIHN5bWJvbD17XG4gICAgICAgIGN1cnJlbmN5Py5zeW1ib2xfbmF0aXZlIHx8XG4gICAgICAgIGN1cnJlbmN5Py5zeW1ib2wgfHxcbiAgICAgICAgY3VycmVuY3lTeW1ib2woY29kZSB8fCBcIlVTRFwiKVxuICAgICAgfVxuICAgICAgbWluPXswfVxuICAgICAgZGVjaW1hbFNjYWxlPXtkZWNpbWFsc31cbiAgICAgIGRlY2ltYWxzTGltaXQ9e2RlY2ltYWxzfVxuICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgZGlzYWJsZWQ9eyFjdXJyZW5jeUNvZGV9XG4gICAgICBvblZhbHVlQ2hhbmdlPXsobmV4dFZhbHVlKSA9PiBvbkNoYW5nZShuZXh0VmFsdWUgfHwgXCJcIil9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBQZXJjZW50YWdlSW5wdXQoe1xuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1zdHJldGNoXCIgc3R5bGU9e3sgd2lkdGg6IFwiMTAwJVwiIH19PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJiZy11aS1iZy1maWVsZCB0ZXh0LXVpLWZnLW11dGVkIGZsZXggaXRlbXMtY2VudGVyIGJvcmRlclwiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6IFwidmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjZweCAwIDAgNnB4XCIsXG4gICAgICAgICAgYm9yZGVyUmlnaHQ6IDAsXG4gICAgICAgICAgcGFkZGluZzogXCIwIDEycHhcIixcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgJVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cIm1pbi13LTAgZmxleC0xXCJcbiAgICAgICAgc3R5bGU9e3sgZmxleDogXCIxIDEgMCVcIiwgbWluV2lkdGg6IDAgfX1cbiAgICAgID5cbiAgICAgICAgPElucHV0XG4gICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsXCJcbiAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICBtaW49ezF9XG4gICAgICAgICAgbWF4PXsxMDB9XG4gICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiMCA2cHggNnB4IDBcIixcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IG9uQ2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSl9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBIYW5kbGVJbnB1dCh7XG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWQgcG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIHotMTAgZmxleCBtaW4tdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXItciBweC0yLjVcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidHh0LWNvbXBhY3Qtc21hbGwgZm9udC1tZWRpdW1cIj4vPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8SW5wdXRcbiAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICBwbGFjZWhvbGRlcj1cIndpbnRlci1qYWNrZXRcIlxuICAgICAgICBzdHlsZT17eyBwYWRkaW5nTGVmdDogMzQgfX1cbiAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gb25DaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZnVuY3Rpb24gTWVkaWFVcGxvYWQoe1xuICBpc1VwbG9hZGluZyxcbiAgbWVkaWEsXG4gIG9uUmVtb3ZlLFxuICBvblVwbG9hZCxcbn06IHtcbiAgaXNVcGxvYWRpbmc6IGJvb2xlYW5cbiAgbWVkaWE6IFByb2R1Y3RNZWRpYVtdXG4gIG9uUmVtb3ZlOiAobWVkaWE6IFByb2R1Y3RNZWRpYSkgPT4gdm9pZFxuICBvblVwbG9hZDogKGZpbGVzOiBGaWxlW10pID0+IHZvaWRcbn0pIHtcbiAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWY8SFRNTElucHV0RWxlbWVudD4obnVsbClcbiAgY29uc3QgYWNjZXB0ID1cbiAgICBcImltYWdlL2pwZWcsaW1hZ2UvcG5nLGltYWdlL2dpZixpbWFnZS93ZWJwLGltYWdlL2hlaWMsaW1hZ2Uvc3ZnK3htbFwiXG5cbiAgY29uc3QgaGFuZGxlRmlsZXMgPSAoZmlsZXM6IEZpbGVMaXN0IHwgbnVsbCkgPT4ge1xuICAgIGlmICghZmlsZXM/Lmxlbmd0aCkgcmV0dXJuXG4gICAgb25VcGxvYWQoQXJyYXkuZnJvbShmaWxlcykpXG4gIH1cblxuICBjb25zdCBoYW5kbGVEcm9wID0gKGV2ZW50OiBEcmFnRXZlbnQ8SFRNTEJ1dHRvbkVsZW1lbnQ+KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGhhbmRsZUZpbGVzKGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcylcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTNcIj5cbiAgICAgIHttZWRpYS5sZW5ndGggPiAwICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImdyaWQgZ2FwLTNcIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMjBweCwgMWZyKSlcIixcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge21lZGlhLm1hcCgoaXRlbSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAga2V5PXtpdGVtLmFzc2V0X2lkIHx8IGl0ZW0udXJsfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZCBib3JkZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgc3JjPXtpdGVtLnVybH1cbiAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtMzIgdy1mdWxsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgaGVpZ2h0OiAxMjggfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC14LTAgYm90dG9tLTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJnLWJsYWNrLzYwIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJ4c21hbGxcIiBzdHlsZT17eyBjb2xvcjogXCJ3aGl0ZVwiIH19PlxuICAgICAgICAgICAgICAgICAge2luZGV4ID09PSAwID8gXCJUaHVtYm5haWxcIiA6IGBJbWFnZSAke2luZGV4ICsgMX1gfVxuICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6IFwid2hpdGVcIiB9fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25SZW1vdmUoaXRlbSl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPFhNYXJrTWluaSAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8aW5wdXRcbiAgICAgICAgcmVmPXtpbnB1dFJlZn1cbiAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICBoaWRkZW5cbiAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgYWNjZXB0PXthY2NlcHR9XG4gICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHtcbiAgICAgICAgICBoYW5kbGVGaWxlcyhldmVudC50YXJnZXQuZmlsZXMpXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gXCJcIlxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGRpc2FibGVkPXtpc1VwbG9hZGluZ31cbiAgICAgICAgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZCBmbGV4IHctZnVsbCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLXktMiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItZGFzaGVkIHAtOFwiXG4gICAgICAgIHN0eWxlPXt7IG1pbkhlaWdodDogMTQ4IH19XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IGlucHV0UmVmLmN1cnJlbnQ/LmNsaWNrKCl9XG4gICAgICAgIG9uRHJhZ092ZXI9eyhldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKX1cbiAgICAgICAgb25Ecm9wPXtoYW5kbGVEcm9wfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLWJhc2UgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMlwiPlxuICAgICAgICAgIDxBcnJvd1VwVHJheSAvPlxuICAgICAgICAgIHtpc1VwbG9hZGluZyA/IFwiVXBsb2FkaW5nIGltYWdlcy4uLlwiIDogXCJVcGxvYWQgaW1hZ2VzXCJ9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgIERyYWcgYW5kIGRyb3AgaW1hZ2VzIGhlcmUgb3IgY2xpY2sgdG8gdXBsb2FkLlxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG50eXBlIENvbmRpdGlvblZhbHVlT3B0aW9uID0geyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1cblxuZnVuY3Rpb24gY29uZGl0aW9uVmFsdWVPcHRpb25zKFxuICBhdHRyaWJ1dGU6IFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlIHwgXCJcIixcbiAgb3B0aW9uczogT3B0aW9uc1BheWxvYWQsXG4pOiBDb25kaXRpb25WYWx1ZU9wdGlvbltdIHtcbiAgaWYgKGF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIpIHtcbiAgICByZXR1cm4gKG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXSkubWFwKChjdXJyZW5jeSkgPT4gKHtcbiAgICAgIHZhbHVlOiBjdXJyZW5jeS5jb2RlLFxuICAgICAgbGFiZWw6IGAke2N1cnJlbmN5Lm5hbWV9ICgke2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX0pYCxcbiAgICB9KSlcbiAgfVxuICBpZiAoYXR0cmlidXRlID09PSBcInNoaXBwaW5nX2FkZHJlc3MuY291bnRyeV9jb2RlXCIpIHtcbiAgICByZXR1cm4gKG9wdGlvbnMuY291bnRyaWVzIHx8IFtdKS5tYXAoKGNvdW50cnkpID0+ICh7XG4gICAgICB2YWx1ZTogU3RyaW5nKGNvdW50cnkuaXNvXzIgfHwgY291bnRyeS5pZCkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGxhYmVsOiBjb3VudHJ5LmRpc3BsYXlfbmFtZSB8fCBjb3VudHJ5Lm5hbWUgfHwgY291bnRyeS5pZCxcbiAgICB9KSlcbiAgfVxuXG4gIGNvbnN0IHJlY29yZHMgPVxuICAgIGF0dHJpYnV0ZSA9PT0gXCJjdXN0b21lci5ncm91cHMuaWRcIlxuICAgICAgPyBvcHRpb25zLmN1c3RvbWVyX2dyb3Vwc1xuICAgICAgOiBhdHRyaWJ1dGUgPT09IFwicmVnaW9uLmlkXCJcbiAgICAgICAgPyBvcHRpb25zLnJlZ2lvbnNcbiAgICAgICAgOiBhdHRyaWJ1dGUgPT09IFwic2FsZXNfY2hhbm5lbF9pZFwiXG4gICAgICAgICAgPyBvcHRpb25zLnNhbGVzX2NoYW5uZWxzXG4gICAgICAgICAgOiBbXVxuICByZXR1cm4gKHJlY29yZHMgfHwgW10pLm1hcCgocmVjb3JkKSA9PiAoe1xuICAgIHZhbHVlOiByZWNvcmQuaWQsXG4gICAgbGFiZWw6IG9wdGlvbkxhYmVsKHJlY29yZCksXG4gIH0pKVxufVxuXG5mdW5jdGlvbiBNdWx0aUNvbmRpdGlvblZhbHVlcyh7XG4gIGF0dHJpYnV0ZSxcbiAgb25DaGFuZ2UsXG4gIG9wdGlvbnMsXG4gIHZhbHVlLFxufToge1xuICBhdHRyaWJ1dGU6IFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZ1tdKSA9PiB2b2lkXG4gIG9wdGlvbnM6IENvbmRpdGlvblZhbHVlT3B0aW9uW11cbiAgdmFsdWU6IHN0cmluZ1tdXG59KSB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbZHJhZnQsIHNldERyYWZ0XSA9IHVzZVN0YXRlKHZhbHVlKVxuICBjb25zdCBbc2VhcmNoLCBzZXRTZWFyY2hdID0gdXNlU3RhdGUoXCJcIilcbiAgY29uc3QgbGFiZWxzID0gT2JqZWN0LmZyb21FbnRyaWVzKG9wdGlvbnMubWFwKChvcHRpb24pID0+IFtvcHRpb24udmFsdWUsIG9wdGlvbi5sYWJlbF0pKVxuICBjb25zdCBmaWx0ZXJlZCA9IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+XG4gICAgb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwganVzdGlmeS1zdGFydFwiXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICBzZXREcmFmdCh2YWx1ZSlcbiAgICAgICAgICBzZXRTZWFyY2goXCJcIilcbiAgICAgICAgICBzZXRPcGVuKHRydWUpXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHt2YWx1ZS5sZW5ndGhcbiAgICAgICAgICA/IHZhbHVlLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBsYWJlbHNbdmFsdWVbMF1dIHx8IHZhbHVlWzBdXG4gICAgICAgICAgICA6IGAke3ZhbHVlLmxlbmd0aH0gdmFsdWVzIHNlbGVjdGVkYFxuICAgICAgICAgIDogXCJTZWxlY3QgdmFsdWVzXCJ9XG4gICAgICA8L0J1dHRvbj5cbiAgICAgIHt2YWx1ZS5sZW5ndGggPiAwICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZsZXggZmxleC13cmFwIGdhcC0xXCI+XG4gICAgICAgICAge3ZhbHVlLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAga2V5PXtpdGVtfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJiZy11aS1iZy1jb21wb25lbnQgdGV4dC11aS1mZy1zdWJ0bGUgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMSByb3VuZGVkLW1kIGJvcmRlciBweC0yIHB5LTEgdGV4dC14c1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtsYWJlbHNbaXRlbV0gfHwgaXRlbX1cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2BSZW1vdmUgJHtsYWJlbHNbaXRlbV0gfHwgaXRlbX1gfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uQ2hhbmdlKHZhbHVlLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSBpdGVtKSl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8WE1hcmtNaW5pIC8+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8RHJhd2VyIG9wZW49e29wZW59IG9uT3BlbkNoYW5nZT17c2V0T3Blbn0+XG4gICAgICAgIDxEcmF3ZXIuQ29udGVudD5cbiAgICAgICAgICA8RHJhd2VyLkhlYWRlcj5cbiAgICAgICAgICAgIDxEcmF3ZXIuVGl0bGU+XG4gICAgICAgICAgICAgIFNlbGVjdCB7Y29uZGl0aW9uQXR0cmlidXRlcy5maW5kKChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSBhdHRyaWJ1dGUpPy5sYWJlbH1cbiAgICAgICAgICAgIDwvRHJhd2VyLlRpdGxlPlxuICAgICAgICAgIDwvRHJhd2VyLkhlYWRlcj5cbiAgICAgICAgICA8RHJhd2VyLkJvZHkgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0zIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgIHZhbHVlPXtzZWFyY2h9XG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHZhbHVlc1wiXG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IHNldFNlYXJjaChldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHtmaWx0ZXJlZC5sZW5ndGggPyAoXG4gICAgICAgICAgICAgIGZpbHRlcmVkLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICBrZXk9e29wdGlvbi52YWx1ZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIGdhcC14LTMgcm91bmRlZC1tZCBib3JkZXIgcC0zXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17ZHJhZnQuaW5jbHVkZXMob3B0aW9uLnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXREcmFmdCgoY3VycmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmN1cnJlbnQsIG9wdGlvbi52YWx1ZV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnQuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IG9wdGlvbi52YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPFRleHQ+e29wdGlvbi5sYWJlbH08L1RleHQ+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxUZXh0IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5ObyBtYXRjaGluZyB2YWx1ZXMuPC9UZXh0PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0RyYXdlci5Cb2R5PlxuICAgICAgICAgIDxEcmF3ZXIuRm9vdGVyPlxuICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdmFyaWFudD1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpID0+IHNldE9wZW4oZmFsc2UpfT5cbiAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGRpc2FibGVkPXshZHJhZnQubGVuZ3RofVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgb25DaGFuZ2UoZHJhZnQpXG4gICAgICAgICAgICAgICAgc2V0T3BlbihmYWxzZSlcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQXBwbHlcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDwvRHJhd2VyLkZvb3Rlcj5cbiAgICAgICAgPC9EcmF3ZXIuQ29udGVudD5cbiAgICAgIDwvRHJhd2VyPlxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIFB1cmNoYXNlQ29uZGl0aW9uc0ZpZWxkKHtcbiAgZml4ZWRBbW91bnQsXG4gIG9uQ2hhbmdlLFxuICBvcHRpb25zLFxuICB2YWx1ZSxcbn06IHtcbiAgZml4ZWRBbW91bnQ6IGJvb2xlYW5cbiAgb25DaGFuZ2U6IChjb25kaXRpb25zOiBQdXJjaGFzZUNvbmRpdGlvbkZvcm1bXSkgPT4gdm9pZFxuICBvcHRpb25zOiBPcHRpb25zUGF5bG9hZFxuICB2YWx1ZTogUHVyY2hhc2VDb25kaXRpb25Gb3JtW11cbn0pIHtcbiAgY29uc3Qgc2VsZWN0ZWRBdHRyaWJ1dGVzID0gbmV3IFNldChcbiAgICB2YWx1ZS5tYXAoKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLmF0dHJpYnV0ZSkuZmlsdGVyKEJvb2xlYW4pLFxuICApXG5cbiAgY29uc3QgcmVwbGFjZSA9IChrZXk6IHN0cmluZywgdXBkYXRlOiBQYXJ0aWFsPFB1cmNoYXNlQ29uZGl0aW9uRm9ybT4pID0+XG4gICAgb25DaGFuZ2UoXG4gICAgICB2YWx1ZS5tYXAoKGNvbmRpdGlvbikgPT5cbiAgICAgICAgY29uZGl0aW9uLmtleSA9PT0ga2V5ID8geyAuLi5jb25kaXRpb24sIC4uLnVwZGF0ZSB9IDogY29uZGl0aW9uLFxuICAgICAgKSxcbiAgICApXG5cbiAgcmV0dXJuIChcbiAgICA8U2VjdGlvblxuICAgICAgdGl0bGU9XCJXaG8gY2FuIHB1cmNoYXNlIHRoaXMgY291cG9uP1wiXG4gICAgICBkZXNjcmlwdGlvbj1cIkNvdXBvbiBwcm9kdWN0cyBjYW4gYmUgcHVyY2hhc2VkIGJ5IGFsbCBjdXN0b21lcnMgd2hlbiBubyBjb25kaXRpb25zIGFyZSBjb25maWd1cmVkLiBDb25kaXRpb25zIGFyZSBjb21iaW5lZCB3aXRoIEFORC5cIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0zXCI+XG4gICAgICAgIHt2YWx1ZS5tYXAoKGNvbmRpdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBjb25kaXRpb25WYWx1ZU9wdGlvbnMoY29uZGl0aW9uLmF0dHJpYnV0ZSwgb3B0aW9ucylcbiAgICAgICAgICBjb25zdCBjdXJyZW5jeVJlcXVpcmVkID1cbiAgICAgICAgICAgIGZpeGVkQW1vdW50ICYmIGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYga2V5PXtjb25kaXRpb24ua2V5fT5cbiAgICAgICAgICAgICAge2luZGV4ID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkIGZsZXggaC04IGl0ZW1zLWNlbnRlciB0ZXh0LXhzIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICBBTkRcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cGFuZWxTdHlsZX0gY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleCBmbGV4LWNvbCBnYXAteS0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGdhcC14LTJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29uZGl0aW9uLmF0dHJpYnV0ZSB8fCB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2N1cnJlbmN5UmVxdWlyZWR9XG4gICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KGF0dHJpYnV0ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoY29uZGl0aW9uLmtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU6IGF0dHJpYnV0ZSBhcyBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgcGxhY2Vob2xkZXI9XCJTZWxlY3QgYXR0cmlidXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb25kaXRpb25BdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJpYnV0ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS52YWx1ZSA9PT0gY29uZGl0aW9uLmF0dHJpYnV0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXNlbGVjdGVkQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChhdHRyaWJ1dGUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXthdHRyaWJ1dGUudmFsdWV9IHZhbHVlPXthdHRyaWJ1dGUudmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2F0dHJpYnV0ZS5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2N1cnJlbmN5UmVxdWlyZWR9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZW1vdmUgY29uZGl0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZSh2YWx1ZS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0ua2V5ICE9PSBjb25kaXRpb24ua2V5KSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8WE1hcmtNaW5pIC8+XG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29uZGl0aW9uLm9wZXJhdG9yIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjb25kaXRpb24uYXR0cmlidXRlfVxuICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsob3BlcmF0b3IpID0+XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZShjb25kaXRpb24ua2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogb3BlcmF0b3IgYXMgUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPT09IFwiZXFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29uZGl0aW9uLnZhbHVlcy5zbGljZSgwLCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uZGl0aW9uLnZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIHBsYWNlaG9sZGVyPVwiU2VsZWN0IG9wZXJhdG9yXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIHtjb25kaXRpb25PcGVyYXRvcnMubWFwKChvcGVyYXRvcikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17b3BlcmF0b3IudmFsdWV9IHZhbHVlPXtvcGVyYXRvci52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtvcGVyYXRvci5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgIHtjb25kaXRpb24uYXR0cmlidXRlICYmIGNvbmRpdGlvbi5vcGVyYXRvciA9PT0gXCJlcVwiID8gKFxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbmRpdGlvbi52YWx1ZXNbMF0gfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhzZWxlY3RlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoY29uZGl0aW9uLmtleSwgeyB2YWx1ZXM6IFtzZWxlY3RlZF0gfSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIHBsYWNlaG9sZGVyPVwiU2VsZWN0IHZhbHVlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZXMubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17b3B0aW9uLnZhbHVlfSB2YWx1ZT17b3B0aW9uLnZhbHVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICApIDogY29uZGl0aW9uLmF0dHJpYnV0ZSAmJiBjb25kaXRpb24ub3BlcmF0b3IgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxNdWx0aUNvbmRpdGlvblZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZT17Y29uZGl0aW9uLmF0dHJpYnV0ZX1cbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXt2YWx1ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbmRpdGlvbi52YWx1ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZXMpID0+IHJlcGxhY2UoY29uZGl0aW9uLmtleSwgeyB2YWx1ZXMgfSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgZGlzYWJsZWQgY2xhc3NOYW1lPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKVxuICAgICAgICB9KX1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIGRpc2FibGVkPXtzZWxlY3RlZEF0dHJpYnV0ZXMuc2l6ZSA+PSBjb25kaXRpb25BdHRyaWJ1dGVzLmxlbmd0aH1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgIG9uQ2hhbmdlKFtcbiAgICAgICAgICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgICAgICAgICB7IGtleTogY29uZGl0aW9uS2V5KCksIGF0dHJpYnV0ZTogXCJcIiwgb3BlcmF0b3I6IFwiXCIsIHZhbHVlczogW10gfSxcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8UGx1cyAvPiBBZGQgY29uZGl0aW9uXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB2YXJpYW50PVwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgb25DaGFuZ2UoZml4ZWRBbW91bnQgPyBkZWZhdWx0UHVyY2hhc2VDb25kaXRpb25zKG9wdGlvbnMpIDogW10pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgQ2xlYXIgYWxsXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9TZWN0aW9uPlxuICApXG59XG5cbmZ1bmN0aW9uIFByb2R1Y3RQcmljZXNUYWJsZSh7XG4gIGN1cnJlbmNpZXMsXG4gIGNvdXBvblZhbHVlLFxuICBvbkNoYW5nZSxcbiAgcHJpY2VzLFxufToge1xuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdXG4gIGNvdXBvblZhbHVlOiBzdHJpbmdcbiAgb25DaGFuZ2U6IChjdXJyZW5jeUNvZGU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICBwcmljZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn0pIHtcbiAgY29uc3QgW3Zpc2libGVDdXJyZW5jaWVzLCBzZXRWaXNpYmxlQ3VycmVuY2llc10gPSB1c2VTdGF0ZTxzdHJpbmdbXT4oKCkgPT5cbiAgICBjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpLFxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRWaXNpYmxlQ3VycmVuY2llcygoY3VycmVudCkgPT4ge1xuICAgICAgY29uc3QgYXZhaWxhYmxlID0gbmV3IFNldChjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpKVxuICAgICAgY29uc3QgcmV0YWluZWQgPSBjdXJyZW50LmZpbHRlcigoY29kZSkgPT4gYXZhaWxhYmxlLmhhcyhjb2RlKSlcbiAgICAgIGNvbnN0IGFkZGVkID0gY3VycmVuY2llc1xuICAgICAgICAubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSlcbiAgICAgICAgLmZpbHRlcigoY29kZSkgPT4gIWN1cnJlbnQuaW5jbHVkZXMoY29kZSkpXG4gICAgICByZXR1cm4gWy4uLnJldGFpbmVkLCAuLi5hZGRlZF1cbiAgICB9KVxuICB9LCBbY3VycmVuY2llc10pXG5cbiAgY29uc3Qgc2hvd25DdXJyZW5jaWVzID0gY3VycmVuY2llcy5maWx0ZXIoKGN1cnJlbmN5KSA9PlxuICAgIHZpc2libGVDdXJyZW5jaWVzLmluY2x1ZGVzKGN1cnJlbmN5LmNvZGUpLFxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggc2l6ZS1mdWxsIGZsZXgtY29sIGRpdmlkZS15IG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy11aS1iZy1zdWJ0bGUgZmxleCBzaXplLWZ1bGwgZmxleC1jb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy11aS1iZy1iYXNlIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIj5cbiAgICAgICAgICAgIDxEcm9wZG93bk1lbnU+XG4gICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgIDxBZGp1c3RtZW50cyAvPlxuICAgICAgICAgICAgICAgICAgVmlld1xuICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5UcmlnZ2VyPlxuICAgICAgICAgICAgICA8RHJvcGRvd25NZW51LkNvbnRlbnQgYWxpZ249XCJzdGFydFwiPlxuICAgICAgICAgICAgICAgIHtjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IChcbiAgICAgICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuQ2hlY2tib3hJdGVtXG4gICAgICAgICAgICAgICAgICAgIGtleT17Y3VycmVuY3kuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17dmlzaWJsZUN1cnJlbmNpZXMuaW5jbHVkZXMoY3VycmVuY3kuY29kZSl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZUN1cnJlbmNpZXMoKGN1cnJlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5jdXJyZW50LCBjdXJyZW5jeS5jb2RlXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudC5maWx0ZXIoKGNvZGUpID0+IGNvZGUgIT09IGN1cnJlbmN5LmNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBQcmljZSB7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnUuQ2hlY2tib3hJdGVtPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5Db250ZW50PlxuICAgICAgICAgICAgPC9Ecm9wZG93bk1lbnU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCIgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaXplLWZ1bGwgb3ZlcmZsb3ctYXV0b1wiPlxuICAgICAgICAgIDxUYWJsZVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgYm9yZGVyQ29sbGFwc2U6IFwiY29sbGFwc2VcIixcbiAgICAgICAgICAgICAgdGFibGVMYXlvdXQ6IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgd2lkdGg6IFwibWF4LWNvbnRlbnRcIlxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGFibGUuSGVhZGVyIHN0eWxlPXt7IGJvcmRlclRvcDogXCJub25lXCIgfX0+XG4gICAgICAgICAgICAgIDxUYWJsZS5Sb3cgc3R5bGU9e3sgaGVpZ2h0OiA0MCB9fT5cbiAgICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbFxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1iZy1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNDAsXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMCAxNnB4XCIsXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcInN0aWNreVwiLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIENvdXBvbiBWYWx1ZVxuICAgICAgICAgICAgICAgIDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgICB7c2hvd25DdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IChcbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsXG4gICAgICAgICAgICAgICAgICAgIGtleT17Y3VycmVuY3kuY29kZX1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWJnLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIwIDE2cHhcIixcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0cnVuY2F0ZVwiIHRpdGxlPXtgUHJpY2UgJHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9YH0+XG4gICAgICAgICAgICAgICAgICAgICAgICBQcmljZSB7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7Y3VycmVuY3kuaXNfdGF4X2luY2x1c2l2ZSA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYXhJbmNsdXNpdmUgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZCBzaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUYXhFeGNsdXNpdmUgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZCBzaHJpbmstMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgICAgPC9UYWJsZS5IZWFkZXI+XG4gICAgICAgICAgICA8VGFibGUuQm9keT5cbiAgICAgICAgICAgICAgPFRhYmxlLlJvdyBjbGFzc05hbWU9XCJiZy11aS1iZy1zdWJ0bGVcIiBzdHlsZT17eyBoZWlnaHQ6IDQwIH19PlxuICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWJnLXN1YnRsZSlcIixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjAgMTZweFwiLFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIixcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgekluZGV4OiAxLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJibG9jayB0cnVuY2F0ZVwiPntjb3Vwb25WYWx1ZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgIHtzaG93bkN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGxcbiAgICAgICAgICAgICAgICAgICAga2V5PXtjdXJyZW5jeS5jb2RlfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tYmctYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxUYWJsZVByaWNlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeT17Y3VycmVuY3l9XG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ByaWNlc1tjdXJyZW5jeS5jb2RlXSB8fCBcIlwifVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+IG9uQ2hhbmdlKGN1cnJlbmN5LmNvZGUsIHZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgICA8L1RhYmxlLkJvZHk+XG4gICAgICAgICAgPC9UYWJsZT5cblxuICAgICAgICAgIHshY3VycmVuY2llcy5sZW5ndGggJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTRcIj5cbiAgICAgICAgICAgICAgPFRleHQgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgIEFkZCBhIHN1cHBvcnRlZCBjdXJyZW5jeSB0byB0aGUgc3RvcmUgYmVmb3JlIHNldHRpbmcgcHJpY2VzLlxuICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDb3Vwb25WYWx1ZShcbiAgY291cG9uOiBQaWNrPENvdXBvbkZvcm1TdGF0ZSwgXCJhbW91bnRzXCIgfCBcInBlcmNlbnRhZ2VcIiB8IFwidHlwZVwiPixcbiAgY3VycmVuY2llczogUGljazxDdXJyZW5jeU9wdGlvbiwgXCJjb2RlXCIgfCBcImlzX2RlZmF1bHRcIj5bXSxcbikge1xuICBpZiAoXG4gICAgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiIHx8XG4gICAgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9vcmRlclwiXG4gICkge1xuICAgIGNvbnN0IGRlZmF1bHRDb2RlID1cbiAgICAgIGN1cnJlbmNpZXMuZmluZCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmlzX2RlZmF1bHQpPy5jb2RlIHx8XG4gICAgICBjdXJyZW5jaWVzWzBdPy5jb2RlXG4gICAgY29uc3QgcHJpbWFyeSA9XG4gICAgICBjb3Vwb24uYW1vdW50cy5maW5kKChyb3cpID0+IHJvdy5jdXJyZW5jeV9jb2RlID09PSBkZWZhdWx0Q29kZSkgfHxcbiAgICAgIGNvdXBvbi5hbW91bnRzWzBdXG4gICAgY29uc3QgYW1vdW50ID0gbnVtYmVyT3JOdWxsKHByaW1hcnk/LmFtb3VudClcbiAgICBpZiAoYW1vdW50ID09IG51bGwpIHJldHVybiBcIlx1MjAxNFwiXG4gICAgY29uc3QgYWRkaXRpb25hbCA9IE1hdGgubWF4KDAsIGNvdXBvbi5hbW91bnRzLmxlbmd0aCAtIDEpXG4gICAgY29uc3QgZm9ybWF0dGVkID0gYCR7YW1vdW50fSR7cHJpbWFyeS5jdXJyZW5jeV9jb2RlLnRvVXBwZXJDYXNlKCl9YFxuICAgIHJldHVybiBhZGRpdGlvbmFsID8gYCR7Zm9ybWF0dGVkfSArJHthZGRpdGlvbmFsfWAgOiBmb3JtYXR0ZWRcbiAgfVxuXG4gIGlmIChcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9wcm9kdWN0XCIgfHxcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICkge1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBudW1iZXJPck51bGwoY291cG9uLnBlcmNlbnRhZ2UpXG4gICAgaWYgKHBlcmNlbnRhZ2UgPT0gbnVsbCkgcmV0dXJuIFwiXHUyMDE0XCJcbiAgICByZXR1cm4gY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICAgICAgPyBgJHtwZXJjZW50YWdlfSUgb2ZmIG9yZGVyYFxuICAgICAgOiBgJHtwZXJjZW50YWdlfSUgb2ZmIHByb2R1Y3RzYFxuICB9XG5cbiAgcmV0dXJuIGNvdXBvbi50eXBlID09PSBcImZyZWVfc2hpcHBpbmdcIiA/IFwiRnJlZSBzaGlwcGluZ1wiIDogXCJCdXkgWCBHZXQgWVwiXG59XG5cbmZ1bmN0aW9uIFRhYmxlUHJpY2VJbnB1dCh7XG4gIGN1cnJlbmN5LFxuICBvbkNoYW5nZSxcbiAgdmFsdWUsXG59OiB7XG4gIGN1cnJlbmN5OiBDdXJyZW5jeU9wdGlvblxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICBjb25zdCBzeW1ib2wgPVxuICAgIGN1cnJlbmN5LnN5bWJvbF9uYXRpdmUgfHxcbiAgICBjdXJyZW5jeS5zeW1ib2wgfHxcbiAgICBjdXJyZW5jeVN5bWJvbChjdXJyZW5jeS5jb2RlIHx8IFwiVVNEXCIpXG5cbiAgcmV0dXJuIChcbiAgICA8bGFiZWxcbiAgICAgIGNsYXNzTmFtZT1cImJnLXVpLWJnLWJhc2UgaG92ZXI6YmctdWktYmctc3VidGxlIGZvY3VzLXdpdGhpbjpzaGFkb3ctYm9yZGVycy1pbnRlcmFjdGl2ZS13aXRoLWFjdGl2ZSB0ZXh0LXVpLWZnLWJhc2VcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgIHN0eWxlPXt7IGZsZXg6IFwiMCAwIDQwcHhcIiwgcGFkZGluZ0xlZnQ6IDE2IH19XG4gICAgICA+XG4gICAgICAgIHtzeW1ib2x9XG4gICAgICA8L3NwYW4+XG4gICAgICA8aW5wdXRcbiAgICAgICAgYXJpYS1sYWJlbD17YFByaWNlICR7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfWB9XG4gICAgICAgIGlucHV0TW9kZT1cImRlY2ltYWxcIlxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+IG9uQ2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSl9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYXBwZWFyYW5jZTogXCJub25lXCIsXG4gICAgICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgICAgZmxleDogXCIxIDEgYXV0b1wiLFxuICAgICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgIG1pbldpZHRoOiAwLFxuICAgICAgICAgIG91dGxpbmU6IFwibm9uZVwiLFxuICAgICAgICAgIHBhZGRpbmc6IFwiMCAxNnB4IDAgMFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogXCJyaWdodFwiLFxuICAgICAgICB9fVxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAvPlxuICAgIDwvbGFiZWw+XG4gIClcbn1cblxuZnVuY3Rpb24gQ291cG9uUHJvZHVjdE1vZGFsKHtcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3IsXG4gIGFwaUJhc2UsXG4gIG9uT3BlbkNoYW5nZSxcbiAgb25TYXZlZCxcbiAgb3BlbixcbiAgb3B0aW9ucyxcbiAgcm93LFxufToge1xuICBhbGxvd1Byb21vdGlvbk1pcnJvcjogYm9vbGVhblxuICBhcGlCYXNlOiBBcGlCYXNlXG4gIG9uT3BlbkNoYW5nZTogKG9wZW46IGJvb2xlYW4pID0+IHZvaWRcbiAgb25TYXZlZDogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICBvcGVuOiBib29sZWFuXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkXG4gIHJvdzogQ291cG9uUHJvZHVjdFJvdyB8IG51bGxcbn0pIHtcbiAgY29uc3QgW2FjdGl2ZVN0ZXAsIHNldEFjdGl2ZVN0ZXBdID0gdXNlU3RhdGU8V2l6YXJkU3RlcD4oXCJkZXRhaWxzXCIpXG4gIGNvbnN0IFtwcm9kdWN0LCBzZXRQcm9kdWN0XSA9IHVzZVN0YXRlPFByb2R1Y3RGb3JtU3RhdGU+KCgpID0+XG4gICAgZW1wdHlQcm9kdWN0KG9wdGlvbnMpLFxuICApXG4gIGNvbnN0IFtjb3Vwb24sIHNldENvdXBvbl0gPSB1c2VTdGF0ZTxDb3Vwb25Gb3JtU3RhdGU+KCgpID0+XG4gICAgZW1wdHlDb3Vwb24ob3B0aW9ucyksXG4gIClcbiAgY29uc3QgW2NhbXBhaWduLCBzZXRDYW1wYWlnbl0gPSB1c2VTdGF0ZTxDYW1wYWlnbkZvcm1TdGF0ZT4oZW1wdHlDYW1wYWlnbilcbiAgY29uc3QgW3NhdmluZywgc2V0U2F2aW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbdXBsb2FkaW5nLCBzZXRVcGxvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtmdXJ0aGVzdFN0ZXBJbmRleCwgc2V0RnVydGhlc3RTdGVwSW5kZXhdID0gdXNlU3RhdGUoMClcblxuICBjb25zdCB2aXNpYmxlU3RlcHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgICAgICA/IGFsbFN0ZXBzXG4gICAgICAgIDogYWxsU3RlcHMuZmlsdGVyKChzdGVwKSA9PiBzdGVwICE9PSBcImNhbXBhaWduXCIpLFxuICAgIFthbGxvd1Byb21vdGlvbk1pcnJvcl0sXG4gIClcbiAgY29uc3QgY3VycmVudFN0ZXBJbmRleCA9IHZpc2libGVTdGVwcy5pbmRleE9mKGFjdGl2ZVN0ZXApXG4gIGNvbnN0IGN1cnJlbmNpZXMgPSBvcHRpb25zLmN1cnJlbmNpZXMgfHwgW11cbiAgY29uc3Qgc3VwcG9ydGVkQ3VycmVuY3lDb2RlcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gbmV3IFNldChjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmNvZGUpKSxcbiAgICBbY3VycmVuY2llc10sXG4gIClcbiAgY29uc3QgaXNBbW91bnRUeXBlID1cbiAgICBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIgfHwgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9vcmRlclwiXG4gIGNvbnN0IGlzUGVyY2VudGFnZVR5cGUgPVxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIiB8fFxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCJcbiAgY29uc3QgaXNJdGVtU2NvcGVkRGlzY291bnQgPVxuICAgIGNvdXBvbi50eXBlID09PSBcImFtb3VudF9vZmZfcHJvZHVjdHNcIiB8fFxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIlxuICBjb25zdCBlZmZlY3RpdmVDdXJyZW5jaWVzID0gdXNlTWVtbyhcbiAgICAoKSA9PiBlZmZlY3RpdmVDb3Vwb25DdXJyZW5jaWVzKGNvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zLCBjdXJyZW5jaWVzKSxcbiAgICBbY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMsIGN1cnJlbmNpZXNdLFxuICApXG4gIGNvbnN0IHByb2R1Y3RQcmljZXMgPSBjdXJyZW5jaWVzLmZsYXRNYXAoKGN1cnJlbmN5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBwcm9kdWN0LnByaWNlX2Ftb3VudHNbY3VycmVuY3kuY29kZV0gfHwgXCJcIlxuICAgIGNvbnN0IGFtb3VudCA9IG5vbk5lZ2F0aXZlTnVtYmVyT3JOdWxsKHZhbHVlKVxuICAgIHJldHVybiBhbW91bnQgPT0gbnVsbCA/IFtdIDogW3sgY3VycmVuY3lfY29kZTogY3VycmVuY3kuY29kZSwgYW1vdW50IH1dXG4gIH0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4pIHJldHVyblxuICAgIGNvbnN0IGZvcm1zID0gcm93XG4gICAgICA/IGZvcm1zRnJvbVJvdyhyb3csIG9wdGlvbnMpXG4gICAgICA6IHtcbiAgICAgICAgcHJvZHVjdDogZW1wdHlQcm9kdWN0KG9wdGlvbnMpLFxuICAgICAgICBjb3Vwb246IGVtcHR5Q291cG9uKG9wdGlvbnMpLFxuICAgICAgICBjYW1wYWlnbjogZW1wdHlDYW1wYWlnbixcbiAgICAgIH1cbiAgICBzZXRQcm9kdWN0KGZvcm1zLnByb2R1Y3QpXG4gICAgc2V0Q291cG9uKGZvcm1zLmNvdXBvbilcbiAgICBzZXRDYW1wYWlnbihmb3Jtcy5jYW1wYWlnbilcbiAgICBzZXRBY3RpdmVTdGVwKFwiZGV0YWlsc1wiKVxuICAgIHNldEZ1cnRoZXN0U3RlcEluZGV4KDApXG4gIH0sIFtvcGVuLCByb3csIG9wdGlvbnNdKVxuXG4gIGNvbnN0IHVwZGF0ZVB1cmNoYXNlQ29uZGl0aW9ucyA9IChcbiAgICBwdXJjaGFzZUNvbmRpdGlvbnM6IFB1cmNoYXNlQ29uZGl0aW9uRm9ybVtdLFxuICApID0+IHtcbiAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgcHVyY2hhc2VfY29uZGl0aW9uczogcHVyY2hhc2VDb25kaXRpb25zLFxuICAgICAgYW1vdW50czogaXNBbW91bnRDb3Vwb25UeXBlKGN1cnJlbnQudHlwZSlcbiAgICAgICAgPyByZWNvbmNpbGVDb3Vwb25BbW91bnRzKFxuICAgICAgICAgIGN1cnJlbnQuYW1vdW50cyxcbiAgICAgICAgICBlZmZlY3RpdmVDb3Vwb25DdXJyZW5jaWVzKHB1cmNoYXNlQ29uZGl0aW9ucywgY3VycmVuY2llcyksXG4gICAgICAgIClcbiAgICAgICAgOiBjdXJyZW50LmFtb3VudHMsXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCB1cGRhdGVDb3Vwb25UeXBlID0gKHR5cGU6IENvdXBvblR5cGUpID0+IHtcbiAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+IHtcbiAgICAgIGxldCBwdXJjaGFzZUNvbmRpdGlvbnMgPSBjdXJyZW50LnB1cmNoYXNlX2NvbmRpdGlvbnNcbiAgICAgIGlmIChcbiAgICAgICAgaXNBbW91bnRDb3Vwb25UeXBlKHR5cGUpICYmXG4gICAgICAgICFwdXJjaGFzZUNvbmRpdGlvbnMuc29tZShcbiAgICAgICAgICAoY29uZGl0aW9uKSA9PiBjb25kaXRpb24uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIixcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHB1cmNoYXNlQ29uZGl0aW9ucyA9IFtcbiAgICAgICAgICAuLi5wdXJjaGFzZUNvbmRpdGlvbnMsXG4gICAgICAgICAgLi4uZGVmYXVsdFB1cmNoYXNlQ29uZGl0aW9ucyhvcHRpb25zKSxcbiAgICAgICAgXVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgcHVyY2hhc2VfY29uZGl0aW9uczogcHVyY2hhc2VDb25kaXRpb25zLFxuICAgICAgICBhbW91bnRzOiBpc0Ftb3VudENvdXBvblR5cGUodHlwZSlcbiAgICAgICAgICA/IHJlY29uY2lsZUNvdXBvbkFtb3VudHMoXG4gICAgICAgICAgICBjdXJyZW50LmFtb3VudHMsXG4gICAgICAgICAgICBlZmZlY3RpdmVDb3Vwb25DdXJyZW5jaWVzKHB1cmNoYXNlQ29uZGl0aW9ucywgY3VycmVuY2llcyksXG4gICAgICAgICAgKVxuICAgICAgICAgIDogY3VycmVudC5hbW91bnRzLFxuICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6XG4gICAgICAgICAgdHlwZSA9PT0gXCJidXlfeF9nZXRfeVwiID8gXCJub25lXCIgOiBjdXJyZW50LnByb21vdGlvbl9taXJyb3JfbW9kZSxcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY29uc3QgdXBsb2FkTWVkaWEgPSBhc3luYyAoZmlsZXM6IEZpbGVbXSkgPT4ge1xuICAgIGlmICghZmlsZXMubGVuZ3RoKSByZXR1cm5cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4gZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZmlsZSkpXG4gICAgaWYgKGFwaUJhc2UgPT09IFwiL2FkbWluXCIgJiYgcHJvZHVjdC5zZWxsZXJfaWQpIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcInNlbGxlcl9pZFwiLCBwcm9kdWN0LnNlbGxlcl9pZClcbiAgICB9XG4gICAgc2V0VXBsb2FkaW5nKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGAke2JhY2tlbmRVcmwoKX0ke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0cy91cGxvYWRzYCxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihhcGlFcnJvck1lc3NhZ2UocGF5bG9hZCwgcmVzcG9uc2Uuc3RhdHVzVGV4dCkpXG4gICAgICB9XG4gICAgICBjb25zdCBwYXlsb2FkID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgICBmaWxlcz86IHsgYXNzZXRfaWQ/OiBzdHJpbmc7IHVybD86IHN0cmluZyB9W11cbiAgICAgIH1cbiAgICAgIGNvbnN0IHVwbG9hZGVkID0gKHBheWxvYWQuZmlsZXMgfHwgW10pXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGZpbGUpOiBmaWxlIGlzIHsgYXNzZXRfaWQ6IHN0cmluZzsgdXJsOiBzdHJpbmcgfSA9PlxuICAgICAgICAgICAgQm9vbGVhbihmaWxlLmFzc2V0X2lkICYmIGZpbGUudXJsKSxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChmaWxlKSA9PiAoeyBhc3NldF9pZDogZmlsZS5hc3NldF9pZCwgdXJsOiBmaWxlLnVybCB9KSlcbiAgICAgIGlmICghdXBsb2FkZWQubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgdXBsb2FkIGRpZCBub3QgcmV0dXJuIGFuIGltYWdlIFVSTFwiKVxuICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgbWVkaWE6IEFycmF5LmZyb20oXG4gICAgICAgICAgbmV3IE1hcChcbiAgICAgICAgICAgIFsuLi5jdXJyZW50Lm1lZGlhLCAuLi51cGxvYWRlZF0ubWFwKChpdGVtKSA9PiBbaXRlbS51cmwsIGl0ZW1dKSxcbiAgICAgICAgICApLnZhbHVlcygpLFxuICAgICAgICApLFxuICAgICAgfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiSW1hZ2UgdXBsb2FkIGZhaWxlZFwiLFxuICAgICAgKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRVcGxvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGV0YWlsc0NvbXBsZXRlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFwcm9kdWN0LnRpdGxlLnRyaW0oKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKCFjdXJyZW5jaWVzLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucykge1xuICAgICAgaWYgKFxuICAgICAgICAhY29uZGl0aW9uLmF0dHJpYnV0ZSB8fFxuICAgICAgICAhY29uZGl0aW9uLm9wZXJhdG9yIHx8XG4gICAgICAgICFjb25kaXRpb24udmFsdWVzLmxlbmd0aCB8fFxuICAgICAgICAoY29uZGl0aW9uLm9wZXJhdG9yID09PSBcImVxXCIgJiYgY29uZGl0aW9uLnZhbHVlcy5sZW5ndGggIT09IDEpIHx8XG4gICAgICAgIGF0dHJpYnV0ZXMuaGFzKGNvbmRpdGlvbi5hdHRyaWJ1dGUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBhdHRyaWJ1dGVzLmFkZChjb25kaXRpb24uYXR0cmlidXRlKVxuICAgIH1cblxuICAgIGlmIChpc0Ftb3VudFR5cGUpIHtcbiAgICAgIGlmICghYXR0cmlidXRlcy5oYXMoXCJjdXJyZW5jeV9jb2RlXCIpKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmICghY291cG9uLmFtb3VudHMubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChjb3Vwb24uYW1vdW50cy5sZW5ndGggIT09IGVmZmVjdGl2ZUN1cnJlbmNpZXMubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgICAgZm9yIChjb25zdCByb3cgb2YgY291cG9uLmFtb3VudHMpIHtcbiAgICAgICAgaWYgKCFzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLmhhcyhyb3cuY3VycmVuY3lfY29kZSkpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoc2Vlbi5oYXMocm93LmN1cnJlbmN5X2NvZGUpKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKG51bWJlck9yTnVsbChyb3cuYW1vdW50KSA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgICAgICAgc2Vlbi5hZGQocm93LmN1cnJlbmN5X2NvZGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyY2VudGFnZVR5cGUpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbnVtYmVyT3JOdWxsKGNvdXBvbi5wZXJjZW50YWdlKVxuICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPiAxMDApIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiICYmICFjb3Vwb24uc2hhcmVkX2NvZGUudHJpbSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJkdXJhdGlvblwiKSB7XG4gICAgICBjb25zdCBkYXlzID0gTnVtYmVyKGNvdXBvbi5leHBpcmF0aW9uX2RheXMpXG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF5cykgfHwgZGF5cyA8IDEpIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAoY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiKSB7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fZGF0ZSlcbiAgICAgIGlmICghY291cG9uLmV4cGlyYXRpb25fZGF0ZSB8fCBOdW1iZXIuaXNOYU4oZXhwaXJhdGlvbi5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlICE9PSBcIm5vbmVcIiAmJiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpIHtcbiAgICAgIGNvbnN0IGNhcCA9IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdClcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oY2FwLmdldFRpbWUoKSkpIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IG1heElzc3VhbmNlID0gTnVtYmVyKGNvdXBvbi5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW0pXG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobWF4SXNzdWFuY2UpICYmIG1heElzc3VhbmNlID4gMFxuICB9LCBbXG4gICAgY291cG9uLFxuICAgIGN1cnJlbmNpZXMubGVuZ3RoLFxuICAgIGVmZmVjdGl2ZUN1cnJlbmNpZXMubGVuZ3RoLFxuICAgIGlzQW1vdW50VHlwZSxcbiAgICBpc1BlcmNlbnRhZ2VUeXBlLFxuICAgIHByb2R1Y3QudGl0bGUsXG4gICAgc3VwcG9ydGVkQ3VycmVuY3lDb2RlcyxcbiAgXSlcblxuICBjb25zdCBjYW1wYWlnbkNvbXBsZXRlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFhbGxvd1Byb21vdGlvbk1pcnJvciB8fCBjYW1wYWlnbi5tb2RlID09PSBcIm5vbmVcIikgcmV0dXJuIHRydWVcbiAgICBpZiAoY2FtcGFpZ24ubW9kZSA9PT0gXCJleGlzdGluZ1wiKSByZXR1cm4gQm9vbGVhbihjYW1wYWlnbi5jYW1wYWlnbl9pZClcbiAgICBpZiAoIWNhbXBhaWduLm5hbWUudHJpbSgpIHx8ICFjYW1wYWlnbi5jYW1wYWlnbl9pZGVudGlmaWVyLnRyaW0oKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIFtjYW1wYWlnbi5zdGFydHNfYXQsIGNhbXBhaWduLmVuZHNfYXRdLmV2ZXJ5KCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHRydWVcbiAgICAgIHJldHVybiAhTnVtYmVyLmlzTmFOKG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCkpXG4gICAgfSlcbiAgfSwgW2FsbG93UHJvbW90aW9uTWlycm9yLCBjYW1wYWlnbl0pXG5cbiAgY29uc3QgcHJpY2VzQ29tcGxldGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWN1cnJlbmNpZXMubGVuZ3RoIHx8ICFwcm9kdWN0UHJpY2VzLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGN1cnJlbmNpZXMuZXZlcnkoKGN1cnJlbmN5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb2R1Y3QucHJpY2VfYW1vdW50c1tjdXJyZW5jeS5jb2RlXSB8fCBcIlwiXG4gICAgICByZXR1cm4gIXZhbHVlLnRyaW0oKSB8fCBub25OZWdhdGl2ZU51bWJlck9yTnVsbCh2YWx1ZSkgIT0gbnVsbFxuICAgIH0pXG4gIH0sIFtjdXJyZW5jaWVzLCBwcm9kdWN0LnByaWNlX2Ftb3VudHMsIHByb2R1Y3RQcmljZXMubGVuZ3RoXSlcblxuICBjb25zdCBzdGVwVmFsaWRpdHkgPSB1c2VNZW1vPFJlY29yZDxXaXphcmRTdGVwLCBib29sZWFuPj4oXG4gICAgKCkgPT4gKHtcbiAgICAgIGRldGFpbHM6IGRldGFpbHNDb21wbGV0ZSxcbiAgICAgIG9yZ2FuaXplOiB0cnVlLFxuICAgICAgY2FtcGFpZ246IGNhbXBhaWduQ29tcGxldGUsXG4gICAgICBwcmljZXM6IHByaWNlc0NvbXBsZXRlLFxuICAgIH0pLFxuICAgIFtjYW1wYWlnbkNvbXBsZXRlLCBkZXRhaWxzQ29tcGxldGUsIHByaWNlc0NvbXBsZXRlXSxcbiAgKVxuXG4gIGNvbnN0IGFjdGl2ZVN0ZXBDb21wbGV0ZSA9IHN0ZXBWYWxpZGl0eVthY3RpdmVTdGVwXVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFvcGVuIHx8ICFhY3RpdmVTdGVwQ29tcGxldGUpIHJldHVyblxuICAgIHNldEZ1cnRoZXN0U3RlcEluZGV4KChjdXJyZW50KSA9PlxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIE1hdGgubWluKGN1cnJlbnRTdGVwSW5kZXggKyAxLCB2aXNpYmxlU3RlcHMubGVuZ3RoIC0gMSksXG4gICAgICApLFxuICAgIClcbiAgfSwgW2FjdGl2ZVN0ZXBDb21wbGV0ZSwgY3VycmVudFN0ZXBJbmRleCwgb3BlbiwgdmlzaWJsZVN0ZXBzLmxlbmd0aF0pXG5cbiAgY29uc3QgaXNTdGVwRGlzYWJsZWQgPSAoaW5kZXg6IG51bWJlcikgPT5cbiAgICBpbmRleCA+IGZ1cnRoZXN0U3RlcEluZGV4IHx8XG4gICAgdmlzaWJsZVN0ZXBzLnNsaWNlKDAsIGluZGV4KS5zb21lKChwcmV2aW91cykgPT4gIXN0ZXBWYWxpZGl0eVtwcmV2aW91c10pXG5cbiAgY29uc3QgdmFsaWRhdGUgPSAoKSA9PiB7XG4gICAgaWYgKCFwcm9kdWN0LnRpdGxlLnRyaW0oKSkgdGhyb3cgbmV3IEVycm9yKFwiUHJvZHVjdCB0aXRsZSBpcyByZXF1aXJlZFwiKVxuICAgIGlmICghY3VycmVuY2llcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkZCBhIHN1cHBvcnRlZCBjdXJyZW5jeSB0byB0aGUgc3RvcmUgYmVmb3JlIGNvbnRpbnVpbmdcIilcbiAgICB9XG4gICAgY29uc3QgaW52YWxpZFByaWNlID0gY3VycmVuY2llcy5zb21lKChjdXJyZW5jeSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBwcm9kdWN0LnByaWNlX2Ftb3VudHNbY3VycmVuY3kuY29kZV0gfHwgXCJcIlxuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKSAmJiBub25OZWdhdGl2ZU51bWJlck9yTnVsbCh2YWx1ZSkgPT0gbnVsbFxuICAgIH0pXG4gICAgaWYgKGludmFsaWRQcmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvZHVjdCBwcmljZXMgbXVzdCBiZSAwIG9yIG1vcmVcIilcbiAgICB9XG4gICAgaWYgKCFwcm9kdWN0UHJpY2VzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGF0IGxlYXN0IG9uZSBwcm9kdWN0IHByaWNlXCIpXG4gICAgfVxuICAgIGlmIChpc0Ftb3VudFR5cGUpIHtcbiAgICAgIGlmICghY291cG9uLmFtb3VudHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkZCBhdCBsZWFzdCBvbmUgY291cG9uIHZhbHVlXCIpXG4gICAgICB9XG4gICAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICAgIGNvbnN0IGN1cnJlbmN5Q29uZGl0aW9uID0gY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMuZmluZChcbiAgICAgICAgKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIsXG4gICAgICApXG4gICAgICBpZiAoIWN1cnJlbmN5Q29uZGl0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFkZCBhIEN1cnJlbmN5IENvZGUgcHVyY2hhc2UgY29uZGl0aW9uXCIpXG4gICAgICB9XG4gICAgICBpZiAoY291cG9uLmFtb3VudHMubGVuZ3RoICE9PSBlZmZlY3RpdmVDdXJyZW5jaWVzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDb3Vwb24gdmFsdWVzIG11c3QgbWF0Y2ggZXZlcnkgZWZmZWN0aXZlIGN1cnJlbmN5IGNvbmRpdGlvbiB2YWx1ZVwiLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBjb3Vwb24uYW1vdW50cykge1xuICAgICAgICBpZiAoIXN1cHBvcnRlZEN1cnJlbmN5Q29kZXMuaGFzKHJvdy5jdXJyZW5jeV9jb2RlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhbiBhdmFpbGFibGUgY291cG9uIGN1cnJlbmN5XCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZW4uaGFzKHJvdy5jdXJyZW5jeV9jb2RlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdXBvbiB2YWx1ZSBjdXJyZW5jaWVzIGNhbm5vdCBiZSBkdXBsaWNhdGVkXCIpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bWJlck9yTnVsbChyb3cuYW1vdW50KSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291cG9uIHZhbHVlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpXG4gICAgICAgIH1cbiAgICAgICAgc2Vlbi5hZGQocm93LmN1cnJlbmN5X2NvZGUpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlZW5BdHRyaWJ1dGVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucykge1xuICAgICAgaWYgKCFjb25kaXRpb24uYXR0cmlidXRlIHx8ICFjb25kaXRpb24ub3BlcmF0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tcGxldGUgZXZlcnkgcHVyY2hhc2UgY29uZGl0aW9uXCIpXG4gICAgICB9XG4gICAgICBpZiAoIWNvbmRpdGlvbi52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhdCBsZWFzdCBvbmUgdmFsdWUgZm9yIGV2ZXJ5IHB1cmNoYXNlIGNvbmRpdGlvblwiKVxuICAgICAgfVxuICAgICAgaWYgKGNvbmRpdGlvbi5vcGVyYXRvciA9PT0gXCJlcVwiICYmIGNvbmRpdGlvbi52YWx1ZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVxdWFscyBjb25kaXRpb25zIHJlcXVpcmUgZXhhY3RseSBvbmUgdmFsdWVcIilcbiAgICAgIH1cbiAgICAgIGlmIChzZWVuQXR0cmlidXRlcy5oYXMoY29uZGl0aW9uLmF0dHJpYnV0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHVyY2hhc2UgY29uZGl0aW9uIGF0dHJpYnV0ZXMgY2Fubm90IGJlIGR1cGxpY2F0ZWRcIilcbiAgICAgIH1cbiAgICAgIHNlZW5BdHRyaWJ1dGVzLmFkZChjb25kaXRpb24uYXR0cmlidXRlKVxuICAgIH1cbiAgICBpZiAoaXNQZXJjZW50YWdlVHlwZSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBudW1iZXJPck51bGwoY291cG9uLnBlcmNlbnRhZ2UpXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA+IDEwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3Vwb24gdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMCBwZXJjZW50XCIpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiICYmICFjb3Vwb24uc2hhcmVkX2NvZGUudHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHNoYXJlZCBjb3Vwb24gY29kZSBpcyByZXF1aXJlZFwiKVxuICAgIH1cbiAgICBpZiAoY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiKSB7XG4gICAgICBjb25zdCBleHBpcmF0aW9uID0gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fZGF0ZSlcbiAgICAgIGlmICghY291cG9uLmV4cGlyYXRpb25fZGF0ZSB8fCBOdW1iZXIuaXNOYU4oZXhwaXJhdGlvbi5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgdmFsaWQgZml4ZWQgZXhwaXJhdGlvbiBkYXRlIGlzIHJlcXVpcmVkXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlICE9PSBcIm5vbmVcIiAmJiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpIHtcbiAgICAgIGNvbnN0IGNhcCA9IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdClcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oY2FwLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB2YWxpZCBleHBpcmF0aW9uIGNhcCBkYXRlIGlzIHJlcXVpcmVkXCIpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjYW1wYWlnbi5tb2RlID09PSBcImV4aXN0aW5nXCIgJiYgIWNhbXBhaWduLmNhbXBhaWduX2lkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWxlY3QgYW4gZXhpc3RpbmcgY2FtcGFpZ25cIilcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2FtcGFpZ24ubW9kZSA9PT0gXCJuZXdcIiAmJlxuICAgICAgKCFjYW1wYWlnbi5uYW1lLnRyaW0oKSB8fCAhY2FtcGFpZ24uY2FtcGFpZ25faWRlbnRpZmllci50cmltKCkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW1wYWlnbiBuYW1lIGFuZCBpZGVudGlmaWVyIGFyZSByZXF1aXJlZFwiKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNhdmUgPSBhc3luYyAoKSA9PiB7XG4gICAgc2V0U2F2aW5nKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlKClcbiAgICAgIGNvbnN0IGJlbmVmaXRUeXBlID0gYmVuZWZpdFR5cGVGcm9tQ291cG9uVHlwZShjb3Vwb24udHlwZSlcbiAgICAgIGNvbnN0IHRhcmdldFR5cGUgPVxuICAgICAgICBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX29yZGVyXCIgfHxcbiAgICAgICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICAgICAgICAgID8gXCJvcmRlclwiXG4gICAgICAgICAgOiBcIml0ZW1zXCJcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHByb2R1Y3Q6IHtcbiAgICAgICAgICB0aXRsZTogcHJvZHVjdC50aXRsZS50cmltKCksXG4gICAgICAgICAgc3VidGl0bGU6IHByb2R1Y3Quc3VidGl0bGUudHJpbSgpIHx8IG51bGwsXG4gICAgICAgICAgaGFuZGxlOiBwcm9kdWN0LmhhbmRsZS50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdC5kZXNjcmlwdGlvbi50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICBzdGF0dXM6IHByb2R1Y3RTdGF0dXNGcm9tQ291cG9uU3RhdHVzKGNvdXBvbi5wcm9tb3Rpb25fc3RhdHVzKSxcbiAgICAgICAgICB0aHVtYm5haWw6IHByb2R1Y3QubWVkaWFbMF0/LnVybCB8fCBudWxsLFxuICAgICAgICAgIHRodW1ibmFpbF9hc3NldF9pZDogcHJvZHVjdC5tZWRpYVswXT8uYXNzZXRfaWQgfHwgbnVsbCxcbiAgICAgICAgICBpbWFnZXM6IHByb2R1Y3QubWVkaWEuc2xpY2UoMSkubWFwKChtZWRpYSkgPT4gKHtcbiAgICAgICAgICAgIHVybDogbWVkaWEudXJsLFxuICAgICAgICAgICAgLi4uKG1lZGlhLmFzc2V0X2lkID8geyBhc3NldF9pZDogbWVkaWEuYXNzZXRfaWQgfSA6IHt9KSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgZGlzY291bnRhYmxlOiBwcm9kdWN0LmRpc2NvdW50YWJsZSxcbiAgICAgICAgICB0eXBlX2lkOiBwcm9kdWN0LnR5cGVfaWQgfHwgbnVsbCxcbiAgICAgICAgICBjb2xsZWN0aW9uX2lkOiBwcm9kdWN0LmNvbGxlY3Rpb25faWQgfHwgbnVsbCxcbiAgICAgICAgICBjYXRlZ29yaWVzOiBwcm9kdWN0LmNhdGVnb3J5X2lkID8gW3sgaWQ6IHByb2R1Y3QuY2F0ZWdvcnlfaWQgfV0gOiBbXSxcbiAgICAgICAgICB0YWdzOiBwcm9kdWN0LnRhZ19pZCA/IFt7IGlkOiBwcm9kdWN0LnRhZ19pZCB9XSA6IFtdLFxuICAgICAgICAgIHZhcmlhbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRpdGxlOiBcIkRlZmF1bHRcIixcbiAgICAgICAgICAgICAgc2t1OiBwcm9kdWN0LnNrdS50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgbWFuYWdlX2ludmVudG9yeTogZmFsc2UsXG4gICAgICAgICAgICAgIGFsbG93X2JhY2tvcmRlcjogdHJ1ZSxcbiAgICAgICAgICAgICAgcHJpY2VzOiBwcm9kdWN0UHJpY2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBjb3Vwb246IHtcbiAgICAgICAgICBlbmFibGVkOiBjb3Vwb24uZW5hYmxlZCxcbiAgICAgICAgICBiZW5lZml0X3R5cGU6IGJlbmVmaXRUeXBlLFxuICAgICAgICAgIHB1cmNoYXNlX2NvbmRpdGlvbnM6IGNvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zLm1hcCgoY29uZGl0aW9uKSA9PiAoe1xuICAgICAgICAgICAgYXR0cmlidXRlOiBjb25kaXRpb24uYXR0cmlidXRlLFxuICAgICAgICAgICAgb3BlcmF0b3I6IGNvbmRpdGlvbi5vcGVyYXRvcixcbiAgICAgICAgICAgIHZhbHVlczogY29uZGl0aW9uLnZhbHVlcyxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgYW1vdW50czogaXNBbW91bnRUeXBlXG4gICAgICAgICAgICA/IGNvdXBvbi5hbW91bnRzLm1hcCgocm93KSA9PiAoe1xuICAgICAgICAgICAgICBhbW91bnQ6IG51bWJlck9yTnVsbChyb3cuYW1vdW50KSxcbiAgICAgICAgICAgICAgY3VycmVuY3lfY29kZTogcm93LmN1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBhbW91bnQ6IG51bGwsXG4gICAgICAgICAgcGVyY2VudGFnZTogaXNQZXJjZW50YWdlVHlwZSA/IG51bWJlck9yTnVsbChjb3Vwb24ucGVyY2VudGFnZSkgOiBudWxsLFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IG51bGwsXG4gICAgICAgICAgY29kZV9zdHJhdGVneTogY291cG9uLmNvZGVfc3RyYXRlZ3ksXG4gICAgICAgICAgY29kZV9wcmVmaXg6XG4gICAgICAgICAgICBjb3Vwb24uY29kZV9zdHJhdGVneSA9PT0gXCJ1bmlxdWVfY29kZVwiXG4gICAgICAgICAgICAgID8gY291cG9uLmNvZGVfcHJlZml4LnRyaW0oKSB8fCBcIkNPVVBPTlwiXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzaGFyZWRfY29kZTpcbiAgICAgICAgICAgIGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCJcbiAgICAgICAgICAgICAgPyBjb3Vwb24uc2hhcmVkX2NvZGUudHJpbSgpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBleHBpcmF0aW9uX3BvbGljeTpcbiAgICAgICAgICAgIGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwibm9uZVwiXG4gICAgICAgICAgICAgID8geyB0eXBlOiBcIm5vbmVcIiB9XG4gICAgICAgICAgICAgIDogY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImZpeGVkXCIsXG4gICAgICAgICAgICAgICAgICBleHBpcmVzX2F0OiBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9kYXRlKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgY2FwX2J5X2NhbXBhaWduOiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ24sXG4gICAgICAgICAgICAgICAgICBjYXBfYXQ6IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdFxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgZHVyYXRpb25fZGF5czogTnVtYmVyKGNvdXBvbi5leHBpcmF0aW9uX2RheXMpIHx8IDMwLFxuICAgICAgICAgICAgICAgICAgY2FwX2J5X2NhbXBhaWduOiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ24sXG4gICAgICAgICAgICAgICAgICBjYXBfYXQ6IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdFxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06XG4gICAgICAgICAgICBOdW1iZXIoY291cG9uLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSkgfHwgMSxcbiAgICAgICAgICBwcm9tb3Rpb25fdGVtcGxhdGU6XG4gICAgICAgICAgICBiZW5lZml0VHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiB8fCBiZW5lZml0VHlwZSA9PT0gXCJwZXJjZW50YWdlXCJcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25fbWV0aG9kOiB7XG4gICAgICAgICAgICAgICAgICB0YXJnZXRfdHlwZTogdGFyZ2V0VHlwZSxcbiAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb246XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPT09IFwib3JkZXJcIiA/IFwiYWNyb3NzXCIgOiBjb3Vwb24uYWxsb2NhdGlvbixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBwcm9tb3Rpb25fc3RhdHVzOiBjb3Vwb24ucHJvbW90aW9uX3N0YXR1cyxcbiAgICAgICAgICAuLi4oYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6XG4gICAgICAgICAgICAgICAgYmVuZWZpdFR5cGUgPT09IFwiYnV5X2dldFwiIHx8XG4gICAgICAgICAgICAgICAgICAoYmVuZWZpdFR5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiYgY291cG9uLmFtb3VudHMubGVuZ3RoID4gMSlcbiAgICAgICAgICAgICAgICAgID8gXCJub25lXCJcbiAgICAgICAgICAgICAgICAgIDogY291cG9uLnByb21vdGlvbl9taXJyb3JfbW9kZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9LFxuICAgICAgICBjYW1wYWlnbjogYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgICAgICAgICA/IGNhbXBhaWduLm1vZGUgPT09IFwiZXhpc3RpbmdcIlxuICAgICAgICAgICAgPyB7IG1vZGU6IFwiZXhpc3RpbmdcIiwgY2FtcGFpZ25faWQ6IGNhbXBhaWduLmNhbXBhaWduX2lkIH1cbiAgICAgICAgICAgIDogY2FtcGFpZ24ubW9kZSA9PT0gXCJuZXdcIlxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBtb2RlOiBcIm5ld1wiLFxuICAgICAgICAgICAgICAgIGNhbXBhaWduOiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBjYW1wYWlnbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgY2FtcGFpZ25faWRlbnRpZmllcjogY2FtcGFpZ24uY2FtcGFpZ25faWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICAgIHN0YXJ0c19hdDogY2FtcGFpZ24uc3RhcnRzX2F0XG4gICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoY2FtcGFpZ24uc3RhcnRzX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgIGVuZHNfYXQ6IGNhbXBhaWduLmVuZHNfYXRcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShjYW1wYWlnbi5lbmRzX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogeyBtb2RlOiBcIm5vbmVcIiB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHNlbGxlcl9pZDogcHJvZHVjdC5zZWxsZXJfaWQgfHwgbnVsbCxcbiAgICAgICAgdmFyaWFudF9vdmVycmlkZXM6IFtdLFxuICAgICAgfVxuXG4gICAgICBhd2FpdCBhcGlGZXRjaChcbiAgICAgICAgcm93XG4gICAgICAgICAgPyBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHMvJHtyb3cucHJvZHVjdC5pZH1gXG4gICAgICAgICAgOiBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHNgLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiByb3cgPyBcIlBBVENIXCIgOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHRvYXN0LnN1Y2Nlc3Mocm93ID8gXCJDb3Vwb24gcHJvZHVjdCB1cGRhdGVkXCIgOiBcIkNvdXBvbiBwcm9kdWN0IGNyZWF0ZWRcIilcbiAgICAgIG9uT3BlbkNoYW5nZShmYWxzZSlcbiAgICAgIGF3YWl0IG9uU2F2ZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgIDogXCJGYWlsZWQgdG8gc2F2ZSBjb3Vwb24gcHJvZHVjdFwiLFxuICAgICAgKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTYXZpbmcoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RlcFN0YXR1cyA9IChzdGVwOiBXaXphcmRTdGVwKSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSB2aXNpYmxlU3RlcHMuaW5kZXhPZihzdGVwKVxuICAgIGlmIChpbmRleCA8IGN1cnJlbnRTdGVwSW5kZXggJiYgc3RlcFZhbGlkaXR5W3N0ZXBdKSB7XG4gICAgICByZXR1cm4gXCJjb21wbGV0ZWRcIiBhcyBjb25zdFxuICAgIH1cbiAgICBpZiAoaW5kZXggPT09IGN1cnJlbnRTdGVwSW5kZXgpIHJldHVybiBcImluLXByb2dyZXNzXCIgYXMgY29uc3RcbiAgICByZXR1cm4gXCJub3Qtc3RhcnRlZFwiIGFzIGNvbnN0XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxGb2N1c01vZGFsIG9wZW49e29wZW59IG9uT3BlbkNoYW5nZT17b25PcGVuQ2hhbmdlfT5cbiAgICAgIDxGb2N1c01vZGFsLkNvbnRlbnQgc3R5bGU9e21vZGFsQ29udGVudFN0eWxlfT5cbiAgICAgICAgPEZvY3VzTW9kYWwuVGl0bGUgc3R5bGU9e3Zpc3VhbGx5SGlkZGVuU3R5bGV9PlxuICAgICAgICAgIHtyb3cgPyBcIkVkaXQgQ291cG9uIFByb2R1Y3RcIiA6IFwiQ3JlYXRlIENvdXBvbiBQcm9kdWN0XCJ9XG4gICAgICAgIDwvRm9jdXNNb2RhbC5UaXRsZT5cbiAgICAgICAgPFByb2dyZXNzVGFic1xuICAgICAgICAgIHZhbHVlPXthY3RpdmVTdGVwfVxuICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RlcCA9IHZhbHVlIGFzIFdpemFyZFN0ZXBcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdmlzaWJsZVN0ZXBzLmluZGV4T2Yoc3RlcClcbiAgICAgICAgICAgIGlmICghaXNTdGVwRGlzYWJsZWQoaW5kZXgpKSBzZXRBY3RpdmVTdGVwKHN0ZXApXG4gICAgICAgICAgfX1cbiAgICAgICAgICBzdHlsZT17bW9kYWxXaXphcmRTdHlsZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxGb2N1c01vZGFsLkhlYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiLW15LTIgdy1mdWxsIGJvcmRlci1sXCI+XG4gICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuTGlzdCBjbGFzc05hbWU9XCJqdXN0aWZ5LXN0YXJ0LXN0YXJ0IGZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIHt2aXNpYmxlU3RlcHMubWFwKChzdGVwLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5UcmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgIGtleT17c3RlcH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3N0ZXB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cz17c3RlcFN0YXR1cyhzdGVwKX1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzU3RlcERpc2FibGVkKGluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWF4LXctWzIwMHB4XSB0cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtzdGVwWzBdLnRvVXBwZXJDYXNlKCkgKyBzdGVwLnNsaWNlKDEpfVxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuTGlzdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvRm9jdXNNb2RhbC5IZWFkZXI+XG5cbiAgICAgICAgICA8Rm9jdXNNb2RhbC5Cb2R5IGNsYXNzTmFtZT1cIm92ZXJmbG93LWhpZGRlbiBwLTBcIiBzdHlsZT17bW9kYWxCb2R5U3R5bGV9PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBzdHlsZT17XG4gICAgICAgICAgICAgICAgYWN0aXZlU3RlcCA9PT0gXCJwcmljZXNcIlxuICAgICAgICAgICAgICAgICAgPyB7IGhlaWdodDogXCIxMDAlXCIsIG92ZXJmbG93OiBcImhpZGRlblwiLCB3aWR0aDogXCIxMDAlXCIgfVxuICAgICAgICAgICAgICAgICAgOiBtb2RhbFNjcm9sbFN0eWxlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHN0eWxlPXtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZVN0ZXAgPT09IFwicHJpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgPyB7IGhlaWdodDogXCIxMDAlXCIsIHdpZHRoOiBcIjEwMCVcIiB9XG4gICAgICAgICAgICAgICAgICAgIDogbW9kYWxGb3JtU3R5bGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7YWN0aXZlU3RlcCA9PT0gXCJkZXRhaWxzXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwiZGV0YWlsc1wiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEhlYWRpbmcgbGV2ZWw9XCJoMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHtyb3cgPyBcIkVkaXQgQ291cG9uIFByb2R1Y3RcIiA6IFwiQ3JlYXRlIENvdXBvbiBQcm9kdWN0XCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvSGVhZGluZz5cbiAgICAgICAgICAgICAgICAgICAgPERpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJHZW5lcmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dGhyZWVDb2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QudGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXaW50ZXIgamFja2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTdWJ0aXRsZVwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5zdWJ0aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIldhcm0gYW5kIGNvenlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkhhbmRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJUaGUgVVJMLWZyaWVuZGx5IGlkZW50aWZpZXIgZm9yIHRoaXMgcHJvZHVjdC4gSWYgbGVmdCBlbXB0eSwgTWVkdXNhIGdlbmVyYXRlcyBpdCBmcm9tIHRoZSB0aXRsZS5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8SGFuZGxlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5oYW5kbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhoYW5kbGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBoYW5kbGUgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJEZXNjcmlwdGlvblwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkEgd2FybSBhbmQgY296eSBqYWNrZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk1lZGlhXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWVkaWFVcGxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNVcGxvYWRpbmc9e3VwbG9hZGluZ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE9e3Byb2R1Y3QubWVkaWF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVXBsb2FkPXsoZmlsZXMpID0+IHZvaWQgdXBsb2FkTWVkaWEoZmlsZXMpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblJlbW92ZT17KG1lZGlhKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6IGN1cnJlbnQubWVkaWEuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVkaWEuYXNzZXRfaWQgJiYgaXRlbS5hc3NldF9pZCAhPT0gbWVkaWEuYXNzZXRfaWQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFtZWRpYS5hc3NldF9pZCAmJiBpdGVtLnVybCAhPT0gbWVkaWEudXJsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTS1VcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5za3V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ09VUE9OLTAwMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza3U6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgIDxEaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgICAgIDxQdXJjaGFzZUNvbmRpdGlvbnNGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgIGZpeGVkQW1vdW50PXtpc0Ftb3VudFR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVB1cmNoYXNlQ29uZGl0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHthY3RpdmVTdGVwID09PSBcIm9yZ2FuaXplXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwib3JnYW5pemVcIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPVwiT3JnYW5pemVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC14LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+RGlzY291bnRhYmxlPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IHByb21vdGlvbnMgdG8gZGlzY291bnQgdGhpcyBwcm9kdWN0J3Mgc2FsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3Byb2R1Y3QuZGlzY291bnRhYmxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGRpc2NvdW50YWJsZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50YWJsZTogQm9vbGVhbihkaXNjb3VudGFibGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNlbGxlclwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnNlbGxlcl9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMuc2VsbGVycyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoc2VsbGVyX2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBzZWxsZXJfaWQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUeXBlXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC50eXBlX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF90eXBlcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHR5cGVfaWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCB0eXBlX2lkIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2xsZWN0aW9uXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5jb2xsZWN0aW9uX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF9jb2xsZWN0aW9ucyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGNvbGxlY3Rpb25faWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhdGVnb3J5XCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC5jYXRlZ29yeV9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfY2F0ZWdvcmllcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGNhdGVnb3J5X2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgY2F0ZWdvcnlfaWQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlRhZ1wiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QudGFnX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF90YWdzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodGFnX2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHsgLi4uY3VycmVudCwgdGFnX2lkIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHthY3RpdmVTdGVwID09PSBcImRldGFpbHNcIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IC4uLnN0YWNrU3R5bGUsIG1hcmdpblRvcDogMjQgfX0+XG4gICAgICAgICAgICAgICAgICAgIDxEaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDb3Vwb25cIlxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiQ29uZmlndXJlIHRoZSBjb3Vwb24gaXNzdWVkIHdoZW4gdGhpcyBwcm9kdWN0IGlzIHB1cmNoYXNlZC5cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cGFuZWxTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAteC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPkNvdXBvbiBpc3N1YW5jZTwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc3N1ZSBjb3Vwb25zIHdoZW4gY3VzdG9tZXJzIHB1cmNoYXNlIHRoaXMgcHJvZHVjdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y291cG9uLmVuYWJsZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoZW5hYmxlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJUeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnR5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh0eXBlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvdXBvblR5cGUodHlwZSBhcyBDb3Vwb25UeXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlQ2hvaWNlcy5tYXAoKGNob2ljZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwLkNob2ljZUJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjaG9pY2UudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2hvaWNlLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e2Nob2ljZS5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtjaG9pY2UuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24ucHJvbW90aW9uX3N0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHByb21vdGlvbl9zdGF0dXMpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9zdGF0dXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9zdGF0dXMgYXMgUHJvbW90aW9uU3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtzdGF0dXNDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuQ2hvaWNlQm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2Nob2ljZS52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjaG9pY2UudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17Y2hvaWNlLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e2Nob2ljZS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICB7KGlzQW1vdW50VHlwZSB8fCBpc1BlcmNlbnRhZ2VUeXBlKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT17aXNBbW91bnRUeXBlID8gXCJDb3Vwb24gVmFsdWVzXCIgOiBcIlZhbHVlXCJ9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNBbW91bnRUeXBlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y291cG9uLmFtb3VudHMubWFwKChyb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbmN5ID0gY3VycmVuY2llcy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtLmNvZGUgPT09IHJvdy5jdXJyZW5jeV9jb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e3Jvdy5rZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzaGFkb3ctZWxldmF0aW9uLWNhcmQtcmVzdCBiZy11aS1iZy1jb21wb25lbnQgcm91bmRlZC1tZCBweC00IHB5LTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPExhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Jvdy5jdXJyZW5jeV9jb2RlLnRvVXBwZXJDYXNlKCl9IENvdXBvbiBWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2N1cnJlbmN5Py5uYW1lIHx8IHJvdy5jdXJyZW5jeV9jb2RlLnRvVXBwZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q3VycmVuY3lBbW91bnRGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZT17cm93LmN1cnJlbmN5X2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cm93LmFtb3VudH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoYW1vdW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnRzOiBjdXJyZW50LmFtb3VudHMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0sIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9PT0gcm93SW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgLi4uaXRlbSwgYW1vdW50IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IWNvdXBvbi5hbW91bnRzLmxlbmd0aCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgYXQgbGVhc3Qgb25lIGVmZmVjdGl2ZSBDdXJyZW5jeSBDb2RlIGNvbmRpdGlvbiB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb3Vwb24gVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxQZXJjZW50YWdlSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5wZXJjZW50YWdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHBlcmNlbnRhZ2UpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgICAge2lzSXRlbVNjb3BlZERpc2NvdW50ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJBbGxvY2F0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uYWxsb2NhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhhbGxvY2F0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uOiBhbGxvY2F0aW9uIGFzIENvdXBvbkFsbG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5DaG9pY2VCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJlYWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJFYWNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJBcHBsaWVzIHZhbHVlIG9uIGVhY2ggaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuQ2hvaWNlQm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwib25jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiT25jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiTGltaXQgZGlzY291bnQgdG8gbWF4IHF1YW50aXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwaXJhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIkNvbnRyb2wgd2hlbiBpc3N1ZWQgY291cG9ucyBleHBpcmUuXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIHBvbGljeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uZXhwaXJhdGlvbl90eXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KGV4cGlyYXRpb25fdHlwZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl90eXBlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl90eXBlIGFzIEV4cGlyYXRpb25Qb2xpY3lUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5vbmVcIj5Ob25lPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZHVyYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiBhZnRlciBpc3N1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmaXhlZFwiPkZpeGVkIGRhdGU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2NvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZHVyYXRpb25cIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIGRheXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPXsxfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmV4cGlyYXRpb25fZGF5c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9kYXlzOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgPT09IFwiZml4ZWRcIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmVzIGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5leHBpcmF0aW9uX2RhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fZGF0ZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Y291cG9uLmV4cGlyYXRpb25fdHlwZSAhPT0gXCJub25lXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDYXAgZXhwaXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC14LTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IC4uLnBhbmVsU3R5bGUsIHBhZGRpbmc6IFwiOHB4IDEycHhcIiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FtcGFpZ24gZW5kIG9yIGNhcCBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2NvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IEJvb2xlYW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIGNhcCBkYXRlXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5leHBpcmF0aW9uX2NhcF9hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9hdDogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJDaG9vc2Ugd2hldGhlciBldmVyeSBpc3N1ZWQgY291cG9uIGlzIHVuaXF1ZSBvciBzaGFyZXMgb25lIGNvZGUuXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2RlIHN0cmF0ZWd5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5jb2RlX3N0cmF0ZWd5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KGNvZGVfc3RyYXRlZ3kpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfc3RyYXRlZ3k6IGNvZGVfc3RyYXRlZ3kgYXMgQ29kZVN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInVuaXF1ZV9jb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwic2hhcmVkX2NvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWQgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2NvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInVuaXF1ZV9jb2RlXCIgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ29kZSBwcmVmaXhcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmNvZGVfcHJlZml4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNPVVBPTlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfcHJlZml4OiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTaGFyZWQgY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uc2hhcmVkX2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU1VNTUVSMTVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfY29kZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIklzc3VhbmNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJNYXggaXNzdWFuY2UgcGVyIGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPXsxfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5tYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW1vdW50VHlwZSAmJiBjb3Vwb24uYW1vdW50cy5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQcm9tb3Rpb24gbWlycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnByb21vdGlvbl9taXJyb3JfbW9kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uLnR5cGUgPT09IFwiYnV5X3hfZ2V0X3lcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsocHJvbW90aW9uX21pcnJvcl9tb2RlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlIGFzIE1pcnJvck1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJub25lXCI+Tm9uZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJtYW51YWxcIj5NYW51YWw8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiYXV0b1wiPkF1dG88L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIGFjdGl2ZVN0ZXAgPT09IFwiY2FtcGFpZ25cIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJjYW1wYWlnblwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJDYW1wYWlnblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDYW1wYWlnbiBtb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24ubW9kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsobW9kZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBtb2RlIGFzIENhbXBhaWduTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5vbmVcIj5ObyBjYW1wYWlnbjwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJleGlzdGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGlzdGluZyBjYW1wYWlnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5ld1wiPk5ldyBjYW1wYWlnbjwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NhbXBhaWduLm1vZGUgPT09IFwiZXhpc3RpbmdcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4aXN0aW5nIGNhbXBhaWduXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLmNhbXBhaWduX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5jYW1wYWlnbnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGNhbXBhaWduX2lkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjYW1wYWlnbi5tb2RlID09PSBcIm5ld1wiICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiSWRlbnRpZmllclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbi5jYW1wYWlnbl9pZGVudGlmaWVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduX2lkZW50aWZpZXI6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlN0YXJ0cyBhdFwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbi5zdGFydHNfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzX2F0OiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFbmRzIGF0XCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLmVuZHNfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kc19hdDogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2FjdGl2ZVN0ZXAgPT09IFwicHJpY2VzXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwicHJpY2VzXCIgc3R5bGU9e3sgaGVpZ2h0OiBcIjEwMCVcIiB9fT5cbiAgICAgICAgICAgICAgICAgICAgPFByb2R1Y3RQcmljZXNUYWJsZVxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgY291cG9uVmFsdWU9e2Zvcm1hdENvdXBvblZhbHVlKGNvdXBvbiwgY3VycmVuY2llcyl9XG4gICAgICAgICAgICAgICAgICAgICAgcHJpY2VzPXtwcm9kdWN0LnByaWNlX2Ftb3VudHN9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhjdXJyZW5jeUNvZGUsIHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VfYW1vdW50czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQucHJpY2VfYW1vdW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VycmVuY3lDb2RlXTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Gb2N1c01vZGFsLkJvZHk+XG5cbiAgICAgICAgICA8Rm9jdXNNb2RhbC5Gb290ZXIgc3R5bGU9e3sgZmxleFNocmluazogMCB9fT5cbiAgICAgICAgICAgIDxCdXR0b24gdmFyaWFudD1cInNlY29uZGFyeVwiIG9uQ2xpY2s9eygpID0+IG9uT3BlbkNoYW5nZShmYWxzZSl9PlxuICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAge2N1cnJlbnRTdGVwSW5kZXggPiAwICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICBzZXRBY3RpdmVTdGVwKHZpc2libGVTdGVwc1tjdXJyZW50U3RlcEluZGV4IC0gMV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQmFja1xuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7Y3VycmVudFN0ZXBJbmRleCA8IHZpc2libGVTdGVwcy5sZW5ndGggLSAxID8gKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFhY3RpdmVTdGVwQ29tcGxldGV9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gY3VycmVudFN0ZXBJbmRleCArIDFcbiAgICAgICAgICAgICAgICAgIHNldEZ1cnRoZXN0U3RlcEluZGV4KChjdXJyZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChjdXJyZW50LCBuZXh0SW5kZXgpLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlU3RlcCh2aXNpYmxlU3RlcHNbbmV4dEluZGV4XSlcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQ29udGludWVcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFhY3RpdmVTdGVwQ29tcGxldGV9XG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nPXtzYXZpbmd9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBzYXZlKCl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBTYXZlXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0ZvY3VzTW9kYWwuRm9vdGVyPlxuICAgICAgICA8L1Byb2dyZXNzVGFicz5cbiAgICAgIDwvRm9jdXNNb2RhbC5Db250ZW50PlxuICAgIDwvRm9jdXNNb2RhbD5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQ291cG9uUHJvZHVjdHNQYWdlKHtcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgPSBmYWxzZSxcbiAgYXBpQmFzZSxcbiAgdGl0bGUsXG59OiB7XG4gIGFsbG93UHJvbW90aW9uTWlycm9yPzogYm9vbGVhblxuICBhcGlCYXNlOiBBcGlCYXNlXG4gIHRpdGxlOiBzdHJpbmdcbn0pIHtcbiAgY29uc3QgW3Byb2R1Y3RzLCBzZXRQcm9kdWN0c10gPSB1c2VTdGF0ZTxDb3Vwb25Qcm9kdWN0Um93W10+KFtdKVxuICBjb25zdCBbb3B0aW9ucywgc2V0T3B0aW9uc10gPSB1c2VTdGF0ZTxPcHRpb25zUGF5bG9hZD4oe30pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtsb2FkRXJyb3IsIHNldExvYWRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbW9kYWxPcGVuLCBzZXRNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtlZGl0aW5nUm93LCBzZXRFZGl0aW5nUm93XSA9IHVzZVN0YXRlPENvdXBvblByb2R1Y3RSb3cgfCBudWxsPihudWxsKVxuICBjb25zdCBwcm9tcHQgPSB1c2VQcm9tcHQoKVxuICBjb25zdCBjb3Vwb25CYXNlID0gYCR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzYFxuXG4gIGNvbnN0IGxvYWQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0TG9hZGluZyh0cnVlKVxuICAgIHNldExvYWRFcnJvcihudWxsKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbcHJvZHVjdHNQYXlsb2FkLCBvcHRpb25zUGF5bG9hZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGFwaUZldGNoPHsgY291cG9uX3Byb2R1Y3RzOiBDb3Vwb25Qcm9kdWN0Um93W10gfT4oY291cG9uQmFzZSksXG4gICAgICAgIGFwaUZldGNoPE9wdGlvbnNQYXlsb2FkPihgJHtjb3Vwb25CYXNlfS9vcHRpb25zYCksXG4gICAgICBdKVxuICAgICAgc2V0UHJvZHVjdHMocHJvZHVjdHNQYXlsb2FkLmNvdXBvbl9wcm9kdWN0cyB8fCBbXSlcbiAgICAgIHNldE9wdGlvbnMob3B0aW9uc1BheWxvYWQgfHwge30pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBcIkZhaWxlZCB0byBsb2FkIGNvdXBvbiBwcm9kdWN0c1wiXG4gICAgICBzZXRMb2FkRXJyb3IobWVzc2FnZSlcbiAgICAgIHRvYXN0LmVycm9yKG1lc3NhZ2UpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpXG4gICAgfVxuICB9LCBbY291cG9uQmFzZV0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB2b2lkIGxvYWQoKVxuICB9LCBbbG9hZF0pXG5cbiAgY29uc3QgcmVtb3ZlID0gYXN5bmMgKHJvdzogQ291cG9uUHJvZHVjdFJvdykgPT4ge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHByb21wdCh7XG4gICAgICB0aXRsZTogXCJSZW1vdmUgY291cG9uIHByb2R1Y3Q/XCIsXG4gICAgICBkZXNjcmlwdGlvbjogYFRoaXMgcmVtb3ZlcyBjb3Vwb24gaXNzdWFuY2UgZnJvbSAke3Jvdy5wcm9kdWN0LnRpdGxlIHx8IHJvdy5wcm9kdWN0LmlkXG4gICAgICAgIH0uIFRoZSB1bmRlcmx5aW5nIE1lZHVzYSBwcm9kdWN0IHdpbGwgcmVtYWluIGF2YWlsYWJsZS5gLFxuICAgICAgY29uZmlybVRleHQ6IFwiUmVtb3ZlIHByb2R1Y3RcIixcbiAgICAgIGNhbmNlbFRleHQ6IFwiQ2FuY2VsXCIsXG4gICAgICB2YXJpYW50OiBcImRhbmdlclwiLFxuICAgIH0pXG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVyblxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUZldGNoKGAke2NvdXBvbkJhc2V9LyR7cm93LnByb2R1Y3QuaWR9YCwgeyBtZXRob2Q6IFwiREVMRVRFXCIgfSlcbiAgICAgIHRvYXN0LnN1Y2Nlc3MoXCJDb3Vwb24gY29uZmlndXJhdGlvbiByZW1vdmVkXCIpXG4gICAgICBhd2FpdCBsb2FkKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIkRlbGV0ZSBmYWlsZWRcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCBtaXJyb3IgPSBhc3luYyAocm93OiBDb3Vwb25Qcm9kdWN0Um93KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaUZldGNoKFxuICAgICAgICBgL2FkbWluL2NvdXBvbi1wcm9kdWN0cy8ke3Jvdy5wcm9kdWN0LmlkfS9taXJyb3ItcHJvbW90aW9uYCxcbiAgICAgICAge1xuICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe30pLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgdG9hc3Quc3VjY2VzcyhcIlByb21vdGlvbiBtaXJyb3IgY3JlYXRlZFwiKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiTWlycm9yIGZhaWxlZFwiKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTYgcHktNFwiPlxuICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgxXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgPEJ1dHRvbiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gdm9pZCBsb2FkKCl9PlxuICAgICAgICAgICAgPEFycm93UGF0aCAvPiBSZWZyZXNoXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgc2V0RWRpdGluZ1JvdyhudWxsKVxuICAgICAgICAgICAgICBzZXRNb2RhbE9wZW4odHJ1ZSlcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFBsdXMgLz4gQ3JlYXRlXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT1cIkxvYWRpbmcgY291cG9uIHByb2R1Y3RzXCIgLz5cbiAgICAgICkgOiBsb2FkRXJyb3IgPyAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPXtsb2FkRXJyb3J9IC8+XG4gICAgICApIDogcHJvZHVjdHMubGVuZ3RoID8gKFxuICAgICAgICA8VGFibGU+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlcj5cbiAgICAgICAgICAgIDxUYWJsZS5Sb3c+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlByb2R1Y3Q8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlN0YXR1czwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+VHlwZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q29kZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q2FtcGFpZ248L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPklzc3VlZDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGwgLz5cbiAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgIDwvVGFibGUuSGVhZGVyPlxuICAgICAgICAgIDxUYWJsZS5Cb2R5XG4gICAgICAgICAgICBzdHlsZT17eyBib3JkZXJCb3R0b206ICdub25lJyB9fT5cbiAgICAgICAgICAgIHtwcm9kdWN0cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSByb3cuY291cG9uX3Byb2R1Y3RfY29uZmlnXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPFRhYmxlLlJvdyBrZXk9e3Jvdy5pZH1cbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckJvdHRvbTogJ25vbmUnLCBiYWNrZ3JvdW5kOiAnbm9uZScgfX0+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3Jvdy5wcm9kdWN0LnRpdGxlIHx8IHJvdy5wcm9kdWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cm93LnByb2R1Y3QuaGFuZGxlIHx8IHJvdy5wcm9kdWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPFN0YXR1c0JhZGdlXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I9e2NvdXBvblN0YXR1c0NvbG9yKGNvbmZpZy5wcm9tb3Rpb25fc3RhdHVzKX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHtjb25maWcucHJvbW90aW9uX3N0YXR1cyB8fCBcImRyYWZ0XCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvU3RhdHVzQmFkZ2U+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57Y291cG9uVHlwZUxhYmVsKGNvbmZpZyl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIHtjb25maWcuY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb25maWcuc2hhcmVkX2NvZGUgfHwgXCJTaGFyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIDogYCR7Y29uZmlnLmNvZGVfcHJlZml4IHx8IFwiQ09VUE9OXCJ9LSpgfVxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2NhbXBhaWduTGFiZWwoY29uZmlnKX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57cm93LmVudGl0bGVtZW50c19jb3VudCB8fCAwfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlnLmFtb3VudHM/Lmxlbmd0aCB8fCAwKSA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG1pcnJvcihyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVkaXRpbmdSb3cocm93KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRNb2RhbE9wZW4odHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBlbmNpbFNxdWFyZSAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgcmVtb3ZlKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRyYXNoIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1RhYmxlLkJvZHk+XG4gICAgICAgIDwvVGFibGU+XG4gICAgICApIDogKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZVxuICAgICAgICAgIHRpdGxlPVwiTm8gY291cG9uIHByb2R1Y3RzIGZvdW5kXCJcbiAgICAgICAgICBkZXNjcmlwdGlvbj1cIkNyZWF0ZSBhIG5ldyBjb3Vwb24gcHJvZHVjdCB0byBnZXQgc3RhcnRlZC5cIlxuICAgICAgICAvPlxuICAgICAgKX1cblxuICAgICAgPENvdXBvblByb2R1Y3RNb2RhbFxuICAgICAgICBvcGVuPXttb2RhbE9wZW59XG4gICAgICAgIHJvdz17ZWRpdGluZ1Jvd31cbiAgICAgICAgYXBpQmFzZT17YXBpQmFzZX1cbiAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgYWxsb3dQcm9tb3Rpb25NaXJyb3I9e2FsbG93UHJvbW90aW9uTWlycm9yfVxuICAgICAgICBvbk9wZW5DaGFuZ2U9e3NldE1vZGFsT3Blbn1cbiAgICAgICAgb25TYXZlZD17bG9hZH1cbiAgICAgIC8+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cbiIsICJpbXBvcnQgeyBUZXh0IH0gZnJvbSBcIkBtZWR1c2Fqcy91aVwiXG5cbmV4cG9ydCBmdW5jdGlvbiBDb3Vwb25FbXB0eVN0YXRlKHtcbiAgZGVzY3JpcHRpb24sXG4gIHRpdGxlLFxufToge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBmbGV4LTEgZmxleC1jb2wgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggbWluLWgtWzI1MHB4XSB3LWZ1bGwgZmxleC0xIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC02IHB5LTRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNpemUtZnVsbCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+e3RpdGxlfTwvVGV4dD5cbiAgICAgICAgICB7ZGVzY3JpcHRpb24gPyA8VGV4dD57ZGVzY3JpcHRpb259PC9UZXh0PiA6IG51bGx9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsICJpbXBvcnQgeyBDb3Vwb25EZXRhaWxQYWdlVmlldyB9IGZyb20gXCIuLi8uLi8uLi8uLi9kYXNoYm9hcmQvY291cG9ucy9jb3Vwb24tbWFuYWdlclwiXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvdXBvbkRldGFpbFBhZ2UoKSB7XG4gIHJldHVybiA8Q291cG9uRGV0YWlsUGFnZVZpZXcgYXBpQmFzZT1cIi9hZG1pblwiIC8+XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSb3V0ZUNvbmZpZyB9IGZyb20gXCJAbWVyY3VyanMvZGFzaGJvYXJkLXNka1wiXG5pbXBvcnQgeyBSZWNlaXB0UGVyY2VudCB9IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHsgQ291cG9uUHJvZHVjdHNQYWdlVmlldyB9IGZyb20gXCIuLi8uLi8uLi8uLi9kYXNoYm9hcmQvY291cG9ucy9jb3Vwb24tbWFuYWdlclwiXG5cbmV4cG9ydCBjb25zdCBjb25maWc6IFJvdXRlQ29uZmlnID0ge1xuICBsYWJlbDogXCJDb3Vwb24gUHJvZHVjdHNcIixcbiAgaWNvbjogUmVjZWlwdFBlcmNlbnQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvdXBvblByb2R1Y3RzUGFnZSgpIHtcbiAgcmV0dXJuIChcbiAgICA8Q291cG9uUHJvZHVjdHNQYWdlVmlld1xuICAgICAgYXBpQmFzZT1cIi9hZG1pblwiXG4gICAgICB0aXRsZT1cIkNvdXBvbiBQcm9kdWN0c1wiXG4gICAgICBhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgIC8+XG4gIClcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUE7QUFBQSxFQUNFLFNBQVc7QUFBQSxJQUNULE1BQVE7QUFBQSxJQUNSLGNBQWdCO0FBQUEsRUFDbEI7QUFDRjs7O0FDSEEsSUFBTyxlQUFRO0FBQUEsRUFDYixJQUFJO0FBQUEsSUFDRixhQUFhO0FBQUEsRUFDZjtBQUNGOzs7QUNMQSxJQUFBQSxnQkFBK0I7OztBQ0QvQixJQUFBQyxnQkFRTztBQUNQLElBQUFDLGdCQU9PO0FBQ1AsSUFBQUMsYUFtQk87OztBQ3BDUCxtQkFVTztBQUNQLG1CQVdPO0FBQ1AsSUFBQUMsYUF1Qk87OztBQzlDUCxnQkFBcUI7QUFZYjtBQVZELFNBQVMsaUJBQWlCO0FBQUEsRUFDL0I7QUFBQSxFQUNBO0FBQ0YsR0FHRztBQUNELFNB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QUN0QixlQUFlLE9BQWM7QUFBQSxJQUMvQjtBQUFBLElBQ0E7QUFBQSxNQUNFLE9BQU9DLFFBQXFCO0FBQUEsTUFDNUIsTUFBTUEsUUFBcUI7QUFBQSxNQUMzQixNQUFNO0FBQUEsTUFDTixNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixlQUFlQSxRQUFxQjtBQUFBLElBQ3RDO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTyxnQkFBUTtBQUFBLEVBQ2IsY0FBYztBQUFBLElBQ1osU0FBUyxDQUFDO0FBQUEsRUFDWjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxZQUFZO0FBQUEsSUFDVixjQUFjLENBQUM7QUFBQSxFQUNqQjtBQUFBLEVBQ0EsZUFBZTtBQUFBLElBQ2IsVUFBVSxDQUFDO0FBQUEsRUFDYjtBQUFBLEVBQ0EsWUFBWTtBQUNkOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfaWNvbnMiLCAiaW1wb3J0X3JlYWN0IiwgImltcG9ydF9pY29ucyIsICJpbXBvcnRfdWkiLCAiaW1wb3J0X3VpIiwgImltcG9ydF9qc3hfcnVudGltZSIsICJjb25maWciLCAicm93IiwgInZhbHVlIiwgInZhbHVlcyIsICJwYXlsb2FkIiwgInJvdyIsICJjb25maWciLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImJhY2tlbmRVcmwiLCAiYXBpRXJyb3JNZXNzYWdlIiwgImFwaUZldGNoIiwgImFtb3VudCIsICJjdXJyZW5jeSIsICJhcGlGZXRjaCIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiaW1wb3J0X2pzeF9ydW50aW1lIiwgImltcG9ydF9pY29ucyIsICJpbXBvcnRfanN4X3J1bnRpbWUiLCAiY29uZmlnIiwgIkNvdXBvblByb2R1Y3RzUGFnZSIsICJDb3Vwb25Qcm9kdWN0c1BhZ2UiLCAiY29uZmlnIl0KfQo=
|
|
3206
|
+
|
|
3207
|
+
module.exports = module.exports.default || module.exports
|