@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,3237 @@
|
|
|
1
|
+
// src/vendor/i18n/en.json
|
|
2
|
+
var en_default = {
|
|
3
|
+
coupons: {
|
|
4
|
+
menu: "Coupons",
|
|
5
|
+
productsMenu: "Coupon Products"
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
// src/vendor/i18n/index.ts
|
|
10
|
+
var i18n_default = {
|
|
11
|
+
en: {
|
|
12
|
+
translation: en_default
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// src/vendor/routes/coupons/page.tsx
|
|
17
|
+
import { ReceiptPercent } from "@medusajs/icons";
|
|
18
|
+
|
|
19
|
+
// src/dashboard/coupons/coupon-manager.tsx
|
|
20
|
+
import {
|
|
21
|
+
useCallback as useCallback2,
|
|
22
|
+
useEffect as useEffect2,
|
|
23
|
+
useMemo as useMemo2,
|
|
24
|
+
useState as useState2
|
|
25
|
+
} from "react";
|
|
26
|
+
import {
|
|
27
|
+
ArrowPath as ArrowPath2,
|
|
28
|
+
PencilSquare as PencilSquare2,
|
|
29
|
+
Plus as Plus2,
|
|
30
|
+
ShoppingCart,
|
|
31
|
+
Trash as Trash2,
|
|
32
|
+
TriangleRightMini
|
|
33
|
+
} from "@medusajs/icons";
|
|
34
|
+
import {
|
|
35
|
+
Button as Button2,
|
|
36
|
+
Container as Container2,
|
|
37
|
+
Copy,
|
|
38
|
+
CurrencyInput as CurrencyInput2,
|
|
39
|
+
FocusModal as FocusModal2,
|
|
40
|
+
Heading as Heading2,
|
|
41
|
+
Input as Input2,
|
|
42
|
+
Label as Label2,
|
|
43
|
+
ProgressTabs as ProgressTabs2,
|
|
44
|
+
Select as Select2,
|
|
45
|
+
StatusBadge as StatusBadge2,
|
|
46
|
+
Switch as Switch2,
|
|
47
|
+
Table as Table2,
|
|
48
|
+
Tabs,
|
|
49
|
+
Text as Text3,
|
|
50
|
+
Textarea as Textarea2,
|
|
51
|
+
toast as toast2,
|
|
52
|
+
usePrompt as usePrompt2
|
|
53
|
+
} from "@medusajs/ui";
|
|
54
|
+
|
|
55
|
+
// src/dashboard/coupons/coupon-products-page.tsx
|
|
56
|
+
import {
|
|
57
|
+
useCallback,
|
|
58
|
+
useEffect,
|
|
59
|
+
useMemo,
|
|
60
|
+
useRef,
|
|
61
|
+
useState
|
|
62
|
+
} from "react";
|
|
63
|
+
import {
|
|
64
|
+
Adjustments,
|
|
65
|
+
ArrowPath,
|
|
66
|
+
ArrowUpTray,
|
|
67
|
+
InformationCircle,
|
|
68
|
+
PencilSquare,
|
|
69
|
+
Plus,
|
|
70
|
+
TaxExclusive,
|
|
71
|
+
TaxInclusive,
|
|
72
|
+
Trash,
|
|
73
|
+
XMarkMini
|
|
74
|
+
} from "@medusajs/icons";
|
|
75
|
+
import {
|
|
76
|
+
Button,
|
|
77
|
+
Checkbox,
|
|
78
|
+
Container,
|
|
79
|
+
CurrencyInput,
|
|
80
|
+
Divider,
|
|
81
|
+
DropdownMenu,
|
|
82
|
+
Drawer,
|
|
83
|
+
FocusModal,
|
|
84
|
+
Heading,
|
|
85
|
+
Input,
|
|
86
|
+
Label,
|
|
87
|
+
ProgressTabs,
|
|
88
|
+
RadioGroup,
|
|
89
|
+
Select,
|
|
90
|
+
StatusBadge,
|
|
91
|
+
Switch,
|
|
92
|
+
Table,
|
|
93
|
+
Text as Text2,
|
|
94
|
+
Textarea,
|
|
95
|
+
Tooltip,
|
|
96
|
+
toast,
|
|
97
|
+
usePrompt
|
|
98
|
+
} from "@medusajs/ui";
|
|
99
|
+
|
|
100
|
+
// src/dashboard/coupons/empty-state.tsx
|
|
101
|
+
import { Text } from "@medusajs/ui";
|
|
102
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
103
|
+
function CouponEmptyState({
|
|
104
|
+
description,
|
|
105
|
+
title
|
|
106
|
+
}) {
|
|
107
|
+
return /* @__PURE__ */ jsx("div", { className: "flex w-full flex-1 flex-col overflow-hidden", children: /* @__PURE__ */ jsx("div", { className: "flex min-h-[250px] w-full flex-1 flex-col items-center justify-center px-6 py-4", children: /* @__PURE__ */ jsxs("div", { className: "flex size-full flex-col items-center justify-center gap-2 text-center", children: [
|
|
108
|
+
/* @__PURE__ */ jsx(Text, { weight: "plus", children: title }),
|
|
109
|
+
description ? /* @__PURE__ */ jsx(Text, { children: description }) : null
|
|
110
|
+
] }) }) });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// src/dashboard/coupons/coupon-products-page.tsx
|
|
114
|
+
import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
115
|
+
var NONE = "__none__";
|
|
116
|
+
var allSteps = ["details", "organize", "campaign", "prices"];
|
|
117
|
+
var conditionAttributes = [
|
|
118
|
+
{ value: "customer.groups.id", label: "Customer Group" },
|
|
119
|
+
{ value: "region.id", label: "Region" },
|
|
120
|
+
{ value: "shipping_address.country_code", label: "Country" },
|
|
121
|
+
{ value: "sales_channel_id", label: "Sales Channel" },
|
|
122
|
+
{ value: "currency_code", label: "Currency Code" }
|
|
123
|
+
];
|
|
124
|
+
var conditionOperators = [
|
|
125
|
+
{ value: "in", label: "In" },
|
|
126
|
+
{ value: "eq", label: "Equals" },
|
|
127
|
+
{ value: "ne", label: "Not In" }
|
|
128
|
+
];
|
|
129
|
+
var typeChoices = [
|
|
130
|
+
{
|
|
131
|
+
value: "amount_off_products",
|
|
132
|
+
label: "Amount off products",
|
|
133
|
+
description: "Discount specific products or a collection of products"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
value: "amount_off_order",
|
|
137
|
+
label: "Amount off order",
|
|
138
|
+
description: "Discount the total order amount"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
value: "percentage_off_product",
|
|
142
|
+
label: "Percentage off product",
|
|
143
|
+
description: "Discount a percentage off selected products"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
value: "percentage_off_order",
|
|
147
|
+
label: "Percentage off order",
|
|
148
|
+
description: "Discount a percentage off the total order amount"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
value: "buy_x_get_y",
|
|
152
|
+
label: "Buy X Get Y",
|
|
153
|
+
description: "Issue a Buy X Get Y coupon entitlement"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
value: "free_shipping",
|
|
157
|
+
label: "Free shipping",
|
|
158
|
+
description: "Apply a 100% discount to shipping fees"
|
|
159
|
+
}
|
|
160
|
+
];
|
|
161
|
+
var statusChoices = [
|
|
162
|
+
{
|
|
163
|
+
value: "draft",
|
|
164
|
+
label: "Draft",
|
|
165
|
+
description: "Customers will not be able to use the code yet"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
value: "active",
|
|
169
|
+
label: "Active",
|
|
170
|
+
description: "Customers will be able to use the code"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
value: "inactive",
|
|
174
|
+
label: "Inactive",
|
|
175
|
+
description: "Keep the promotion unavailable until reactivated"
|
|
176
|
+
}
|
|
177
|
+
];
|
|
178
|
+
function backendUrl() {
|
|
179
|
+
return typeof __BACKEND_URL__ === "string" ? __BACKEND_URL__.replace(/\/$/, "") : "";
|
|
180
|
+
}
|
|
181
|
+
function apiErrorMessage(payload, fallback) {
|
|
182
|
+
return [payload?.message, payload?.error?.message, payload?.error].find(
|
|
183
|
+
(candidate) => typeof candidate === "string" && candidate.trim()
|
|
184
|
+
) || fallback || "Request failed";
|
|
185
|
+
}
|
|
186
|
+
async function apiFetch(path, options = {}) {
|
|
187
|
+
const response = await fetch(`${backendUrl()}${path}`, {
|
|
188
|
+
...options,
|
|
189
|
+
credentials: "include",
|
|
190
|
+
headers: {
|
|
191
|
+
...options.body ? { "Content-Type": "application/json" } : {},
|
|
192
|
+
...options.headers
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
const payload = await response.json().catch(() => null);
|
|
197
|
+
throw new Error(apiErrorMessage(payload, response.statusText));
|
|
198
|
+
}
|
|
199
|
+
return response.json();
|
|
200
|
+
}
|
|
201
|
+
function optionLabel(option) {
|
|
202
|
+
return option.name || option.title || option.value || option.handle || option.id;
|
|
203
|
+
}
|
|
204
|
+
function numberOrNull(value) {
|
|
205
|
+
const parsed = Number(value);
|
|
206
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
|
|
207
|
+
}
|
|
208
|
+
function nonNegativeNumberOrNull(value) {
|
|
209
|
+
if (!value.trim()) return null;
|
|
210
|
+
const parsed = Number(value);
|
|
211
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : null;
|
|
212
|
+
}
|
|
213
|
+
function toDateTimeLocal(value) {
|
|
214
|
+
if (!value) return "";
|
|
215
|
+
const date = new Date(value);
|
|
216
|
+
if (Number.isNaN(date.getTime())) return "";
|
|
217
|
+
const localDate = new Date(date.getTime() - date.getTimezoneOffset() * 6e4);
|
|
218
|
+
return localDate.toISOString().slice(0, 16);
|
|
219
|
+
}
|
|
220
|
+
function currencyDecimalDigits(code) {
|
|
221
|
+
try {
|
|
222
|
+
return new Intl.NumberFormat("en", {
|
|
223
|
+
style: "currency",
|
|
224
|
+
currency: code.toUpperCase()
|
|
225
|
+
}).resolvedOptions().maximumFractionDigits;
|
|
226
|
+
} catch {
|
|
227
|
+
return 2;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function currencySymbol(code) {
|
|
231
|
+
if (!code) return "";
|
|
232
|
+
try {
|
|
233
|
+
return new Intl.NumberFormat("en", {
|
|
234
|
+
style: "currency",
|
|
235
|
+
currency: code.toUpperCase(),
|
|
236
|
+
currencyDisplay: "narrowSymbol"
|
|
237
|
+
}).formatToParts(0).find((part) => part.type === "currency")?.value || code.toUpperCase();
|
|
238
|
+
} catch {
|
|
239
|
+
return code.toUpperCase();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function couponTypeFromConfig(config3) {
|
|
243
|
+
if (config3.benefit_type === "percentage") {
|
|
244
|
+
return config3.promotion_template?.application_method?.target_type === "order" ? "percentage_off_order" : "percentage_off_product";
|
|
245
|
+
}
|
|
246
|
+
if (config3.benefit_type === "buy_get") return "buy_x_get_y";
|
|
247
|
+
if (config3.benefit_type === "free_shipping") return "free_shipping";
|
|
248
|
+
return config3.promotion_template?.application_method?.target_type === "order" ? "amount_off_order" : "amount_off_products";
|
|
249
|
+
}
|
|
250
|
+
function benefitTypeFromCouponType(type) {
|
|
251
|
+
if (type === "percentage_off_product" || type === "percentage_off_order") return "percentage";
|
|
252
|
+
if (type === "buy_x_get_y") return "buy_get";
|
|
253
|
+
if (type === "free_shipping") return "free_shipping";
|
|
254
|
+
return "fixed_amount";
|
|
255
|
+
}
|
|
256
|
+
function couponTypeLabel(config3) {
|
|
257
|
+
return typeChoices.find(
|
|
258
|
+
(choice) => choice.value === couponTypeFromConfig(config3)
|
|
259
|
+
)?.label;
|
|
260
|
+
}
|
|
261
|
+
function couponStatusColor(status) {
|
|
262
|
+
if (status === "active") return "green";
|
|
263
|
+
if (status === "inactive") return "orange";
|
|
264
|
+
return "grey";
|
|
265
|
+
}
|
|
266
|
+
function productStatusFromCouponStatus(status) {
|
|
267
|
+
return status === "active" ? "published" : "draft";
|
|
268
|
+
}
|
|
269
|
+
function campaignLabel(config3) {
|
|
270
|
+
const name = config3.campaign_snapshot?.name;
|
|
271
|
+
return typeof name === "string" && name ? name : config3.campaign_id || "None";
|
|
272
|
+
}
|
|
273
|
+
function defaultCurrency(options) {
|
|
274
|
+
return options.currencies?.find((currency) => currency.is_default)?.code || options.currencies?.[0]?.code || "";
|
|
275
|
+
}
|
|
276
|
+
function conditionKey(prefix = "condition") {
|
|
277
|
+
return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
278
|
+
}
|
|
279
|
+
function isAmountCouponType(type) {
|
|
280
|
+
return type === "amount_off_products" || type === "amount_off_order";
|
|
281
|
+
}
|
|
282
|
+
function effectiveCouponCurrencies(conditions, currencies) {
|
|
283
|
+
const condition = conditions.find(
|
|
284
|
+
(item) => item.attribute === "currency_code"
|
|
285
|
+
);
|
|
286
|
+
if (!condition || !condition.operator) return [];
|
|
287
|
+
const selected = new Set(condition.values);
|
|
288
|
+
const supported = currencies.map((currency) => currency.code);
|
|
289
|
+
return condition.operator === "ne" ? supported.filter((code) => !selected.has(code)) : supported.filter((code) => selected.has(code));
|
|
290
|
+
}
|
|
291
|
+
function reconcileCouponAmounts(current, currencyCodes) {
|
|
292
|
+
const byCurrency = Object.fromEntries(
|
|
293
|
+
current.map((row) => [row.currency_code, row])
|
|
294
|
+
);
|
|
295
|
+
return currencyCodes.map((currencyCode) => ({
|
|
296
|
+
key: byCurrency[currencyCode]?.key || conditionKey("coupon-value"),
|
|
297
|
+
currency_code: currencyCode,
|
|
298
|
+
amount: byCurrency[currencyCode]?.amount || ""
|
|
299
|
+
}));
|
|
300
|
+
}
|
|
301
|
+
function defaultPurchaseConditions(options) {
|
|
302
|
+
const currencyCode = defaultCurrency(options);
|
|
303
|
+
return currencyCode ? [
|
|
304
|
+
{
|
|
305
|
+
key: conditionKey("currency"),
|
|
306
|
+
attribute: "currency_code",
|
|
307
|
+
operator: "eq",
|
|
308
|
+
values: [currencyCode]
|
|
309
|
+
}
|
|
310
|
+
] : [];
|
|
311
|
+
}
|
|
312
|
+
function emptyProduct(options) {
|
|
313
|
+
return {
|
|
314
|
+
title: "",
|
|
315
|
+
subtitle: "",
|
|
316
|
+
handle: "",
|
|
317
|
+
description: "",
|
|
318
|
+
media: [],
|
|
319
|
+
sku: "",
|
|
320
|
+
price_amounts: Object.fromEntries(
|
|
321
|
+
(options.currencies || []).map((currency) => [currency.code, ""])
|
|
322
|
+
),
|
|
323
|
+
status: "draft",
|
|
324
|
+
discountable: false,
|
|
325
|
+
seller_id: "",
|
|
326
|
+
type_id: "",
|
|
327
|
+
collection_id: "",
|
|
328
|
+
category_id: "",
|
|
329
|
+
tag_id: ""
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
function emptyCoupon(options) {
|
|
333
|
+
const currencyCode = defaultCurrency(options);
|
|
334
|
+
const purchaseConditions = defaultPurchaseConditions(options);
|
|
335
|
+
return {
|
|
336
|
+
enabled: true,
|
|
337
|
+
type: "amount_off_products",
|
|
338
|
+
purchase_conditions: purchaseConditions,
|
|
339
|
+
amounts: currencyCode ? [
|
|
340
|
+
{
|
|
341
|
+
key: "coupon-value-default",
|
|
342
|
+
currency_code: currencyCode,
|
|
343
|
+
amount: ""
|
|
344
|
+
}
|
|
345
|
+
] : [],
|
|
346
|
+
percentage: "",
|
|
347
|
+
allocation: "each",
|
|
348
|
+
code_strategy: "unique_code",
|
|
349
|
+
code_prefix: "COUPON",
|
|
350
|
+
shared_code: "",
|
|
351
|
+
expiration_type: "duration",
|
|
352
|
+
expiration_days: "30",
|
|
353
|
+
expiration_date: "",
|
|
354
|
+
expiration_cap_by_campaign: true,
|
|
355
|
+
expiration_cap_at: "",
|
|
356
|
+
max_issuance_per_order_item: "1",
|
|
357
|
+
promotion_mirror_mode: "none",
|
|
358
|
+
promotion_status: "draft"
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
var emptyCampaign = {
|
|
362
|
+
mode: "none",
|
|
363
|
+
campaign_id: "",
|
|
364
|
+
name: "",
|
|
365
|
+
campaign_identifier: "",
|
|
366
|
+
starts_at: "",
|
|
367
|
+
ends_at: ""
|
|
368
|
+
};
|
|
369
|
+
function formsFromRow(row, options) {
|
|
370
|
+
const product = row.product;
|
|
371
|
+
const config3 = row.coupon_product_config;
|
|
372
|
+
const variant = product.variants?.[0];
|
|
373
|
+
const prices = Object.fromEntries(
|
|
374
|
+
(variant?.prices || []).filter((price) => price.currency_code).map((price) => [
|
|
375
|
+
String(price.currency_code).toLowerCase(),
|
|
376
|
+
price.amount == null ? "" : String(price.amount)
|
|
377
|
+
])
|
|
378
|
+
);
|
|
379
|
+
const media = Array.from(
|
|
380
|
+
new Map(
|
|
381
|
+
[
|
|
382
|
+
...product.thumbnail ? [
|
|
383
|
+
{
|
|
384
|
+
url: product.thumbnail,
|
|
385
|
+
asset_id: product.thumbnail_asset_id || void 0
|
|
386
|
+
}
|
|
387
|
+
] : [],
|
|
388
|
+
...(product.images || []).filter((image) => image.url).map((image) => ({
|
|
389
|
+
url: String(image.url),
|
|
390
|
+
asset_id: image.asset_id || void 0
|
|
391
|
+
}))
|
|
392
|
+
].map((item) => [item.url, item])
|
|
393
|
+
).values()
|
|
394
|
+
);
|
|
395
|
+
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 }] : [];
|
|
396
|
+
const configuredConditions = (config3.purchase_conditions || []).map(
|
|
397
|
+
(condition, index) => ({
|
|
398
|
+
key: `condition-${index}`,
|
|
399
|
+
attribute: condition.attribute,
|
|
400
|
+
operator: condition.operator,
|
|
401
|
+
values: condition.values.map(
|
|
402
|
+
(value) => condition.attribute === "currency_code" || condition.attribute === "shipping_address.country_code" ? value.toLowerCase() : value
|
|
403
|
+
)
|
|
404
|
+
})
|
|
405
|
+
);
|
|
406
|
+
if (!configuredConditions.some(
|
|
407
|
+
(condition) => condition.attribute === "currency_code"
|
|
408
|
+
) && config3.benefit_type === "fixed_amount" && configuredAmounts.length) {
|
|
409
|
+
configuredConditions.push({
|
|
410
|
+
key: "condition-legacy-currency",
|
|
411
|
+
attribute: "currency_code",
|
|
412
|
+
operator: configuredAmounts.length === 1 ? "eq" : "in",
|
|
413
|
+
values: configuredAmounts.map(
|
|
414
|
+
(amount) => amount.currency_code.toLowerCase()
|
|
415
|
+
)
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
if (!configuredConditions.some(
|
|
419
|
+
(condition) => condition.attribute === "sales_channel_id"
|
|
420
|
+
) && product.sales_channels?.length) {
|
|
421
|
+
configuredConditions.push({
|
|
422
|
+
key: "condition-legacy-sales-channel",
|
|
423
|
+
attribute: "sales_channel_id",
|
|
424
|
+
operator: product.sales_channels.length === 1 ? "eq" : "in",
|
|
425
|
+
values: product.sales_channels.map((channel) => channel.id)
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
const expirationPolicy = config3.expiration_policy;
|
|
429
|
+
const configuredAmountRows = configuredAmounts.map((row2, index) => ({
|
|
430
|
+
key: `coupon-value-${index}`,
|
|
431
|
+
amount: String(row2.amount),
|
|
432
|
+
currency_code: row2.currency_code.toLowerCase()
|
|
433
|
+
}));
|
|
434
|
+
const amountRows = config3.benefit_type === "fixed_amount" ? reconcileCouponAmounts(
|
|
435
|
+
configuredAmountRows,
|
|
436
|
+
effectiveCouponCurrencies(configuredConditions, options.currencies || [])
|
|
437
|
+
) : configuredAmountRows;
|
|
438
|
+
return {
|
|
439
|
+
product: {
|
|
440
|
+
...emptyProduct(options),
|
|
441
|
+
title: product.title || "",
|
|
442
|
+
subtitle: product.subtitle || "",
|
|
443
|
+
handle: product.handle || "",
|
|
444
|
+
description: product.description || "",
|
|
445
|
+
media,
|
|
446
|
+
sku: variant?.sku || "",
|
|
447
|
+
price_amounts: {
|
|
448
|
+
...emptyProduct(options).price_amounts,
|
|
449
|
+
...prices
|
|
450
|
+
},
|
|
451
|
+
status: product.status || "draft",
|
|
452
|
+
discountable: Boolean(product.discountable),
|
|
453
|
+
type_id: product.type_id || "",
|
|
454
|
+
collection_id: product.collection_id || "",
|
|
455
|
+
category_id: product.categories?.[0]?.id || "",
|
|
456
|
+
tag_id: product.tags?.[0]?.id || ""
|
|
457
|
+
},
|
|
458
|
+
coupon: {
|
|
459
|
+
...emptyCoupon(options),
|
|
460
|
+
enabled: config3.enabled,
|
|
461
|
+
type: couponTypeFromConfig(config3),
|
|
462
|
+
purchase_conditions: configuredConditions,
|
|
463
|
+
amounts: config3.benefit_type === "fixed_amount" ? amountRows : amountRows.length ? amountRows : emptyCoupon(options).amounts,
|
|
464
|
+
percentage: config3.percentage == null ? "" : String(config3.percentage),
|
|
465
|
+
allocation: config3.promotion_template?.application_method?.allocation === "once" ? "once" : "each",
|
|
466
|
+
code_strategy: config3.code_strategy,
|
|
467
|
+
code_prefix: config3.code_prefix || "",
|
|
468
|
+
shared_code: config3.shared_code || "",
|
|
469
|
+
expiration_type: config3.expiration_policy?.type || "duration",
|
|
470
|
+
expiration_days: config3.expiration_policy?.type === "duration" ? String(config3.expiration_policy.duration_days) : "30",
|
|
471
|
+
expiration_date: config3.expiration_policy?.type === "fixed" ? toDateTimeLocal(config3.expiration_policy.expires_at) : "",
|
|
472
|
+
expiration_cap_by_campaign: expirationPolicy.type === "none" || expirationPolicy.cap_by_campaign !== false,
|
|
473
|
+
expiration_cap_at: expirationPolicy.type === "none" ? "" : toDateTimeLocal(expirationPolicy.cap_at),
|
|
474
|
+
max_issuance_per_order_item: String(
|
|
475
|
+
config3.max_issuance_per_order_item || 1
|
|
476
|
+
),
|
|
477
|
+
promotion_mirror_mode: config3.promotion_mirror_mode || "none",
|
|
478
|
+
promotion_status: config3.promotion_status || "draft"
|
|
479
|
+
},
|
|
480
|
+
campaign: {
|
|
481
|
+
...emptyCampaign,
|
|
482
|
+
mode: config3.campaign_id ? "existing" : "none",
|
|
483
|
+
campaign_id: config3.campaign_id || ""
|
|
484
|
+
}
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
var modalContentStyle = {
|
|
488
|
+
display: "flex",
|
|
489
|
+
flexDirection: "column",
|
|
490
|
+
overflow: "hidden"
|
|
491
|
+
};
|
|
492
|
+
var modalWizardStyle = {
|
|
493
|
+
display: "flex",
|
|
494
|
+
flex: "1 1 auto",
|
|
495
|
+
flexDirection: "column",
|
|
496
|
+
minHeight: 0,
|
|
497
|
+
overflow: "hidden"
|
|
498
|
+
};
|
|
499
|
+
var visuallyHiddenStyle = {
|
|
500
|
+
clip: "rect(0 0 0 0)",
|
|
501
|
+
clipPath: "inset(50%)",
|
|
502
|
+
height: 1,
|
|
503
|
+
overflow: "hidden",
|
|
504
|
+
position: "absolute",
|
|
505
|
+
whiteSpace: "nowrap",
|
|
506
|
+
width: 1
|
|
507
|
+
};
|
|
508
|
+
var modalBodyStyle = {
|
|
509
|
+
flex: "1 1 auto",
|
|
510
|
+
minHeight: 0,
|
|
511
|
+
padding: 0
|
|
512
|
+
};
|
|
513
|
+
var modalScrollStyle = {
|
|
514
|
+
height: "100%",
|
|
515
|
+
overflowY: "auto",
|
|
516
|
+
padding: "64px 24px 112px",
|
|
517
|
+
width: "100%"
|
|
518
|
+
};
|
|
519
|
+
var modalFormStyle = {
|
|
520
|
+
margin: "0 auto",
|
|
521
|
+
maxWidth: 720,
|
|
522
|
+
width: "min(720px, 100%)"
|
|
523
|
+
};
|
|
524
|
+
var stackStyle = {
|
|
525
|
+
display: "flex",
|
|
526
|
+
flexDirection: "column",
|
|
527
|
+
gap: 24
|
|
528
|
+
};
|
|
529
|
+
var twoColumnGridStyle = {
|
|
530
|
+
display: "grid",
|
|
531
|
+
gap: 16,
|
|
532
|
+
gridTemplateColumns: "repeat(auto-fit, minmax(260px, 1fr))"
|
|
533
|
+
};
|
|
534
|
+
var threeColumnGridStyle = {
|
|
535
|
+
display: "grid",
|
|
536
|
+
gap: 16,
|
|
537
|
+
gridTemplateColumns: "repeat(auto-fit, minmax(180px, 1fr))"
|
|
538
|
+
};
|
|
539
|
+
var panelStyle = {
|
|
540
|
+
border: "1px solid var(--border-base)",
|
|
541
|
+
borderRadius: 8,
|
|
542
|
+
padding: 16
|
|
543
|
+
};
|
|
544
|
+
function Field({
|
|
545
|
+
children,
|
|
546
|
+
label,
|
|
547
|
+
optional,
|
|
548
|
+
tooltip
|
|
549
|
+
}) {
|
|
550
|
+
return /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-1", style: { minWidth: 0 }, children: [
|
|
551
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-x-1", children: [
|
|
552
|
+
/* @__PURE__ */ jsx2(Label, { children: label }),
|
|
553
|
+
tooltip && /* @__PURE__ */ jsx2(Tooltip, { content: tooltip, children: /* @__PURE__ */ jsx2(
|
|
554
|
+
"button",
|
|
555
|
+
{
|
|
556
|
+
type: "button",
|
|
557
|
+
"aria-label": `${label} information`,
|
|
558
|
+
className: "text-ui-fg-muted",
|
|
559
|
+
children: /* @__PURE__ */ jsx2(InformationCircle, {})
|
|
560
|
+
}
|
|
561
|
+
) }),
|
|
562
|
+
optional && /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "(Optional)" })
|
|
563
|
+
] }),
|
|
564
|
+
children
|
|
565
|
+
] });
|
|
566
|
+
}
|
|
567
|
+
function Section({
|
|
568
|
+
children,
|
|
569
|
+
description,
|
|
570
|
+
title
|
|
571
|
+
}) {
|
|
572
|
+
return /* @__PURE__ */ jsxs2("section", { className: "flex flex-col gap-y-4", children: [
|
|
573
|
+
/* @__PURE__ */ jsxs2("div", { children: [
|
|
574
|
+
/* @__PURE__ */ jsx2(Heading, { level: "h2", children: title }),
|
|
575
|
+
description && /* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: description })
|
|
576
|
+
] }),
|
|
577
|
+
children
|
|
578
|
+
] });
|
|
579
|
+
}
|
|
580
|
+
function OptionSelect({
|
|
581
|
+
onChange,
|
|
582
|
+
options,
|
|
583
|
+
value
|
|
584
|
+
}) {
|
|
585
|
+
return /* @__PURE__ */ jsxs2(
|
|
586
|
+
Select,
|
|
587
|
+
{
|
|
588
|
+
value: value || NONE,
|
|
589
|
+
onValueChange: (next) => onChange(next === NONE ? "" : next),
|
|
590
|
+
children: [
|
|
591
|
+
/* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
|
|
592
|
+
/* @__PURE__ */ jsxs2(Select.Content, { children: [
|
|
593
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: NONE, children: "None" }),
|
|
594
|
+
options.map((option) => /* @__PURE__ */ jsx2(Select.Item, { value: option.id, children: optionLabel(option) }, option.id))
|
|
595
|
+
] })
|
|
596
|
+
]
|
|
597
|
+
}
|
|
598
|
+
);
|
|
599
|
+
}
|
|
600
|
+
function CurrencyAmountField({
|
|
601
|
+
currencies,
|
|
602
|
+
currencyCode,
|
|
603
|
+
onChange,
|
|
604
|
+
value
|
|
605
|
+
}) {
|
|
606
|
+
const currency = currencies.find((item) => item.code === currencyCode);
|
|
607
|
+
const code = currencyCode.toUpperCase();
|
|
608
|
+
const decimals = currencyDecimalDigits(code || "USD");
|
|
609
|
+
return /* @__PURE__ */ jsx2(
|
|
610
|
+
CurrencyInput,
|
|
611
|
+
{
|
|
612
|
+
code: code || "USD",
|
|
613
|
+
symbol: currency?.symbol_native || currency?.symbol || currencySymbol(code || "USD"),
|
|
614
|
+
min: 0,
|
|
615
|
+
decimalScale: decimals,
|
|
616
|
+
decimalsLimit: decimals,
|
|
617
|
+
value,
|
|
618
|
+
disabled: !currencyCode,
|
|
619
|
+
onValueChange: (nextValue) => onChange(nextValue || "")
|
|
620
|
+
}
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
function PercentageInput({
|
|
624
|
+
onChange,
|
|
625
|
+
value
|
|
626
|
+
}) {
|
|
627
|
+
return /* @__PURE__ */ jsxs2("div", { className: "flex w-full items-stretch", style: { width: "100%" }, children: [
|
|
628
|
+
/* @__PURE__ */ jsx2(
|
|
629
|
+
"div",
|
|
630
|
+
{
|
|
631
|
+
className: "bg-ui-bg-field text-ui-fg-muted flex items-center border",
|
|
632
|
+
style: {
|
|
633
|
+
borderColor: "var(--border-base)",
|
|
634
|
+
borderRadius: "6px 0 0 6px",
|
|
635
|
+
borderRight: 0,
|
|
636
|
+
padding: "0 12px"
|
|
637
|
+
},
|
|
638
|
+
children: "%"
|
|
639
|
+
}
|
|
640
|
+
),
|
|
641
|
+
/* @__PURE__ */ jsx2(
|
|
642
|
+
"div",
|
|
643
|
+
{
|
|
644
|
+
className: "min-w-0 flex-1",
|
|
645
|
+
style: { flex: "1 1 0%", minWidth: 0 },
|
|
646
|
+
children: /* @__PURE__ */ jsx2(
|
|
647
|
+
Input,
|
|
648
|
+
{
|
|
649
|
+
className: "w-full",
|
|
650
|
+
type: "number",
|
|
651
|
+
min: 1,
|
|
652
|
+
max: 100,
|
|
653
|
+
value,
|
|
654
|
+
style: {
|
|
655
|
+
borderRadius: "0 6px 6px 0",
|
|
656
|
+
width: "100%"
|
|
657
|
+
},
|
|
658
|
+
onChange: (event) => onChange(event.target.value)
|
|
659
|
+
}
|
|
660
|
+
)
|
|
661
|
+
}
|
|
662
|
+
)
|
|
663
|
+
] });
|
|
664
|
+
}
|
|
665
|
+
function HandleInput({
|
|
666
|
+
onChange,
|
|
667
|
+
value
|
|
668
|
+
}) {
|
|
669
|
+
return /* @__PURE__ */ jsxs2("div", { className: "relative", children: [
|
|
670
|
+
/* @__PURE__ */ jsx2("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__ */ jsx2("span", { className: "txt-compact-small font-medium", children: "/" }) }),
|
|
671
|
+
/* @__PURE__ */ jsx2(
|
|
672
|
+
Input,
|
|
673
|
+
{
|
|
674
|
+
value,
|
|
675
|
+
placeholder: "winter-jacket",
|
|
676
|
+
style: { paddingLeft: 34 },
|
|
677
|
+
onChange: (event) => onChange(event.target.value)
|
|
678
|
+
}
|
|
679
|
+
)
|
|
680
|
+
] });
|
|
681
|
+
}
|
|
682
|
+
function MediaUpload({
|
|
683
|
+
isUploading,
|
|
684
|
+
media,
|
|
685
|
+
onRemove,
|
|
686
|
+
onUpload
|
|
687
|
+
}) {
|
|
688
|
+
const inputRef = useRef(null);
|
|
689
|
+
const accept = "image/jpeg,image/png,image/gif,image/webp,image/heic,image/svg+xml";
|
|
690
|
+
const handleFiles = (files) => {
|
|
691
|
+
if (!files?.length) return;
|
|
692
|
+
onUpload(Array.from(files));
|
|
693
|
+
};
|
|
694
|
+
const handleDrop = (event) => {
|
|
695
|
+
event.preventDefault();
|
|
696
|
+
handleFiles(event.dataTransfer.files);
|
|
697
|
+
};
|
|
698
|
+
return /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-3", children: [
|
|
699
|
+
media.length > 0 && /* @__PURE__ */ jsx2(
|
|
700
|
+
"div",
|
|
701
|
+
{
|
|
702
|
+
className: "grid gap-3",
|
|
703
|
+
style: {
|
|
704
|
+
gridTemplateColumns: "repeat(auto-fill, minmax(120px, 1fr))"
|
|
705
|
+
},
|
|
706
|
+
children: media.map((item, index) => /* @__PURE__ */ jsxs2(
|
|
707
|
+
"div",
|
|
708
|
+
{
|
|
709
|
+
className: "relative overflow-hidden rounded-md border",
|
|
710
|
+
children: [
|
|
711
|
+
/* @__PURE__ */ jsx2(
|
|
712
|
+
"img",
|
|
713
|
+
{
|
|
714
|
+
src: item.url,
|
|
715
|
+
alt: "",
|
|
716
|
+
className: "h-32 w-full object-cover",
|
|
717
|
+
style: { height: 128 }
|
|
718
|
+
}
|
|
719
|
+
),
|
|
720
|
+
/* @__PURE__ */ jsxs2("div", { className: "absolute inset-x-0 bottom-0 flex items-center justify-between bg-black/60 px-2 py-1", children: [
|
|
721
|
+
/* @__PURE__ */ jsx2(Text2, { size: "xsmall", style: { color: "white" }, children: index === 0 ? "Thumbnail" : `Image ${index + 1}` }),
|
|
722
|
+
/* @__PURE__ */ jsx2(
|
|
723
|
+
"button",
|
|
724
|
+
{
|
|
725
|
+
type: "button",
|
|
726
|
+
"aria-label": "Remove image",
|
|
727
|
+
style: { color: "white" },
|
|
728
|
+
onClick: () => onRemove(item),
|
|
729
|
+
children: /* @__PURE__ */ jsx2(XMarkMini, {})
|
|
730
|
+
}
|
|
731
|
+
)
|
|
732
|
+
] })
|
|
733
|
+
]
|
|
734
|
+
},
|
|
735
|
+
item.asset_id || item.url
|
|
736
|
+
))
|
|
737
|
+
}
|
|
738
|
+
),
|
|
739
|
+
/* @__PURE__ */ jsx2(
|
|
740
|
+
"input",
|
|
741
|
+
{
|
|
742
|
+
ref: inputRef,
|
|
743
|
+
type: "file",
|
|
744
|
+
hidden: true,
|
|
745
|
+
multiple: true,
|
|
746
|
+
accept,
|
|
747
|
+
onChange: (event) => {
|
|
748
|
+
handleFiles(event.target.files);
|
|
749
|
+
event.target.value = "";
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
),
|
|
753
|
+
/* @__PURE__ */ jsxs2(
|
|
754
|
+
"button",
|
|
755
|
+
{
|
|
756
|
+
type: "button",
|
|
757
|
+
disabled: isUploading,
|
|
758
|
+
className: "text-ui-fg-muted flex w-full flex-col items-center justify-center gap-y-2 rounded-md border border-dashed p-8",
|
|
759
|
+
style: { minHeight: 148 },
|
|
760
|
+
onClick: () => inputRef.current?.click(),
|
|
761
|
+
onDragOver: (event) => event.preventDefault(),
|
|
762
|
+
onDrop: handleDrop,
|
|
763
|
+
children: [
|
|
764
|
+
/* @__PURE__ */ jsxs2("span", { className: "text-ui-fg-base flex items-center gap-x-2", children: [
|
|
765
|
+
/* @__PURE__ */ jsx2(ArrowUpTray, {}),
|
|
766
|
+
isUploading ? "Uploading images..." : "Upload images"
|
|
767
|
+
] }),
|
|
768
|
+
/* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "Drag and drop images here or click to upload." })
|
|
769
|
+
]
|
|
770
|
+
}
|
|
771
|
+
)
|
|
772
|
+
] });
|
|
773
|
+
}
|
|
774
|
+
function conditionValueOptions(attribute, options) {
|
|
775
|
+
if (attribute === "currency_code") {
|
|
776
|
+
return (options.currencies || []).map((currency) => ({
|
|
777
|
+
value: currency.code,
|
|
778
|
+
label: `${currency.name} (${currency.code.toUpperCase()})`
|
|
779
|
+
}));
|
|
780
|
+
}
|
|
781
|
+
if (attribute === "shipping_address.country_code") {
|
|
782
|
+
return (options.countries || []).map((country) => ({
|
|
783
|
+
value: String(country.iso_2 || country.id).toLowerCase(),
|
|
784
|
+
label: country.display_name || country.name || country.id
|
|
785
|
+
}));
|
|
786
|
+
}
|
|
787
|
+
const records = attribute === "customer.groups.id" ? options.customer_groups : attribute === "region.id" ? options.regions : attribute === "sales_channel_id" ? options.sales_channels : [];
|
|
788
|
+
return (records || []).map((record) => ({
|
|
789
|
+
value: record.id,
|
|
790
|
+
label: optionLabel(record)
|
|
791
|
+
}));
|
|
792
|
+
}
|
|
793
|
+
function MultiConditionValues({
|
|
794
|
+
attribute,
|
|
795
|
+
onChange,
|
|
796
|
+
options,
|
|
797
|
+
value
|
|
798
|
+
}) {
|
|
799
|
+
const [open, setOpen] = useState(false);
|
|
800
|
+
const [draft, setDraft] = useState(value);
|
|
801
|
+
const [search, setSearch] = useState("");
|
|
802
|
+
const labels = Object.fromEntries(options.map((option) => [option.value, option.label]));
|
|
803
|
+
const filtered = options.filter(
|
|
804
|
+
(option) => option.label.toLowerCase().includes(search.trim().toLowerCase())
|
|
805
|
+
);
|
|
806
|
+
return /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
807
|
+
/* @__PURE__ */ jsx2(
|
|
808
|
+
Button,
|
|
809
|
+
{
|
|
810
|
+
type: "button",
|
|
811
|
+
variant: "secondary",
|
|
812
|
+
className: "w-full justify-start",
|
|
813
|
+
onClick: () => {
|
|
814
|
+
setDraft(value);
|
|
815
|
+
setSearch("");
|
|
816
|
+
setOpen(true);
|
|
817
|
+
},
|
|
818
|
+
children: value.length ? value.length === 1 ? labels[value[0]] || value[0] : `${value.length} values selected` : "Select values"
|
|
819
|
+
}
|
|
820
|
+
),
|
|
821
|
+
value.length > 0 && /* @__PURE__ */ jsx2("div", { className: "mt-2 flex flex-wrap gap-1", children: value.map((item) => /* @__PURE__ */ jsxs2(
|
|
822
|
+
"span",
|
|
823
|
+
{
|
|
824
|
+
className: "bg-ui-bg-component text-ui-fg-subtle flex items-center gap-x-1 rounded-md border px-2 py-1 text-xs",
|
|
825
|
+
children: [
|
|
826
|
+
labels[item] || item,
|
|
827
|
+
/* @__PURE__ */ jsx2(
|
|
828
|
+
"button",
|
|
829
|
+
{
|
|
830
|
+
type: "button",
|
|
831
|
+
"aria-label": `Remove ${labels[item] || item}`,
|
|
832
|
+
onClick: () => onChange(value.filter((entry) => entry !== item)),
|
|
833
|
+
children: /* @__PURE__ */ jsx2(XMarkMini, {})
|
|
834
|
+
}
|
|
835
|
+
)
|
|
836
|
+
]
|
|
837
|
+
},
|
|
838
|
+
item
|
|
839
|
+
)) }),
|
|
840
|
+
/* @__PURE__ */ jsx2(Drawer, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs2(Drawer.Content, { children: [
|
|
841
|
+
/* @__PURE__ */ jsx2(Drawer.Header, { children: /* @__PURE__ */ jsxs2(Drawer.Title, { children: [
|
|
842
|
+
"Select ",
|
|
843
|
+
conditionAttributes.find((item) => item.value === attribute)?.label
|
|
844
|
+
] }) }),
|
|
845
|
+
/* @__PURE__ */ jsxs2(Drawer.Body, { className: "flex flex-col gap-y-3 overflow-y-auto", children: [
|
|
846
|
+
/* @__PURE__ */ jsx2(
|
|
847
|
+
Input,
|
|
848
|
+
{
|
|
849
|
+
value: search,
|
|
850
|
+
placeholder: "Search values",
|
|
851
|
+
onChange: (event) => setSearch(event.target.value)
|
|
852
|
+
}
|
|
853
|
+
),
|
|
854
|
+
filtered.length ? filtered.map((option) => /* @__PURE__ */ jsxs2(
|
|
855
|
+
"label",
|
|
856
|
+
{
|
|
857
|
+
className: "flex cursor-pointer items-center gap-x-3 rounded-md border p-3",
|
|
858
|
+
children: [
|
|
859
|
+
/* @__PURE__ */ jsx2(
|
|
860
|
+
Checkbox,
|
|
861
|
+
{
|
|
862
|
+
checked: draft.includes(option.value),
|
|
863
|
+
onCheckedChange: (checked) => setDraft(
|
|
864
|
+
(current) => checked ? Array.from(/* @__PURE__ */ new Set([...current, option.value])) : current.filter((value2) => value2 !== option.value)
|
|
865
|
+
)
|
|
866
|
+
}
|
|
867
|
+
),
|
|
868
|
+
/* @__PURE__ */ jsx2(Text2, { children: option.label })
|
|
869
|
+
]
|
|
870
|
+
},
|
|
871
|
+
option.value
|
|
872
|
+
)) : /* @__PURE__ */ jsx2(Text2, { className: "text-ui-fg-muted", children: "No matching values." })
|
|
873
|
+
] }),
|
|
874
|
+
/* @__PURE__ */ jsxs2(Drawer.Footer, { children: [
|
|
875
|
+
/* @__PURE__ */ jsx2(Button, { type: "button", variant: "secondary", onClick: () => setOpen(false), children: "Cancel" }),
|
|
876
|
+
/* @__PURE__ */ jsx2(
|
|
877
|
+
Button,
|
|
878
|
+
{
|
|
879
|
+
type: "button",
|
|
880
|
+
disabled: !draft.length,
|
|
881
|
+
onClick: () => {
|
|
882
|
+
onChange(draft);
|
|
883
|
+
setOpen(false);
|
|
884
|
+
},
|
|
885
|
+
children: "Apply"
|
|
886
|
+
}
|
|
887
|
+
)
|
|
888
|
+
] })
|
|
889
|
+
] }) })
|
|
890
|
+
] });
|
|
891
|
+
}
|
|
892
|
+
function PurchaseConditionsField({
|
|
893
|
+
fixedAmount,
|
|
894
|
+
onChange,
|
|
895
|
+
options,
|
|
896
|
+
value
|
|
897
|
+
}) {
|
|
898
|
+
const selectedAttributes = new Set(
|
|
899
|
+
value.map((condition) => condition.attribute).filter(Boolean)
|
|
900
|
+
);
|
|
901
|
+
const replace = (key, update) => onChange(
|
|
902
|
+
value.map(
|
|
903
|
+
(condition) => condition.key === key ? { ...condition, ...update } : condition
|
|
904
|
+
)
|
|
905
|
+
);
|
|
906
|
+
return /* @__PURE__ */ jsx2(
|
|
907
|
+
Section,
|
|
908
|
+
{
|
|
909
|
+
title: "Who can purchase this coupon?",
|
|
910
|
+
description: "Coupon products can be purchased by all customers when no conditions are configured. Conditions are combined with AND.",
|
|
911
|
+
children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-3", children: [
|
|
912
|
+
value.map((condition, index) => {
|
|
913
|
+
const values = conditionValueOptions(condition.attribute, options);
|
|
914
|
+
const currencyRequired = fixedAmount && condition.attribute === "currency_code";
|
|
915
|
+
return /* @__PURE__ */ jsxs2("div", { children: [
|
|
916
|
+
index > 0 && /* @__PURE__ */ jsx2("div", { className: "text-ui-fg-muted flex h-8 items-center text-xs font-medium", children: "AND" }),
|
|
917
|
+
/* @__PURE__ */ jsxs2("div", { style: panelStyle, className: "relative flex flex-col gap-y-3", children: [
|
|
918
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-start gap-x-2", children: [
|
|
919
|
+
/* @__PURE__ */ jsx2("div", { className: "flex-1", children: /* @__PURE__ */ jsxs2(
|
|
920
|
+
Select,
|
|
921
|
+
{
|
|
922
|
+
value: condition.attribute || void 0,
|
|
923
|
+
disabled: currencyRequired,
|
|
924
|
+
onValueChange: (attribute) => replace(condition.key, {
|
|
925
|
+
attribute,
|
|
926
|
+
operator: "",
|
|
927
|
+
values: []
|
|
928
|
+
}),
|
|
929
|
+
children: [
|
|
930
|
+
/* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, { placeholder: "Select attribute" }) }),
|
|
931
|
+
/* @__PURE__ */ jsx2(Select.Content, { children: conditionAttributes.filter(
|
|
932
|
+
(attribute) => attribute.value === condition.attribute || !selectedAttributes.has(attribute.value)
|
|
933
|
+
).map((attribute) => /* @__PURE__ */ jsx2(Select.Item, { value: attribute.value, children: attribute.label }, attribute.value)) })
|
|
934
|
+
]
|
|
935
|
+
}
|
|
936
|
+
) }),
|
|
937
|
+
/* @__PURE__ */ jsx2(
|
|
938
|
+
Button,
|
|
939
|
+
{
|
|
940
|
+
type: "button",
|
|
941
|
+
size: "small",
|
|
942
|
+
variant: "transparent",
|
|
943
|
+
disabled: currencyRequired,
|
|
944
|
+
"aria-label": "Remove condition",
|
|
945
|
+
onClick: () => onChange(value.filter((item) => item.key !== condition.key)),
|
|
946
|
+
children: /* @__PURE__ */ jsx2(XMarkMini, {})
|
|
947
|
+
}
|
|
948
|
+
)
|
|
949
|
+
] }),
|
|
950
|
+
/* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
|
|
951
|
+
/* @__PURE__ */ jsxs2(
|
|
952
|
+
Select,
|
|
953
|
+
{
|
|
954
|
+
value: condition.operator || void 0,
|
|
955
|
+
disabled: !condition.attribute,
|
|
956
|
+
onValueChange: (operator) => replace(condition.key, {
|
|
957
|
+
operator,
|
|
958
|
+
values: operator === "eq" ? condition.values.slice(0, 1) : condition.values
|
|
959
|
+
}),
|
|
960
|
+
children: [
|
|
961
|
+
/* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, { placeholder: "Select operator" }) }),
|
|
962
|
+
/* @__PURE__ */ jsx2(Select.Content, { children: conditionOperators.map((operator) => /* @__PURE__ */ jsx2(Select.Item, { value: operator.value, children: operator.label }, operator.value)) })
|
|
963
|
+
]
|
|
964
|
+
}
|
|
965
|
+
),
|
|
966
|
+
condition.attribute && condition.operator === "eq" ? /* @__PURE__ */ jsxs2(
|
|
967
|
+
Select,
|
|
968
|
+
{
|
|
969
|
+
value: condition.values[0] || void 0,
|
|
970
|
+
onValueChange: (selected) => replace(condition.key, { values: [selected] }),
|
|
971
|
+
children: [
|
|
972
|
+
/* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, { placeholder: "Select value" }) }),
|
|
973
|
+
/* @__PURE__ */ jsx2(Select.Content, { children: values.map((option) => /* @__PURE__ */ jsx2(Select.Item, { value: option.value, children: option.label }, option.value)) })
|
|
974
|
+
]
|
|
975
|
+
}
|
|
976
|
+
) : condition.attribute && condition.operator ? /* @__PURE__ */ jsx2(
|
|
977
|
+
MultiConditionValues,
|
|
978
|
+
{
|
|
979
|
+
attribute: condition.attribute,
|
|
980
|
+
options: values,
|
|
981
|
+
value: condition.values,
|
|
982
|
+
onChange: (values2) => replace(condition.key, { values: values2 })
|
|
983
|
+
}
|
|
984
|
+
) : /* @__PURE__ */ jsx2(Button, { type: "button", variant: "secondary", disabled: true, className: "w-full", children: "Select values" })
|
|
985
|
+
] })
|
|
986
|
+
] })
|
|
987
|
+
] }, condition.key);
|
|
988
|
+
}),
|
|
989
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-x-2", children: [
|
|
990
|
+
/* @__PURE__ */ jsxs2(
|
|
991
|
+
Button,
|
|
992
|
+
{
|
|
993
|
+
type: "button",
|
|
994
|
+
variant: "secondary",
|
|
995
|
+
disabled: selectedAttributes.size >= conditionAttributes.length,
|
|
996
|
+
onClick: () => onChange([
|
|
997
|
+
...value,
|
|
998
|
+
{ key: conditionKey(), attribute: "", operator: "", values: [] }
|
|
999
|
+
]),
|
|
1000
|
+
children: [
|
|
1001
|
+
/* @__PURE__ */ jsx2(Plus, {}),
|
|
1002
|
+
" Add condition"
|
|
1003
|
+
]
|
|
1004
|
+
}
|
|
1005
|
+
),
|
|
1006
|
+
/* @__PURE__ */ jsx2(
|
|
1007
|
+
Button,
|
|
1008
|
+
{
|
|
1009
|
+
type: "button",
|
|
1010
|
+
variant: "transparent",
|
|
1011
|
+
onClick: () => onChange(fixedAmount ? defaultPurchaseConditions(options) : []),
|
|
1012
|
+
children: "Clear all"
|
|
1013
|
+
}
|
|
1014
|
+
)
|
|
1015
|
+
] })
|
|
1016
|
+
] })
|
|
1017
|
+
}
|
|
1018
|
+
);
|
|
1019
|
+
}
|
|
1020
|
+
function ProductPricesTable({
|
|
1021
|
+
currencies,
|
|
1022
|
+
couponValue,
|
|
1023
|
+
onChange,
|
|
1024
|
+
prices
|
|
1025
|
+
}) {
|
|
1026
|
+
const [visibleCurrencies, setVisibleCurrencies] = useState(
|
|
1027
|
+
() => currencies.map((currency) => currency.code)
|
|
1028
|
+
);
|
|
1029
|
+
useEffect(() => {
|
|
1030
|
+
setVisibleCurrencies((current) => {
|
|
1031
|
+
const available = new Set(currencies.map((currency) => currency.code));
|
|
1032
|
+
const retained = current.filter((code) => available.has(code));
|
|
1033
|
+
const added = currencies.map((currency) => currency.code).filter((code) => !current.includes(code));
|
|
1034
|
+
return [...retained, ...added];
|
|
1035
|
+
});
|
|
1036
|
+
}, [currencies]);
|
|
1037
|
+
const shownCurrencies = currencies.filter(
|
|
1038
|
+
(currency) => visibleCurrencies.includes(currency.code)
|
|
1039
|
+
);
|
|
1040
|
+
return /* @__PURE__ */ jsx2("div", { className: "flex size-full flex-col divide-y overflow-hidden", children: /* @__PURE__ */ jsxs2("div", { className: "bg-ui-bg-subtle flex size-full flex-col", children: [
|
|
1041
|
+
/* @__PURE__ */ jsxs2("div", { className: "bg-ui-bg-base flex items-center justify-between border-b p-4", children: [
|
|
1042
|
+
/* @__PURE__ */ jsx2("div", { className: "flex items-center gap-x-2", children: /* @__PURE__ */ jsxs2(DropdownMenu, { children: [
|
|
1043
|
+
/* @__PURE__ */ jsx2(DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs2(Button, { type: "button", size: "small", variant: "secondary", children: [
|
|
1044
|
+
/* @__PURE__ */ jsx2(Adjustments, {}),
|
|
1045
|
+
"View"
|
|
1046
|
+
] }) }),
|
|
1047
|
+
/* @__PURE__ */ jsx2(DropdownMenu.Content, { align: "start", children: currencies.map((currency) => /* @__PURE__ */ jsxs2(
|
|
1048
|
+
DropdownMenu.CheckboxItem,
|
|
1049
|
+
{
|
|
1050
|
+
checked: visibleCurrencies.includes(currency.code),
|
|
1051
|
+
onCheckedChange: (checked) => setVisibleCurrencies(
|
|
1052
|
+
(current) => checked ? Array.from(/* @__PURE__ */ new Set([...current, currency.code])) : current.filter((code) => code !== currency.code)
|
|
1053
|
+
),
|
|
1054
|
+
children: [
|
|
1055
|
+
"Price ",
|
|
1056
|
+
currency.code.toUpperCase()
|
|
1057
|
+
]
|
|
1058
|
+
},
|
|
1059
|
+
currency.code
|
|
1060
|
+
)) })
|
|
1061
|
+
] }) }),
|
|
1062
|
+
/* @__PURE__ */ jsx2("div", { className: "flex items-center gap-x-2" })
|
|
1063
|
+
] }),
|
|
1064
|
+
/* @__PURE__ */ jsxs2("div", { className: "size-full overflow-auto", children: [
|
|
1065
|
+
/* @__PURE__ */ jsxs2(
|
|
1066
|
+
Table,
|
|
1067
|
+
{
|
|
1068
|
+
style: {
|
|
1069
|
+
borderCollapse: "collapse",
|
|
1070
|
+
tableLayout: "fixed",
|
|
1071
|
+
width: "max-content"
|
|
1072
|
+
},
|
|
1073
|
+
children: [
|
|
1074
|
+
/* @__PURE__ */ jsx2(Table.Header, { style: { borderTop: "none" }, children: /* @__PURE__ */ jsxs2(Table.Row, { style: { height: 40 }, children: [
|
|
1075
|
+
/* @__PURE__ */ jsx2(
|
|
1076
|
+
Table.HeaderCell,
|
|
1077
|
+
{
|
|
1078
|
+
style: {
|
|
1079
|
+
background: "var(--bg-base)",
|
|
1080
|
+
borderBottom: "1px solid var(--border-base)",
|
|
1081
|
+
borderRight: "1px solid var(--border-base)",
|
|
1082
|
+
height: 40,
|
|
1083
|
+
left: 0,
|
|
1084
|
+
maxWidth: 200,
|
|
1085
|
+
minWidth: 200,
|
|
1086
|
+
padding: "0 16px",
|
|
1087
|
+
position: "sticky",
|
|
1088
|
+
width: 200,
|
|
1089
|
+
zIndex: 1
|
|
1090
|
+
},
|
|
1091
|
+
children: "Coupon Value"
|
|
1092
|
+
}
|
|
1093
|
+
),
|
|
1094
|
+
shownCurrencies.map((currency) => /* @__PURE__ */ jsx2(
|
|
1095
|
+
Table.HeaderCell,
|
|
1096
|
+
{
|
|
1097
|
+
style: {
|
|
1098
|
+
background: "var(--bg-base)",
|
|
1099
|
+
borderBottom: "1px solid var(--border-base)",
|
|
1100
|
+
borderRight: "1px solid var(--border-base)",
|
|
1101
|
+
height: 40,
|
|
1102
|
+
maxWidth: 200,
|
|
1103
|
+
minWidth: 200,
|
|
1104
|
+
padding: "0 16px",
|
|
1105
|
+
width: 200
|
|
1106
|
+
},
|
|
1107
|
+
children: /* @__PURE__ */ jsxs2("div", { className: "flex w-full items-center justify-between gap-3", children: [
|
|
1108
|
+
/* @__PURE__ */ jsxs2("span", { className: "truncate", title: `Price ${currency.code.toUpperCase()}`, children: [
|
|
1109
|
+
"Price ",
|
|
1110
|
+
currency.code.toUpperCase()
|
|
1111
|
+
] }),
|
|
1112
|
+
currency.is_tax_inclusive ? /* @__PURE__ */ jsx2(TaxInclusive, { className: "text-ui-fg-muted shrink-0" }) : /* @__PURE__ */ jsx2(TaxExclusive, { className: "text-ui-fg-muted shrink-0" })
|
|
1113
|
+
] })
|
|
1114
|
+
},
|
|
1115
|
+
currency.code
|
|
1116
|
+
))
|
|
1117
|
+
] }) }),
|
|
1118
|
+
/* @__PURE__ */ jsx2(Table.Body, { children: /* @__PURE__ */ jsxs2(Table.Row, { className: "bg-ui-bg-subtle", style: { height: 40 }, children: [
|
|
1119
|
+
/* @__PURE__ */ jsx2(
|
|
1120
|
+
Table.Cell,
|
|
1121
|
+
{
|
|
1122
|
+
style: {
|
|
1123
|
+
background: "var(--bg-subtle)",
|
|
1124
|
+
borderBottom: "1px solid var(--border-base)",
|
|
1125
|
+
borderRight: "1px solid var(--border-base)",
|
|
1126
|
+
height: 40,
|
|
1127
|
+
left: 0,
|
|
1128
|
+
maxWidth: 200,
|
|
1129
|
+
minWidth: 200,
|
|
1130
|
+
padding: "0 16px",
|
|
1131
|
+
position: "sticky",
|
|
1132
|
+
width: 200,
|
|
1133
|
+
zIndex: 1
|
|
1134
|
+
},
|
|
1135
|
+
children: /* @__PURE__ */ jsx2("span", { className: "block truncate", children: couponValue })
|
|
1136
|
+
}
|
|
1137
|
+
),
|
|
1138
|
+
shownCurrencies.map((currency) => /* @__PURE__ */ jsx2(
|
|
1139
|
+
Table.Cell,
|
|
1140
|
+
{
|
|
1141
|
+
style: {
|
|
1142
|
+
background: "var(--bg-base)",
|
|
1143
|
+
borderBottom: "1px solid var(--border-base)",
|
|
1144
|
+
borderRight: "1px solid var(--border-base)",
|
|
1145
|
+
height: 40,
|
|
1146
|
+
maxWidth: 200,
|
|
1147
|
+
minWidth: 200,
|
|
1148
|
+
padding: 0,
|
|
1149
|
+
width: 200
|
|
1150
|
+
},
|
|
1151
|
+
children: /* @__PURE__ */ jsx2(
|
|
1152
|
+
TablePriceInput,
|
|
1153
|
+
{
|
|
1154
|
+
currency,
|
|
1155
|
+
value: prices[currency.code] || "",
|
|
1156
|
+
onChange: (value) => onChange(currency.code, value)
|
|
1157
|
+
}
|
|
1158
|
+
)
|
|
1159
|
+
},
|
|
1160
|
+
currency.code
|
|
1161
|
+
))
|
|
1162
|
+
] }) })
|
|
1163
|
+
]
|
|
1164
|
+
}
|
|
1165
|
+
),
|
|
1166
|
+
!currencies.length && /* @__PURE__ */ jsx2("div", { className: "p-4", children: /* @__PURE__ */ jsx2(Text2, { className: "text-ui-fg-muted", children: "Add a supported currency to the store before setting prices." }) })
|
|
1167
|
+
] })
|
|
1168
|
+
] }) });
|
|
1169
|
+
}
|
|
1170
|
+
function formatCouponValue(coupon, currencies) {
|
|
1171
|
+
if (coupon.type === "amount_off_products" || coupon.type === "amount_off_order") {
|
|
1172
|
+
const defaultCode = currencies.find((currency) => currency.is_default)?.code || currencies[0]?.code;
|
|
1173
|
+
const primary = coupon.amounts.find((row) => row.currency_code === defaultCode) || coupon.amounts[0];
|
|
1174
|
+
const amount = numberOrNull(primary?.amount);
|
|
1175
|
+
if (amount == null) return "\u2014";
|
|
1176
|
+
const additional = Math.max(0, coupon.amounts.length - 1);
|
|
1177
|
+
const formatted = `${amount}${primary.currency_code.toUpperCase()}`;
|
|
1178
|
+
return additional ? `${formatted} +${additional}` : formatted;
|
|
1179
|
+
}
|
|
1180
|
+
if (coupon.type === "percentage_off_product" || coupon.type === "percentage_off_order") {
|
|
1181
|
+
const percentage = numberOrNull(coupon.percentage);
|
|
1182
|
+
if (percentage == null) return "\u2014";
|
|
1183
|
+
return coupon.type === "percentage_off_order" ? `${percentage}% off order` : `${percentage}% off products`;
|
|
1184
|
+
}
|
|
1185
|
+
return coupon.type === "free_shipping" ? "Free shipping" : "Buy X Get Y";
|
|
1186
|
+
}
|
|
1187
|
+
function TablePriceInput({
|
|
1188
|
+
currency,
|
|
1189
|
+
onChange,
|
|
1190
|
+
value
|
|
1191
|
+
}) {
|
|
1192
|
+
const symbol = currency.symbol_native || currency.symbol || currencySymbol(currency.code || "USD");
|
|
1193
|
+
return /* @__PURE__ */ jsxs2(
|
|
1194
|
+
"label",
|
|
1195
|
+
{
|
|
1196
|
+
className: "bg-ui-bg-base hover:bg-ui-bg-subtle focus-within:shadow-borders-interactive-with-active text-ui-fg-base",
|
|
1197
|
+
style: {
|
|
1198
|
+
alignItems: "center",
|
|
1199
|
+
borderRadius: 0,
|
|
1200
|
+
display: "flex",
|
|
1201
|
+
height: 40,
|
|
1202
|
+
margin: 0,
|
|
1203
|
+
overflow: "hidden",
|
|
1204
|
+
width: 200
|
|
1205
|
+
},
|
|
1206
|
+
children: [
|
|
1207
|
+
/* @__PURE__ */ jsx2(
|
|
1208
|
+
"span",
|
|
1209
|
+
{
|
|
1210
|
+
className: "text-ui-fg-muted",
|
|
1211
|
+
"aria-hidden": "true",
|
|
1212
|
+
style: { flex: "0 0 40px", paddingLeft: 16 },
|
|
1213
|
+
children: symbol
|
|
1214
|
+
}
|
|
1215
|
+
),
|
|
1216
|
+
/* @__PURE__ */ jsx2(
|
|
1217
|
+
"input",
|
|
1218
|
+
{
|
|
1219
|
+
"aria-label": `Price ${currency.code.toUpperCase()}`,
|
|
1220
|
+
inputMode: "decimal",
|
|
1221
|
+
value,
|
|
1222
|
+
onChange: (event) => onChange(event.target.value),
|
|
1223
|
+
style: {
|
|
1224
|
+
appearance: "none",
|
|
1225
|
+
background: "transparent",
|
|
1226
|
+
border: 0,
|
|
1227
|
+
borderRadius: 0,
|
|
1228
|
+
flex: "1 1 auto",
|
|
1229
|
+
height: "100%",
|
|
1230
|
+
margin: 0,
|
|
1231
|
+
minWidth: 0,
|
|
1232
|
+
outline: "none",
|
|
1233
|
+
padding: "0 16px 0 0",
|
|
1234
|
+
textAlign: "right"
|
|
1235
|
+
},
|
|
1236
|
+
type: "text"
|
|
1237
|
+
}
|
|
1238
|
+
)
|
|
1239
|
+
]
|
|
1240
|
+
}
|
|
1241
|
+
);
|
|
1242
|
+
}
|
|
1243
|
+
function CouponProductModal({
|
|
1244
|
+
allowPromotionMirror,
|
|
1245
|
+
apiBase,
|
|
1246
|
+
onOpenChange,
|
|
1247
|
+
onSaved,
|
|
1248
|
+
open,
|
|
1249
|
+
options,
|
|
1250
|
+
row
|
|
1251
|
+
}) {
|
|
1252
|
+
const [activeStep, setActiveStep] = useState("details");
|
|
1253
|
+
const [product, setProduct] = useState(
|
|
1254
|
+
() => emptyProduct(options)
|
|
1255
|
+
);
|
|
1256
|
+
const [coupon, setCoupon] = useState(
|
|
1257
|
+
() => emptyCoupon(options)
|
|
1258
|
+
);
|
|
1259
|
+
const [campaign, setCampaign] = useState(emptyCampaign);
|
|
1260
|
+
const [saving, setSaving] = useState(false);
|
|
1261
|
+
const [uploading, setUploading] = useState(false);
|
|
1262
|
+
const [furthestStepIndex, setFurthestStepIndex] = useState(0);
|
|
1263
|
+
const visibleSteps = useMemo(
|
|
1264
|
+
() => allowPromotionMirror ? allSteps : allSteps.filter((step) => step !== "campaign"),
|
|
1265
|
+
[allowPromotionMirror]
|
|
1266
|
+
);
|
|
1267
|
+
const currentStepIndex = visibleSteps.indexOf(activeStep);
|
|
1268
|
+
const currencies = options.currencies || [];
|
|
1269
|
+
const supportedCurrencyCodes = useMemo(
|
|
1270
|
+
() => new Set(currencies.map((currency) => currency.code)),
|
|
1271
|
+
[currencies]
|
|
1272
|
+
);
|
|
1273
|
+
const isAmountType = coupon.type === "amount_off_products" || coupon.type === "amount_off_order";
|
|
1274
|
+
const isPercentageType = coupon.type === "percentage_off_product" || coupon.type === "percentage_off_order";
|
|
1275
|
+
const isItemScopedDiscount = coupon.type === "amount_off_products" || coupon.type === "percentage_off_product";
|
|
1276
|
+
const effectiveCurrencies = useMemo(
|
|
1277
|
+
() => effectiveCouponCurrencies(coupon.purchase_conditions, currencies),
|
|
1278
|
+
[coupon.purchase_conditions, currencies]
|
|
1279
|
+
);
|
|
1280
|
+
const productPrices = currencies.flatMap((currency) => {
|
|
1281
|
+
const value = product.price_amounts[currency.code] || "";
|
|
1282
|
+
const amount = nonNegativeNumberOrNull(value);
|
|
1283
|
+
return amount == null ? [] : [{ currency_code: currency.code, amount }];
|
|
1284
|
+
});
|
|
1285
|
+
useEffect(() => {
|
|
1286
|
+
if (!open) return;
|
|
1287
|
+
const forms = row ? formsFromRow(row, options) : {
|
|
1288
|
+
product: emptyProduct(options),
|
|
1289
|
+
coupon: emptyCoupon(options),
|
|
1290
|
+
campaign: emptyCampaign
|
|
1291
|
+
};
|
|
1292
|
+
setProduct(forms.product);
|
|
1293
|
+
setCoupon(forms.coupon);
|
|
1294
|
+
setCampaign(forms.campaign);
|
|
1295
|
+
setActiveStep("details");
|
|
1296
|
+
setFurthestStepIndex(0);
|
|
1297
|
+
}, [open, row, options]);
|
|
1298
|
+
const updatePurchaseConditions = (purchaseConditions) => {
|
|
1299
|
+
setCoupon((current) => ({
|
|
1300
|
+
...current,
|
|
1301
|
+
purchase_conditions: purchaseConditions,
|
|
1302
|
+
amounts: isAmountCouponType(current.type) ? reconcileCouponAmounts(
|
|
1303
|
+
current.amounts,
|
|
1304
|
+
effectiveCouponCurrencies(purchaseConditions, currencies)
|
|
1305
|
+
) : current.amounts
|
|
1306
|
+
}));
|
|
1307
|
+
};
|
|
1308
|
+
const updateCouponType = (type) => {
|
|
1309
|
+
setCoupon((current) => {
|
|
1310
|
+
let purchaseConditions = current.purchase_conditions;
|
|
1311
|
+
if (isAmountCouponType(type) && !purchaseConditions.some(
|
|
1312
|
+
(condition) => condition.attribute === "currency_code"
|
|
1313
|
+
)) {
|
|
1314
|
+
purchaseConditions = [
|
|
1315
|
+
...purchaseConditions,
|
|
1316
|
+
...defaultPurchaseConditions(options)
|
|
1317
|
+
];
|
|
1318
|
+
}
|
|
1319
|
+
return {
|
|
1320
|
+
...current,
|
|
1321
|
+
type,
|
|
1322
|
+
purchase_conditions: purchaseConditions,
|
|
1323
|
+
amounts: isAmountCouponType(type) ? reconcileCouponAmounts(
|
|
1324
|
+
current.amounts,
|
|
1325
|
+
effectiveCouponCurrencies(purchaseConditions, currencies)
|
|
1326
|
+
) : current.amounts,
|
|
1327
|
+
promotion_mirror_mode: type === "buy_x_get_y" ? "none" : current.promotion_mirror_mode
|
|
1328
|
+
};
|
|
1329
|
+
});
|
|
1330
|
+
};
|
|
1331
|
+
const uploadMedia = async (files) => {
|
|
1332
|
+
if (!files.length) return;
|
|
1333
|
+
const formData = new FormData();
|
|
1334
|
+
files.forEach((file) => formData.append("files", file));
|
|
1335
|
+
if (apiBase === "/admin" && product.seller_id) {
|
|
1336
|
+
formData.append("seller_id", product.seller_id);
|
|
1337
|
+
}
|
|
1338
|
+
setUploading(true);
|
|
1339
|
+
try {
|
|
1340
|
+
const response = await fetch(
|
|
1341
|
+
`${backendUrl()}${apiBase}/coupon-products/uploads`,
|
|
1342
|
+
{
|
|
1343
|
+
method: "POST",
|
|
1344
|
+
body: formData,
|
|
1345
|
+
credentials: "include"
|
|
1346
|
+
}
|
|
1347
|
+
);
|
|
1348
|
+
if (!response.ok) {
|
|
1349
|
+
const payload2 = await response.json().catch(() => null);
|
|
1350
|
+
throw new Error(apiErrorMessage(payload2, response.statusText));
|
|
1351
|
+
}
|
|
1352
|
+
const payload = await response.json();
|
|
1353
|
+
const uploaded = (payload.files || []).filter(
|
|
1354
|
+
(file) => Boolean(file.asset_id && file.url)
|
|
1355
|
+
).map((file) => ({ asset_id: file.asset_id, url: file.url }));
|
|
1356
|
+
if (!uploaded.length)
|
|
1357
|
+
throw new Error("The upload did not return an image URL");
|
|
1358
|
+
setProduct((current) => ({
|
|
1359
|
+
...current,
|
|
1360
|
+
media: Array.from(
|
|
1361
|
+
new Map(
|
|
1362
|
+
[...current.media, ...uploaded].map((item) => [item.url, item])
|
|
1363
|
+
).values()
|
|
1364
|
+
)
|
|
1365
|
+
}));
|
|
1366
|
+
} catch (error) {
|
|
1367
|
+
toast.error(
|
|
1368
|
+
error instanceof Error ? error.message : "Image upload failed"
|
|
1369
|
+
);
|
|
1370
|
+
} finally {
|
|
1371
|
+
setUploading(false);
|
|
1372
|
+
}
|
|
1373
|
+
};
|
|
1374
|
+
const detailsComplete = useMemo(() => {
|
|
1375
|
+
if (!product.title.trim()) return false;
|
|
1376
|
+
if (!currencies.length) return false;
|
|
1377
|
+
const attributes = /* @__PURE__ */ new Set();
|
|
1378
|
+
for (const condition of coupon.purchase_conditions) {
|
|
1379
|
+
if (!condition.attribute || !condition.operator || !condition.values.length || condition.operator === "eq" && condition.values.length !== 1 || attributes.has(condition.attribute)) {
|
|
1380
|
+
return false;
|
|
1381
|
+
}
|
|
1382
|
+
attributes.add(condition.attribute);
|
|
1383
|
+
}
|
|
1384
|
+
if (isAmountType) {
|
|
1385
|
+
if (!attributes.has("currency_code")) return false;
|
|
1386
|
+
if (!coupon.amounts.length) return false;
|
|
1387
|
+
if (coupon.amounts.length !== effectiveCurrencies.length) return false;
|
|
1388
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1389
|
+
for (const row2 of coupon.amounts) {
|
|
1390
|
+
if (!supportedCurrencyCodes.has(row2.currency_code)) return false;
|
|
1391
|
+
if (seen.has(row2.currency_code)) return false;
|
|
1392
|
+
if (numberOrNull(row2.amount) == null) return false;
|
|
1393
|
+
seen.add(row2.currency_code);
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
if (isPercentageType) {
|
|
1397
|
+
const value = numberOrNull(coupon.percentage);
|
|
1398
|
+
if (value == null || value > 100) return false;
|
|
1399
|
+
}
|
|
1400
|
+
if (coupon.code_strategy === "shared_code" && !coupon.shared_code.trim()) {
|
|
1401
|
+
return false;
|
|
1402
|
+
}
|
|
1403
|
+
if (coupon.expiration_type === "duration") {
|
|
1404
|
+
const days = Number(coupon.expiration_days);
|
|
1405
|
+
if (!Number.isInteger(days) || days < 1) return false;
|
|
1406
|
+
} else if (coupon.expiration_type === "fixed") {
|
|
1407
|
+
const expiration = new Date(coupon.expiration_date);
|
|
1408
|
+
if (!coupon.expiration_date || Number.isNaN(expiration.getTime())) {
|
|
1409
|
+
return false;
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
if (coupon.expiration_type !== "none" && coupon.expiration_cap_at) {
|
|
1413
|
+
const cap = new Date(coupon.expiration_cap_at);
|
|
1414
|
+
if (Number.isNaN(cap.getTime())) return false;
|
|
1415
|
+
}
|
|
1416
|
+
const maxIssuance = Number(coupon.max_issuance_per_order_item);
|
|
1417
|
+
return Number.isInteger(maxIssuance) && maxIssuance > 0;
|
|
1418
|
+
}, [
|
|
1419
|
+
coupon,
|
|
1420
|
+
currencies.length,
|
|
1421
|
+
effectiveCurrencies.length,
|
|
1422
|
+
isAmountType,
|
|
1423
|
+
isPercentageType,
|
|
1424
|
+
product.title,
|
|
1425
|
+
supportedCurrencyCodes
|
|
1426
|
+
]);
|
|
1427
|
+
const campaignComplete = useMemo(() => {
|
|
1428
|
+
if (!allowPromotionMirror || campaign.mode === "none") return true;
|
|
1429
|
+
if (campaign.mode === "existing") return Boolean(campaign.campaign_id);
|
|
1430
|
+
if (!campaign.name.trim() || !campaign.campaign_identifier.trim()) {
|
|
1431
|
+
return false;
|
|
1432
|
+
}
|
|
1433
|
+
return [campaign.starts_at, campaign.ends_at].every((value) => {
|
|
1434
|
+
if (!value) return true;
|
|
1435
|
+
return !Number.isNaN(new Date(value).getTime());
|
|
1436
|
+
});
|
|
1437
|
+
}, [allowPromotionMirror, campaign]);
|
|
1438
|
+
const pricesComplete = useMemo(() => {
|
|
1439
|
+
if (!currencies.length || !productPrices.length) return false;
|
|
1440
|
+
return currencies.every((currency) => {
|
|
1441
|
+
const value = product.price_amounts[currency.code] || "";
|
|
1442
|
+
return !value.trim() || nonNegativeNumberOrNull(value) != null;
|
|
1443
|
+
});
|
|
1444
|
+
}, [currencies, product.price_amounts, productPrices.length]);
|
|
1445
|
+
const stepValidity = useMemo(
|
|
1446
|
+
() => ({
|
|
1447
|
+
details: detailsComplete,
|
|
1448
|
+
organize: true,
|
|
1449
|
+
campaign: campaignComplete,
|
|
1450
|
+
prices: pricesComplete
|
|
1451
|
+
}),
|
|
1452
|
+
[campaignComplete, detailsComplete, pricesComplete]
|
|
1453
|
+
);
|
|
1454
|
+
const activeStepComplete = stepValidity[activeStep];
|
|
1455
|
+
useEffect(() => {
|
|
1456
|
+
if (!open || !activeStepComplete) return;
|
|
1457
|
+
setFurthestStepIndex(
|
|
1458
|
+
(current) => Math.max(
|
|
1459
|
+
current,
|
|
1460
|
+
Math.min(currentStepIndex + 1, visibleSteps.length - 1)
|
|
1461
|
+
)
|
|
1462
|
+
);
|
|
1463
|
+
}, [activeStepComplete, currentStepIndex, open, visibleSteps.length]);
|
|
1464
|
+
const isStepDisabled = (index) => index > furthestStepIndex || visibleSteps.slice(0, index).some((previous) => !stepValidity[previous]);
|
|
1465
|
+
const validate = () => {
|
|
1466
|
+
if (!product.title.trim()) throw new Error("Product title is required");
|
|
1467
|
+
if (!currencies.length) {
|
|
1468
|
+
throw new Error("Add a supported currency to the store before continuing");
|
|
1469
|
+
}
|
|
1470
|
+
const invalidPrice = currencies.some((currency) => {
|
|
1471
|
+
const value = product.price_amounts[currency.code] || "";
|
|
1472
|
+
return value.trim() && nonNegativeNumberOrNull(value) == null;
|
|
1473
|
+
});
|
|
1474
|
+
if (invalidPrice) {
|
|
1475
|
+
throw new Error("Product prices must be 0 or more");
|
|
1476
|
+
}
|
|
1477
|
+
if (!productPrices.length) {
|
|
1478
|
+
throw new Error("Add at least one product price");
|
|
1479
|
+
}
|
|
1480
|
+
if (isAmountType) {
|
|
1481
|
+
if (!coupon.amounts.length) {
|
|
1482
|
+
throw new Error("Add at least one coupon value");
|
|
1483
|
+
}
|
|
1484
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1485
|
+
const currencyCondition = coupon.purchase_conditions.find(
|
|
1486
|
+
(condition) => condition.attribute === "currency_code"
|
|
1487
|
+
);
|
|
1488
|
+
if (!currencyCondition) {
|
|
1489
|
+
throw new Error("Add a Currency Code purchase condition");
|
|
1490
|
+
}
|
|
1491
|
+
if (coupon.amounts.length !== effectiveCurrencies.length) {
|
|
1492
|
+
throw new Error(
|
|
1493
|
+
"Coupon values must match every effective currency condition value"
|
|
1494
|
+
);
|
|
1495
|
+
}
|
|
1496
|
+
for (const row2 of coupon.amounts) {
|
|
1497
|
+
if (!supportedCurrencyCodes.has(row2.currency_code)) {
|
|
1498
|
+
throw new Error("Select an available coupon currency");
|
|
1499
|
+
}
|
|
1500
|
+
if (seen.has(row2.currency_code)) {
|
|
1501
|
+
throw new Error("Coupon value currencies cannot be duplicated");
|
|
1502
|
+
}
|
|
1503
|
+
if (numberOrNull(row2.amount) == null) {
|
|
1504
|
+
throw new Error("Coupon values must be greater than 0");
|
|
1505
|
+
}
|
|
1506
|
+
seen.add(row2.currency_code);
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1509
|
+
const seenAttributes = /* @__PURE__ */ new Set();
|
|
1510
|
+
for (const condition of coupon.purchase_conditions) {
|
|
1511
|
+
if (!condition.attribute || !condition.operator) {
|
|
1512
|
+
throw new Error("Complete every purchase condition");
|
|
1513
|
+
}
|
|
1514
|
+
if (!condition.values.length) {
|
|
1515
|
+
throw new Error("Select at least one value for every purchase condition");
|
|
1516
|
+
}
|
|
1517
|
+
if (condition.operator === "eq" && condition.values.length !== 1) {
|
|
1518
|
+
throw new Error("Equals conditions require exactly one value");
|
|
1519
|
+
}
|
|
1520
|
+
if (seenAttributes.has(condition.attribute)) {
|
|
1521
|
+
throw new Error("Purchase condition attributes cannot be duplicated");
|
|
1522
|
+
}
|
|
1523
|
+
seenAttributes.add(condition.attribute);
|
|
1524
|
+
}
|
|
1525
|
+
if (isPercentageType) {
|
|
1526
|
+
const value = numberOrNull(coupon.percentage);
|
|
1527
|
+
if (value == null || value > 100) {
|
|
1528
|
+
throw new Error("Coupon value must be between 1 and 100 percent");
|
|
1529
|
+
}
|
|
1530
|
+
}
|
|
1531
|
+
if (coupon.code_strategy === "shared_code" && !coupon.shared_code.trim()) {
|
|
1532
|
+
throw new Error("A shared coupon code is required");
|
|
1533
|
+
}
|
|
1534
|
+
if (coupon.expiration_type === "fixed") {
|
|
1535
|
+
const expiration = new Date(coupon.expiration_date);
|
|
1536
|
+
if (!coupon.expiration_date || Number.isNaN(expiration.getTime())) {
|
|
1537
|
+
throw new Error("A valid fixed expiration date is required");
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
if (coupon.expiration_type !== "none" && coupon.expiration_cap_at) {
|
|
1541
|
+
const cap = new Date(coupon.expiration_cap_at);
|
|
1542
|
+
if (Number.isNaN(cap.getTime())) {
|
|
1543
|
+
throw new Error("A valid expiration cap date is required");
|
|
1544
|
+
}
|
|
1545
|
+
}
|
|
1546
|
+
if (campaign.mode === "existing" && !campaign.campaign_id) {
|
|
1547
|
+
throw new Error("Select an existing campaign");
|
|
1548
|
+
}
|
|
1549
|
+
if (campaign.mode === "new" && (!campaign.name.trim() || !campaign.campaign_identifier.trim())) {
|
|
1550
|
+
throw new Error("Campaign name and identifier are required");
|
|
1551
|
+
}
|
|
1552
|
+
};
|
|
1553
|
+
const save = async () => {
|
|
1554
|
+
setSaving(true);
|
|
1555
|
+
try {
|
|
1556
|
+
validate();
|
|
1557
|
+
const benefitType = benefitTypeFromCouponType(coupon.type);
|
|
1558
|
+
const targetType = coupon.type === "amount_off_order" || coupon.type === "percentage_off_order" ? "order" : "items";
|
|
1559
|
+
const payload = {
|
|
1560
|
+
product: {
|
|
1561
|
+
title: product.title.trim(),
|
|
1562
|
+
subtitle: product.subtitle.trim() || null,
|
|
1563
|
+
handle: product.handle.trim() || null,
|
|
1564
|
+
description: product.description.trim() || null,
|
|
1565
|
+
status: productStatusFromCouponStatus(coupon.promotion_status),
|
|
1566
|
+
thumbnail: product.media[0]?.url || null,
|
|
1567
|
+
thumbnail_asset_id: product.media[0]?.asset_id || null,
|
|
1568
|
+
images: product.media.slice(1).map((media) => ({
|
|
1569
|
+
url: media.url,
|
|
1570
|
+
...media.asset_id ? { asset_id: media.asset_id } : {}
|
|
1571
|
+
})),
|
|
1572
|
+
discountable: product.discountable,
|
|
1573
|
+
type_id: product.type_id || null,
|
|
1574
|
+
collection_id: product.collection_id || null,
|
|
1575
|
+
categories: product.category_id ? [{ id: product.category_id }] : [],
|
|
1576
|
+
tags: product.tag_id ? [{ id: product.tag_id }] : [],
|
|
1577
|
+
variants: [
|
|
1578
|
+
{
|
|
1579
|
+
title: "Default",
|
|
1580
|
+
sku: product.sku.trim() || null,
|
|
1581
|
+
manage_inventory: false,
|
|
1582
|
+
allow_backorder: true,
|
|
1583
|
+
prices: productPrices
|
|
1584
|
+
}
|
|
1585
|
+
]
|
|
1586
|
+
},
|
|
1587
|
+
coupon: {
|
|
1588
|
+
enabled: coupon.enabled,
|
|
1589
|
+
benefit_type: benefitType,
|
|
1590
|
+
purchase_conditions: coupon.purchase_conditions.map((condition) => ({
|
|
1591
|
+
attribute: condition.attribute,
|
|
1592
|
+
operator: condition.operator,
|
|
1593
|
+
values: condition.values
|
|
1594
|
+
})),
|
|
1595
|
+
amounts: isAmountType ? coupon.amounts.map((row2) => ({
|
|
1596
|
+
amount: numberOrNull(row2.amount),
|
|
1597
|
+
currency_code: row2.currency_code
|
|
1598
|
+
})) : null,
|
|
1599
|
+
amount: null,
|
|
1600
|
+
percentage: isPercentageType ? numberOrNull(coupon.percentage) : null,
|
|
1601
|
+
currency_code: null,
|
|
1602
|
+
code_strategy: coupon.code_strategy,
|
|
1603
|
+
code_prefix: coupon.code_strategy === "unique_code" ? coupon.code_prefix.trim() || "COUPON" : null,
|
|
1604
|
+
shared_code: coupon.code_strategy === "shared_code" ? coupon.shared_code.trim() : null,
|
|
1605
|
+
expiration_policy: coupon.expiration_type === "none" ? { type: "none" } : coupon.expiration_type === "fixed" ? {
|
|
1606
|
+
type: "fixed",
|
|
1607
|
+
expires_at: new Date(coupon.expiration_date).toISOString(),
|
|
1608
|
+
cap_by_campaign: coupon.expiration_cap_by_campaign,
|
|
1609
|
+
cap_at: coupon.expiration_cap_at ? new Date(coupon.expiration_cap_at).toISOString() : null
|
|
1610
|
+
} : {
|
|
1611
|
+
type: "duration",
|
|
1612
|
+
duration_days: Number(coupon.expiration_days) || 30,
|
|
1613
|
+
cap_by_campaign: coupon.expiration_cap_by_campaign,
|
|
1614
|
+
cap_at: coupon.expiration_cap_at ? new Date(coupon.expiration_cap_at).toISOString() : null
|
|
1615
|
+
},
|
|
1616
|
+
max_issuance_per_order_item: Number(coupon.max_issuance_per_order_item) || 1,
|
|
1617
|
+
promotion_template: benefitType === "fixed_amount" || benefitType === "percentage" ? {
|
|
1618
|
+
application_method: {
|
|
1619
|
+
target_type: targetType,
|
|
1620
|
+
allocation: targetType === "order" ? "across" : coupon.allocation
|
|
1621
|
+
}
|
|
1622
|
+
} : null,
|
|
1623
|
+
promotion_status: coupon.promotion_status,
|
|
1624
|
+
...allowPromotionMirror ? {
|
|
1625
|
+
promotion_mirror_mode: benefitType === "buy_get" || benefitType === "fixed_amount" && coupon.amounts.length > 1 ? "none" : coupon.promotion_mirror_mode
|
|
1626
|
+
} : {}
|
|
1627
|
+
},
|
|
1628
|
+
campaign: allowPromotionMirror ? campaign.mode === "existing" ? { mode: "existing", campaign_id: campaign.campaign_id } : campaign.mode === "new" ? {
|
|
1629
|
+
mode: "new",
|
|
1630
|
+
campaign: {
|
|
1631
|
+
name: campaign.name,
|
|
1632
|
+
campaign_identifier: campaign.campaign_identifier,
|
|
1633
|
+
starts_at: campaign.starts_at ? new Date(campaign.starts_at).toISOString() : null,
|
|
1634
|
+
ends_at: campaign.ends_at ? new Date(campaign.ends_at).toISOString() : null
|
|
1635
|
+
}
|
|
1636
|
+
} : { mode: "none" } : void 0,
|
|
1637
|
+
seller_id: product.seller_id || null,
|
|
1638
|
+
variant_overrides: []
|
|
1639
|
+
};
|
|
1640
|
+
await apiFetch(
|
|
1641
|
+
row ? `${apiBase}/coupon-products/${row.product.id}` : `${apiBase}/coupon-products`,
|
|
1642
|
+
{
|
|
1643
|
+
method: row ? "PATCH" : "POST",
|
|
1644
|
+
body: JSON.stringify(payload)
|
|
1645
|
+
}
|
|
1646
|
+
);
|
|
1647
|
+
toast.success(row ? "Coupon product updated" : "Coupon product created");
|
|
1648
|
+
onOpenChange(false);
|
|
1649
|
+
await onSaved();
|
|
1650
|
+
} catch (error) {
|
|
1651
|
+
toast.error(
|
|
1652
|
+
error instanceof Error ? error.message : "Failed to save coupon product"
|
|
1653
|
+
);
|
|
1654
|
+
} finally {
|
|
1655
|
+
setSaving(false);
|
|
1656
|
+
}
|
|
1657
|
+
};
|
|
1658
|
+
const stepStatus = (step) => {
|
|
1659
|
+
const index = visibleSteps.indexOf(step);
|
|
1660
|
+
if (index < currentStepIndex && stepValidity[step]) {
|
|
1661
|
+
return "completed";
|
|
1662
|
+
}
|
|
1663
|
+
if (index === currentStepIndex) return "in-progress";
|
|
1664
|
+
return "not-started";
|
|
1665
|
+
};
|
|
1666
|
+
return /* @__PURE__ */ jsx2(FocusModal, { open, onOpenChange, children: /* @__PURE__ */ jsxs2(FocusModal.Content, { style: modalContentStyle, children: [
|
|
1667
|
+
/* @__PURE__ */ jsx2(FocusModal.Title, { style: visuallyHiddenStyle, children: row ? "Edit Coupon Product" : "Create Coupon Product" }),
|
|
1668
|
+
/* @__PURE__ */ jsxs2(
|
|
1669
|
+
ProgressTabs,
|
|
1670
|
+
{
|
|
1671
|
+
value: activeStep,
|
|
1672
|
+
onValueChange: (value) => {
|
|
1673
|
+
const step = value;
|
|
1674
|
+
const index = visibleSteps.indexOf(step);
|
|
1675
|
+
if (!isStepDisabled(index)) setActiveStep(step);
|
|
1676
|
+
},
|
|
1677
|
+
style: modalWizardStyle,
|
|
1678
|
+
children: [
|
|
1679
|
+
/* @__PURE__ */ jsx2(FocusModal.Header, { children: /* @__PURE__ */ jsx2("div", { className: "-my-2 w-full border-l", children: /* @__PURE__ */ jsx2(ProgressTabs.List, { className: "justify-start-start flex w-full items-center", children: visibleSteps.map((step, index) => /* @__PURE__ */ jsx2(
|
|
1680
|
+
ProgressTabs.Trigger,
|
|
1681
|
+
{
|
|
1682
|
+
value: step,
|
|
1683
|
+
status: stepStatus(step),
|
|
1684
|
+
disabled: isStepDisabled(index),
|
|
1685
|
+
className: "max-w-[200px] truncate",
|
|
1686
|
+
children: step[0].toUpperCase() + step.slice(1)
|
|
1687
|
+
},
|
|
1688
|
+
step
|
|
1689
|
+
)) }) }) }),
|
|
1690
|
+
/* @__PURE__ */ jsx2(FocusModal.Body, { className: "overflow-hidden p-0", style: modalBodyStyle, children: /* @__PURE__ */ jsx2(
|
|
1691
|
+
"div",
|
|
1692
|
+
{
|
|
1693
|
+
style: activeStep === "prices" ? { height: "100%", overflow: "hidden", width: "100%" } : modalScrollStyle,
|
|
1694
|
+
children: /* @__PURE__ */ jsxs2(
|
|
1695
|
+
"div",
|
|
1696
|
+
{
|
|
1697
|
+
style: activeStep === "prices" ? { height: "100%", width: "100%" } : modalFormStyle,
|
|
1698
|
+
children: [
|
|
1699
|
+
activeStep === "details" && /* @__PURE__ */ jsxs2(ProgressTabs.Content, { value: "details", style: stackStyle, children: [
|
|
1700
|
+
/* @__PURE__ */ jsx2(Heading, { level: "h1", children: row ? "Edit Coupon Product" : "Create Coupon Product" }),
|
|
1701
|
+
/* @__PURE__ */ jsx2(Divider, {}),
|
|
1702
|
+
/* @__PURE__ */ jsxs2(Section, { title: "General", children: [
|
|
1703
|
+
/* @__PURE__ */ jsxs2("div", { style: threeColumnGridStyle, children: [
|
|
1704
|
+
/* @__PURE__ */ jsx2(Field, { label: "Title", children: /* @__PURE__ */ jsx2(
|
|
1705
|
+
Input,
|
|
1706
|
+
{
|
|
1707
|
+
value: product.title,
|
|
1708
|
+
placeholder: "Winter jacket",
|
|
1709
|
+
onChange: (event) => setProduct((current) => ({
|
|
1710
|
+
...current,
|
|
1711
|
+
title: event.target.value
|
|
1712
|
+
}))
|
|
1713
|
+
}
|
|
1714
|
+
) }),
|
|
1715
|
+
/* @__PURE__ */ jsx2(Field, { label: "Subtitle", optional: true, children: /* @__PURE__ */ jsx2(
|
|
1716
|
+
Input,
|
|
1717
|
+
{
|
|
1718
|
+
value: product.subtitle,
|
|
1719
|
+
placeholder: "Warm and cozy",
|
|
1720
|
+
onChange: (event) => setProduct((current) => ({
|
|
1721
|
+
...current,
|
|
1722
|
+
subtitle: event.target.value
|
|
1723
|
+
}))
|
|
1724
|
+
}
|
|
1725
|
+
) }),
|
|
1726
|
+
/* @__PURE__ */ jsx2(
|
|
1727
|
+
Field,
|
|
1728
|
+
{
|
|
1729
|
+
label: "Handle",
|
|
1730
|
+
optional: true,
|
|
1731
|
+
tooltip: "The URL-friendly identifier for this product. If left empty, Medusa generates it from the title.",
|
|
1732
|
+
children: /* @__PURE__ */ jsx2(
|
|
1733
|
+
HandleInput,
|
|
1734
|
+
{
|
|
1735
|
+
value: product.handle,
|
|
1736
|
+
onChange: (handle) => setProduct((current) => ({ ...current, handle }))
|
|
1737
|
+
}
|
|
1738
|
+
)
|
|
1739
|
+
}
|
|
1740
|
+
)
|
|
1741
|
+
] }),
|
|
1742
|
+
/* @__PURE__ */ jsx2(Field, { label: "Description", optional: true, children: /* @__PURE__ */ jsx2(
|
|
1743
|
+
Textarea,
|
|
1744
|
+
{
|
|
1745
|
+
value: product.description,
|
|
1746
|
+
placeholder: "A warm and cozy jacket",
|
|
1747
|
+
onChange: (event) => setProduct((current) => ({
|
|
1748
|
+
...current,
|
|
1749
|
+
description: event.target.value
|
|
1750
|
+
}))
|
|
1751
|
+
}
|
|
1752
|
+
) }),
|
|
1753
|
+
/* @__PURE__ */ jsx2(Field, { label: "Media", optional: true, children: /* @__PURE__ */ jsx2(
|
|
1754
|
+
MediaUpload,
|
|
1755
|
+
{
|
|
1756
|
+
isUploading: uploading,
|
|
1757
|
+
media: product.media,
|
|
1758
|
+
onUpload: (files) => void uploadMedia(files),
|
|
1759
|
+
onRemove: (media) => setProduct((current) => ({
|
|
1760
|
+
...current,
|
|
1761
|
+
media: current.media.filter(
|
|
1762
|
+
(item) => media.asset_id && item.asset_id !== media.asset_id || !media.asset_id && item.url !== media.url
|
|
1763
|
+
)
|
|
1764
|
+
}))
|
|
1765
|
+
}
|
|
1766
|
+
) }),
|
|
1767
|
+
/* @__PURE__ */ jsx2(Field, { label: "SKU", optional: true, children: /* @__PURE__ */ jsx2(
|
|
1768
|
+
Input,
|
|
1769
|
+
{
|
|
1770
|
+
value: product.sku,
|
|
1771
|
+
placeholder: "COUPON-001",
|
|
1772
|
+
onChange: (event) => setProduct((current) => ({
|
|
1773
|
+
...current,
|
|
1774
|
+
sku: event.target.value
|
|
1775
|
+
}))
|
|
1776
|
+
}
|
|
1777
|
+
) })
|
|
1778
|
+
] }),
|
|
1779
|
+
/* @__PURE__ */ jsx2(Divider, {}),
|
|
1780
|
+
/* @__PURE__ */ jsx2(
|
|
1781
|
+
PurchaseConditionsField,
|
|
1782
|
+
{
|
|
1783
|
+
fixedAmount: isAmountType,
|
|
1784
|
+
options,
|
|
1785
|
+
value: coupon.purchase_conditions,
|
|
1786
|
+
onChange: updatePurchaseConditions
|
|
1787
|
+
}
|
|
1788
|
+
)
|
|
1789
|
+
] }),
|
|
1790
|
+
activeStep === "organize" && /* @__PURE__ */ jsx2(ProgressTabs.Content, { value: "organize", style: stackStyle, children: /* @__PURE__ */ jsxs2(Section, { title: "Organize", children: [
|
|
1791
|
+
/* @__PURE__ */ jsx2("div", { style: panelStyle, children: /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between gap-x-4", children: [
|
|
1792
|
+
/* @__PURE__ */ jsxs2("div", { children: [
|
|
1793
|
+
/* @__PURE__ */ jsx2(Text2, { weight: "plus", children: "Discountable" }),
|
|
1794
|
+
/* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "Allow promotions to discount this product's sale price." })
|
|
1795
|
+
] }),
|
|
1796
|
+
/* @__PURE__ */ jsx2(
|
|
1797
|
+
Switch,
|
|
1798
|
+
{
|
|
1799
|
+
checked: product.discountable,
|
|
1800
|
+
onCheckedChange: (discountable) => setProduct((current) => ({
|
|
1801
|
+
...current,
|
|
1802
|
+
discountable: Boolean(discountable)
|
|
1803
|
+
}))
|
|
1804
|
+
}
|
|
1805
|
+
)
|
|
1806
|
+
] }) }),
|
|
1807
|
+
/* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
|
|
1808
|
+
allowPromotionMirror && /* @__PURE__ */ jsx2(Field, { label: "Seller", optional: true, children: /* @__PURE__ */ jsx2(
|
|
1809
|
+
OptionSelect,
|
|
1810
|
+
{
|
|
1811
|
+
value: product.seller_id,
|
|
1812
|
+
options: options.sellers || [],
|
|
1813
|
+
onChange: (seller_id) => setProduct((current) => ({ ...current, seller_id }))
|
|
1814
|
+
}
|
|
1815
|
+
) }),
|
|
1816
|
+
/* @__PURE__ */ jsx2(Field, { label: "Type", optional: true, children: /* @__PURE__ */ jsx2(
|
|
1817
|
+
OptionSelect,
|
|
1818
|
+
{
|
|
1819
|
+
value: product.type_id,
|
|
1820
|
+
options: options.product_types || [],
|
|
1821
|
+
onChange: (type_id) => setProduct((current) => ({ ...current, type_id }))
|
|
1822
|
+
}
|
|
1823
|
+
) }),
|
|
1824
|
+
/* @__PURE__ */ jsx2(Field, { label: "Collection", optional: true, children: /* @__PURE__ */ jsx2(
|
|
1825
|
+
OptionSelect,
|
|
1826
|
+
{
|
|
1827
|
+
value: product.collection_id,
|
|
1828
|
+
options: options.product_collections || [],
|
|
1829
|
+
onChange: (collection_id) => setProduct((current) => ({
|
|
1830
|
+
...current,
|
|
1831
|
+
collection_id
|
|
1832
|
+
}))
|
|
1833
|
+
}
|
|
1834
|
+
) }),
|
|
1835
|
+
/* @__PURE__ */ jsx2(Field, { label: "Category", optional: true, children: /* @__PURE__ */ jsx2(
|
|
1836
|
+
OptionSelect,
|
|
1837
|
+
{
|
|
1838
|
+
value: product.category_id,
|
|
1839
|
+
options: options.product_categories || [],
|
|
1840
|
+
onChange: (category_id) => setProduct((current) => ({ ...current, category_id }))
|
|
1841
|
+
}
|
|
1842
|
+
) }),
|
|
1843
|
+
/* @__PURE__ */ jsx2(Field, { label: "Tag", optional: true, children: /* @__PURE__ */ jsx2(
|
|
1844
|
+
OptionSelect,
|
|
1845
|
+
{
|
|
1846
|
+
value: product.tag_id,
|
|
1847
|
+
options: options.product_tags || [],
|
|
1848
|
+
onChange: (tag_id) => setProduct((current) => ({ ...current, tag_id }))
|
|
1849
|
+
}
|
|
1850
|
+
) })
|
|
1851
|
+
] })
|
|
1852
|
+
] }) }),
|
|
1853
|
+
activeStep === "details" && /* @__PURE__ */ jsxs2("div", { style: { ...stackStyle, marginTop: 24 }, children: [
|
|
1854
|
+
/* @__PURE__ */ jsx2(Divider, {}),
|
|
1855
|
+
/* @__PURE__ */ jsxs2(
|
|
1856
|
+
Section,
|
|
1857
|
+
{
|
|
1858
|
+
title: "Coupon",
|
|
1859
|
+
description: "Configure the coupon issued when this product is purchased.",
|
|
1860
|
+
children: [
|
|
1861
|
+
/* @__PURE__ */ jsx2("div", { style: panelStyle, children: /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between gap-x-4", children: [
|
|
1862
|
+
/* @__PURE__ */ jsxs2("div", { children: [
|
|
1863
|
+
/* @__PURE__ */ jsx2(Text2, { weight: "plus", children: "Coupon issuance" }),
|
|
1864
|
+
/* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "Issue coupons when customers purchase this product." })
|
|
1865
|
+
] }),
|
|
1866
|
+
/* @__PURE__ */ jsx2(
|
|
1867
|
+
Switch,
|
|
1868
|
+
{
|
|
1869
|
+
checked: coupon.enabled,
|
|
1870
|
+
onCheckedChange: (enabled) => setCoupon((current) => ({
|
|
1871
|
+
...current,
|
|
1872
|
+
enabled: Boolean(enabled)
|
|
1873
|
+
}))
|
|
1874
|
+
}
|
|
1875
|
+
)
|
|
1876
|
+
] }) }),
|
|
1877
|
+
/* @__PURE__ */ jsx2(Section, { title: "Type", children: /* @__PURE__ */ jsx2(
|
|
1878
|
+
RadioGroup,
|
|
1879
|
+
{
|
|
1880
|
+
value: coupon.type,
|
|
1881
|
+
onValueChange: (type) => updateCouponType(type),
|
|
1882
|
+
className: "flex flex-col gap-y-3",
|
|
1883
|
+
children: typeChoices.map((choice) => /* @__PURE__ */ jsx2(
|
|
1884
|
+
RadioGroup.ChoiceBox,
|
|
1885
|
+
{
|
|
1886
|
+
value: choice.value,
|
|
1887
|
+
label: choice.label,
|
|
1888
|
+
description: choice.description
|
|
1889
|
+
},
|
|
1890
|
+
choice.value
|
|
1891
|
+
))
|
|
1892
|
+
}
|
|
1893
|
+
) }),
|
|
1894
|
+
/* @__PURE__ */ jsx2(Section, { title: "Status", children: /* @__PURE__ */ jsx2(
|
|
1895
|
+
RadioGroup,
|
|
1896
|
+
{
|
|
1897
|
+
value: coupon.promotion_status,
|
|
1898
|
+
onValueChange: (promotion_status) => setCoupon((current) => ({
|
|
1899
|
+
...current,
|
|
1900
|
+
promotion_status
|
|
1901
|
+
})),
|
|
1902
|
+
style: twoColumnGridStyle,
|
|
1903
|
+
children: statusChoices.map((choice) => /* @__PURE__ */ jsx2(
|
|
1904
|
+
RadioGroup.ChoiceBox,
|
|
1905
|
+
{
|
|
1906
|
+
value: choice.value,
|
|
1907
|
+
label: choice.label,
|
|
1908
|
+
description: choice.description
|
|
1909
|
+
},
|
|
1910
|
+
choice.value
|
|
1911
|
+
))
|
|
1912
|
+
}
|
|
1913
|
+
) }),
|
|
1914
|
+
(isAmountType || isPercentageType) && /* @__PURE__ */ jsx2(Section, { title: isAmountType ? "Coupon Values" : "Value", children: isAmountType ? /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-2", children: [
|
|
1915
|
+
coupon.amounts.map((row2, rowIndex) => {
|
|
1916
|
+
const currency = currencies.find(
|
|
1917
|
+
(item) => item.code === row2.currency_code
|
|
1918
|
+
);
|
|
1919
|
+
return /* @__PURE__ */ jsx2(
|
|
1920
|
+
"div",
|
|
1921
|
+
{
|
|
1922
|
+
className: "shadow-elevation-card-rest bg-ui-bg-component rounded-md px-4 py-3",
|
|
1923
|
+
children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-col gap-y-2", children: [
|
|
1924
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between", children: [
|
|
1925
|
+
/* @__PURE__ */ jsxs2(Label, { children: [
|
|
1926
|
+
row2.currency_code.toUpperCase(),
|
|
1927
|
+
" Coupon Value"
|
|
1928
|
+
] }),
|
|
1929
|
+
/* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: currency?.name || row2.currency_code.toUpperCase() })
|
|
1930
|
+
] }),
|
|
1931
|
+
/* @__PURE__ */ jsx2("div", { children: /* @__PURE__ */ jsx2(
|
|
1932
|
+
CurrencyAmountField,
|
|
1933
|
+
{
|
|
1934
|
+
currencies,
|
|
1935
|
+
currencyCode: row2.currency_code,
|
|
1936
|
+
value: row2.amount,
|
|
1937
|
+
onChange: (amount) => setCoupon((current) => ({
|
|
1938
|
+
...current,
|
|
1939
|
+
amounts: current.amounts.map(
|
|
1940
|
+
(item, index) => index === rowIndex ? { ...item, amount } : item
|
|
1941
|
+
)
|
|
1942
|
+
}))
|
|
1943
|
+
}
|
|
1944
|
+
) })
|
|
1945
|
+
] })
|
|
1946
|
+
},
|
|
1947
|
+
row2.key
|
|
1948
|
+
);
|
|
1949
|
+
}),
|
|
1950
|
+
!coupon.amounts.length && /* @__PURE__ */ jsx2(Text2, { className: "text-ui-fg-muted", children: "Select at least one effective Currency Code condition value." })
|
|
1951
|
+
] }) : /* @__PURE__ */ jsx2(Field, { label: "Coupon Value", children: /* @__PURE__ */ jsx2(
|
|
1952
|
+
PercentageInput,
|
|
1953
|
+
{
|
|
1954
|
+
value: coupon.percentage,
|
|
1955
|
+
onChange: (percentage) => setCoupon((current) => ({
|
|
1956
|
+
...current,
|
|
1957
|
+
percentage
|
|
1958
|
+
}))
|
|
1959
|
+
}
|
|
1960
|
+
) }) }),
|
|
1961
|
+
isItemScopedDiscount && /* @__PURE__ */ jsx2(Section, { title: "Allocation", children: /* @__PURE__ */ jsxs2(
|
|
1962
|
+
RadioGroup,
|
|
1963
|
+
{
|
|
1964
|
+
value: coupon.allocation,
|
|
1965
|
+
onValueChange: (allocation) => setCoupon((current) => ({
|
|
1966
|
+
...current,
|
|
1967
|
+
allocation
|
|
1968
|
+
})),
|
|
1969
|
+
style: twoColumnGridStyle,
|
|
1970
|
+
children: [
|
|
1971
|
+
/* @__PURE__ */ jsx2(
|
|
1972
|
+
RadioGroup.ChoiceBox,
|
|
1973
|
+
{
|
|
1974
|
+
value: "each",
|
|
1975
|
+
label: "Each",
|
|
1976
|
+
description: "Applies value on each item"
|
|
1977
|
+
}
|
|
1978
|
+
),
|
|
1979
|
+
/* @__PURE__ */ jsx2(
|
|
1980
|
+
RadioGroup.ChoiceBox,
|
|
1981
|
+
{
|
|
1982
|
+
value: "once",
|
|
1983
|
+
label: "Once",
|
|
1984
|
+
description: "Limit discount to max quantity"
|
|
1985
|
+
}
|
|
1986
|
+
)
|
|
1987
|
+
]
|
|
1988
|
+
}
|
|
1989
|
+
) }),
|
|
1990
|
+
/* @__PURE__ */ jsx2(
|
|
1991
|
+
Section,
|
|
1992
|
+
{
|
|
1993
|
+
title: "Expiration",
|
|
1994
|
+
description: "Control when issued coupons expire.",
|
|
1995
|
+
children: /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
|
|
1996
|
+
/* @__PURE__ */ jsx2(Field, { label: "Expiration policy", children: /* @__PURE__ */ jsxs2(
|
|
1997
|
+
Select,
|
|
1998
|
+
{
|
|
1999
|
+
value: coupon.expiration_type,
|
|
2000
|
+
onValueChange: (expiration_type) => setCoupon((current) => ({
|
|
2001
|
+
...current,
|
|
2002
|
+
expiration_type
|
|
2003
|
+
})),
|
|
2004
|
+
children: [
|
|
2005
|
+
/* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
|
|
2006
|
+
/* @__PURE__ */ jsxs2(Select.Content, { children: [
|
|
2007
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "none", children: "None" }),
|
|
2008
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "duration", children: "Duration after issue" }),
|
|
2009
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "fixed", children: "Fixed date" })
|
|
2010
|
+
] })
|
|
2011
|
+
]
|
|
2012
|
+
}
|
|
2013
|
+
) }),
|
|
2014
|
+
coupon.expiration_type === "duration" ? /* @__PURE__ */ jsx2(Field, { label: "Expiration days", children: /* @__PURE__ */ jsx2(
|
|
2015
|
+
Input,
|
|
2016
|
+
{
|
|
2017
|
+
type: "number",
|
|
2018
|
+
min: 1,
|
|
2019
|
+
value: coupon.expiration_days,
|
|
2020
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2021
|
+
...current,
|
|
2022
|
+
expiration_days: event.target.value
|
|
2023
|
+
}))
|
|
2024
|
+
}
|
|
2025
|
+
) }) : coupon.expiration_type === "fixed" ? /* @__PURE__ */ jsx2(Field, { label: "Expires at", children: /* @__PURE__ */ jsx2(
|
|
2026
|
+
Input,
|
|
2027
|
+
{
|
|
2028
|
+
type: "datetime-local",
|
|
2029
|
+
value: coupon.expiration_date,
|
|
2030
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2031
|
+
...current,
|
|
2032
|
+
expiration_date: event.target.value
|
|
2033
|
+
}))
|
|
2034
|
+
}
|
|
2035
|
+
) }) : null,
|
|
2036
|
+
coupon.expiration_type !== "none" && /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
2037
|
+
/* @__PURE__ */ jsx2(Field, { label: "Cap expiration", children: /* @__PURE__ */ jsxs2(
|
|
2038
|
+
"div",
|
|
2039
|
+
{
|
|
2040
|
+
className: "flex items-center justify-between gap-x-4",
|
|
2041
|
+
style: { ...panelStyle, padding: "8px 12px" },
|
|
2042
|
+
children: [
|
|
2043
|
+
/* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: "Campaign end or cap date" }),
|
|
2044
|
+
/* @__PURE__ */ jsx2(
|
|
2045
|
+
Switch,
|
|
2046
|
+
{
|
|
2047
|
+
checked: coupon.expiration_cap_by_campaign,
|
|
2048
|
+
onCheckedChange: (expiration_cap_by_campaign) => setCoupon((current) => ({
|
|
2049
|
+
...current,
|
|
2050
|
+
expiration_cap_by_campaign: Boolean(
|
|
2051
|
+
expiration_cap_by_campaign
|
|
2052
|
+
)
|
|
2053
|
+
}))
|
|
2054
|
+
}
|
|
2055
|
+
)
|
|
2056
|
+
]
|
|
2057
|
+
}
|
|
2058
|
+
) }),
|
|
2059
|
+
/* @__PURE__ */ jsx2(Field, { label: "Expiration cap date", optional: true, children: /* @__PURE__ */ jsx2(
|
|
2060
|
+
Input,
|
|
2061
|
+
{
|
|
2062
|
+
type: "datetime-local",
|
|
2063
|
+
disabled: !coupon.expiration_cap_by_campaign,
|
|
2064
|
+
value: coupon.expiration_cap_at,
|
|
2065
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2066
|
+
...current,
|
|
2067
|
+
expiration_cap_at: event.target.value
|
|
2068
|
+
}))
|
|
2069
|
+
}
|
|
2070
|
+
) })
|
|
2071
|
+
] })
|
|
2072
|
+
] })
|
|
2073
|
+
}
|
|
2074
|
+
),
|
|
2075
|
+
/* @__PURE__ */ jsx2(
|
|
2076
|
+
Section,
|
|
2077
|
+
{
|
|
2078
|
+
title: "Code",
|
|
2079
|
+
description: "Choose whether every issued coupon is unique or shares one code.",
|
|
2080
|
+
children: /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
|
|
2081
|
+
/* @__PURE__ */ jsx2(Field, { label: "Code strategy", children: /* @__PURE__ */ jsxs2(
|
|
2082
|
+
Select,
|
|
2083
|
+
{
|
|
2084
|
+
value: coupon.code_strategy,
|
|
2085
|
+
onValueChange: (code_strategy) => setCoupon((current) => ({
|
|
2086
|
+
...current,
|
|
2087
|
+
code_strategy
|
|
2088
|
+
})),
|
|
2089
|
+
children: [
|
|
2090
|
+
/* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
|
|
2091
|
+
/* @__PURE__ */ jsxs2(Select.Content, { children: [
|
|
2092
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "unique_code", children: "Unique code" }),
|
|
2093
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "shared_code", children: "Shared code" })
|
|
2094
|
+
] })
|
|
2095
|
+
]
|
|
2096
|
+
}
|
|
2097
|
+
) }),
|
|
2098
|
+
coupon.code_strategy === "unique_code" ? /* @__PURE__ */ jsx2(Field, { label: "Code prefix", optional: true, children: /* @__PURE__ */ jsx2(
|
|
2099
|
+
Input,
|
|
2100
|
+
{
|
|
2101
|
+
value: coupon.code_prefix,
|
|
2102
|
+
placeholder: "COUPON",
|
|
2103
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2104
|
+
...current,
|
|
2105
|
+
code_prefix: event.target.value
|
|
2106
|
+
}))
|
|
2107
|
+
}
|
|
2108
|
+
) }) : /* @__PURE__ */ jsx2(Field, { label: "Shared code", children: /* @__PURE__ */ jsx2(
|
|
2109
|
+
Input,
|
|
2110
|
+
{
|
|
2111
|
+
value: coupon.shared_code,
|
|
2112
|
+
placeholder: "SUMMER15",
|
|
2113
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2114
|
+
...current,
|
|
2115
|
+
shared_code: event.target.value
|
|
2116
|
+
}))
|
|
2117
|
+
}
|
|
2118
|
+
) })
|
|
2119
|
+
] })
|
|
2120
|
+
}
|
|
2121
|
+
),
|
|
2122
|
+
/* @__PURE__ */ jsx2(Section, { title: "Issuance", children: /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
|
|
2123
|
+
/* @__PURE__ */ jsx2(Field, { label: "Max issuance per item", children: /* @__PURE__ */ jsx2(
|
|
2124
|
+
Input,
|
|
2125
|
+
{
|
|
2126
|
+
type: "number",
|
|
2127
|
+
min: 1,
|
|
2128
|
+
value: coupon.max_issuance_per_order_item,
|
|
2129
|
+
onChange: (event) => setCoupon((current) => ({
|
|
2130
|
+
...current,
|
|
2131
|
+
max_issuance_per_order_item: event.target.value
|
|
2132
|
+
}))
|
|
2133
|
+
}
|
|
2134
|
+
) }),
|
|
2135
|
+
allowPromotionMirror && !(isAmountType && coupon.amounts.length > 1) && /* @__PURE__ */ jsx2(Field, { label: "Promotion mirror", children: /* @__PURE__ */ jsxs2(
|
|
2136
|
+
Select,
|
|
2137
|
+
{
|
|
2138
|
+
value: coupon.promotion_mirror_mode,
|
|
2139
|
+
disabled: coupon.type === "buy_x_get_y",
|
|
2140
|
+
onValueChange: (promotion_mirror_mode) => setCoupon((current) => ({
|
|
2141
|
+
...current,
|
|
2142
|
+
promotion_mirror_mode
|
|
2143
|
+
})),
|
|
2144
|
+
children: [
|
|
2145
|
+
/* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
|
|
2146
|
+
/* @__PURE__ */ jsxs2(Select.Content, { children: [
|
|
2147
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "none", children: "None" }),
|
|
2148
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "manual", children: "Manual" }),
|
|
2149
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "auto", children: "Auto" })
|
|
2150
|
+
] })
|
|
2151
|
+
]
|
|
2152
|
+
}
|
|
2153
|
+
) })
|
|
2154
|
+
] }) })
|
|
2155
|
+
]
|
|
2156
|
+
}
|
|
2157
|
+
)
|
|
2158
|
+
] }),
|
|
2159
|
+
allowPromotionMirror && activeStep === "campaign" && /* @__PURE__ */ jsx2(ProgressTabs.Content, { value: "campaign", style: stackStyle, children: /* @__PURE__ */ jsx2(Section, { title: "Campaign", children: /* @__PURE__ */ jsxs2("div", { style: twoColumnGridStyle, children: [
|
|
2160
|
+
/* @__PURE__ */ jsx2(Field, { label: "Campaign mode", children: /* @__PURE__ */ jsxs2(
|
|
2161
|
+
Select,
|
|
2162
|
+
{
|
|
2163
|
+
value: campaign.mode,
|
|
2164
|
+
onValueChange: (mode) => setCampaign((current) => ({
|
|
2165
|
+
...current,
|
|
2166
|
+
mode
|
|
2167
|
+
})),
|
|
2168
|
+
children: [
|
|
2169
|
+
/* @__PURE__ */ jsx2(Select.Trigger, { children: /* @__PURE__ */ jsx2(Select.Value, {}) }),
|
|
2170
|
+
/* @__PURE__ */ jsxs2(Select.Content, { children: [
|
|
2171
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "none", children: "No campaign" }),
|
|
2172
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "existing", children: "Existing campaign" }),
|
|
2173
|
+
/* @__PURE__ */ jsx2(Select.Item, { value: "new", children: "New campaign" })
|
|
2174
|
+
] })
|
|
2175
|
+
]
|
|
2176
|
+
}
|
|
2177
|
+
) }),
|
|
2178
|
+
campaign.mode === "existing" && /* @__PURE__ */ jsx2(Field, { label: "Existing campaign", children: /* @__PURE__ */ jsx2(
|
|
2179
|
+
OptionSelect,
|
|
2180
|
+
{
|
|
2181
|
+
value: campaign.campaign_id,
|
|
2182
|
+
options: options.campaigns || [],
|
|
2183
|
+
onChange: (campaign_id) => setCampaign((current) => ({
|
|
2184
|
+
...current,
|
|
2185
|
+
campaign_id
|
|
2186
|
+
}))
|
|
2187
|
+
}
|
|
2188
|
+
) }),
|
|
2189
|
+
campaign.mode === "new" && /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
2190
|
+
/* @__PURE__ */ jsx2(Field, { label: "Name", children: /* @__PURE__ */ jsx2(
|
|
2191
|
+
Input,
|
|
2192
|
+
{
|
|
2193
|
+
value: campaign.name,
|
|
2194
|
+
onChange: (event) => setCampaign((current) => ({
|
|
2195
|
+
...current,
|
|
2196
|
+
name: event.target.value
|
|
2197
|
+
}))
|
|
2198
|
+
}
|
|
2199
|
+
) }),
|
|
2200
|
+
/* @__PURE__ */ jsx2(Field, { label: "Identifier", children: /* @__PURE__ */ jsx2(
|
|
2201
|
+
Input,
|
|
2202
|
+
{
|
|
2203
|
+
value: campaign.campaign_identifier,
|
|
2204
|
+
onChange: (event) => setCampaign((current) => ({
|
|
2205
|
+
...current,
|
|
2206
|
+
campaign_identifier: event.target.value
|
|
2207
|
+
}))
|
|
2208
|
+
}
|
|
2209
|
+
) }),
|
|
2210
|
+
/* @__PURE__ */ jsx2(Field, { label: "Starts at", optional: true, children: /* @__PURE__ */ jsx2(
|
|
2211
|
+
Input,
|
|
2212
|
+
{
|
|
2213
|
+
type: "datetime-local",
|
|
2214
|
+
value: campaign.starts_at,
|
|
2215
|
+
onChange: (event) => setCampaign((current) => ({
|
|
2216
|
+
...current,
|
|
2217
|
+
starts_at: event.target.value
|
|
2218
|
+
}))
|
|
2219
|
+
}
|
|
2220
|
+
) }),
|
|
2221
|
+
/* @__PURE__ */ jsx2(Field, { label: "Ends at", optional: true, children: /* @__PURE__ */ jsx2(
|
|
2222
|
+
Input,
|
|
2223
|
+
{
|
|
2224
|
+
type: "datetime-local",
|
|
2225
|
+
value: campaign.ends_at,
|
|
2226
|
+
onChange: (event) => setCampaign((current) => ({
|
|
2227
|
+
...current,
|
|
2228
|
+
ends_at: event.target.value
|
|
2229
|
+
}))
|
|
2230
|
+
}
|
|
2231
|
+
) })
|
|
2232
|
+
] })
|
|
2233
|
+
] }) }) }),
|
|
2234
|
+
activeStep === "prices" && /* @__PURE__ */ jsx2(ProgressTabs.Content, { value: "prices", style: { height: "100%" }, children: /* @__PURE__ */ jsx2(
|
|
2235
|
+
ProductPricesTable,
|
|
2236
|
+
{
|
|
2237
|
+
currencies,
|
|
2238
|
+
couponValue: formatCouponValue(coupon, currencies),
|
|
2239
|
+
prices: product.price_amounts,
|
|
2240
|
+
onChange: (currencyCode, value) => setProduct((current) => ({
|
|
2241
|
+
...current,
|
|
2242
|
+
price_amounts: {
|
|
2243
|
+
...current.price_amounts,
|
|
2244
|
+
[currencyCode]: value
|
|
2245
|
+
}
|
|
2246
|
+
}))
|
|
2247
|
+
}
|
|
2248
|
+
) })
|
|
2249
|
+
]
|
|
2250
|
+
}
|
|
2251
|
+
)
|
|
2252
|
+
}
|
|
2253
|
+
) }),
|
|
2254
|
+
/* @__PURE__ */ jsxs2(FocusModal.Footer, { style: { flexShrink: 0 }, children: [
|
|
2255
|
+
/* @__PURE__ */ jsx2(Button, { variant: "secondary", onClick: () => onOpenChange(false), children: "Cancel" }),
|
|
2256
|
+
currentStepIndex > 0 && /* @__PURE__ */ jsx2(
|
|
2257
|
+
Button,
|
|
2258
|
+
{
|
|
2259
|
+
variant: "secondary",
|
|
2260
|
+
onClick: () => setActiveStep(visibleSteps[currentStepIndex - 1]),
|
|
2261
|
+
children: "Back"
|
|
2262
|
+
}
|
|
2263
|
+
),
|
|
2264
|
+
currentStepIndex < visibleSteps.length - 1 ? /* @__PURE__ */ jsx2(
|
|
2265
|
+
Button,
|
|
2266
|
+
{
|
|
2267
|
+
disabled: !activeStepComplete,
|
|
2268
|
+
onClick: () => {
|
|
2269
|
+
const nextIndex = currentStepIndex + 1;
|
|
2270
|
+
setFurthestStepIndex(
|
|
2271
|
+
(current) => Math.max(current, nextIndex)
|
|
2272
|
+
);
|
|
2273
|
+
setActiveStep(visibleSteps[nextIndex]);
|
|
2274
|
+
},
|
|
2275
|
+
children: "Continue"
|
|
2276
|
+
}
|
|
2277
|
+
) : /* @__PURE__ */ jsx2(
|
|
2278
|
+
Button,
|
|
2279
|
+
{
|
|
2280
|
+
disabled: !activeStepComplete,
|
|
2281
|
+
isLoading: saving,
|
|
2282
|
+
onClick: () => void save(),
|
|
2283
|
+
children: "Save"
|
|
2284
|
+
}
|
|
2285
|
+
)
|
|
2286
|
+
] })
|
|
2287
|
+
]
|
|
2288
|
+
}
|
|
2289
|
+
)
|
|
2290
|
+
] }) });
|
|
2291
|
+
}
|
|
2292
|
+
function CouponProductsPage({
|
|
2293
|
+
allowPromotionMirror = false,
|
|
2294
|
+
apiBase,
|
|
2295
|
+
title
|
|
2296
|
+
}) {
|
|
2297
|
+
const [products, setProducts] = useState([]);
|
|
2298
|
+
const [options, setOptions] = useState({});
|
|
2299
|
+
const [loading, setLoading] = useState(true);
|
|
2300
|
+
const [loadError, setLoadError] = useState(null);
|
|
2301
|
+
const [modalOpen, setModalOpen] = useState(false);
|
|
2302
|
+
const [editingRow, setEditingRow] = useState(null);
|
|
2303
|
+
const prompt = usePrompt();
|
|
2304
|
+
const couponBase = `${apiBase}/coupon-products`;
|
|
2305
|
+
const load = useCallback(async () => {
|
|
2306
|
+
setLoading(true);
|
|
2307
|
+
setLoadError(null);
|
|
2308
|
+
try {
|
|
2309
|
+
const [productsPayload, optionsPayload] = await Promise.all([
|
|
2310
|
+
apiFetch(couponBase),
|
|
2311
|
+
apiFetch(`${couponBase}/options`)
|
|
2312
|
+
]);
|
|
2313
|
+
setProducts(productsPayload.coupon_products || []);
|
|
2314
|
+
setOptions(optionsPayload || {});
|
|
2315
|
+
} catch (error) {
|
|
2316
|
+
const message = error instanceof Error ? error.message : "Failed to load coupon products";
|
|
2317
|
+
setLoadError(message);
|
|
2318
|
+
toast.error(message);
|
|
2319
|
+
} finally {
|
|
2320
|
+
setLoading(false);
|
|
2321
|
+
}
|
|
2322
|
+
}, [couponBase]);
|
|
2323
|
+
useEffect(() => {
|
|
2324
|
+
void load();
|
|
2325
|
+
}, [load]);
|
|
2326
|
+
const remove = async (row) => {
|
|
2327
|
+
const confirmed = await prompt({
|
|
2328
|
+
title: "Remove coupon product?",
|
|
2329
|
+
description: `This removes coupon issuance from ${row.product.title || row.product.id}. The underlying Medusa product will remain available.`,
|
|
2330
|
+
confirmText: "Remove product",
|
|
2331
|
+
cancelText: "Cancel",
|
|
2332
|
+
variant: "danger"
|
|
2333
|
+
});
|
|
2334
|
+
if (!confirmed) return;
|
|
2335
|
+
try {
|
|
2336
|
+
await apiFetch(`${couponBase}/${row.product.id}`, { method: "DELETE" });
|
|
2337
|
+
toast.success("Coupon configuration removed");
|
|
2338
|
+
await load();
|
|
2339
|
+
} catch (error) {
|
|
2340
|
+
toast.error(error instanceof Error ? error.message : "Delete failed");
|
|
2341
|
+
}
|
|
2342
|
+
};
|
|
2343
|
+
const mirror = async (row) => {
|
|
2344
|
+
try {
|
|
2345
|
+
await apiFetch(
|
|
2346
|
+
`/admin/coupon-products/${row.product.id}/mirror-promotion`,
|
|
2347
|
+
{
|
|
2348
|
+
method: "POST",
|
|
2349
|
+
body: JSON.stringify({})
|
|
2350
|
+
}
|
|
2351
|
+
);
|
|
2352
|
+
toast.success("Promotion mirror created");
|
|
2353
|
+
} catch (error) {
|
|
2354
|
+
toast.error(error instanceof Error ? error.message : "Mirror failed");
|
|
2355
|
+
}
|
|
2356
|
+
};
|
|
2357
|
+
return /* @__PURE__ */ jsxs2(Container, { className: "divide-y p-0", children: [
|
|
2358
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
2359
|
+
/* @__PURE__ */ jsx2(Heading, { level: "h1", children: title }),
|
|
2360
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-x-2", children: [
|
|
2361
|
+
/* @__PURE__ */ jsxs2(Button, { size: "small", variant: "secondary", onClick: () => void load(), children: [
|
|
2362
|
+
/* @__PURE__ */ jsx2(ArrowPath, {}),
|
|
2363
|
+
" Refresh"
|
|
2364
|
+
] }),
|
|
2365
|
+
/* @__PURE__ */ jsxs2(
|
|
2366
|
+
Button,
|
|
2367
|
+
{
|
|
2368
|
+
size: "small",
|
|
2369
|
+
onClick: () => {
|
|
2370
|
+
setEditingRow(null);
|
|
2371
|
+
setModalOpen(true);
|
|
2372
|
+
},
|
|
2373
|
+
children: [
|
|
2374
|
+
/* @__PURE__ */ jsx2(Plus, {}),
|
|
2375
|
+
" Create"
|
|
2376
|
+
]
|
|
2377
|
+
}
|
|
2378
|
+
)
|
|
2379
|
+
] })
|
|
2380
|
+
] }),
|
|
2381
|
+
loading ? /* @__PURE__ */ jsx2(CouponEmptyState, { title: "Loading coupon products" }) : loadError ? /* @__PURE__ */ jsx2(CouponEmptyState, { title: loadError }) : products.length ? /* @__PURE__ */ jsxs2(Table, { children: [
|
|
2382
|
+
/* @__PURE__ */ jsx2(Table.Header, { children: /* @__PURE__ */ jsxs2(Table.Row, { children: [
|
|
2383
|
+
/* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Product" }),
|
|
2384
|
+
/* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Status" }),
|
|
2385
|
+
/* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Type" }),
|
|
2386
|
+
/* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Code" }),
|
|
2387
|
+
/* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Campaign" }),
|
|
2388
|
+
/* @__PURE__ */ jsx2(Table.HeaderCell, { children: "Issued" }),
|
|
2389
|
+
/* @__PURE__ */ jsx2(Table.HeaderCell, {})
|
|
2390
|
+
] }) }),
|
|
2391
|
+
/* @__PURE__ */ jsx2(
|
|
2392
|
+
Table.Body,
|
|
2393
|
+
{
|
|
2394
|
+
style: { borderBottom: "none" },
|
|
2395
|
+
children: products.map((row) => {
|
|
2396
|
+
const config3 = row.coupon_product_config;
|
|
2397
|
+
return /* @__PURE__ */ jsxs2(
|
|
2398
|
+
Table.Row,
|
|
2399
|
+
{
|
|
2400
|
+
style: { borderBottom: "none", background: "none" },
|
|
2401
|
+
children: [
|
|
2402
|
+
/* @__PURE__ */ jsx2(Table.Cell, { children: /* @__PURE__ */ jsxs2("div", { className: "flex flex-col", children: [
|
|
2403
|
+
/* @__PURE__ */ jsx2(Text2, { weight: "plus", children: row.product.title || row.product.id }),
|
|
2404
|
+
/* @__PURE__ */ jsx2(Text2, { size: "small", className: "text-ui-fg-muted", children: row.product.handle || row.product.id })
|
|
2405
|
+
] }) }),
|
|
2406
|
+
/* @__PURE__ */ jsx2(Table.Cell, { children: /* @__PURE__ */ jsx2(
|
|
2407
|
+
StatusBadge,
|
|
2408
|
+
{
|
|
2409
|
+
color: couponStatusColor(config3.promotion_status),
|
|
2410
|
+
children: config3.promotion_status || "draft"
|
|
2411
|
+
}
|
|
2412
|
+
) }),
|
|
2413
|
+
/* @__PURE__ */ jsx2(Table.Cell, { children: couponTypeLabel(config3) }),
|
|
2414
|
+
/* @__PURE__ */ jsx2(Table.Cell, { children: config3.code_strategy === "shared_code" ? config3.shared_code || "Shared" : `${config3.code_prefix || "COUPON"}-*` }),
|
|
2415
|
+
/* @__PURE__ */ jsx2(Table.Cell, { children: campaignLabel(config3) }),
|
|
2416
|
+
/* @__PURE__ */ jsx2(Table.Cell, { children: row.entitlements_count || 0 }),
|
|
2417
|
+
/* @__PURE__ */ jsx2(Table.Cell, { children: /* @__PURE__ */ jsxs2("div", { className: "flex justify-end gap-x-2", children: [
|
|
2418
|
+
allowPromotionMirror && !(config3.benefit_type === "fixed_amount" && (config3.amounts?.length || 0) > 1) && /* @__PURE__ */ jsx2(
|
|
2419
|
+
Button,
|
|
2420
|
+
{
|
|
2421
|
+
size: "small",
|
|
2422
|
+
variant: "secondary",
|
|
2423
|
+
onClick: () => void mirror(row),
|
|
2424
|
+
children: "Mirror"
|
|
2425
|
+
}
|
|
2426
|
+
),
|
|
2427
|
+
/* @__PURE__ */ jsx2(
|
|
2428
|
+
Button,
|
|
2429
|
+
{
|
|
2430
|
+
size: "small",
|
|
2431
|
+
variant: "secondary",
|
|
2432
|
+
onClick: () => {
|
|
2433
|
+
setEditingRow(row);
|
|
2434
|
+
setModalOpen(true);
|
|
2435
|
+
},
|
|
2436
|
+
children: /* @__PURE__ */ jsx2(PencilSquare, {})
|
|
2437
|
+
}
|
|
2438
|
+
),
|
|
2439
|
+
/* @__PURE__ */ jsx2(
|
|
2440
|
+
Button,
|
|
2441
|
+
{
|
|
2442
|
+
size: "small",
|
|
2443
|
+
variant: "danger",
|
|
2444
|
+
onClick: () => void remove(row),
|
|
2445
|
+
children: /* @__PURE__ */ jsx2(Trash, {})
|
|
2446
|
+
}
|
|
2447
|
+
)
|
|
2448
|
+
] }) })
|
|
2449
|
+
]
|
|
2450
|
+
},
|
|
2451
|
+
row.id
|
|
2452
|
+
);
|
|
2453
|
+
})
|
|
2454
|
+
}
|
|
2455
|
+
)
|
|
2456
|
+
] }) : /* @__PURE__ */ jsx2(
|
|
2457
|
+
CouponEmptyState,
|
|
2458
|
+
{
|
|
2459
|
+
title: "No coupon products found",
|
|
2460
|
+
description: "Create a new coupon product to get started."
|
|
2461
|
+
}
|
|
2462
|
+
),
|
|
2463
|
+
/* @__PURE__ */ jsx2(
|
|
2464
|
+
CouponProductModal,
|
|
2465
|
+
{
|
|
2466
|
+
open: modalOpen,
|
|
2467
|
+
row: editingRow,
|
|
2468
|
+
apiBase,
|
|
2469
|
+
options,
|
|
2470
|
+
allowPromotionMirror,
|
|
2471
|
+
onOpenChange: setModalOpen,
|
|
2472
|
+
onSaved: load
|
|
2473
|
+
}
|
|
2474
|
+
)
|
|
2475
|
+
] });
|
|
2476
|
+
}
|
|
2477
|
+
|
|
2478
|
+
// src/dashboard/coupons/coupon-manager.tsx
|
|
2479
|
+
import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
2480
|
+
function backendUrl2() {
|
|
2481
|
+
return typeof __BACKEND_URL__ === "string" ? __BACKEND_URL__.replace(/\/$/, "") : "";
|
|
2482
|
+
}
|
|
2483
|
+
function apiErrorMessage2(payload, fallback) {
|
|
2484
|
+
const candidates = [
|
|
2485
|
+
payload?.message,
|
|
2486
|
+
payload?.error?.message,
|
|
2487
|
+
payload?.error,
|
|
2488
|
+
payload?.errors?.[0]?.message
|
|
2489
|
+
];
|
|
2490
|
+
const message = candidates.find(
|
|
2491
|
+
(candidate) => typeof candidate === "string" && candidate.trim()
|
|
2492
|
+
);
|
|
2493
|
+
return message || fallback || "Request failed";
|
|
2494
|
+
}
|
|
2495
|
+
async function apiFetch2(path, options = {}) {
|
|
2496
|
+
const response = await fetch(`${backendUrl2()}${path}`, {
|
|
2497
|
+
...options,
|
|
2498
|
+
credentials: "include",
|
|
2499
|
+
headers: {
|
|
2500
|
+
...options.body ? { "Content-Type": "application/json" } : {},
|
|
2501
|
+
...options.headers
|
|
2502
|
+
}
|
|
2503
|
+
});
|
|
2504
|
+
if (!response.ok) {
|
|
2505
|
+
const payload = await response.json().catch(() => null);
|
|
2506
|
+
throw new Error(apiErrorMessage2(payload, response.statusText));
|
|
2507
|
+
}
|
|
2508
|
+
return response.json();
|
|
2509
|
+
}
|
|
2510
|
+
function formatDate(value) {
|
|
2511
|
+
if (!value) return "-";
|
|
2512
|
+
const date = new Date(value);
|
|
2513
|
+
if (Number.isNaN(date.getTime())) return "-";
|
|
2514
|
+
return date.toLocaleDateString();
|
|
2515
|
+
}
|
|
2516
|
+
function formatDateTime(value) {
|
|
2517
|
+
if (!value) return "-";
|
|
2518
|
+
const date = new Date(value);
|
|
2519
|
+
if (Number.isNaN(date.getTime())) return "-";
|
|
2520
|
+
return date.toLocaleString();
|
|
2521
|
+
}
|
|
2522
|
+
function formatFullDate(value) {
|
|
2523
|
+
if (!value) return "-";
|
|
2524
|
+
const date = new Date(value);
|
|
2525
|
+
if (Number.isNaN(date.getTime())) return "-";
|
|
2526
|
+
return date.toLocaleString(void 0, {
|
|
2527
|
+
day: "numeric",
|
|
2528
|
+
hour: "numeric",
|
|
2529
|
+
minute: "2-digit",
|
|
2530
|
+
month: "short",
|
|
2531
|
+
year: "numeric"
|
|
2532
|
+
});
|
|
2533
|
+
}
|
|
2534
|
+
function formatRelativeDate(value) {
|
|
2535
|
+
if (!value) return "-";
|
|
2536
|
+
const date = new Date(value);
|
|
2537
|
+
if (Number.isNaN(date.getTime())) return "-";
|
|
2538
|
+
const diffSeconds = Math.round((date.getTime() - Date.now()) / 1e3);
|
|
2539
|
+
const absSeconds = Math.abs(diffSeconds);
|
|
2540
|
+
const units = [
|
|
2541
|
+
["year", 60 * 60 * 24 * 365],
|
|
2542
|
+
["month", 60 * 60 * 24 * 30],
|
|
2543
|
+
["week", 60 * 60 * 24 * 7],
|
|
2544
|
+
["day", 60 * 60 * 24],
|
|
2545
|
+
["hour", 60 * 60],
|
|
2546
|
+
["minute", 60]
|
|
2547
|
+
];
|
|
2548
|
+
const [unit, seconds] = units.find(([, secondsPerUnit]) => absSeconds >= secondsPerUnit) || [];
|
|
2549
|
+
if (!unit || !seconds) {
|
|
2550
|
+
return "just now";
|
|
2551
|
+
}
|
|
2552
|
+
return new Intl.RelativeTimeFormat(void 0, { numeric: "auto" }).format(
|
|
2553
|
+
Math.round(diffSeconds / seconds),
|
|
2554
|
+
unit
|
|
2555
|
+
);
|
|
2556
|
+
}
|
|
2557
|
+
function formatSnapshotAmount(amount, currency) {
|
|
2558
|
+
if (amount == null) return "-";
|
|
2559
|
+
const code = currency ? currency.toUpperCase() : "";
|
|
2560
|
+
return [code, amount.toLocaleString(void 0, { maximumFractionDigits: 2 })].filter(Boolean).join(" ");
|
|
2561
|
+
}
|
|
2562
|
+
function entitlementStatusColor(status) {
|
|
2563
|
+
if (status === "issued") return "green";
|
|
2564
|
+
if (status === "redeemed") return "blue";
|
|
2565
|
+
if (status === "expired" || status === "canceled") return "grey";
|
|
2566
|
+
return "orange";
|
|
2567
|
+
}
|
|
2568
|
+
function snapshotString(snapshot, key) {
|
|
2569
|
+
const value = snapshot?.[key];
|
|
2570
|
+
if (typeof value === "string" && value.trim()) return value;
|
|
2571
|
+
if (typeof value === "number") return String(value);
|
|
2572
|
+
return "";
|
|
2573
|
+
}
|
|
2574
|
+
function snapshotNumber(snapshot, key) {
|
|
2575
|
+
const value = snapshot?.[key];
|
|
2576
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
2577
|
+
}
|
|
2578
|
+
function jsonBlock(value) {
|
|
2579
|
+
if (value == null) return "{}";
|
|
2580
|
+
return JSON.stringify(value, null, 2);
|
|
2581
|
+
}
|
|
2582
|
+
function couponCode(entitlement) {
|
|
2583
|
+
return entitlement.code || entitlement.shared_code || "-";
|
|
2584
|
+
}
|
|
2585
|
+
function entitlementSource(entitlement) {
|
|
2586
|
+
if (entitlement.origin === "external") return "External";
|
|
2587
|
+
return "Purchase";
|
|
2588
|
+
}
|
|
2589
|
+
function entitlementSellerScope(entitlement) {
|
|
2590
|
+
const count = entitlement.seller_targets?.length || 0;
|
|
2591
|
+
if (entitlement.origin !== "external") {
|
|
2592
|
+
if (!count) return "Product seller";
|
|
2593
|
+
return `Product seller + ${count} linked`;
|
|
2594
|
+
}
|
|
2595
|
+
if (!count) return "Admin only";
|
|
2596
|
+
return count === 1 ? "1 linked seller" : `${count} linked sellers`;
|
|
2597
|
+
}
|
|
2598
|
+
function orderDisplayId(order) {
|
|
2599
|
+
if (!order) return "-";
|
|
2600
|
+
return order.display_id == null ? order.id : `#${order.display_id}`;
|
|
2601
|
+
}
|
|
2602
|
+
function dashboardBasePath(apiBase) {
|
|
2603
|
+
return apiBase === "/vendor" ? "/seller" : "/dashboard";
|
|
2604
|
+
}
|
|
2605
|
+
function couponDetailPath(apiBase, entitlementId) {
|
|
2606
|
+
return `${dashboardBasePath(apiBase)}/coupons/${encodeURIComponent(
|
|
2607
|
+
entitlementId
|
|
2608
|
+
)}`;
|
|
2609
|
+
}
|
|
2610
|
+
function orderDetailPath(apiBase, orderId) {
|
|
2611
|
+
return `${dashboardBasePath(apiBase)}/orders/${encodeURIComponent(orderId)}`;
|
|
2612
|
+
}
|
|
2613
|
+
function currentCouponDetailId(apiBase) {
|
|
2614
|
+
if (typeof window === "undefined") {
|
|
2615
|
+
return "";
|
|
2616
|
+
}
|
|
2617
|
+
const prefix = `${dashboardBasePath(apiBase)}/coupons/`;
|
|
2618
|
+
const path = window.location.pathname;
|
|
2619
|
+
const index = path.indexOf(prefix);
|
|
2620
|
+
if (index === -1) {
|
|
2621
|
+
return "";
|
|
2622
|
+
}
|
|
2623
|
+
const id = path.slice(index + prefix.length).split("/")[0];
|
|
2624
|
+
if (!id || id === "products") {
|
|
2625
|
+
return "";
|
|
2626
|
+
}
|
|
2627
|
+
try {
|
|
2628
|
+
return decodeURIComponent(id);
|
|
2629
|
+
} catch {
|
|
2630
|
+
return id;
|
|
2631
|
+
}
|
|
2632
|
+
}
|
|
2633
|
+
function benefitSnapshotLabel(snapshot) {
|
|
2634
|
+
const type = snapshotString(snapshot, "benefit_type");
|
|
2635
|
+
if (type === "fixed_amount") {
|
|
2636
|
+
const amounts = Array.isArray(snapshot?.amounts) ? snapshot.amounts : [];
|
|
2637
|
+
if (amounts.length) {
|
|
2638
|
+
return amounts.map((row) => {
|
|
2639
|
+
const amount2 = snapshotNumber(row, "amount");
|
|
2640
|
+
const currency2 = snapshotString(row, "currency_code").toUpperCase();
|
|
2641
|
+
return `${amount2 ?? 0} ${currency2}`.trim();
|
|
2642
|
+
}).join(", ");
|
|
2643
|
+
}
|
|
2644
|
+
const amount = snapshotNumber(snapshot, "amount");
|
|
2645
|
+
const currency = snapshotString(snapshot, "currency_code").toUpperCase();
|
|
2646
|
+
return `${amount ?? 0} ${currency}`.trim();
|
|
2647
|
+
}
|
|
2648
|
+
if (type === "percentage") {
|
|
2649
|
+
const template = snapshot?.promotion_template;
|
|
2650
|
+
const method = template?.application_method;
|
|
2651
|
+
const scope = snapshotString(method, "target_type") === "order" ? "order" : "products";
|
|
2652
|
+
return `${snapshotNumber(snapshot, "percentage") ?? 0}% off ${scope}`;
|
|
2653
|
+
}
|
|
2654
|
+
if (type === "free_shipping") {
|
|
2655
|
+
return "Free shipping";
|
|
2656
|
+
}
|
|
2657
|
+
if (type === "buy_get") {
|
|
2658
|
+
return "Buy X Get Y";
|
|
2659
|
+
}
|
|
2660
|
+
return "Unknown";
|
|
2661
|
+
}
|
|
2662
|
+
function expirationPolicyLabel(snapshot) {
|
|
2663
|
+
const policy = snapshot?.expiration_policy;
|
|
2664
|
+
const type = snapshotString(policy, "type");
|
|
2665
|
+
if (type === "none") return "No expiration";
|
|
2666
|
+
if (type === "duration") {
|
|
2667
|
+
const days = snapshotNumber(policy, "duration_days") ?? 0;
|
|
2668
|
+
return `${days} days after issuance`;
|
|
2669
|
+
}
|
|
2670
|
+
if (type === "fixed") {
|
|
2671
|
+
return `Fixed date ${formatDateTime(snapshotString(policy, "expires_at"))}`;
|
|
2672
|
+
}
|
|
2673
|
+
return "-";
|
|
2674
|
+
}
|
|
2675
|
+
function campaignSnapshotLabel(snapshot) {
|
|
2676
|
+
const campaignSnapshot = snapshot?.campaign_snapshot;
|
|
2677
|
+
return snapshotString(campaignSnapshot, "name") || snapshotString(campaignSnapshot, "campaign_identifier") || snapshotString(snapshot, "campaign_id") || "None";
|
|
2678
|
+
}
|
|
2679
|
+
function promotionSnapshotLabel(snapshot) {
|
|
2680
|
+
const template = snapshot?.promotion_template;
|
|
2681
|
+
const method = template?.application_method;
|
|
2682
|
+
const target = snapshotString(method, "target_type");
|
|
2683
|
+
const allocation = snapshotString(method, "allocation");
|
|
2684
|
+
return [target, allocation].filter(Boolean).join(" / ") || "None";
|
|
2685
|
+
}
|
|
2686
|
+
var entitlementFilters = [
|
|
2687
|
+
{ label: "All", value: "all" },
|
|
2688
|
+
{ label: "Issued", value: "issued" },
|
|
2689
|
+
{ label: "Redeemed", value: "redeemed" },
|
|
2690
|
+
{ label: "Expired", value: "expired" },
|
|
2691
|
+
{ label: "Canceled", value: "canceled" }
|
|
2692
|
+
];
|
|
2693
|
+
function SnapshotBlock({ title, value }) {
|
|
2694
|
+
return /* @__PURE__ */ jsxs3("details", { className: "rounded-lg border p-3", children: [
|
|
2695
|
+
/* @__PURE__ */ jsx3("summary", { className: "cursor-pointer text-ui-fg-base txt-small-plus", children: title }),
|
|
2696
|
+
/* @__PURE__ */ jsx3(
|
|
2697
|
+
"pre",
|
|
2698
|
+
{
|
|
2699
|
+
className: "mt-3 rounded-md bg-ui-bg-subtle p-3 text-ui-fg-subtle txt-compact-xsmall",
|
|
2700
|
+
style: {
|
|
2701
|
+
maxHeight: 220,
|
|
2702
|
+
overflow: "auto",
|
|
2703
|
+
whiteSpace: "pre-wrap",
|
|
2704
|
+
wordBreak: "break-word"
|
|
2705
|
+
},
|
|
2706
|
+
children: jsonBlock(value)
|
|
2707
|
+
}
|
|
2708
|
+
)
|
|
2709
|
+
] });
|
|
2710
|
+
}
|
|
2711
|
+
function TwoColumnLayout({
|
|
2712
|
+
firstCol,
|
|
2713
|
+
secondCol
|
|
2714
|
+
}) {
|
|
2715
|
+
return /* @__PURE__ */ jsxs3("div", { className: "flex flex-col gap-x-4 gap-y-3 xl:flex-row xl:items-start", children: [
|
|
2716
|
+
/* @__PURE__ */ jsx3("div", { className: "flex w-full flex-col gap-y-3", children: firstCol }),
|
|
2717
|
+
/* @__PURE__ */ jsx3("div", { className: "flex w-full max-w-[100%] flex-col gap-y-3 xl:mt-0 xl:max-w-[440px]", children: secondCol })
|
|
2718
|
+
] });
|
|
2719
|
+
}
|
|
2720
|
+
function SectionRow({
|
|
2721
|
+
title,
|
|
2722
|
+
value
|
|
2723
|
+
}) {
|
|
2724
|
+
return /* @__PURE__ */ jsxs3("div", { className: "text-ui-fg-subtle grid grid-cols-2 items-center gap-x-4 px-6 py-4", children: [
|
|
2725
|
+
/* @__PURE__ */ jsx3(Text3, { size: "small", weight: "plus", leading: "compact", children: title }),
|
|
2726
|
+
typeof value === "string" || value == null ? /* @__PURE__ */ jsx3(
|
|
2727
|
+
Text3,
|
|
2728
|
+
{
|
|
2729
|
+
size: "small",
|
|
2730
|
+
leading: "compact",
|
|
2731
|
+
className: "text-pretty whitespace-pre-line",
|
|
2732
|
+
children: value || "-"
|
|
2733
|
+
}
|
|
2734
|
+
) : /* @__PURE__ */ jsx3("div", { className: "min-w-0", children: value })
|
|
2735
|
+
] });
|
|
2736
|
+
}
|
|
2737
|
+
function WidgetHeader({ title }) {
|
|
2738
|
+
return /* @__PURE__ */ jsx3("div", { className: "flex items-center justify-between px-6 py-4", children: /* @__PURE__ */ jsx3(Heading2, { level: "h2", children: title }) });
|
|
2739
|
+
}
|
|
2740
|
+
function SidebarLink({
|
|
2741
|
+
href,
|
|
2742
|
+
label,
|
|
2743
|
+
description,
|
|
2744
|
+
icon
|
|
2745
|
+
}) {
|
|
2746
|
+
return /* @__PURE__ */ jsx3("a", { href, className: "group outline-none", children: /* @__PURE__ */ jsx3("div", { className: "flex flex-col gap-2 px-2 pb-2", children: /* @__PURE__ */ jsx3("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__ */ jsxs3("div", { className: "flex items-center gap-4", children: [
|
|
2747
|
+
icon && /* @__PURE__ */ jsx3("div", { children: icon }),
|
|
2748
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex flex-1 flex-col", children: [
|
|
2749
|
+
/* @__PURE__ */ jsx3(Text3, { size: "small", leading: "compact", weight: "plus", children: label }),
|
|
2750
|
+
/* @__PURE__ */ jsx3(
|
|
2751
|
+
Text3,
|
|
2752
|
+
{
|
|
2753
|
+
size: "small",
|
|
2754
|
+
leading: "compact",
|
|
2755
|
+
className: "text-ui-fg-subtle",
|
|
2756
|
+
children: description
|
|
2757
|
+
}
|
|
2758
|
+
)
|
|
2759
|
+
] }),
|
|
2760
|
+
/* @__PURE__ */ jsx3("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx3(TriangleRightMini, { className: "text-ui-fg-muted" }) })
|
|
2761
|
+
] }) }) }) });
|
|
2762
|
+
}
|
|
2763
|
+
function SummaryWidget({
|
|
2764
|
+
label,
|
|
2765
|
+
value,
|
|
2766
|
+
tone = "green"
|
|
2767
|
+
}) {
|
|
2768
|
+
return /* @__PURE__ */ jsx3(Container2, { className: "px-6 py-4", children: /* @__PURE__ */ jsxs3("div", { className: "text-ui-fg-subtle flex items-center gap-x-3", children: [
|
|
2769
|
+
/* @__PURE__ */ jsx3(
|
|
2770
|
+
"div",
|
|
2771
|
+
{
|
|
2772
|
+
className: `h-8 w-1 rounded-full ${tone === "green" ? "bg-ui-tag-green-icon" : "bg-ui-tag-neutral-icon"}`
|
|
2773
|
+
}
|
|
2774
|
+
),
|
|
2775
|
+
/* @__PURE__ */ jsxs3("div", { className: "min-w-0", children: [
|
|
2776
|
+
/* @__PURE__ */ jsx3(Text3, { weight: "plus", size: "small", className: "text-ui-fg-subtle", children: label }),
|
|
2777
|
+
/* @__PURE__ */ jsx3(
|
|
2778
|
+
Text3,
|
|
2779
|
+
{
|
|
2780
|
+
weight: "plus",
|
|
2781
|
+
size: "xlarge",
|
|
2782
|
+
className: "tabular-nums text-ui-fg-base break-words",
|
|
2783
|
+
children: value
|
|
2784
|
+
}
|
|
2785
|
+
)
|
|
2786
|
+
] })
|
|
2787
|
+
] }) });
|
|
2788
|
+
}
|
|
2789
|
+
function CouponGeneralSection({ detail }) {
|
|
2790
|
+
const entitlement = detail.customer_coupon_entitlement;
|
|
2791
|
+
const issuance = detail.coupon_issuance || null;
|
|
2792
|
+
const benefitSnapshot = entitlement.benefit_snapshot || null;
|
|
2793
|
+
const sourceSnapshot = entitlement.source_snapshot || null;
|
|
2794
|
+
const code = couponCode(entitlement);
|
|
2795
|
+
const external = entitlement.origin === "external";
|
|
2796
|
+
const productLabel = snapshotString(sourceSnapshot, "title") || snapshotString(sourceSnapshot, "source") || entitlement.product_id || "External";
|
|
2797
|
+
const variantLabel = snapshotString(sourceSnapshot, "variant_id") || entitlement.variant_id || "-";
|
|
2798
|
+
const issuedDate = entitlement.created_at || issuance?.created_at || null;
|
|
2799
|
+
return /* @__PURE__ */ jsxs3(Container2, { className: "divide-y p-0", children: [
|
|
2800
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
2801
|
+
/* @__PURE__ */ jsxs3("div", { className: "min-w-0", children: [
|
|
2802
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-x-1", children: [
|
|
2803
|
+
/* @__PURE__ */ jsxs3(Heading2, { className: "break-all", children: [
|
|
2804
|
+
"#",
|
|
2805
|
+
code
|
|
2806
|
+
] }),
|
|
2807
|
+
code !== "-" && /* @__PURE__ */ jsx3(Copy, { content: code, className: "text-ui-fg-muted" })
|
|
2808
|
+
] }),
|
|
2809
|
+
/* @__PURE__ */ jsx3(Text3, { size: "small", className: "text-ui-fg-subtle", children: formatFullDate(issuedDate) })
|
|
2810
|
+
] }),
|
|
2811
|
+
/* @__PURE__ */ jsx3(StatusBadge2, { color: entitlementStatusColor(entitlement.status), children: entitlement.status })
|
|
2812
|
+
] }),
|
|
2813
|
+
/* @__PURE__ */ jsx3(SectionRow, { title: "Date issued", value: formatRelativeDate(issuedDate) }),
|
|
2814
|
+
/* @__PURE__ */ jsx3(
|
|
2815
|
+
SectionRow,
|
|
2816
|
+
{
|
|
2817
|
+
title: "Customer",
|
|
2818
|
+
value: entitlement.email || entitlement.customer_id || "-"
|
|
2819
|
+
}
|
|
2820
|
+
),
|
|
2821
|
+
/* @__PURE__ */ jsx3(SectionRow, { title: "Origin", value: entitlementSource(entitlement) }),
|
|
2822
|
+
/* @__PURE__ */ jsx3(
|
|
2823
|
+
SectionRow,
|
|
2824
|
+
{
|
|
2825
|
+
title: external ? "Source" : "Coupon product",
|
|
2826
|
+
value: productLabel
|
|
2827
|
+
}
|
|
2828
|
+
),
|
|
2829
|
+
/* @__PURE__ */ jsx3(SectionRow, { title: "Seller scope", value: entitlementSellerScope(entitlement) }),
|
|
2830
|
+
!external && /* @__PURE__ */ jsx3(SectionRow, { title: "Variant", value: variantLabel }),
|
|
2831
|
+
!external && /* @__PURE__ */ jsx3(
|
|
2832
|
+
SectionRow,
|
|
2833
|
+
{
|
|
2834
|
+
title: "Quantity",
|
|
2835
|
+
value: String(
|
|
2836
|
+
snapshotNumber(sourceSnapshot, "quantity") ?? issuance?.quantity ?? 1
|
|
2837
|
+
)
|
|
2838
|
+
}
|
|
2839
|
+
),
|
|
2840
|
+
/* @__PURE__ */ jsx3(
|
|
2841
|
+
SectionRow,
|
|
2842
|
+
{
|
|
2843
|
+
title: "Benefit",
|
|
2844
|
+
value: benefitSnapshotLabel(benefitSnapshot)
|
|
2845
|
+
}
|
|
2846
|
+
),
|
|
2847
|
+
/* @__PURE__ */ jsx3(
|
|
2848
|
+
SectionRow,
|
|
2849
|
+
{
|
|
2850
|
+
title: "Expiration policy",
|
|
2851
|
+
value: expirationPolicyLabel(benefitSnapshot)
|
|
2852
|
+
}
|
|
2853
|
+
),
|
|
2854
|
+
/* @__PURE__ */ jsx3(SectionRow, { title: "Expiration Date", value: formatDate(entitlement.expires_at) }),
|
|
2855
|
+
/* @__PURE__ */ jsx3(SectionRow, { title: "Redeemed Date", value: formatDate(entitlement.redeemed_at) })
|
|
2856
|
+
] });
|
|
2857
|
+
}
|
|
2858
|
+
function RelatedOrderSection({
|
|
2859
|
+
apiBase,
|
|
2860
|
+
detail
|
|
2861
|
+
}) {
|
|
2862
|
+
const entitlement = detail.customer_coupon_entitlement;
|
|
2863
|
+
const order = detail.order || null;
|
|
2864
|
+
const orderId = order?.id || entitlement.order_id;
|
|
2865
|
+
if (!orderId) {
|
|
2866
|
+
return null;
|
|
2867
|
+
}
|
|
2868
|
+
return /* @__PURE__ */ jsxs3(Container2, { className: "p-0", children: [
|
|
2869
|
+
/* @__PURE__ */ jsx3(WidgetHeader, { title: "Related Order" }),
|
|
2870
|
+
/* @__PURE__ */ jsx3(
|
|
2871
|
+
SidebarLink,
|
|
2872
|
+
{
|
|
2873
|
+
href: orderDetailPath(apiBase, orderId),
|
|
2874
|
+
label: order ? orderDisplayId(order) : orderId,
|
|
2875
|
+
description: order?.created_at ? `Order placed ${formatRelativeDate(order.created_at)}` : "Purchased coupon order",
|
|
2876
|
+
icon: /* @__PURE__ */ jsx3(ShoppingCart, {})
|
|
2877
|
+
}
|
|
2878
|
+
)
|
|
2879
|
+
] });
|
|
2880
|
+
}
|
|
2881
|
+
function CouponSnapshotsSection({
|
|
2882
|
+
detail
|
|
2883
|
+
}) {
|
|
2884
|
+
const entitlement = detail.customer_coupon_entitlement;
|
|
2885
|
+
const issuance = detail.coupon_issuance || null;
|
|
2886
|
+
return /* @__PURE__ */ jsxs3(Container2, { className: "p-0", children: [
|
|
2887
|
+
/* @__PURE__ */ jsx3(WidgetHeader, { title: "JSON" }),
|
|
2888
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex flex-col gap-y-3 px-6 pb-6", children: [
|
|
2889
|
+
/* @__PURE__ */ jsx3(
|
|
2890
|
+
SnapshotBlock,
|
|
2891
|
+
{
|
|
2892
|
+
title: "Benefit snapshot",
|
|
2893
|
+
value: entitlement.benefit_snapshot
|
|
2894
|
+
}
|
|
2895
|
+
),
|
|
2896
|
+
/* @__PURE__ */ jsx3(
|
|
2897
|
+
SnapshotBlock,
|
|
2898
|
+
{
|
|
2899
|
+
title: "Source snapshot",
|
|
2900
|
+
value: entitlement.source_snapshot
|
|
2901
|
+
}
|
|
2902
|
+
),
|
|
2903
|
+
/* @__PURE__ */ jsx3(
|
|
2904
|
+
SnapshotBlock,
|
|
2905
|
+
{
|
|
2906
|
+
title: "Issuance config snapshot",
|
|
2907
|
+
value: issuance?.config_snapshot
|
|
2908
|
+
}
|
|
2909
|
+
),
|
|
2910
|
+
/* @__PURE__ */ jsx3(SnapshotBlock, { title: "Seller targets", value: entitlement.seller_targets }),
|
|
2911
|
+
/* @__PURE__ */ jsx3(SnapshotBlock, { title: "Metadata", value: entitlement.metadata })
|
|
2912
|
+
] })
|
|
2913
|
+
] });
|
|
2914
|
+
}
|
|
2915
|
+
function CouponSummarySections({
|
|
2916
|
+
detail
|
|
2917
|
+
}) {
|
|
2918
|
+
const entitlement = detail.customer_coupon_entitlement;
|
|
2919
|
+
const issuance = detail.coupon_issuance || null;
|
|
2920
|
+
const benefitSnapshot = entitlement.benefit_snapshot || null;
|
|
2921
|
+
const sourceSnapshot = entitlement.source_snapshot || null;
|
|
2922
|
+
const order = detail.order || null;
|
|
2923
|
+
const lineTotal = snapshotNumber(sourceSnapshot, "total");
|
|
2924
|
+
const external = entitlement.origin === "external";
|
|
2925
|
+
return /* @__PURE__ */ jsxs3(Fragment2, { children: [
|
|
2926
|
+
/* @__PURE__ */ jsx3(
|
|
2927
|
+
SummaryWidget,
|
|
2928
|
+
{
|
|
2929
|
+
label: "Benefit",
|
|
2930
|
+
value: benefitSnapshotLabel(benefitSnapshot)
|
|
2931
|
+
}
|
|
2932
|
+
),
|
|
2933
|
+
!external && /* @__PURE__ */ jsx3(
|
|
2934
|
+
SummaryWidget,
|
|
2935
|
+
{
|
|
2936
|
+
label: "Line Total",
|
|
2937
|
+
value: formatSnapshotAmount(lineTotal, order?.currency_code),
|
|
2938
|
+
tone: "neutral"
|
|
2939
|
+
}
|
|
2940
|
+
),
|
|
2941
|
+
!external && /* @__PURE__ */ jsxs3(Container2, { className: "divide-y p-0", children: [
|
|
2942
|
+
/* @__PURE__ */ jsx3(WidgetHeader, { title: "Campaign" }),
|
|
2943
|
+
/* @__PURE__ */ jsx3(SectionRow, { title: "Campaign", value: campaignSnapshotLabel(benefitSnapshot) }),
|
|
2944
|
+
/* @__PURE__ */ jsx3(SectionRow, { title: "Promotion", value: promotionSnapshotLabel(benefitSnapshot) }),
|
|
2945
|
+
/* @__PURE__ */ jsx3(
|
|
2946
|
+
SectionRow,
|
|
2947
|
+
{
|
|
2948
|
+
title: "Promotion status",
|
|
2949
|
+
value: snapshotString(benefitSnapshot, "promotion_status") || "-"
|
|
2950
|
+
}
|
|
2951
|
+
)
|
|
2952
|
+
] }),
|
|
2953
|
+
!external && /* @__PURE__ */ jsxs3(Container2, { className: "divide-y p-0", children: [
|
|
2954
|
+
/* @__PURE__ */ jsx3(WidgetHeader, { title: "Issuance" }),
|
|
2955
|
+
/* @__PURE__ */ jsx3(SectionRow, { title: "Status", value: issuance?.status || "-" }),
|
|
2956
|
+
/* @__PURE__ */ jsx3(
|
|
2957
|
+
SectionRow,
|
|
2958
|
+
{
|
|
2959
|
+
title: "Issued / failed",
|
|
2960
|
+
value: issuance ? `${issuance.issued_count ?? 0} / ${issuance.failed_count ?? 0}` : "-"
|
|
2961
|
+
}
|
|
2962
|
+
),
|
|
2963
|
+
/* @__PURE__ */ jsx3(SectionRow, { title: "Config", value: entitlement.config_id || "-" }),
|
|
2964
|
+
/* @__PURE__ */ jsx3(
|
|
2965
|
+
SectionRow,
|
|
2966
|
+
{
|
|
2967
|
+
title: "Variant config",
|
|
2968
|
+
value: entitlement.variant_config_id || "-"
|
|
2969
|
+
}
|
|
2970
|
+
)
|
|
2971
|
+
] })
|
|
2972
|
+
] });
|
|
2973
|
+
}
|
|
2974
|
+
function CouponDetailPageView({ apiBase }) {
|
|
2975
|
+
const id = currentCouponDetailId(apiBase);
|
|
2976
|
+
const [detail, setDetail] = useState2(null);
|
|
2977
|
+
const [loading, setLoading] = useState2(true);
|
|
2978
|
+
const [loadError, setLoadError] = useState2(null);
|
|
2979
|
+
useEffect2(() => {
|
|
2980
|
+
let active = true;
|
|
2981
|
+
async function load() {
|
|
2982
|
+
if (!id) {
|
|
2983
|
+
setLoadError("Missing coupon id");
|
|
2984
|
+
setLoading(false);
|
|
2985
|
+
return;
|
|
2986
|
+
}
|
|
2987
|
+
setLoading(true);
|
|
2988
|
+
setLoadError(null);
|
|
2989
|
+
try {
|
|
2990
|
+
const payload = await apiFetch2(
|
|
2991
|
+
`${apiBase}/coupon-products/entitlements/${encodeURIComponent(id)}`
|
|
2992
|
+
);
|
|
2993
|
+
if (active) {
|
|
2994
|
+
setDetail(payload);
|
|
2995
|
+
}
|
|
2996
|
+
} catch (error) {
|
|
2997
|
+
const message = error instanceof Error ? error.message : "Failed to load coupon details";
|
|
2998
|
+
if (active) {
|
|
2999
|
+
setLoadError(message);
|
|
3000
|
+
toast2.error(message);
|
|
3001
|
+
}
|
|
3002
|
+
} finally {
|
|
3003
|
+
if (active) {
|
|
3004
|
+
setLoading(false);
|
|
3005
|
+
}
|
|
3006
|
+
}
|
|
3007
|
+
}
|
|
3008
|
+
void load();
|
|
3009
|
+
return () => {
|
|
3010
|
+
active = false;
|
|
3011
|
+
};
|
|
3012
|
+
}, [apiBase, id]);
|
|
3013
|
+
if (loading) {
|
|
3014
|
+
return /* @__PURE__ */ jsx3(CouponEmptyState, { title: "Loading coupon" });
|
|
3015
|
+
}
|
|
3016
|
+
if (loadError) {
|
|
3017
|
+
return /* @__PURE__ */ jsx3(CouponEmptyState, { title: loadError });
|
|
3018
|
+
}
|
|
3019
|
+
if (!detail) {
|
|
3020
|
+
return /* @__PURE__ */ jsx3(CouponEmptyState, { title: "Coupon not found" });
|
|
3021
|
+
}
|
|
3022
|
+
return /* @__PURE__ */ jsx3(
|
|
3023
|
+
TwoColumnLayout,
|
|
3024
|
+
{
|
|
3025
|
+
firstCol: /* @__PURE__ */ jsxs3(Fragment2, { children: [
|
|
3026
|
+
/* @__PURE__ */ jsx3(CouponGeneralSection, { detail }),
|
|
3027
|
+
/* @__PURE__ */ jsx3(RelatedOrderSection, { apiBase, detail }),
|
|
3028
|
+
/* @__PURE__ */ jsx3(CouponSnapshotsSection, { detail })
|
|
3029
|
+
] }),
|
|
3030
|
+
secondCol: /* @__PURE__ */ jsx3(CouponSummarySections, { detail })
|
|
3031
|
+
}
|
|
3032
|
+
);
|
|
3033
|
+
}
|
|
3034
|
+
function EntitlementsTable({
|
|
3035
|
+
entitlements,
|
|
3036
|
+
loading,
|
|
3037
|
+
error,
|
|
3038
|
+
onOpen
|
|
3039
|
+
}) {
|
|
3040
|
+
if (loading) {
|
|
3041
|
+
return /* @__PURE__ */ jsx3(CouponEmptyState, { title: "Loading coupons" });
|
|
3042
|
+
}
|
|
3043
|
+
if (error) {
|
|
3044
|
+
return /* @__PURE__ */ jsx3(CouponEmptyState, { title: error });
|
|
3045
|
+
}
|
|
3046
|
+
if (!entitlements.length) {
|
|
3047
|
+
return /* @__PURE__ */ jsx3(
|
|
3048
|
+
CouponEmptyState,
|
|
3049
|
+
{
|
|
3050
|
+
title: "No coupons found",
|
|
3051
|
+
description: "Purchased coupons will appear here after they are issued."
|
|
3052
|
+
}
|
|
3053
|
+
);
|
|
3054
|
+
}
|
|
3055
|
+
return /* @__PURE__ */ jsxs3(Table2, { children: [
|
|
3056
|
+
/* @__PURE__ */ jsx3(Table2.Header, { children: /* @__PURE__ */ jsxs3(Table2.Row, { children: [
|
|
3057
|
+
/* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Status" }),
|
|
3058
|
+
/* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Code" }),
|
|
3059
|
+
/* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Date issued" }),
|
|
3060
|
+
/* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Order" }),
|
|
3061
|
+
/* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Customer" }),
|
|
3062
|
+
/* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Origin" }),
|
|
3063
|
+
/* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Seller scope" }),
|
|
3064
|
+
/* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Source" }),
|
|
3065
|
+
/* @__PURE__ */ jsx3(Table2.HeaderCell, { children: "Expires" })
|
|
3066
|
+
] }) }),
|
|
3067
|
+
/* @__PURE__ */ jsx3(Table2.Body, { children: entitlements.map((item) => /* @__PURE__ */ jsxs3(
|
|
3068
|
+
Table2.Row,
|
|
3069
|
+
{
|
|
3070
|
+
className: "cursor-pointer hover:bg-ui-bg-subtle",
|
|
3071
|
+
onClick: () => onOpen(item),
|
|
3072
|
+
children: [
|
|
3073
|
+
/* @__PURE__ */ jsx3(Table2.Cell, { children: /* @__PURE__ */ jsx3(StatusBadge2, { color: entitlementStatusColor(item.status), children: item.status }) }),
|
|
3074
|
+
/* @__PURE__ */ jsx3(Table2.Cell, { children: item.code || item.shared_code || "-" }),
|
|
3075
|
+
/* @__PURE__ */ jsx3(Table2.Cell, { title: formatFullDate(item.created_at), children: formatRelativeDate(item.created_at) }),
|
|
3076
|
+
/* @__PURE__ */ jsx3(Table2.Cell, { children: item.order_id || "-" }),
|
|
3077
|
+
/* @__PURE__ */ jsx3(Table2.Cell, { children: item.email || item.customer_id || "-" }),
|
|
3078
|
+
/* @__PURE__ */ jsx3(Table2.Cell, { children: entitlementSource(item) }),
|
|
3079
|
+
/* @__PURE__ */ jsx3(Table2.Cell, { children: entitlementSellerScope(item) }),
|
|
3080
|
+
/* @__PURE__ */ jsx3(Table2.Cell, { children: snapshotString(item.source_snapshot, "title") || snapshotString(item.source_snapshot, "source") || item.product_id || "External" }),
|
|
3081
|
+
/* @__PURE__ */ jsx3(Table2.Cell, { children: formatDate(item.expires_at) })
|
|
3082
|
+
]
|
|
3083
|
+
},
|
|
3084
|
+
item.id
|
|
3085
|
+
)) })
|
|
3086
|
+
] });
|
|
3087
|
+
}
|
|
3088
|
+
function CouponsPageView({
|
|
3089
|
+
apiBase,
|
|
3090
|
+
title
|
|
3091
|
+
}) {
|
|
3092
|
+
const [entitlements, setEntitlements] = useState2([]);
|
|
3093
|
+
const [loading, setLoading] = useState2(true);
|
|
3094
|
+
const [loadError, setLoadError] = useState2(null);
|
|
3095
|
+
const [filter, setFilter] = useState2("all");
|
|
3096
|
+
const load = useCallback2(async () => {
|
|
3097
|
+
setLoading(true);
|
|
3098
|
+
setLoadError(null);
|
|
3099
|
+
try {
|
|
3100
|
+
const payload = await apiFetch2(`${apiBase}/coupon-products/entitlements`);
|
|
3101
|
+
setEntitlements(payload.customer_coupon_entitlements || []);
|
|
3102
|
+
} catch (error) {
|
|
3103
|
+
const message = error instanceof Error ? error.message : "Failed to load coupons";
|
|
3104
|
+
setLoadError(message);
|
|
3105
|
+
toast2.error(message);
|
|
3106
|
+
} finally {
|
|
3107
|
+
setLoading(false);
|
|
3108
|
+
}
|
|
3109
|
+
}, [apiBase]);
|
|
3110
|
+
useEffect2(() => {
|
|
3111
|
+
void load();
|
|
3112
|
+
}, [load]);
|
|
3113
|
+
const openDetail = useCallback2(
|
|
3114
|
+
(entitlement) => {
|
|
3115
|
+
window.location.assign(couponDetailPath(apiBase, entitlement.id));
|
|
3116
|
+
},
|
|
3117
|
+
[apiBase]
|
|
3118
|
+
);
|
|
3119
|
+
return /* @__PURE__ */ jsxs3(Container2, { className: "divide-y p-0", children: [
|
|
3120
|
+
/* @__PURE__ */ jsxs3("div", { className: "flex items-center justify-between px-6 py-4", children: [
|
|
3121
|
+
/* @__PURE__ */ jsx3(Heading2, { level: "h1", children: title }),
|
|
3122
|
+
/* @__PURE__ */ jsxs3(Button2, { size: "small", variant: "secondary", onClick: () => void load(), children: [
|
|
3123
|
+
/* @__PURE__ */ jsx3(ArrowPath2, {}),
|
|
3124
|
+
"Refresh"
|
|
3125
|
+
] })
|
|
3126
|
+
] }),
|
|
3127
|
+
/* @__PURE__ */ jsxs3(
|
|
3128
|
+
Tabs,
|
|
3129
|
+
{
|
|
3130
|
+
value: filter,
|
|
3131
|
+
onValueChange: (value) => setFilter(value),
|
|
3132
|
+
children: [
|
|
3133
|
+
/* @__PURE__ */ jsx3("div", { className: "px-6 py-2 border-b", children: /* @__PURE__ */ jsx3(Tabs.List, { children: entitlementFilters.map((item) => /* @__PURE__ */ jsx3(Tabs.Trigger, { value: item.value, children: item.label }, item.value)) }) }),
|
|
3134
|
+
entitlementFilters.map((item) => /* @__PURE__ */ jsx3(Tabs.Content, { value: item.value, children: /* @__PURE__ */ jsx3(
|
|
3135
|
+
EntitlementsTable,
|
|
3136
|
+
{
|
|
3137
|
+
loading,
|
|
3138
|
+
error: loadError,
|
|
3139
|
+
onOpen: openDetail,
|
|
3140
|
+
entitlements: item.value === "all" ? entitlements : entitlements.filter(
|
|
3141
|
+
(entitlement) => entitlement.status === item.value
|
|
3142
|
+
)
|
|
3143
|
+
}
|
|
3144
|
+
) }, item.value))
|
|
3145
|
+
]
|
|
3146
|
+
}
|
|
3147
|
+
)
|
|
3148
|
+
] });
|
|
3149
|
+
}
|
|
3150
|
+
function CouponProductsPageView({
|
|
3151
|
+
apiBase,
|
|
3152
|
+
title,
|
|
3153
|
+
allowPromotionMirror = false
|
|
3154
|
+
}) {
|
|
3155
|
+
return /* @__PURE__ */ jsx3(
|
|
3156
|
+
CouponProductsPage,
|
|
3157
|
+
{
|
|
3158
|
+
apiBase,
|
|
3159
|
+
title,
|
|
3160
|
+
allowPromotionMirror
|
|
3161
|
+
}
|
|
3162
|
+
);
|
|
3163
|
+
}
|
|
3164
|
+
|
|
3165
|
+
// src/vendor/routes/coupons/page.tsx
|
|
3166
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
3167
|
+
var config = {
|
|
3168
|
+
label: "Coupons",
|
|
3169
|
+
icon: ReceiptPercent
|
|
3170
|
+
};
|
|
3171
|
+
function VendorCouponsPage() {
|
|
3172
|
+
return /* @__PURE__ */ jsx4(CouponsPageView, { apiBase: "/vendor", title: "Coupons" });
|
|
3173
|
+
}
|
|
3174
|
+
|
|
3175
|
+
// src/vendor/routes/coupons/[id]/page.tsx
|
|
3176
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
3177
|
+
function VendorCouponDetailPage() {
|
|
3178
|
+
return /* @__PURE__ */ jsx5(CouponDetailPageView, { apiBase: "/vendor" });
|
|
3179
|
+
}
|
|
3180
|
+
|
|
3181
|
+
// src/vendor/routes/coupons/products/page.tsx
|
|
3182
|
+
import { ReceiptPercent as ReceiptPercent2 } from "@medusajs/icons";
|
|
3183
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
3184
|
+
var config2 = {
|
|
3185
|
+
label: "Coupon Products",
|
|
3186
|
+
icon: ReceiptPercent2
|
|
3187
|
+
};
|
|
3188
|
+
function VendorCouponProductsPage() {
|
|
3189
|
+
return /* @__PURE__ */ jsx6(CouponProductsPageView, { apiBase: "/vendor", title: "Coupon Products" });
|
|
3190
|
+
}
|
|
3191
|
+
|
|
3192
|
+
// src/vendor/index.ts
|
|
3193
|
+
var routeModule = {
|
|
3194
|
+
routes: [
|
|
3195
|
+
{
|
|
3196
|
+
Component: VendorCouponsPage,
|
|
3197
|
+
path: "/coupons"
|
|
3198
|
+
},
|
|
3199
|
+
{
|
|
3200
|
+
Component: VendorCouponProductsPage,
|
|
3201
|
+
path: "/coupons/products"
|
|
3202
|
+
},
|
|
3203
|
+
{
|
|
3204
|
+
Component: VendorCouponDetailPage,
|
|
3205
|
+
path: "/coupons/:id"
|
|
3206
|
+
}
|
|
3207
|
+
]
|
|
3208
|
+
};
|
|
3209
|
+
var menuItemModule = {
|
|
3210
|
+
menuItems: [
|
|
3211
|
+
{
|
|
3212
|
+
label: config.label,
|
|
3213
|
+
icon: config.icon,
|
|
3214
|
+
path: "/coupons",
|
|
3215
|
+
rank: config.rank,
|
|
3216
|
+
nested: config.nested,
|
|
3217
|
+
translationNs: config.translationNs
|
|
3218
|
+
},
|
|
3219
|
+
{
|
|
3220
|
+
label: config2.label,
|
|
3221
|
+
icon: config2.icon,
|
|
3222
|
+
path: "/coupons/products",
|
|
3223
|
+
rank: 11,
|
|
3224
|
+
nested: "/coupons",
|
|
3225
|
+
translationNs: config2.translationNs
|
|
3226
|
+
}
|
|
3227
|
+
]
|
|
3228
|
+
};
|
|
3229
|
+
var vendor_default = {
|
|
3230
|
+
routeModule,
|
|
3231
|
+
menuItemModule,
|
|
3232
|
+
i18nModule: i18n_default
|
|
3233
|
+
};
|
|
3234
|
+
export {
|
|
3235
|
+
vendor_default as default
|
|
3236
|
+
};
|
|
3237
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZlbmRvci9pMThuL2VuLmpzb24iLCAiLi4vLi4vLi4vLi4vc3JjL3ZlbmRvci9pMThuL2luZGV4LnRzIiwgIi4uLy4uLy4uLy4uL3NyYy92ZW5kb3Ivcm91dGVzL2NvdXBvbnMvcGFnZS50c3giLCAiLi4vLi4vLi4vLi4vc3JjL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1tYW5hZ2VyLnRzeCIsICIuLi8uLi8uLi8uLi9zcmMvZGFzaGJvYXJkL2NvdXBvbnMvY291cG9uLXByb2R1Y3RzLXBhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy9kYXNoYm9hcmQvY291cG9ucy9lbXB0eS1zdGF0ZS50c3giLCAiLi4vLi4vLi4vLi4vc3JjL3ZlbmRvci9yb3V0ZXMvY291cG9ucy9baWRdL3BhZ2UudHN4IiwgIi4uLy4uLy4uLy4uL3NyYy92ZW5kb3Ivcm91dGVzL2NvdXBvbnMvcHJvZHVjdHMvcGFnZS50c3giLCAiLi4vLi4vLi4vLi4vc3JjL3ZlbmRvci9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsie1xuICBcImNvdXBvbnNcIjoge1xuICAgIFwibWVudVwiOiBcIkNvdXBvbnNcIixcbiAgICBcInByb2R1Y3RzTWVudVwiOiBcIkNvdXBvbiBQcm9kdWN0c1wiXG4gIH1cbn1cbiIsICJpbXBvcnQgZW4gZnJvbSBcIi4vZW4uanNvblwiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW46IHtcbiAgICB0cmFuc2xhdGlvbjogZW4sXG4gIH0sXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSb3V0ZUNvbmZpZyB9IGZyb20gXCJAbWVyY3VyanMvZGFzaGJvYXJkLXNka1wiXG5pbXBvcnQgeyBSZWNlaXB0UGVyY2VudCB9IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHsgQ291cG9uc1BhZ2VWaWV3IH0gZnJvbSBcIi4uLy4uLy4uL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1tYW5hZ2VyXCJcblxuZXhwb3J0IGNvbnN0IGNvbmZpZzogUm91dGVDb25maWcgPSB7XG4gIGxhYmVsOiBcIkNvdXBvbnNcIixcbiAgaWNvbjogUmVjZWlwdFBlcmNlbnQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFZlbmRvckNvdXBvbnNQYWdlKCkge1xuICByZXR1cm4gPENvdXBvbnNQYWdlVmlldyBhcGlCYXNlPVwiL3ZlbmRvclwiIHRpdGxlPVwiQ291cG9uc1wiIC8+XG59XG4iLCAiaW1wb3J0IHtcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG4gIHR5cGUgQ2hhbmdlRXZlbnQsXG4gIHR5cGUgQ1NTUHJvcGVydGllcyxcbiAgdHlwZSBSZWFjdE5vZGUsXG59IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQge1xuICBBcnJvd1BhdGgsXG4gIFBlbmNpbFNxdWFyZSxcbiAgUGx1cyxcbiAgU2hvcHBpbmdDYXJ0LFxuICBUcmFzaCxcbiAgVHJpYW5nbGVSaWdodE1pbmksXG59IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBDb250YWluZXIsXG4gIENvcHksXG4gIEN1cnJlbmN5SW5wdXQsXG4gIEZvY3VzTW9kYWwsXG4gIEhlYWRpbmcsXG4gIElucHV0LFxuICBMYWJlbCxcbiAgUHJvZ3Jlc3NUYWJzLFxuICBTZWxlY3QsXG4gIFN0YXR1c0JhZGdlLFxuICBTd2l0Y2gsXG4gIFRhYmxlLFxuICBUYWJzLFxuICBUZXh0LFxuICBUZXh0YXJlYSxcbiAgdG9hc3QsXG4gIHVzZVByb21wdCxcbn0gZnJvbSBcIkBtZWR1c2Fqcy91aVwiXG5pbXBvcnQgeyBDb3Vwb25Qcm9kdWN0c1BhZ2UgfSBmcm9tIFwiLi9jb3Vwb24tcHJvZHVjdHMtcGFnZVwiXG5pbXBvcnQgeyBDb3Vwb25FbXB0eVN0YXRlIH0gZnJvbSBcIi4vZW1wdHktc3RhdGVcIlxuXG5kZWNsYXJlIGNvbnN0IF9fQkFDS0VORF9VUkxfXzogc3RyaW5nXG5cbnR5cGUgQXBpQmFzZSA9IFwiL2FkbWluXCIgfCBcIi92ZW5kb3JcIlxudHlwZSBCZW5lZml0VHlwZSA9IFwiZml4ZWRfYW1vdW50XCIgfCBcInBlcmNlbnRhZ2VcIiB8IFwiZnJlZV9zaGlwcGluZ1wiIHwgXCJidXlfZ2V0XCJcbnR5cGUgQ29kZVN0cmF0ZWd5ID0gXCJ1bmlxdWVfY29kZVwiIHwgXCJzaGFyZWRfY29kZVwiXG50eXBlIE1pcnJvck1vZGUgPSBcIm5vbmVcIiB8IFwibWFudWFsXCIgfCBcImF1dG9cIlxudHlwZSBQcm9tb3Rpb25TdGF0dXMgPSBcImRyYWZ0XCIgfCBcImFjdGl2ZVwiIHwgXCJpbmFjdGl2ZVwiXG50eXBlIENhbXBhaWduTW9kZSA9IFwibm9uZVwiIHwgXCJleGlzdGluZ1wiIHwgXCJuZXdcIlxudHlwZSBFeHBpcmF0aW9uUG9saWN5VHlwZSA9IFwiZHVyYXRpb25cIiB8IFwiZml4ZWRcIlxudHlwZSBXaXphcmRTdGVwID0gXCJkZXRhaWxzXCIgfCBcIm9yZ2FuaXplXCIgfCBcInZhcmlhbnRzXCIgfCBcImNvdXBvblwiIHwgXCJjYW1wYWlnblwiXG5cbnR5cGUgQ291cG9uUHJvZHVjdENvbmZpZyA9IHtcbiAgaWQ6IHN0cmluZ1xuICBlbmFibGVkOiBib29sZWFuXG4gIHByb2R1Y3RfaWQ6IHN0cmluZ1xuICBiZW5lZml0X3R5cGU6IEJlbmVmaXRUeXBlXG4gIGFtb3VudDogbnVtYmVyIHwgbnVsbFxuICBwZXJjZW50YWdlOiBudW1iZXIgfCBudWxsXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGxcbiAgY29kZV9zdHJhdGVneTogQ29kZVN0cmF0ZWd5XG4gIGNvZGVfcHJlZml4OiBzdHJpbmcgfCBudWxsXG4gIHNoYXJlZF9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIGV4cGlyYXRpb25fcG9saWN5OlxuICAgIHwge1xuICAgICAgICB0eXBlOiBcImR1cmF0aW9uXCJcbiAgICAgICAgZHVyYXRpb25fZGF5czogbnVtYmVyXG4gICAgICAgIGNhcF9ieV9jYW1wYWlnbj86IGJvb2xlYW5cbiAgICAgICAgY2FwX2F0Pzogc3RyaW5nIHwgbnVsbFxuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiBcImZpeGVkXCJcbiAgICAgICAgZXhwaXJlc19hdDogc3RyaW5nXG4gICAgICAgIGNhcF9ieV9jYW1wYWlnbj86IGJvb2xlYW5cbiAgICAgICAgY2FwX2F0Pzogc3RyaW5nIHwgbnVsbFxuICAgICAgfVxuICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IG51bWJlclxuICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IE1pcnJvck1vZGVcbiAgcHJvbW90aW9uX3N0YXR1cz86IFByb21vdGlvblN0YXR1cyB8IG51bGxcbiAgY2FtcGFpZ25fbW9kZT86IENhbXBhaWduTW9kZSB8IG51bGxcbiAgY2FtcGFpZ25faWQ/OiBzdHJpbmcgfCBudWxsXG4gIGNhbXBhaWduX3NuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIGNvbmZpZ192ZXJzaW9uOiBudW1iZXJcbn1cblxudHlwZSBDb3Vwb25WYXJpYW50Q29uZmlnID0gUGFydGlhbDxDb3Vwb25Qcm9kdWN0Q29uZmlnPiAmIHtcbiAgaWQ6IHN0cmluZ1xuICBwcm9kdWN0X2NvbmZpZ19pZDogc3RyaW5nXG4gIHZhcmlhbnRfaWQ6IHN0cmluZ1xufVxuXG50eXBlIFByb2R1Y3RWYXJpYW50ID0ge1xuICBpZDogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmcgfCBudWxsXG4gIHNrdT86IHN0cmluZyB8IG51bGxcbiAgcHJpY2VzPzogeyBjdXJyZW5jeV9jb2RlPzogc3RyaW5nOyBhbW91bnQ/OiBudW1iZXIgfVtdXG59XG5cbnR5cGUgUHJvZHVjdFJlY29yZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nIHwgbnVsbFxuICBzdWJ0aXRsZT86IHN0cmluZyB8IG51bGxcbiAgaGFuZGxlOiBzdHJpbmcgfCBudWxsXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbFxuICBzdGF0dXM6IHN0cmluZyB8IG51bGxcbiAgdGh1bWJuYWlsOiBzdHJpbmcgfCBudWxsXG4gIGRpc2NvdW50YWJsZT86IGJvb2xlYW5cbiAgdHlwZV9pZD86IHN0cmluZyB8IG51bGxcbiAgY29sbGVjdGlvbl9pZD86IHN0cmluZyB8IG51bGxcbiAgc2hpcHBpbmdfcHJvZmlsZV9pZD86IHN0cmluZyB8IG51bGxcbiAgdmFyaWFudHM/OiBQcm9kdWN0VmFyaWFudFtdXG4gIGNhdGVnb3JpZXM/OiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH1bXVxuICB0YWdzPzogeyBpZDogc3RyaW5nOyB2YWx1ZT86IHN0cmluZyB8IG51bGwgfVtdXG4gIHNhbGVzX2NoYW5uZWxzPzogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nIHwgbnVsbCB9W11cbn1cblxudHlwZSBDb3Vwb25Qcm9kdWN0Um93ID0ge1xuICBpZDogc3RyaW5nXG4gIHByb2R1Y3Q6IFByb2R1Y3RSZWNvcmRcbiAgY291cG9uX3Byb2R1Y3RfY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnXG4gIGNvdXBvbl9wcm9kdWN0X3ZhcmlhbnRfY29uZmlnczogQ291cG9uVmFyaWFudENvbmZpZ1tdXG4gIGVudGl0bGVtZW50c19jb3VudDogbnVtYmVyXG59XG5cbnR5cGUgQ291cG9uRW50aXRsZW1lbnQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgb3JpZ2luPzogXCJwdXJjaGFzZVwiIHwgXCJleHRlcm5hbFwiXG4gIGN1c3RvbWVyX2lkOiBzdHJpbmcgfCBudWxsXG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsXG4gIGNvZGU6IHN0cmluZyB8IG51bGxcbiAgc2hhcmVkX2NvZGU6IHN0cmluZyB8IG51bGxcbiAgc3RhdHVzOiBzdHJpbmdcbiAgcHJvZHVjdF9pZDogc3RyaW5nIHwgbnVsbFxuICB2YXJpYW50X2lkOiBzdHJpbmcgfCBudWxsXG4gIG9yZGVyX2lkOiBzdHJpbmcgfCBudWxsXG4gIGxpbmVfaXRlbV9pZDogc3RyaW5nIHwgbnVsbFxuICBpc3N1YW5jZV9pZD86IHN0cmluZyB8IG51bGxcbiAgY29uZmlnX2lkPzogc3RyaW5nIHwgbnVsbFxuICB2YXJpYW50X2NvbmZpZ19pZD86IHN0cmluZyB8IG51bGxcbiAgZXhwaXJlc19hdDogc3RyaW5nIHwgbnVsbFxuICByZWRlZW1lZF9hdDogc3RyaW5nIHwgbnVsbFxuICBjcmVhdGVkX2F0Pzogc3RyaW5nXG4gIGJlbmVmaXRfc25hcHNob3Q/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgc291cmNlX3NuYXBzaG90PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsXG4gIGV4dGVybmFsX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGxcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGxcbiAgc2VsbGVyX3RhcmdldHM/OiBBcnJheTx7XG4gICAgc2VsbGVyX2lkOiBzdHJpbmdcbiAgICBzZWxsZXJfbWVtYmVyX2lkPzogc3RyaW5nIHwgbnVsbFxuICB9PlxufVxuXG50eXBlIENvdXBvbklzc3VhbmNlUmVjb3JkID0ge1xuICBpZDogc3RyaW5nXG4gIHN0YXR1cz86IHN0cmluZyB8IG51bGxcbiAgcXVhbnRpdHk/OiBudW1iZXIgfCBudWxsXG4gIGNvbmZpZ19zbmFwc2hvdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxuICBpc3N1ZWRfY291bnQ/OiBudW1iZXIgfCBudWxsXG4gIGZhaWxlZF9jb3VudD86IG51bWJlciB8IG51bGxcbiAgY3JlYXRlZF9hdD86IHN0cmluZ1xuICB1cGRhdGVkX2F0Pzogc3RyaW5nXG59XG5cbnR5cGUgQ291cG9uT3JkZXJTdW1tYXJ5ID0ge1xuICBpZDogc3RyaW5nXG4gIGRpc3BsYXlfaWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgZW1haWw6IHN0cmluZyB8IG51bGxcbiAgY3VzdG9tZXJfaWQ6IHN0cmluZyB8IG51bGxcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbFxuICB0b3RhbDogbnVtYmVyIHwgbnVsbFxuICBjcmVhdGVkX2F0OiBzdHJpbmcgfCBudWxsXG59XG5cbnR5cGUgQ291cG9uRW50aXRsZW1lbnREZXRhaWwgPSB7XG4gIGN1c3RvbWVyX2NvdXBvbl9lbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnRcbiAgY291cG9uX2lzc3VhbmNlPzogQ291cG9uSXNzdWFuY2VSZWNvcmQgfCBudWxsXG4gIG9yZGVyPzogQ291cG9uT3JkZXJTdW1tYXJ5IHwgbnVsbFxufVxuXG50eXBlIE9wdGlvblJlY29yZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbFxuICB0aXRsZT86IHN0cmluZyB8IG51bGxcbiAgdmFsdWU/OiBzdHJpbmcgfCBudWxsXG4gIGhhbmRsZT86IHN0cmluZyB8IG51bGxcbiAgY2FtcGFpZ25faWRlbnRpZmllcj86IHN0cmluZyB8IG51bGxcbn1cblxudHlwZSBDdXJyZW5jeU9wdGlvbiA9IHtcbiAgY29kZTogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBzeW1ib2w6IHN0cmluZ1xuICBzeW1ib2xfbmF0aXZlOiBzdHJpbmdcbiAgaXNfZGVmYXVsdDogYm9vbGVhblxufVxuXG50eXBlIE9wdGlvbnNQYXlsb2FkID0ge1xuICBjdXJyZW5jaWVzPzogQ3VycmVuY3lPcHRpb25bXVxuICBwcm9kdWN0X3R5cGVzPzogT3B0aW9uUmVjb3JkW11cbiAgcHJvZHVjdF9jb2xsZWN0aW9ucz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfY2F0ZWdvcmllcz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfdGFncz86IE9wdGlvblJlY29yZFtdXG4gIHNhbGVzX2NoYW5uZWxzPzogT3B0aW9uUmVjb3JkW11cbiAgc2hpcHBpbmdfcHJvZmlsZXM/OiBPcHRpb25SZWNvcmRbXVxuICBjYW1wYWlnbnM/OiBPcHRpb25SZWNvcmRbXVxuICBzZWxsZXJzPzogT3B0aW9uUmVjb3JkW11cbn1cblxudHlwZSBQcm9kdWN0Rm9ybVN0YXRlID0ge1xuICBpZDogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbiAgc3VidGl0bGU6IHN0cmluZ1xuICBoYW5kbGU6IHN0cmluZ1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gIHRodW1ibmFpbDogc3RyaW5nXG4gIHN0YXR1czogc3RyaW5nXG4gIGRpc2NvdW50YWJsZTogYm9vbGVhblxuICBzZWxsZXJfaWQ6IHN0cmluZ1xuICB0eXBlX2lkOiBzdHJpbmdcbiAgY29sbGVjdGlvbl9pZDogc3RyaW5nXG4gIGNhdGVnb3J5X2lkOiBzdHJpbmdcbiAgdGFnX2lkOiBzdHJpbmdcbiAgc2FsZXNfY2hhbm5lbF9pZDogc3RyaW5nXG4gIHZhcmlhbnRzOiBWYXJpYW50Rm9ybVN0YXRlW11cbn1cblxudHlwZSBWYXJpYW50Rm9ybVN0YXRlID0ge1xuICBpZD86IHN0cmluZ1xuICBvdmVycmlkZV9jb25maWdfaWQ/OiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xuICBza3U6IHN0cmluZ1xuICBjdXJyZW5jeV9jb2RlOiBzdHJpbmdcbiAgYW1vdW50OiBzdHJpbmdcbiAgb3ZlcnJpZGVfZW5hYmxlZDogYm9vbGVhblxuICBvdmVycmlkZV9iZW5lZml0X3R5cGU6IEJlbmVmaXRUeXBlXG4gIG92ZXJyaWRlX2N1cnJlbmN5X2NvZGU6IHN0cmluZ1xuICBvdmVycmlkZV9hbW91bnQ6IHN0cmluZ1xuICBvdmVycmlkZV9wZXJjZW50YWdlOiBzdHJpbmdcbn1cblxudHlwZSBDb3Vwb25Gb3JtU3RhdGUgPSB7XG4gIGVuYWJsZWQ6IGJvb2xlYW5cbiAgYmVuZWZpdF90eXBlOiBCZW5lZml0VHlwZVxuICBhbW91bnQ6IHN0cmluZ1xuICBwZXJjZW50YWdlOiBzdHJpbmdcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nXG4gIGNvZGVfc3RyYXRlZ3k6IENvZGVTdHJhdGVneVxuICBjb2RlX3ByZWZpeDogc3RyaW5nXG4gIHNoYXJlZF9jb2RlOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl90eXBlOiBFeHBpcmF0aW9uUG9saWN5VHlwZVxuICBleHBpcmF0aW9uX2RheXM6IHN0cmluZ1xuICBleHBpcmF0aW9uX2RhdGU6IHN0cmluZ1xuICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogYm9vbGVhblxuICBleHBpcmF0aW9uX2NhcF9hdDogc3RyaW5nXG4gIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogc3RyaW5nXG4gIHByb21vdGlvbl9taXJyb3JfbW9kZTogTWlycm9yTW9kZVxuICBwcm9tb3Rpb25fc3RhdHVzOiBQcm9tb3Rpb25TdGF0dXNcbn1cblxudHlwZSBDYW1wYWlnbkZvcm1TdGF0ZSA9IHtcbiAgbW9kZTogQ2FtcGFpZ25Nb2RlXG4gIGNhbXBhaWduX2lkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIGNhbXBhaWduX2lkZW50aWZpZXI6IHN0cmluZ1xuICBzdGFydHNfYXQ6IHN0cmluZ1xuICBlbmRzX2F0OiBzdHJpbmdcbn1cblxuY29uc3QgTk9ORSA9IFwiX19ub25lX19cIlxuY29uc3Qgc3RlcHM6IFdpemFyZFN0ZXBbXSA9IFtcbiAgXCJkZXRhaWxzXCIsXG4gIFwib3JnYW5pemVcIixcbiAgXCJ2YXJpYW50c1wiLFxuICBcImNvdXBvblwiLFxuICBcImNhbXBhaWduXCIsXG5dXG5cbmNvbnN0IGVtcHR5VmFyaWFudDogVmFyaWFudEZvcm1TdGF0ZSA9IHtcbiAgdGl0bGU6IFwiRGVmYXVsdCB2YXJpYW50XCIsXG4gIHNrdTogXCJcIixcbiAgY3VycmVuY3lfY29kZTogXCJcIixcbiAgYW1vdW50OiBcIlwiLFxuICBvdmVycmlkZV9lbmFibGVkOiBmYWxzZSxcbiAgb3ZlcnJpZGVfYmVuZWZpdF90eXBlOiBcImZpeGVkX2Ftb3VudFwiLFxuICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlOiBcIlwiLFxuICBvdmVycmlkZV9hbW91bnQ6IFwiXCIsXG4gIG92ZXJyaWRlX3BlcmNlbnRhZ2U6IFwiXCIsXG59XG5cbmNvbnN0IGVtcHR5UHJvZHVjdDogUHJvZHVjdEZvcm1TdGF0ZSA9IHtcbiAgaWQ6IFwiXCIsXG4gIHRpdGxlOiBcIlwiLFxuICBzdWJ0aXRsZTogXCJcIixcbiAgaGFuZGxlOiBcIlwiLFxuICBkZXNjcmlwdGlvbjogXCJcIixcbiAgdGh1bWJuYWlsOiBcIlwiLFxuICBzdGF0dXM6IFwiZHJhZnRcIixcbiAgZGlzY291bnRhYmxlOiBmYWxzZSxcbiAgc2VsbGVyX2lkOiBcIlwiLFxuICB0eXBlX2lkOiBcIlwiLFxuICBjb2xsZWN0aW9uX2lkOiBcIlwiLFxuICBjYXRlZ29yeV9pZDogXCJcIixcbiAgdGFnX2lkOiBcIlwiLFxuICBzYWxlc19jaGFubmVsX2lkOiBcIlwiLFxuICB2YXJpYW50czogW2VtcHR5VmFyaWFudF0sXG59XG5cbmNvbnN0IGVtcHR5Q291cG9uOiBDb3Vwb25Gb3JtU3RhdGUgPSB7XG4gIGVuYWJsZWQ6IHRydWUsXG4gIGJlbmVmaXRfdHlwZTogXCJmaXhlZF9hbW91bnRcIixcbiAgYW1vdW50OiBcIlwiLFxuICBwZXJjZW50YWdlOiBcIlwiLFxuICBjdXJyZW5jeV9jb2RlOiBcIlwiLFxuICBjb2RlX3N0cmF0ZWd5OiBcInVuaXF1ZV9jb2RlXCIsXG4gIGNvZGVfcHJlZml4OiBcIkNPVVBPTlwiLFxuICBzaGFyZWRfY29kZTogXCJcIixcbiAgZXhwaXJhdGlvbl90eXBlOiBcImR1cmF0aW9uXCIsXG4gIGV4cGlyYXRpb25fZGF5czogXCIzMFwiLFxuICBleHBpcmF0aW9uX2RhdGU6IFwiXCIsXG4gIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOiB0cnVlLFxuICBleHBpcmF0aW9uX2NhcF9hdDogXCJcIixcbiAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBcIjFcIixcbiAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBcIm5vbmVcIixcbiAgcHJvbW90aW9uX3N0YXR1czogXCJkcmFmdFwiLFxufVxuXG5jb25zdCBlbXB0eUNhbXBhaWduOiBDYW1wYWlnbkZvcm1TdGF0ZSA9IHtcbiAgbW9kZTogXCJub25lXCIsXG4gIGNhbXBhaWduX2lkOiBcIlwiLFxuICBuYW1lOiBcIlwiLFxuICBjYW1wYWlnbl9pZGVudGlmaWVyOiBcIlwiLFxuICBzdGFydHNfYXQ6IFwiXCIsXG4gIGVuZHNfYXQ6IFwiXCIsXG59XG5cbmNvbnN0IG1vZGFsQ29udGVudFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG59XG5cbmNvbnN0IG1vZGFsU3RhdGljUm93U3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGZsZXhTaHJpbms6IDAsXG59XG5cbmNvbnN0IG1vZGFsV2l6YXJkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4OiBcIjEgMSBhdXRvXCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIG1pbkhlaWdodDogMCxcbn1cblxuY29uc3QgbW9kYWxCb2R5U3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGZsZXg6IFwiMSAxIGF1dG9cIixcbiAgbWluSGVpZ2h0OiAwLFxuICBvdmVyZmxvd1k6IFwiYXV0b1wiLFxuICBwYWRkaW5nOiBcIjMycHggMjRweFwiLFxufVxuXG5jb25zdCBtb2RhbEZvcm1TdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgbWFyZ2luOiBcIjAgYXV0b1wiLFxuICBtYXhXaWR0aDogOTIwLFxuICB3aWR0aDogXCJtaW4oOTIwcHgsIDEwMCUpXCIsXG59XG5cbmNvbnN0IHN0YWNrU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBnYXA6IDE2LFxufVxuXG5jb25zdCB0d29Db2x1bW5HcmlkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICBnYXA6IDE2LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDI2MHB4LCAxZnIpKVwiLFxufVxuXG5jb25zdCB0aHJlZUNvbHVtbkdyaWRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJncmlkXCIsXG4gIGdhcDogMTYsXG4gIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjIwcHgsIDFmcikpXCIsXG59XG5cbmNvbnN0IGZvdXJDb2x1bW5HcmlkU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICBnYXA6IDE2LFxuICBncmlkVGVtcGxhdGVDb2x1bW5zOiBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE2MHB4LCAxZnIpKVwiLFxufVxuXG5jb25zdCBwYW5lbFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBib3JkZXI6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICBib3JkZXJSYWRpdXM6IDgsXG4gIHBhZGRpbmc6IDE2LFxufVxuXG5jb25zdCByb3dCZXR3ZWVuU3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gIGRpc3BsYXk6IFwiZmxleFwiLFxuICBnYXA6IDE2LFxuICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsXG59XG5cbmZ1bmN0aW9uIGJhY2tlbmRVcmwoKSB7XG4gIHJldHVybiB0eXBlb2YgX19CQUNLRU5EX1VSTF9fID09PSBcInN0cmluZ1wiXG4gICAgPyBfX0JBQ0tFTkRfVVJMX18ucmVwbGFjZSgvXFwvJC8sIFwiXCIpXG4gICAgOiBcIlwiXG59XG5cbmZ1bmN0aW9uIGFwaUVycm9yTWVzc2FnZShwYXlsb2FkOiBhbnksIGZhbGxiYWNrOiBzdHJpbmcpIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICBwYXlsb2FkPy5tZXNzYWdlLFxuICAgIHBheWxvYWQ/LmVycm9yPy5tZXNzYWdlLFxuICAgIHBheWxvYWQ/LmVycm9yLFxuICAgIHBheWxvYWQ/LmVycm9ycz8uWzBdPy5tZXNzYWdlLFxuICBdXG4gIGNvbnN0IG1lc3NhZ2UgPSBjYW5kaWRhdGVzLmZpbmQoXG4gICAgKGNhbmRpZGF0ZSkgPT4gdHlwZW9mIGNhbmRpZGF0ZSA9PT0gXCJzdHJpbmdcIiAmJiBjYW5kaWRhdGUudHJpbSgpLFxuICApXG5cbiAgcmV0dXJuIG1lc3NhZ2UgfHwgZmFsbGJhY2sgfHwgXCJSZXF1ZXN0IGZhaWxlZFwiXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwaUZldGNoPFQ+KFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge30sXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtiYWNrZW5kVXJsKCl9JHtwYXRofWAsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICAuLi4ob3B0aW9ucy5ib2R5ID8geyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IDoge30pLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH0sXG4gIH0pXG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYXBpRXJyb3JNZXNzYWdlKHBheWxvYWQsIHJlc3BvbnNlLnN0YXR1c1RleHQpKVxuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKVxufVxuXG5mdW5jdGlvbiBudW1iZXJPck51bGwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPiAwID8gcGFyc2VkIDogbnVsbFxufVxuXG5mdW5jdGlvbiBvcHRpb25MYWJlbChvcHRpb246IE9wdGlvblJlY29yZCkge1xuICByZXR1cm4gKFxuICAgIG9wdGlvbi5uYW1lIHx8IG9wdGlvbi50aXRsZSB8fCBvcHRpb24udmFsdWUgfHwgb3B0aW9uLmhhbmRsZSB8fCBvcHRpb24uaWRcbiAgKVxufVxuXG5mdW5jdGlvbiBiZW5lZml0TGFiZWwoXG4gIGNvbmZpZzogUGljazxcbiAgICBDb3Vwb25Qcm9kdWN0Q29uZmlnLFxuICAgIFwiYmVuZWZpdF90eXBlXCIgfCBcImFtb3VudFwiIHwgXCJwZXJjZW50YWdlXCIgfCBcImN1cnJlbmN5X2NvZGVcIlxuICA+LFxuKSB7XG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiKSB7XG4gICAgcmV0dXJuIGAke2NvbmZpZy5hbW91bnQgfHwgMH0gJHsoY29uZmlnLmN1cnJlbmN5X2NvZGUgfHwgXCJcIikudG9VcHBlckNhc2UoKX1gXG4gIH1cbiAgaWYgKGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwicGVyY2VudGFnZVwiKSB7XG4gICAgcmV0dXJuIGAke2NvbmZpZy5wZXJjZW50YWdlIHx8IDB9JWBcbiAgfVxuICBpZiAoY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmcmVlX3NoaXBwaW5nXCIpIHtcbiAgICByZXR1cm4gXCJGcmVlIHNoaXBwaW5nXCJcbiAgfVxuICByZXR1cm4gXCJCdXkgZ2V0XCJcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZSh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiLVwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIi1cIlxuICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKVxufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlVGltZSh2YWx1ZT86IHN0cmluZyB8IG51bGwpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiLVwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIi1cIlxuICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZygpXG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZ1bGxEYXRlKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCItXCJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKVxuICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgcmV0dXJuIFwiLVwiXG4gIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHVuZGVmaW5lZCwge1xuICAgIGRheTogXCJudW1lcmljXCIsXG4gICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICBtb250aDogXCJzaG9ydFwiLFxuICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICB9KVxufVxuXG5mdW5jdGlvbiBmb3JtYXRSZWxhdGl2ZURhdGUodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIi1cIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCItXCJcblxuICBjb25zdCBkaWZmU2Vjb25kcyA9IE1hdGgucm91bmQoKGRhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwKVxuICBjb25zdCBhYnNTZWNvbmRzID0gTWF0aC5hYnMoZGlmZlNlY29uZHMpXG4gIGNvbnN0IHVuaXRzOiBBcnJheTxbSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXRVbml0LCBudW1iZXJdPiA9IFtcbiAgICBbXCJ5ZWFyXCIsIDYwICogNjAgKiAyNCAqIDM2NV0sXG4gICAgW1wibW9udGhcIiwgNjAgKiA2MCAqIDI0ICogMzBdLFxuICAgIFtcIndlZWtcIiwgNjAgKiA2MCAqIDI0ICogN10sXG4gICAgW1wiZGF5XCIsIDYwICogNjAgKiAyNF0sXG4gICAgW1wiaG91clwiLCA2MCAqIDYwXSxcbiAgICBbXCJtaW51dGVcIiwgNjBdLFxuICBdXG4gIGNvbnN0IFt1bml0LCBzZWNvbmRzXSA9XG4gICAgdW5pdHMuZmluZCgoWywgc2Vjb25kc1BlclVuaXRdKSA9PiBhYnNTZWNvbmRzID49IHNlY29uZHNQZXJVbml0KSB8fCBbXVxuXG4gIGlmICghdW5pdCB8fCAhc2Vjb25kcykge1xuICAgIHJldHVybiBcImp1c3Qgbm93XCJcbiAgfVxuXG4gIHJldHVybiBuZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodW5kZWZpbmVkLCB7IG51bWVyaWM6IFwiYXV0b1wiIH0pLmZvcm1hdChcbiAgICBNYXRoLnJvdW5kKGRpZmZTZWNvbmRzIC8gc2Vjb25kcyksXG4gICAgdW5pdCxcbiAgKVxufVxuXG5mdW5jdGlvbiBmb3JtYXRTbmFwc2hvdEFtb3VudChhbW91bnQ6IG51bWJlciB8IG51bGwsIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoYW1vdW50ID09IG51bGwpIHJldHVybiBcIi1cIlxuICBjb25zdCBjb2RlID0gY3VycmVuY3kgPyBjdXJyZW5jeS50b1VwcGVyQ2FzZSgpIDogXCJcIlxuICByZXR1cm4gW2NvZGUsIGFtb3VudC50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyIH0pXVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuam9pbihcIiBcIilcbn1cblxuZnVuY3Rpb24gdG9EYXRlVGltZUxvY2FsKHZhbHVlPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIlxuICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpXG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSByZXR1cm4gXCJcIlxuICBjb25zdCBsb2NhbERhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSAtIGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwXzAwMClcbiAgcmV0dXJuIGxvY2FsRGF0ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDE2KVxufVxuXG5mdW5jdGlvbiBlbnRpdGxlbWVudFN0YXR1c0NvbG9yKHN0YXR1czogc3RyaW5nKSB7XG4gIGlmIChzdGF0dXMgPT09IFwiaXNzdWVkXCIpIHJldHVybiBcImdyZWVuXCIgYXMgY29uc3RcbiAgaWYgKHN0YXR1cyA9PT0gXCJyZWRlZW1lZFwiKSByZXR1cm4gXCJibHVlXCIgYXMgY29uc3RcbiAgaWYgKHN0YXR1cyA9PT0gXCJleHBpcmVkXCIgfHwgc3RhdHVzID09PSBcImNhbmNlbGVkXCIpIHJldHVybiBcImdyZXlcIiBhcyBjb25zdFxuICByZXR1cm4gXCJvcmFuZ2VcIiBhcyBjb25zdFxufVxuXG5mdW5jdGlvbiBwcm9kdWN0U3RhdHVzQ29sb3Ioc3RhdHVzPzogc3RyaW5nIHwgbnVsbCkge1xuICBpZiAoc3RhdHVzID09PSBcInB1Ymxpc2hlZFwiKSByZXR1cm4gXCJncmVlblwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwicmVqZWN0ZWRcIikgcmV0dXJuIFwicmVkXCIgYXMgY29uc3RcbiAgaWYgKHN0YXR1cyA9PT0gXCJwcm9wb3NlZFwiKSByZXR1cm4gXCJvcmFuZ2VcIiBhcyBjb25zdFxuICByZXR1cm4gXCJncmV5XCIgYXMgY29uc3Rcbn1cblxuZnVuY3Rpb24gc25hcHNob3RTdHJpbmcoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGtleTogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHZhbHVlID0gc25hcHNob3Q/LltrZXldXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpKSByZXR1cm4gdmFsdWVcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgcmV0dXJuIFwiXCJcbn1cblxuZnVuY3Rpb24gc25hcHNob3ROdW1iZXIoXG4gIHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGtleTogc3RyaW5nLFxuKSB7XG4gIGNvbnN0IHZhbHVlID0gc25hcHNob3Q/LltrZXldXG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogbnVsbFxufVxuXG5mdW5jdGlvbiBqc29uQmxvY2sodmFsdWU6IHVua25vd24pIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBcInt9XCJcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKVxufVxuXG5mdW5jdGlvbiBjb3Vwb25Db2RlKGVudGl0bGVtZW50OiBDb3Vwb25FbnRpdGxlbWVudCkge1xuICByZXR1cm4gZW50aXRsZW1lbnQuY29kZSB8fCBlbnRpdGxlbWVudC5zaGFyZWRfY29kZSB8fCBcIi1cIlxufVxuXG5mdW5jdGlvbiBlbnRpdGxlbWVudFNvdXJjZShlbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnQpIHtcbiAgaWYgKGVudGl0bGVtZW50Lm9yaWdpbiA9PT0gXCJleHRlcm5hbFwiKSByZXR1cm4gXCJFeHRlcm5hbFwiXG4gIHJldHVybiBcIlB1cmNoYXNlXCJcbn1cblxuZnVuY3Rpb24gZW50aXRsZW1lbnRTZWxsZXJTY29wZShlbnRpdGxlbWVudDogQ291cG9uRW50aXRsZW1lbnQpIHtcbiAgY29uc3QgY291bnQgPSBlbnRpdGxlbWVudC5zZWxsZXJfdGFyZ2V0cz8ubGVuZ3RoIHx8IDBcbiAgaWYgKGVudGl0bGVtZW50Lm9yaWdpbiAhPT0gXCJleHRlcm5hbFwiKSB7XG4gICAgaWYgKCFjb3VudCkgcmV0dXJuIFwiUHJvZHVjdCBzZWxsZXJcIlxuICAgIHJldHVybiBgUHJvZHVjdCBzZWxsZXIgKyAke2NvdW50fSBsaW5rZWRgXG4gIH1cbiAgaWYgKCFjb3VudCkgcmV0dXJuIFwiQWRtaW4gb25seVwiXG4gIHJldHVybiBjb3VudCA9PT0gMSA/IFwiMSBsaW5rZWQgc2VsbGVyXCIgOiBgJHtjb3VudH0gbGlua2VkIHNlbGxlcnNgXG59XG5cbmZ1bmN0aW9uIG9yZGVyRGlzcGxheUlkKG9yZGVyOiBDb3Vwb25PcmRlclN1bW1hcnkgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gIGlmICghb3JkZXIpIHJldHVybiBcIi1cIlxuICByZXR1cm4gb3JkZXIuZGlzcGxheV9pZCA9PSBudWxsID8gb3JkZXIuaWQgOiBgIyR7b3JkZXIuZGlzcGxheV9pZH1gXG59XG5cbmZ1bmN0aW9uIGRhc2hib2FyZEJhc2VQYXRoKGFwaUJhc2U6IEFwaUJhc2UpIHtcbiAgcmV0dXJuIGFwaUJhc2UgPT09IFwiL3ZlbmRvclwiID8gXCIvc2VsbGVyXCIgOiBcIi9kYXNoYm9hcmRcIlxufVxuXG5mdW5jdGlvbiBjb3Vwb25EZXRhaWxQYXRoKGFwaUJhc2U6IEFwaUJhc2UsIGVudGl0bGVtZW50SWQ6IHN0cmluZykge1xuICByZXR1cm4gYCR7ZGFzaGJvYXJkQmFzZVBhdGgoYXBpQmFzZSl9L2NvdXBvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgZW50aXRsZW1lbnRJZCxcbiAgKX1gXG59XG5cbmZ1bmN0aW9uIG9yZGVyRGV0YWlsUGF0aChhcGlCYXNlOiBBcGlCYXNlLCBvcmRlcklkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGAke2Rhc2hib2FyZEJhc2VQYXRoKGFwaUJhc2UpfS9vcmRlcnMvJHtlbmNvZGVVUklDb21wb25lbnQob3JkZXJJZCl9YFxufVxuXG5mdW5jdGlvbiBjdXJyZW50Q291cG9uRGV0YWlsSWQoYXBpQmFzZTogQXBpQmFzZSkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBwcmVmaXggPSBgJHtkYXNoYm9hcmRCYXNlUGF0aChhcGlCYXNlKX0vY291cG9ucy9gXG4gIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWVcbiAgY29uc3QgaW5kZXggPSBwYXRoLmluZGV4T2YocHJlZml4KVxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IGlkID0gcGF0aC5zbGljZShpbmRleCArIHByZWZpeC5sZW5ndGgpLnNwbGl0KFwiL1wiKVswXVxuICBpZiAoIWlkIHx8IGlkID09PSBcInByb2R1Y3RzXCIpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGlkKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gaWRcbiAgfVxufVxuXG5mdW5jdGlvbiBiZW5lZml0U25hcHNob3RMYWJlbChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCB0eXBlID0gc25hcHNob3RTdHJpbmcoc25hcHNob3QsIFwiYmVuZWZpdF90eXBlXCIpXG4gIGlmICh0eXBlID09PSBcImZpeGVkX2Ftb3VudFwiKSB7XG4gICAgY29uc3QgYW1vdW50cyA9IEFycmF5LmlzQXJyYXkoc25hcHNob3Q/LmFtb3VudHMpXG4gICAgICA/IChzbmFwc2hvdC5hbW91bnRzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PilcbiAgICAgIDogW11cbiAgICBpZiAoYW1vdW50cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBhbW91bnRzXG4gICAgICAgIC5tYXAoKHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IGFtb3VudCA9IHNuYXBzaG90TnVtYmVyKHJvdywgXCJhbW91bnRcIilcbiAgICAgICAgICBjb25zdCBjdXJyZW5jeSA9IHNuYXBzaG90U3RyaW5nKHJvdywgXCJjdXJyZW5jeV9jb2RlXCIpLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICByZXR1cm4gYCR7YW1vdW50ID8/IDB9ICR7Y3VycmVuY3l9YC50cmltKClcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGFtb3VudCA9IHNuYXBzaG90TnVtYmVyKHNuYXBzaG90LCBcImFtb3VudFwiKVxuICAgIGNvbnN0IGN1cnJlbmN5ID0gc25hcHNob3RTdHJpbmcoc25hcHNob3QsIFwiY3VycmVuY3lfY29kZVwiKS50b1VwcGVyQ2FzZSgpXG4gICAgcmV0dXJuIGAke2Ftb3VudCA/PyAwfSAke2N1cnJlbmN5fWAudHJpbSgpXG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJwZXJjZW50YWdlXCIpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHNuYXBzaG90Py5wcm9tb3Rpb25fdGVtcGxhdGUgYXNcbiAgICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIHwgbnVsbFxuICAgICAgfCB1bmRlZmluZWRcbiAgICBjb25zdCBtZXRob2QgPSB0ZW1wbGF0ZT8uYXBwbGljYXRpb25fbWV0aG9kIGFzXG4gICAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICB8IG51bGxcbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgY29uc3Qgc2NvcGUgPSBzbmFwc2hvdFN0cmluZyhtZXRob2QsIFwidGFyZ2V0X3R5cGVcIikgPT09IFwib3JkZXJcIlxuICAgICAgPyBcIm9yZGVyXCJcbiAgICAgIDogXCJwcm9kdWN0c1wiXG4gICAgcmV0dXJuIGAke3NuYXBzaG90TnVtYmVyKHNuYXBzaG90LCBcInBlcmNlbnRhZ2VcIikgPz8gMH0lIG9mZiAke3Njb3BlfWBcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImZyZWVfc2hpcHBpbmdcIikge1xuICAgIHJldHVybiBcIkZyZWUgc2hpcHBpbmdcIlxuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwiYnV5X2dldFwiKSB7XG4gICAgcmV0dXJuIFwiQnV5IFggR2V0IFlcIlxuICB9XG5cbiAgcmV0dXJuIFwiVW5rbm93blwiXG59XG5cbmZ1bmN0aW9uIGV4cGlyYXRpb25Qb2xpY3lMYWJlbChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBwb2xpY3kgPSBzbmFwc2hvdD8uZXhwaXJhdGlvbl9wb2xpY3kgYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWRcbiAgY29uc3QgdHlwZSA9IHNuYXBzaG90U3RyaW5nKHBvbGljeSwgXCJ0eXBlXCIpXG5cbiAgaWYgKHR5cGUgPT09IFwibm9uZVwiKSByZXR1cm4gXCJObyBleHBpcmF0aW9uXCJcbiAgaWYgKHR5cGUgPT09IFwiZHVyYXRpb25cIikge1xuICAgIGNvbnN0IGRheXMgPSBzbmFwc2hvdE51bWJlcihwb2xpY3ksIFwiZHVyYXRpb25fZGF5c1wiKSA/PyAwXG4gICAgcmV0dXJuIGAke2RheXN9IGRheXMgYWZ0ZXIgaXNzdWFuY2VgXG4gIH1cbiAgaWYgKHR5cGUgPT09IFwiZml4ZWRcIikge1xuICAgIHJldHVybiBgRml4ZWQgZGF0ZSAke2Zvcm1hdERhdGVUaW1lKHNuYXBzaG90U3RyaW5nKHBvbGljeSwgXCJleHBpcmVzX2F0XCIpKX1gXG4gIH1cblxuICByZXR1cm4gXCItXCJcbn1cblxuZnVuY3Rpb24gY2FtcGFpZ25TbmFwc2hvdExhYmVsKFxuICBzbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkLFxuKSB7XG4gIGNvbnN0IGNhbXBhaWduU25hcHNob3QgPSBzbmFwc2hvdD8uY2FtcGFpZ25fc25hcHNob3QgYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWRcbiAgcmV0dXJuIChcbiAgICBzbmFwc2hvdFN0cmluZyhjYW1wYWlnblNuYXBzaG90LCBcIm5hbWVcIikgfHxcbiAgICBzbmFwc2hvdFN0cmluZyhjYW1wYWlnblNuYXBzaG90LCBcImNhbXBhaWduX2lkZW50aWZpZXJcIikgfHxcbiAgICBzbmFwc2hvdFN0cmluZyhzbmFwc2hvdCwgXCJjYW1wYWlnbl9pZFwiKSB8fFxuICAgIFwiTm9uZVwiXG4gIClcbn1cblxuZnVuY3Rpb24gcHJvbW90aW9uU25hcHNob3RMYWJlbChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCB0ZW1wbGF0ZSA9IHNuYXBzaG90Py5wcm9tb3Rpb25fdGVtcGxhdGUgYXNcbiAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWRcbiAgY29uc3QgbWV0aG9kID0gdGVtcGxhdGU/LmFwcGxpY2F0aW9uX21ldGhvZCBhc1xuICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZFxuICBjb25zdCB0YXJnZXQgPSBzbmFwc2hvdFN0cmluZyhtZXRob2QsIFwidGFyZ2V0X3R5cGVcIilcbiAgY29uc3QgYWxsb2NhdGlvbiA9IHNuYXBzaG90U3RyaW5nKG1ldGhvZCwgXCJhbGxvY2F0aW9uXCIpXG5cbiAgcmV0dXJuIFt0YXJnZXQsIGFsbG9jYXRpb25dLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIC8gXCIpIHx8IFwiTm9uZVwiXG59XG5cbmZ1bmN0aW9uIGNhbXBhaWduTGFiZWwoY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnKSB7XG4gIGNvbnN0IG5hbWUgPSBjb25maWcuY2FtcGFpZ25fc25hcHNob3Q/Lm5hbWVcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiICYmIG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5jYW1wYWlnbl9pZCB8fCBcIk5vbmVcIlxufVxuXG5mdW5jdGlvbiBmb3JtRnJvbVJvdyhyb3c6IENvdXBvblByb2R1Y3RSb3csIGRlZmF1bHRDdXJyZW5jeUNvZGU6IHN0cmluZykge1xuICBjb25zdCBwcm9kdWN0ID0gcm93LnByb2R1Y3QgfHwgKHt9IGFzIFByb2R1Y3RSZWNvcmQpXG4gIGNvbnN0IGNvbmZpZyA9IHJvdy5jb3Vwb25fcHJvZHVjdF9jb25maWdcbiAgY29uc3QgdmFyaWFudENvbmZpZ0J5VmFyaWFudElkID0gbmV3IE1hcChcbiAgICAocm93LmNvdXBvbl9wcm9kdWN0X3ZhcmlhbnRfY29uZmlncyB8fCBbXSkubWFwKCh2YXJpYW50Q29uZmlnKSA9PiBbXG4gICAgICB2YXJpYW50Q29uZmlnLnZhcmlhbnRfaWQsXG4gICAgICB2YXJpYW50Q29uZmlnLFxuICAgIF0pLFxuICApXG4gIGNvbnN0IGR1cmF0aW9uRGF5cyA9XG4gICAgY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlID09PSBcImR1cmF0aW9uXCJcbiAgICAgID8gY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmR1cmF0aW9uX2RheXNcbiAgICAgIDogMzBcblxuICByZXR1cm4ge1xuICAgIHByb2R1Y3Q6IHtcbiAgICAgIC4uLmVtcHR5UHJvZHVjdCxcbiAgICAgIGlkOiBwcm9kdWN0LmlkIHx8IFwiXCIsXG4gICAgICB0aXRsZTogcHJvZHVjdC50aXRsZSB8fCBcIlwiLFxuICAgICAgc3VidGl0bGU6IHByb2R1Y3Quc3VidGl0bGUgfHwgXCJcIixcbiAgICAgIGhhbmRsZTogcHJvZHVjdC5oYW5kbGUgfHwgXCJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9kdWN0LmRlc2NyaXB0aW9uIHx8IFwiXCIsXG4gICAgICB0aHVtYm5haWw6IHByb2R1Y3QudGh1bWJuYWlsIHx8IFwiXCIsXG4gICAgICBzdGF0dXM6IHByb2R1Y3Quc3RhdHVzIHx8IFwiZHJhZnRcIixcbiAgICAgIGRpc2NvdW50YWJsZTogQm9vbGVhbihwcm9kdWN0LmRpc2NvdW50YWJsZSksXG4gICAgICB0eXBlX2lkOiBwcm9kdWN0LnR5cGVfaWQgfHwgXCJcIixcbiAgICAgIGNvbGxlY3Rpb25faWQ6IHByb2R1Y3QuY29sbGVjdGlvbl9pZCB8fCBcIlwiLFxuICAgICAgY2F0ZWdvcnlfaWQ6IHByb2R1Y3QuY2F0ZWdvcmllcz8uWzBdPy5pZCB8fCBcIlwiLFxuICAgICAgdGFnX2lkOiBwcm9kdWN0LnRhZ3M/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIHNhbGVzX2NoYW5uZWxfaWQ6IHByb2R1Y3Quc2FsZXNfY2hhbm5lbHM/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIHZhcmlhbnRzOiAocHJvZHVjdC52YXJpYW50cz8ubGVuZ3RoID8gcHJvZHVjdC52YXJpYW50cyA6IFtdKS5tYXAoXG4gICAgICAgICh2YXJpYW50KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3ZlcnJpZGUgPSB2YXJpYW50Q29uZmlnQnlWYXJpYW50SWQuZ2V0KHZhcmlhbnQuaWQpXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmVtcHR5VmFyaWFudCxcbiAgICAgICAgICAgIGlkOiB2YXJpYW50LmlkLFxuICAgICAgICAgICAgb3ZlcnJpZGVfY29uZmlnX2lkOiBvdmVycmlkZT8uaWQsXG4gICAgICAgICAgICB0aXRsZTogdmFyaWFudC50aXRsZSB8fCBcIlwiLFxuICAgICAgICAgICAgc2t1OiB2YXJpYW50LnNrdSB8fCBcIlwiLFxuICAgICAgICAgICAgY3VycmVuY3lfY29kZTpcbiAgICAgICAgICAgICAgdmFyaWFudC5wcmljZXM/LlswXT8uY3VycmVuY3lfY29kZSB8fFxuICAgICAgICAgICAgICBvdmVycmlkZT8uY3VycmVuY3lfY29kZSB8fFxuICAgICAgICAgICAgICBjb25maWcuY3VycmVuY3lfY29kZSB8fFxuICAgICAgICAgICAgICBkZWZhdWx0Q3VycmVuY3lDb2RlLFxuICAgICAgICAgICAgYW1vdW50OlxuICAgICAgICAgICAgICB2YXJpYW50LnByaWNlcz8uWzBdPy5hbW91bnQgPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgIDogU3RyaW5nKHZhcmlhbnQucHJpY2VzPy5bMF0/LmFtb3VudCksXG4gICAgICAgICAgICBvdmVycmlkZV9lbmFibGVkOiBvdmVycmlkZSA/IG92ZXJyaWRlLmVuYWJsZWQgIT09IGZhbHNlIDogZmFsc2UsXG4gICAgICAgICAgICBvdmVycmlkZV9iZW5lZml0X3R5cGU6XG4gICAgICAgICAgICAgIG92ZXJyaWRlPy5iZW5lZml0X3R5cGUgfHwgY29uZmlnLmJlbmVmaXRfdHlwZSB8fCBcImZpeGVkX2Ftb3VudFwiLFxuICAgICAgICAgICAgb3ZlcnJpZGVfY3VycmVuY3lfY29kZTpcbiAgICAgICAgICAgICAgb3ZlcnJpZGU/LmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgY29uZmlnLmN1cnJlbmN5X2NvZGUgfHxcbiAgICAgICAgICAgICAgZGVmYXVsdEN1cnJlbmN5Q29kZSxcbiAgICAgICAgICAgIG92ZXJyaWRlX2Ftb3VudDpcbiAgICAgICAgICAgICAgb3ZlcnJpZGU/LmFtb3VudCA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhvdmVycmlkZS5hbW91bnQpLFxuICAgICAgICAgICAgb3ZlcnJpZGVfcGVyY2VudGFnZTpcbiAgICAgICAgICAgICAgb3ZlcnJpZGU/LnBlcmNlbnRhZ2UgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcob3ZlcnJpZGUucGVyY2VudGFnZSksXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICB9LFxuICAgIGNvdXBvbjoge1xuICAgICAgLi4uZW1wdHlDb3Vwb24sXG4gICAgICBlbmFibGVkOiBjb25maWcuZW5hYmxlZCxcbiAgICAgIGJlbmVmaXRfdHlwZTogY29uZmlnLmJlbmVmaXRfdHlwZSxcbiAgICAgIGFtb3VudDogY29uZmlnLmFtb3VudCA9PSBudWxsID8gXCJcIiA6IFN0cmluZyhjb25maWcuYW1vdW50KSxcbiAgICAgIHBlcmNlbnRhZ2U6IGNvbmZpZy5wZXJjZW50YWdlID09IG51bGwgPyBcIlwiIDogU3RyaW5nKGNvbmZpZy5wZXJjZW50YWdlKSxcbiAgICAgIGN1cnJlbmN5X2NvZGU6IGNvbmZpZy5jdXJyZW5jeV9jb2RlIHx8IGRlZmF1bHRDdXJyZW5jeUNvZGUsXG4gICAgICBjb2RlX3N0cmF0ZWd5OiBjb25maWcuY29kZV9zdHJhdGVneSxcbiAgICAgIGNvZGVfcHJlZml4OiBjb25maWcuY29kZV9wcmVmaXggfHwgXCJcIixcbiAgICAgIHNoYXJlZF9jb2RlOiBjb25maWcuc2hhcmVkX2NvZGUgfHwgXCJcIixcbiAgICAgIGV4cGlyYXRpb25fdHlwZTogY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlIHx8IFwiZHVyYXRpb25cIixcbiAgICAgIGV4cGlyYXRpb25fZGF5czogU3RyaW5nKGR1cmF0aW9uRGF5cyksXG4gICAgICBleHBpcmF0aW9uX2RhdGU6XG4gICAgICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8udHlwZSA9PT0gXCJmaXhlZFwiXG4gICAgICAgICAgPyB0b0RhdGVUaW1lTG9jYWwoY29uZmlnLmV4cGlyYXRpb25fcG9saWN5LmV4cGlyZXNfYXQpXG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246XG4gICAgICAgIGNvbmZpZy5leHBpcmF0aW9uX3BvbGljeT8uY2FwX2J5X2NhbXBhaWduICE9PSBmYWxzZSxcbiAgICAgIGV4cGlyYXRpb25fY2FwX2F0OiBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3k/LmNhcF9hdFxuICAgICAgICA/IHRvRGF0ZVRpbWVMb2NhbChjb25maWcuZXhwaXJhdGlvbl9wb2xpY3kuY2FwX2F0KVxuICAgICAgICA6IFwiXCIsXG4gICAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IFN0cmluZyhcbiAgICAgICAgY29uZmlnLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSB8fCAxLFxuICAgICAgKSxcbiAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogY29uZmlnLnByb21vdGlvbl9taXJyb3JfbW9kZSB8fCBcIm5vbmVcIixcbiAgICAgIHByb21vdGlvbl9zdGF0dXM6IGNvbmZpZy5wcm9tb3Rpb25fc3RhdHVzIHx8IFwiZHJhZnRcIixcbiAgICB9LFxuICAgIGNhbXBhaWduOiB7XG4gICAgICAuLi5lbXB0eUNhbXBhaWduLFxuICAgICAgbW9kZTogY29uZmlnLmNhbXBhaWduX2lkID8gXCJleGlzdGluZ1wiIDogXCJub25lXCIsXG4gICAgICBjYW1wYWlnbl9pZDogY29uZmlnLmNhbXBhaWduX2lkIHx8IFwiXCIsXG4gICAgfSxcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZENvdXBvblBheWxvYWQoXG4gIGNvdXBvbjogQ291cG9uRm9ybVN0YXRlLFxuICBhbGxvd1Byb21vdGlvbk1pcnJvcjogYm9vbGVhbixcbikge1xuICByZXR1cm4ge1xuICAgIGVuYWJsZWQ6IGNvdXBvbi5lbmFibGVkLFxuICAgIGJlbmVmaXRfdHlwZTogY291cG9uLmJlbmVmaXRfdHlwZSxcbiAgICBhbW91bnQ6XG4gICAgICBjb3Vwb24uYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgID8gbnVtYmVyT3JOdWxsKGNvdXBvbi5hbW91bnQpXG4gICAgICAgIDogbnVsbCxcbiAgICBwZXJjZW50YWdlOlxuICAgICAgY291cG9uLmJlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCJcbiAgICAgICAgPyBudW1iZXJPck51bGwoY291cG9uLnBlcmNlbnRhZ2UpXG4gICAgICAgIDogbnVsbCxcbiAgICBjdXJyZW5jeV9jb2RlOlxuICAgICAgY291cG9uLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICA/IGNvdXBvbi5jdXJyZW5jeV9jb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIDogbnVsbCxcbiAgICBjb2RlX3N0cmF0ZWd5OiBjb3Vwb24uY29kZV9zdHJhdGVneSxcbiAgICBjb2RlX3ByZWZpeDpcbiAgICAgIGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInVuaXF1ZV9jb2RlXCJcbiAgICAgICAgPyBjb3Vwb24uY29kZV9wcmVmaXgudHJpbSgpIHx8IFwiQ09VUE9OXCJcbiAgICAgICAgOiBudWxsLFxuICAgIHNoYXJlZF9jb2RlOlxuICAgICAgY291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIiA/IGNvdXBvbi5zaGFyZWRfY29kZS50cmltKCkgOiBudWxsLFxuICAgIGV4cGlyYXRpb25fcG9saWN5OlxuICAgICAgY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdHlwZTogXCJmaXhlZFwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgZXhwaXJlc19hdDogbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fZGF0ZSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIGNhcF9ieV9jYW1wYWlnbjogY291cG9uLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduLFxuICAgICAgICAgICAgY2FwX2F0OiBjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXRcbiAgICAgICAgICAgICAgPyBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9jYXBfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0eXBlOiBcImR1cmF0aW9uXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBkdXJhdGlvbl9kYXlzOiBOdW1iZXIoY291cG9uLmV4cGlyYXRpb25fZGF5cykgfHwgMzAsXG4gICAgICAgICAgICBjYXBfYnlfY2FtcGFpZ246IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgIGNhcF9hdDogY291cG9uLmV4cGlyYXRpb25fY2FwX2F0XG4gICAgICAgICAgICAgID8gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9LFxuICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTpcbiAgICAgIE51bWJlcihjb3Vwb24ubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtKSB8fCAxLFxuICAgIC4uLihhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgICAgPyB7XG4gICAgICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBjb3Vwb24ucHJvbW90aW9uX21pcnJvcl9tb2RlLFxuICAgICAgICAgIHByb21vdGlvbl9zdGF0dXM6IGNvdXBvbi5wcm9tb3Rpb25fc3RhdHVzLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZENhbXBhaWduUGF5bG9hZChcbiAgY2FtcGFpZ246IENhbXBhaWduRm9ybVN0YXRlLFxuICBhbGxvd0NhbXBhaWduOiBib29sZWFuLFxuKSB7XG4gIGlmICghYWxsb3dDYW1wYWlnbikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuICBpZiAoY2FtcGFpZ24ubW9kZSA9PT0gXCJleGlzdGluZ1wiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGU6IFwiZXhpc3RpbmdcIixcbiAgICAgIGNhbXBhaWduX2lkOiBjYW1wYWlnbi5jYW1wYWlnbl9pZCB8fCBudWxsLFxuICAgIH1cbiAgfVxuICBpZiAoY2FtcGFpZ24ubW9kZSA9PT0gXCJuZXdcIikge1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlOiBcIm5ld1wiLFxuICAgICAgY2FtcGFpZ246IHtcbiAgICAgICAgbmFtZTogY2FtcGFpZ24ubmFtZSxcbiAgICAgICAgY2FtcGFpZ25faWRlbnRpZmllcjogY2FtcGFpZ24uY2FtcGFpZ25faWRlbnRpZmllcixcbiAgICAgICAgc3RhcnRzX2F0OiBjYW1wYWlnbi5zdGFydHNfYXRcbiAgICAgICAgICA/IG5ldyBEYXRlKGNhbXBhaWduLnN0YXJ0c19hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgZW5kc19hdDogY2FtcGFpZ24uZW5kc19hdFxuICAgICAgICAgID8gbmV3IERhdGUoY2FtcGFpZ24uZW5kc19hdCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgIH0sXG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1vZGU6IFwibm9uZVwiIH1cbn1cblxuZnVuY3Rpb24gc3RlcFN0YXR1cyhzdGVwOiBXaXphcmRTdGVwLCBhY3RpdmU6IFdpemFyZFN0ZXApIHtcbiAgY29uc3Qgc3RlcEluZGV4ID0gc3RlcHMuaW5kZXhPZihzdGVwKVxuICBjb25zdCBhY3RpdmVJbmRleCA9IHN0ZXBzLmluZGV4T2YoYWN0aXZlKVxuICBpZiAoc3RlcEluZGV4IDwgYWN0aXZlSW5kZXgpIHJldHVybiBcImNvbXBsZXRlZFwiXG4gIGlmIChzdGVwSW5kZXggPT09IGFjdGl2ZUluZGV4KSByZXR1cm4gXCJpbi1wcm9ncmVzc1wiXG4gIHJldHVybiBcIm5vdC1zdGFydGVkXCJcbn1cblxuZnVuY3Rpb24gRmllbGQoeyBsYWJlbCwgY2hpbGRyZW4gfTogeyBsYWJlbDogc3RyaW5nOyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktMVwiIHN0eWxlPXt7IG1pbldpZHRoOiAwIH19PlxuICAgICAgPExhYmVsPntsYWJlbH08L0xhYmVsPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIGN1cnJlbmN5RGVjaW1hbERpZ2l0cyhjb2RlOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KFwiZW5cIiwge1xuICAgICAgc3R5bGU6IFwiY3VycmVuY3lcIixcbiAgICAgIGN1cnJlbmN5OiBjb2RlLnRvVXBwZXJDYXNlKCksXG4gICAgfSkucmVzb2x2ZWRPcHRpb25zKCkubWF4aW11bUZyYWN0aW9uRGlnaXRzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAyXG4gIH1cbn1cblxuZnVuY3Rpb24gY3VycmVuY3lTeW1ib2woY29kZTogc3RyaW5nKSB7XG4gIGlmICghY29kZSkgcmV0dXJuIFwiXCJcblxuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBuZXcgSW50bC5OdW1iZXJGb3JtYXQoXCJlblwiLCB7XG4gICAgICAgIHN0eWxlOiBcImN1cnJlbmN5XCIsXG4gICAgICAgIGN1cnJlbmN5OiBjb2RlLnRvVXBwZXJDYXNlKCksXG4gICAgICAgIGN1cnJlbmN5RGlzcGxheTogXCJuYXJyb3dTeW1ib2xcIixcbiAgICAgIH0pXG4gICAgICAgIC5mb3JtYXRUb1BhcnRzKDApXG4gICAgICAgIC5maW5kKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09IFwiY3VycmVuY3lcIik/LnZhbHVlIHx8IGNvZGUudG9VcHBlckNhc2UoKVxuICAgIClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGNvZGUudG9VcHBlckNhc2UoKVxuICB9XG59XG5cbmZ1bmN0aW9uIEN1cnJlbmN5U2VsZWN0KHtcbiAgY3VycmVuY2llcyxcbiAgZGlzYWJsZWQsXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXVxuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0XG4gICAgICB2YWx1ZT17dmFsdWUgfHwgdW5kZWZpbmVkfVxuICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkIHx8ICFjdXJyZW5jaWVzLmxlbmd0aH1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9e29uQ2hhbmdlfVxuICAgID5cbiAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgPFNlbGVjdC5WYWx1ZVxuICAgICAgICAgIHBsYWNlaG9sZGVyPXtcbiAgICAgICAgICAgIGN1cnJlbmNpZXMubGVuZ3RoID8gXCJTZWxlY3QgY3VycmVuY3lcIiA6IFwiTm8gY3VycmVuY2llcyBhdmFpbGFibGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgIHtjdXJyZW5jaWVzLm1hcCgoY3VycmVuY3kpID0+IChcbiAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtjdXJyZW5jeS5jb2RlfSB2YWx1ZT17Y3VycmVuY3kuY29kZX0+XG4gICAgICAgICAgICB7Y3VycmVuY3kubmFtZX0gKHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9KVxuICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICkpfVxuICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICA8L1NlbGVjdD5cbiAgKVxufVxuXG5mdW5jdGlvbiBDdXJyZW5jeUFtb3VudElucHV0KHtcbiAgY3VycmVuY2llcyxcbiAgY3VycmVuY3lDb2RlLFxuICBkaXNhYmxlZCxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdXG4gIGN1cnJlbmN5Q29kZTogc3RyaW5nXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICBjb25zdCBjdXJyZW5jeSA9IGN1cnJlbmNpZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBjdXJyZW5jeUNvZGUpXG4gIGNvbnN0IGNvZGUgPSBjdXJyZW5jeUNvZGUudG9VcHBlckNhc2UoKVxuICBjb25zdCBkZWNpbWFscyA9IGN1cnJlbmN5RGVjaW1hbERpZ2l0cyhjb2RlIHx8IFwiVVNEXCIpXG5cbiAgcmV0dXJuIChcbiAgICA8Q3VycmVuY3lJbnB1dFxuICAgICAgY29kZT17Y29kZSB8fCBcIlVTRFwifVxuICAgICAgc3ltYm9sPXtcbiAgICAgICAgY3VycmVuY3k/LnN5bWJvbF9uYXRpdmUgfHxcbiAgICAgICAgY3VycmVuY3k/LnN5bWJvbCB8fFxuICAgICAgICBjdXJyZW5jeVN5bWJvbChjb2RlIHx8IFwiVVNEXCIpXG4gICAgICB9XG4gICAgICBtaW49ezB9XG4gICAgICBkZWNpbWFsU2NhbGU9e2RlY2ltYWxzfVxuICAgICAgZGVjaW1hbHNMaW1pdD17ZGVjaW1hbHN9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBkaXNhYmxlZD17ZGlzYWJsZWQgfHwgIWN1cnJlbmN5Q29kZX1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9eyhuZXh0VmFsdWUpID0+IG9uQ2hhbmdlKG5leHRWYWx1ZSB8fCBcIlwiKX1cbiAgICAvPlxuICApXG59XG5cbmNvbnN0IGVudGl0bGVtZW50RmlsdGVycyA9IFtcbiAgeyBsYWJlbDogXCJBbGxcIiwgdmFsdWU6IFwiYWxsXCIgfSxcbiAgeyBsYWJlbDogXCJJc3N1ZWRcIiwgdmFsdWU6IFwiaXNzdWVkXCIgfSxcbiAgeyBsYWJlbDogXCJSZWRlZW1lZFwiLCB2YWx1ZTogXCJyZWRlZW1lZFwiIH0sXG4gIHsgbGFiZWw6IFwiRXhwaXJlZFwiLCB2YWx1ZTogXCJleHBpcmVkXCIgfSxcbiAgeyBsYWJlbDogXCJDYW5jZWxlZFwiLCB2YWx1ZTogXCJjYW5jZWxlZFwiIH0sXG5dIGFzIGNvbnN0XG5cbnR5cGUgRW50aXRsZW1lbnRGaWx0ZXIgPSAodHlwZW9mIGVudGl0bGVtZW50RmlsdGVycylbbnVtYmVyXVtcInZhbHVlXCJdXG5cbmZ1bmN0aW9uIFNuYXBzaG90QmxvY2soeyB0aXRsZSwgdmFsdWUgfTogeyB0aXRsZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9KSB7XG4gIHJldHVybiAoXG4gICAgPGRldGFpbHMgY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgcC0zXCI+XG4gICAgICA8c3VtbWFyeSBjbGFzc05hbWU9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LXVpLWZnLWJhc2UgdHh0LXNtYWxsLXBsdXNcIj5cbiAgICAgICAge3RpdGxlfVxuICAgICAgPC9zdW1tYXJ5PlxuICAgICAgPHByZVxuICAgICAgICBjbGFzc05hbWU9XCJtdC0zIHJvdW5kZWQtbWQgYmctdWktYmctc3VidGxlIHAtMyB0ZXh0LXVpLWZnLXN1YnRsZSB0eHQtY29tcGFjdC14c21hbGxcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIG1heEhlaWdodDogMjIwLFxuICAgICAgICAgIG92ZXJmbG93OiBcImF1dG9cIixcbiAgICAgICAgICB3aGl0ZVNwYWNlOiBcInByZS13cmFwXCIsXG4gICAgICAgICAgd29yZEJyZWFrOiBcImJyZWFrLXdvcmRcIixcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2pzb25CbG9jayh2YWx1ZSl9XG4gICAgICA8L3ByZT5cbiAgICA8L2RldGFpbHM+XG4gIClcbn1cblxuZnVuY3Rpb24gVHdvQ29sdW1uTGF5b3V0KHtcbiAgZmlyc3RDb2wsXG4gIHNlY29uZENvbCxcbn06IHtcbiAgZmlyc3RDb2w6IFJlYWN0Tm9kZVxuICBzZWNvbmRDb2w6IFJlYWN0Tm9kZVxufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteC00IGdhcC15LTMgeGw6ZmxleC1yb3cgeGw6aXRlbXMtc3RhcnRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLXktM1wiPntmaXJzdENvbH08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgbWF4LXctWzEwMCVdIGZsZXgtY29sIGdhcC15LTMgeGw6bXQtMCB4bDptYXgtdy1bNDQwcHhdXCI+XG4gICAgICAgIHtzZWNvbmRDb2x9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWN0aW9uUm93KHtcbiAgdGl0bGUsXG4gIHZhbHVlLFxufToge1xuICB0aXRsZTogc3RyaW5nXG4gIHZhbHVlOiBSZWFjdE5vZGVcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdWktZmctc3VidGxlIGdyaWQgZ3JpZC1jb2xzLTIgaXRlbXMtY2VudGVyIGdhcC14LTQgcHgtNiBweS00XCI+XG4gICAgICA8VGV4dCBzaXplPVwic21hbGxcIiB3ZWlnaHQ9XCJwbHVzXCIgbGVhZGluZz1cImNvbXBhY3RcIj5cbiAgICAgICAge3RpdGxlfVxuICAgICAgPC9UZXh0PlxuICAgICAge3R5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSA9PSBudWxsID8gKFxuICAgICAgICA8VGV4dFxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgbGVhZGluZz1cImNvbXBhY3RcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtcHJldHR5IHdoaXRlc3BhY2UtcHJlLWxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAge3ZhbHVlIHx8IFwiLVwifVxuICAgICAgICA8L1RleHQ+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTBcIj57dmFsdWV9PC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIFdpZGdldEhlYWRlcih7IHRpdGxlIH06IHsgdGl0bGU6IHN0cmluZyB9KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00XCI+XG4gICAgICA8SGVhZGluZyBsZXZlbD1cImgyXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaWRlYmFyTGluayh7XG4gIGhyZWYsXG4gIGxhYmVsLFxuICBkZXNjcmlwdGlvbixcbiAgaWNvbixcbn06IHtcbiAgaHJlZjogc3RyaW5nXG4gIGxhYmVsOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuICBpY29uPzogUmVhY3ROb2RlXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGEgaHJlZj17aHJlZn0gY2xhc3NOYW1lPVwiZ3JvdXAgb3V0bGluZS1ub25lXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTIgcHgtMiBwYi0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2hhZG93LWVsZXZhdGlvbi1jYXJkLXJlc3QgYmctdWktYmctY29tcG9uZW50IHRyYW5zaXRpb24tZmcgaG92ZXI6YmctdWktYmctY29tcG9uZW50LWhvdmVyIGFjdGl2ZTpiZy11aS1iZy1jb21wb25lbnQtcHJlc3NlZCBncm91cC1mb2N1cy12aXNpYmxlOnNoYWRvdy1ib3JkZXJzLWludGVyYWN0aXZlLXdpdGgtYWN0aXZlIHJvdW5kZWQtbWQgcHgtNCBweS0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxuICAgICAgICAgICAge2ljb24gJiYgPGRpdj57aWNvbn08L2Rpdj59XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGxlYWRpbmc9XCJjb21wYWN0XCIgd2VpZ2h0PVwicGx1c1wiPlxuICAgICAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgbGVhZGluZz1cImNvbXBhY3RcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtdWktZmctc3VidGxlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtkZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxUcmlhbmdsZVJpZ2h0TWluaSBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYT5cbiAgKVxufVxuXG5mdW5jdGlvbiBTdW1tYXJ5V2lkZ2V0KHtcbiAgbGFiZWwsXG4gIHZhbHVlLFxuICB0b25lID0gXCJncmVlblwiLFxufToge1xuICBsYWJlbDogc3RyaW5nXG4gIHZhbHVlOiBzdHJpbmdcbiAgdG9uZT86IFwiZ3JlZW5cIiB8IFwibmV1dHJhbFwiXG59KSB7XG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJweC02IHB5LTRcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1zdWJ0bGUgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtM1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPXtgaC04IHctMSByb3VuZGVkLWZ1bGwgJHtcbiAgICAgICAgICAgIHRvbmUgPT09IFwiZ3JlZW5cIlxuICAgICAgICAgICAgICA/IFwiYmctdWktdGFnLWdyZWVuLWljb25cIlxuICAgICAgICAgICAgICA6IFwiYmctdWktdGFnLW5ldXRyYWwtaWNvblwiXG4gICAgICAgICAgfWB9XG4gICAgICAgIC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIiBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLXN1YnRsZVwiPlxuICAgICAgICAgICAge2xhYmVsfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICA8VGV4dFxuICAgICAgICAgICAgd2VpZ2h0PVwicGx1c1wiXG4gICAgICAgICAgICBzaXplPVwieGxhcmdlXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRhYnVsYXItbnVtcyB0ZXh0LXVpLWZnLWJhc2UgYnJlYWstd29yZHNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt2YWx1ZX1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gQ291cG9uR2VuZXJhbFNlY3Rpb24oeyBkZXRhaWwgfTogeyBkZXRhaWw6IENvdXBvbkVudGl0bGVtZW50RGV0YWlsIH0pIHtcbiAgY29uc3QgZW50aXRsZW1lbnQgPSBkZXRhaWwuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50XG4gIGNvbnN0IGlzc3VhbmNlID0gZGV0YWlsLmNvdXBvbl9pc3N1YW5jZSB8fCBudWxsXG4gIGNvbnN0IGJlbmVmaXRTbmFwc2hvdCA9IGVudGl0bGVtZW50LmJlbmVmaXRfc25hcHNob3QgfHwgbnVsbFxuICBjb25zdCBzb3VyY2VTbmFwc2hvdCA9IGVudGl0bGVtZW50LnNvdXJjZV9zbmFwc2hvdCB8fCBudWxsXG4gIGNvbnN0IGNvZGUgPSBjb3Vwb25Db2RlKGVudGl0bGVtZW50KVxuICBjb25zdCBleHRlcm5hbCA9IGVudGl0bGVtZW50Lm9yaWdpbiA9PT0gXCJleHRlcm5hbFwiXG4gIGNvbnN0IHByb2R1Y3RMYWJlbCA9XG4gICAgc25hcHNob3RTdHJpbmcoc291cmNlU25hcHNob3QsIFwidGl0bGVcIikgfHxcbiAgICBzbmFwc2hvdFN0cmluZyhzb3VyY2VTbmFwc2hvdCwgXCJzb3VyY2VcIikgfHxcbiAgICBlbnRpdGxlbWVudC5wcm9kdWN0X2lkIHx8XG4gICAgXCJFeHRlcm5hbFwiXG4gIGNvbnN0IHZhcmlhbnRMYWJlbCA9XG4gICAgc25hcHNob3RTdHJpbmcoc291cmNlU25hcHNob3QsIFwidmFyaWFudF9pZFwiKSB8fCBlbnRpdGxlbWVudC52YXJpYW50X2lkIHx8IFwiLVwiXG4gIGNvbnN0IGlzc3VlZERhdGUgPSBlbnRpdGxlbWVudC5jcmVhdGVkX2F0IHx8IGlzc3VhbmNlPy5jcmVhdGVkX2F0IHx8IG51bGxcblxuICByZXR1cm4gKFxuICAgIDxDb250YWluZXIgY2xhc3NOYW1lPVwiZGl2aWRlLXkgcC0wXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC02IHB5LTRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0xXCI+XG4gICAgICAgICAgICA8SGVhZGluZyBjbGFzc05hbWU9XCJicmVhay1hbGxcIj4je2NvZGV9PC9IZWFkaW5nPlxuICAgICAgICAgICAge2NvZGUgIT09IFwiLVwiICYmIChcbiAgICAgICAgICAgICAgPENvcHkgY29udGVudD17Y29kZX0gY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctc3VidGxlXCI+XG4gICAgICAgICAgICB7Zm9ybWF0RnVsbERhdGUoaXNzdWVkRGF0ZSl9XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPFN0YXR1c0JhZGdlIGNvbG9yPXtlbnRpdGxlbWVudFN0YXR1c0NvbG9yKGVudGl0bGVtZW50LnN0YXR1cyl9PlxuICAgICAgICAgIHtlbnRpdGxlbWVudC5zdGF0dXN9XG4gICAgICAgIDwvU3RhdHVzQmFkZ2U+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiRGF0ZSBpc3N1ZWRcIiB2YWx1ZT17Zm9ybWF0UmVsYXRpdmVEYXRlKGlzc3VlZERhdGUpfSAvPlxuICAgICAgPFNlY3Rpb25Sb3dcbiAgICAgICAgdGl0bGU9XCJDdXN0b21lclwiXG4gICAgICAgIHZhbHVlPXtlbnRpdGxlbWVudC5lbWFpbCB8fCBlbnRpdGxlbWVudC5jdXN0b21lcl9pZCB8fCBcIi1cIn1cbiAgICAgIC8+XG4gICAgICA8U2VjdGlvblJvdyB0aXRsZT1cIk9yaWdpblwiIHZhbHVlPXtlbnRpdGxlbWVudFNvdXJjZShlbnRpdGxlbWVudCl9IC8+XG4gICAgICA8U2VjdGlvblJvd1xuICAgICAgICB0aXRsZT17ZXh0ZXJuYWwgPyBcIlNvdXJjZVwiIDogXCJDb3Vwb24gcHJvZHVjdFwifVxuICAgICAgICB2YWx1ZT17cHJvZHVjdExhYmVsfVxuICAgICAgLz5cbiAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiU2VsbGVyIHNjb3BlXCIgdmFsdWU9e2VudGl0bGVtZW50U2VsbGVyU2NvcGUoZW50aXRsZW1lbnQpfSAvPlxuICAgICAgeyFleHRlcm5hbCAmJiA8U2VjdGlvblJvdyB0aXRsZT1cIlZhcmlhbnRcIiB2YWx1ZT17dmFyaWFudExhYmVsfSAvPn1cbiAgICAgIHshZXh0ZXJuYWwgJiYgKFxuICAgICAgICA8U2VjdGlvblJvd1xuICAgICAgICAgIHRpdGxlPVwiUXVhbnRpdHlcIlxuICAgICAgICAgIHZhbHVlPXtTdHJpbmcoXG4gICAgICAgICAgICBzbmFwc2hvdE51bWJlcihzb3VyY2VTbmFwc2hvdCwgXCJxdWFudGl0eVwiKSA/PyBpc3N1YW5jZT8ucXVhbnRpdHkgPz8gMSxcbiAgICAgICAgICApfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgIHRpdGxlPVwiQmVuZWZpdFwiXG4gICAgICAgIHZhbHVlPXtiZW5lZml0U25hcHNob3RMYWJlbChiZW5lZml0U25hcHNob3QpfVxuICAgICAgLz5cbiAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgIHRpdGxlPVwiRXhwaXJhdGlvbiBwb2xpY3lcIlxuICAgICAgICB2YWx1ZT17ZXhwaXJhdGlvblBvbGljeUxhYmVsKGJlbmVmaXRTbmFwc2hvdCl9XG4gICAgICAvPlxuICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJFeHBpcmF0aW9uIERhdGVcIiB2YWx1ZT17Zm9ybWF0RGF0ZShlbnRpdGxlbWVudC5leHBpcmVzX2F0KX0gLz5cbiAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiUmVkZWVtZWQgRGF0ZVwiIHZhbHVlPXtmb3JtYXREYXRlKGVudGl0bGVtZW50LnJlZGVlbWVkX2F0KX0gLz5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBSZWxhdGVkT3JkZXJTZWN0aW9uKHtcbiAgYXBpQmFzZSxcbiAgZGV0YWlsLFxufToge1xuICBhcGlCYXNlOiBBcGlCYXNlXG4gIGRldGFpbDogQ291cG9uRW50aXRsZW1lbnREZXRhaWxcbn0pIHtcbiAgY29uc3QgZW50aXRsZW1lbnQgPSBkZXRhaWwuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50XG4gIGNvbnN0IG9yZGVyID0gZGV0YWlsLm9yZGVyIHx8IG51bGxcbiAgY29uc3Qgb3JkZXJJZCA9IG9yZGVyPy5pZCB8fCBlbnRpdGxlbWVudC5vcmRlcl9pZFxuICBpZiAoIW9yZGVySWQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cInAtMFwiPlxuICAgICAgPFdpZGdldEhlYWRlciB0aXRsZT1cIlJlbGF0ZWQgT3JkZXJcIiAvPlxuICAgICAgPFNpZGViYXJMaW5rXG4gICAgICAgIGhyZWY9e29yZGVyRGV0YWlsUGF0aChhcGlCYXNlLCBvcmRlcklkKX1cbiAgICAgICAgbGFiZWw9e29yZGVyID8gb3JkZXJEaXNwbGF5SWQob3JkZXIpIDogb3JkZXJJZH1cbiAgICAgICAgZGVzY3JpcHRpb249e1xuICAgICAgICAgIG9yZGVyPy5jcmVhdGVkX2F0XG4gICAgICAgICAgICA/IGBPcmRlciBwbGFjZWQgJHtmb3JtYXRSZWxhdGl2ZURhdGUob3JkZXIuY3JlYXRlZF9hdCl9YFxuICAgICAgICAgICAgOiBcIlB1cmNoYXNlZCBjb3Vwb24gb3JkZXJcIlxuICAgICAgICB9XG4gICAgICAgIGljb249ezxTaG9wcGluZ0NhcnQgLz59XG4gICAgICAvPlxuICAgIDwvQ29udGFpbmVyPlxuICApXG59XG5cbmZ1bmN0aW9uIENvdXBvblNuYXBzaG90c1NlY3Rpb24oe1xuICBkZXRhaWwsXG59OiB7XG4gIGRldGFpbDogQ291cG9uRW50aXRsZW1lbnREZXRhaWxcbn0pIHtcbiAgY29uc3QgZW50aXRsZW1lbnQgPSBkZXRhaWwuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50XG4gIGNvbnN0IGlzc3VhbmNlID0gZGV0YWlsLmNvdXBvbl9pc3N1YW5jZSB8fCBudWxsXG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cInAtMFwiPlxuICAgICAgPFdpZGdldEhlYWRlciB0aXRsZT1cIkpTT05cIiAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTMgcHgtNiBwYi02XCI+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrXG4gICAgICAgICAgdGl0bGU9XCJCZW5lZml0IHNuYXBzaG90XCJcbiAgICAgICAgICB2YWx1ZT17ZW50aXRsZW1lbnQuYmVuZWZpdF9zbmFwc2hvdH1cbiAgICAgICAgLz5cbiAgICAgICAgPFNuYXBzaG90QmxvY2tcbiAgICAgICAgICB0aXRsZT1cIlNvdXJjZSBzbmFwc2hvdFwiXG4gICAgICAgICAgdmFsdWU9e2VudGl0bGVtZW50LnNvdXJjZV9zbmFwc2hvdH1cbiAgICAgICAgLz5cbiAgICAgICAgPFNuYXBzaG90QmxvY2tcbiAgICAgICAgICB0aXRsZT1cIklzc3VhbmNlIGNvbmZpZyBzbmFwc2hvdFwiXG4gICAgICAgICAgdmFsdWU9e2lzc3VhbmNlPy5jb25maWdfc25hcHNob3R9XG4gICAgICAgIC8+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrIHRpdGxlPVwiU2VsbGVyIHRhcmdldHNcIiB2YWx1ZT17ZW50aXRsZW1lbnQuc2VsbGVyX3RhcmdldHN9IC8+XG4gICAgICAgIDxTbmFwc2hvdEJsb2NrIHRpdGxlPVwiTWV0YWRhdGFcIiB2YWx1ZT17ZW50aXRsZW1lbnQubWV0YWRhdGF9IC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBDb3Vwb25TdW1tYXJ5U2VjdGlvbnMoe1xuICBkZXRhaWwsXG59OiB7XG4gIGRldGFpbDogQ291cG9uRW50aXRsZW1lbnREZXRhaWxcbn0pIHtcbiAgY29uc3QgZW50aXRsZW1lbnQgPSBkZXRhaWwuY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50XG4gIGNvbnN0IGlzc3VhbmNlID0gZGV0YWlsLmNvdXBvbl9pc3N1YW5jZSB8fCBudWxsXG4gIGNvbnN0IGJlbmVmaXRTbmFwc2hvdCA9IGVudGl0bGVtZW50LmJlbmVmaXRfc25hcHNob3QgfHwgbnVsbFxuICBjb25zdCBzb3VyY2VTbmFwc2hvdCA9IGVudGl0bGVtZW50LnNvdXJjZV9zbmFwc2hvdCB8fCBudWxsXG4gIGNvbnN0IG9yZGVyID0gZGV0YWlsLm9yZGVyIHx8IG51bGxcbiAgY29uc3QgbGluZVRvdGFsID0gc25hcHNob3ROdW1iZXIoc291cmNlU25hcHNob3QsIFwidG90YWxcIilcbiAgY29uc3QgZXh0ZXJuYWwgPSBlbnRpdGxlbWVudC5vcmlnaW4gPT09IFwiZXh0ZXJuYWxcIlxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxTdW1tYXJ5V2lkZ2V0XG4gICAgICAgIGxhYmVsPVwiQmVuZWZpdFwiXG4gICAgICAgIHZhbHVlPXtiZW5lZml0U25hcHNob3RMYWJlbChiZW5lZml0U25hcHNob3QpfVxuICAgICAgLz5cbiAgICAgIHshZXh0ZXJuYWwgJiYgKFxuICAgICAgICA8U3VtbWFyeVdpZGdldFxuICAgICAgICAgIGxhYmVsPVwiTGluZSBUb3RhbFwiXG4gICAgICAgICAgdmFsdWU9e2Zvcm1hdFNuYXBzaG90QW1vdW50KGxpbmVUb3RhbCwgb3JkZXI/LmN1cnJlbmN5X2NvZGUpfVxuICAgICAgICAgIHRvbmU9XCJuZXV0cmFsXCJcbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICB7IWV4dGVybmFsICYmIChcbiAgICAgICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgICAgICA8V2lkZ2V0SGVhZGVyIHRpdGxlPVwiQ2FtcGFpZ25cIiAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93IHRpdGxlPVwiQ2FtcGFpZ25cIiB2YWx1ZT17Y2FtcGFpZ25TbmFwc2hvdExhYmVsKGJlbmVmaXRTbmFwc2hvdCl9IC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJQcm9tb3Rpb25cIiB2YWx1ZT17cHJvbW90aW9uU25hcHNob3RMYWJlbChiZW5lZml0U25hcHNob3QpfSAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgICAgICB0aXRsZT1cIlByb21vdGlvbiBzdGF0dXNcIlxuICAgICAgICAgICAgdmFsdWU9e3NuYXBzaG90U3RyaW5nKGJlbmVmaXRTbmFwc2hvdCwgXCJwcm9tb3Rpb25fc3RhdHVzXCIpIHx8IFwiLVwifVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQ29udGFpbmVyPlxuICAgICAgKX1cbiAgICAgIHshZXh0ZXJuYWwgJiYgKFxuICAgICAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgICAgIDxXaWRnZXRIZWFkZXIgdGl0bGU9XCJJc3N1YW5jZVwiIC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJTdGF0dXNcIiB2YWx1ZT17aXNzdWFuY2U/LnN0YXR1cyB8fCBcIi1cIn0gLz5cbiAgICAgICAgICA8U2VjdGlvblJvd1xuICAgICAgICAgICAgdGl0bGU9XCJJc3N1ZWQgLyBmYWlsZWRcIlxuICAgICAgICAgICAgdmFsdWU9e1xuICAgICAgICAgICAgICBpc3N1YW5jZVxuICAgICAgICAgICAgICAgID8gYCR7aXNzdWFuY2UuaXNzdWVkX2NvdW50ID8/IDB9IC8gJHtpc3N1YW5jZS5mYWlsZWRfY291bnQgPz8gMH1gXG4gICAgICAgICAgICAgICAgOiBcIi1cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPFNlY3Rpb25Sb3cgdGl0bGU9XCJDb25maWdcIiB2YWx1ZT17ZW50aXRsZW1lbnQuY29uZmlnX2lkIHx8IFwiLVwifSAvPlxuICAgICAgICAgIDxTZWN0aW9uUm93XG4gICAgICAgICAgICB0aXRsZT1cIlZhcmlhbnQgY29uZmlnXCJcbiAgICAgICAgICAgIHZhbHVlPXtlbnRpdGxlbWVudC52YXJpYW50X2NvbmZpZ19pZCB8fCBcIi1cIn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L0NvbnRhaW5lcj5cbiAgICAgICl9XG4gICAgPC8+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvdXBvbkRldGFpbFBhZ2VWaWV3KHsgYXBpQmFzZSB9OiB7IGFwaUJhc2U6IEFwaUJhc2UgfSkge1xuICBjb25zdCBpZCA9IGN1cnJlbnRDb3Vwb25EZXRhaWxJZChhcGlCYXNlKVxuICBjb25zdCBbZGV0YWlsLCBzZXREZXRhaWxdID0gdXNlU3RhdGU8Q291cG9uRW50aXRsZW1lbnREZXRhaWwgfCBudWxsPihudWxsKVxuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKVxuICBjb25zdCBbbG9hZEVycm9yLCBzZXRMb2FkRXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBhY3RpdmUgPSB0cnVlXG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZCgpIHtcbiAgICAgIGlmICghaWQpIHtcbiAgICAgICAgc2V0TG9hZEVycm9yKFwiTWlzc2luZyBjb3Vwb24gaWRcIilcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICAgIHNldExvYWRFcnJvcihudWxsKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgYXBpRmV0Y2g8Q291cG9uRW50aXRsZW1lbnREZXRhaWw+KFxuICAgICAgICAgIGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0cy9lbnRpdGxlbWVudHMvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsXG4gICAgICAgIClcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIHNldERldGFpbChwYXlsb2FkKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgIDogXCJGYWlsZWQgdG8gbG9hZCBjb3Vwb24gZGV0YWlsc1wiXG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICBzZXRMb2FkRXJyb3IobWVzc2FnZSlcbiAgICAgICAgICB0b2FzdC5lcnJvcihtZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZvaWQgbG9hZCgpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgYWN0aXZlID0gZmFsc2VcbiAgICB9XG4gIH0sIFthcGlCYXNlLCBpZF0pXG5cbiAgaWYgKGxvYWRpbmcpIHtcbiAgICByZXR1cm4gPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9XCJMb2FkaW5nIGNvdXBvblwiIC8+XG4gIH1cblxuICBpZiAobG9hZEVycm9yKSB7XG4gICAgcmV0dXJuIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPXtsb2FkRXJyb3J9IC8+XG4gIH1cblxuICBpZiAoIWRldGFpbCkge1xuICAgIHJldHVybiA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT1cIkNvdXBvbiBub3QgZm91bmRcIiAvPlxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8VHdvQ29sdW1uTGF5b3V0XG4gICAgICBmaXJzdENvbD17XG4gICAgICAgIDw+XG4gICAgICAgICAgPENvdXBvbkdlbmVyYWxTZWN0aW9uIGRldGFpbD17ZGV0YWlsfSAvPlxuICAgICAgICAgIDxSZWxhdGVkT3JkZXJTZWN0aW9uIGFwaUJhc2U9e2FwaUJhc2V9IGRldGFpbD17ZGV0YWlsfSAvPlxuICAgICAgICAgIDxDb3Vwb25TbmFwc2hvdHNTZWN0aW9uIGRldGFpbD17ZGV0YWlsfSAvPlxuICAgICAgICA8Lz5cbiAgICAgIH1cbiAgICAgIHNlY29uZENvbD17PENvdXBvblN1bW1hcnlTZWN0aW9ucyBkZXRhaWw9e2RldGFpbH0gLz59XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBFbnRpdGxlbWVudHNUYWJsZSh7XG4gIGVudGl0bGVtZW50cyxcbiAgbG9hZGluZyxcbiAgZXJyb3IsXG4gIG9uT3Blbixcbn06IHtcbiAgZW50aXRsZW1lbnRzOiBDb3Vwb25FbnRpdGxlbWVudFtdXG4gIGxvYWRpbmc6IGJvb2xlYW5cbiAgZXJyb3I6IHN0cmluZyB8IG51bGxcbiAgb25PcGVuOiAoZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50KSA9PiB2b2lkXG59KSB7XG4gIGlmIChsb2FkaW5nKSB7XG4gICAgcmV0dXJuIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPVwiTG9hZGluZyBjb3Vwb25zXCIgLz5cbiAgfVxuICBpZiAoZXJyb3IpIHtcbiAgICByZXR1cm4gPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9e2Vycm9yfSAvPlxuICB9XG4gIGlmICghZW50aXRsZW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiAoXG4gICAgICA8Q291cG9uRW1wdHlTdGF0ZVxuICAgICAgICB0aXRsZT1cIk5vIGNvdXBvbnMgZm91bmRcIlxuICAgICAgICBkZXNjcmlwdGlvbj1cIlB1cmNoYXNlZCBjb3Vwb25zIHdpbGwgYXBwZWFyIGhlcmUgYWZ0ZXIgdGhleSBhcmUgaXNzdWVkLlwiXG4gICAgICAvPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFRhYmxlPlxuICAgICAgPFRhYmxlLkhlYWRlcj5cbiAgICAgICAgPFRhYmxlLlJvdz5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5TdGF0dXM8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+Q29kZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5EYXRlIGlzc3VlZDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5PcmRlcjwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5DdXN0b21lcjwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5PcmlnaW48L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+U2VsbGVyIHNjb3BlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPlNvdXJjZTwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5FeHBpcmVzPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgIDwvVGFibGUuSGVhZGVyPlxuICAgICAgPFRhYmxlLkJvZHk+XG4gICAgICAgIHtlbnRpdGxlbWVudHMubWFwKChpdGVtKSA9PiAoXG4gICAgICAgICAgPFRhYmxlLlJvd1xuICAgICAgICAgICAga2V5PXtpdGVtLmlkfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiY3Vyc29yLXBvaW50ZXIgaG92ZXI6YmctdWktYmctc3VidGxlXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uT3BlbihpdGVtKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgPFN0YXR1c0JhZGdlIGNvbG9yPXtlbnRpdGxlbWVudFN0YXR1c0NvbG9yKGl0ZW0uc3RhdHVzKX0+XG4gICAgICAgICAgICAgICAge2l0ZW0uc3RhdHVzfVxuICAgICAgICAgICAgICA8L1N0YXR1c0JhZGdlPlxuICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2l0ZW0uY29kZSB8fCBpdGVtLnNoYXJlZF9jb2RlIHx8IFwiLVwifTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsIHRpdGxlPXtmb3JtYXRGdWxsRGF0ZShpdGVtLmNyZWF0ZWRfYXQpfT5cbiAgICAgICAgICAgICAge2Zvcm1hdFJlbGF0aXZlRGF0ZShpdGVtLmNyZWF0ZWRfYXQpfVxuICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2l0ZW0ub3JkZXJfaWQgfHwgXCItXCJ9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2l0ZW0uZW1haWwgfHwgaXRlbS5jdXN0b21lcl9pZCB8fCBcIi1cIn08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICA8VGFibGUuQ2VsbD57ZW50aXRsZW1lbnRTb3VyY2UoaXRlbSl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2VudGl0bGVtZW50U2VsbGVyU2NvcGUoaXRlbSl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgIHtzbmFwc2hvdFN0cmluZyhpdGVtLnNvdXJjZV9zbmFwc2hvdCwgXCJ0aXRsZVwiKSB8fFxuICAgICAgICAgICAgICAgIHNuYXBzaG90U3RyaW5nKGl0ZW0uc291cmNlX3NuYXBzaG90LCBcInNvdXJjZVwiKSB8fFxuICAgICAgICAgICAgICAgIGl0ZW0ucHJvZHVjdF9pZCB8fFxuICAgICAgICAgICAgICAgIFwiRXh0ZXJuYWxcIn1cbiAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgIDxUYWJsZS5DZWxsPntmb3JtYXREYXRlKGl0ZW0uZXhwaXJlc19hdCl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICApKX1cbiAgICAgIDwvVGFibGUuQm9keT5cbiAgICA8L1RhYmxlPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb3Vwb25zUGFnZVZpZXcoe1xuICBhcGlCYXNlLFxuICB0aXRsZSxcbn06IHtcbiAgYXBpQmFzZTogQXBpQmFzZVxuICB0aXRsZTogc3RyaW5nXG59KSB7XG4gIGNvbnN0IFtlbnRpdGxlbWVudHMsIHNldEVudGl0bGVtZW50c10gPSB1c2VTdGF0ZTxDb3Vwb25FbnRpdGxlbWVudFtdPihbXSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtmaWx0ZXIsIHNldEZpbHRlcl0gPSB1c2VTdGF0ZTxFbnRpdGxlbWVudEZpbHRlcj4oXCJhbGxcIilcblxuICBjb25zdCBsb2FkID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIHNldExvYWRpbmcodHJ1ZSlcbiAgICBzZXRMb2FkRXJyb3IobnVsbClcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGFwaUZldGNoPHtcbiAgICAgICAgY3VzdG9tZXJfY291cG9uX2VudGl0bGVtZW50czogQ291cG9uRW50aXRsZW1lbnRbXVxuICAgICAgfT4oYCR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzL2VudGl0bGVtZW50c2ApXG4gICAgICBzZXRFbnRpdGxlbWVudHMocGF5bG9hZC5jdXN0b21lcl9jb3Vwb25fZW50aXRsZW1lbnRzIHx8IFtdKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIkZhaWxlZCB0byBsb2FkIGNvdXBvbnNcIlxuICAgICAgc2V0TG9hZEVycm9yKG1lc3NhZ2UpXG4gICAgICB0b2FzdC5lcnJvcihtZXNzYWdlKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgIH1cbiAgfSwgW2FwaUJhc2VdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdm9pZCBsb2FkKClcbiAgfSwgW2xvYWRdKVxuXG4gIGNvbnN0IG9wZW5EZXRhaWwgPSB1c2VDYWxsYmFjayhcbiAgICAoZW50aXRsZW1lbnQ6IENvdXBvbkVudGl0bGVtZW50KSA9PiB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGNvdXBvbkRldGFpbFBhdGgoYXBpQmFzZSwgZW50aXRsZW1lbnQuaWQpKVxuICAgIH0sXG4gICAgW2FwaUJhc2VdLFxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00XCI+XG4gICAgICAgIDxIZWFkaW5nIGxldmVsPVwiaDFcIj57dGl0bGV9PC9IZWFkaW5nPlxuICAgICAgICA8QnV0dG9uIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBvbkNsaWNrPXsoKSA9PiB2b2lkIGxvYWQoKX0+XG4gICAgICAgICAgPEFycm93UGF0aCAvPlxuICAgICAgICAgIFJlZnJlc2hcbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxUYWJzXG4gICAgICAgIHZhbHVlPXtmaWx0ZXJ9XG4gICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT4gc2V0RmlsdGVyKHZhbHVlIGFzIEVudGl0bGVtZW50RmlsdGVyKX1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJweC02IHB5LTIgYm9yZGVyLWJcIj5cbiAgICAgICAgICA8VGFicy5MaXN0PlxuICAgICAgICAgICAge2VudGl0bGVtZW50RmlsdGVycy5tYXAoKGl0ZW0pID0+IChcbiAgICAgICAgICAgICAgPFRhYnMuVHJpZ2dlciBrZXk9e2l0ZW0udmFsdWV9IHZhbHVlPXtpdGVtLnZhbHVlfT5cbiAgICAgICAgICAgICAgICB7aXRlbS5sYWJlbH1cbiAgICAgICAgICAgICAgPC9UYWJzLlRyaWdnZXI+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgICA8L1RhYnMuTGlzdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtlbnRpdGxlbWVudEZpbHRlcnMubWFwKChpdGVtKSA9PiAoXG4gICAgICAgICAgPFRhYnMuQ29udGVudCBrZXk9e2l0ZW0udmFsdWV9IHZhbHVlPXtpdGVtLnZhbHVlfT5cbiAgICAgICAgICAgIDxFbnRpdGxlbWVudHNUYWJsZVxuICAgICAgICAgICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICAgICAgICBlcnJvcj17bG9hZEVycm9yfVxuICAgICAgICAgICAgICBvbk9wZW49e29wZW5EZXRhaWx9XG4gICAgICAgICAgICAgIGVudGl0bGVtZW50cz17XG4gICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9PT0gXCJhbGxcIlxuICAgICAgICAgICAgICAgICAgPyBlbnRpdGxlbWVudHNcbiAgICAgICAgICAgICAgICAgIDogZW50aXRsZW1lbnRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAoZW50aXRsZW1lbnQpID0+IGVudGl0bGVtZW50LnN0YXR1cyA9PT0gaXRlbS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvVGFicy5Db250ZW50PlxuICAgICAgICApKX1cbiAgICAgIDwvVGFicz5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gQ291cG9uUHJvZHVjdHNQYWdlVmlldyh7XG4gIGFwaUJhc2UsXG4gIHRpdGxlLFxuICBhbGxvd1Byb21vdGlvbk1pcnJvciA9IGZhbHNlLFxufToge1xuICBhcGlCYXNlOiBBcGlCYXNlXG4gIHRpdGxlOiBzdHJpbmdcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3I/OiBib29sZWFuXG59KSB7XG4gIHJldHVybiAoXG4gICAgPENvdXBvblByb2R1Y3RzUGFnZVxuICAgICAgYXBpQmFzZT17YXBpQmFzZX1cbiAgICAgIHRpdGxlPXt0aXRsZX1cbiAgICAgIGFsbG93UHJvbW90aW9uTWlycm9yPXthbGxvd1Byb21vdGlvbk1pcnJvcn1cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIExlZ2FjeUNvdXBvblByb2R1Y3RzUGFnZVZpZXcoe1xuICBhcGlCYXNlLFxuICB0aXRsZSxcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgPSBmYWxzZSxcbn06IHtcbiAgYXBpQmFzZTogQXBpQmFzZVxuICB0aXRsZTogc3RyaW5nXG4gIGFsbG93UHJvbW90aW9uTWlycm9yPzogYm9vbGVhblxufSkge1xuICBjb25zdCBbcHJvZHVjdHMsIHNldFByb2R1Y3RzXSA9IHVzZVN0YXRlPENvdXBvblByb2R1Y3RSb3dbXT4oW10pXG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPE9wdGlvbnNQYXlsb2FkPih7fSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFttb2RhbE9wZW4sIHNldE1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3NhdmluZywgc2V0U2F2aW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbYWN0aXZlU3RlcCwgc2V0QWN0aXZlU3RlcF0gPSB1c2VTdGF0ZTxXaXphcmRTdGVwPihcImRldGFpbHNcIilcbiAgY29uc3QgW3Byb2R1Y3RGb3JtLCBzZXRQcm9kdWN0Rm9ybV0gPSB1c2VTdGF0ZTxQcm9kdWN0Rm9ybVN0YXRlPihlbXB0eVByb2R1Y3QpXG4gIGNvbnN0IFtjb3Vwb25Gb3JtLCBzZXRDb3Vwb25Gb3JtXSA9IHVzZVN0YXRlPENvdXBvbkZvcm1TdGF0ZT4oZW1wdHlDb3Vwb24pXG4gIGNvbnN0IFtjYW1wYWlnbkZvcm0sIHNldENhbXBhaWduRm9ybV0gPVxuICAgIHVzZVN0YXRlPENhbXBhaWduRm9ybVN0YXRlPihlbXB0eUNhbXBhaWduKVxuICBjb25zdCBwcm9tcHQgPSB1c2VQcm9tcHQoKVxuXG4gIGNvbnN0IGNvdXBvbkJhc2UgPSBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHNgXG5cbiAgY29uc3QgbG9hZCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0TG9hZEVycm9yKG51bGwpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtwcm9kdWN0c1BheWxvYWQsIG9wdGlvbnNQYXlsb2FkXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgYXBpRmV0Y2g8eyBjb3Vwb25fcHJvZHVjdHM6IENvdXBvblByb2R1Y3RSb3dbXSB9Pihjb3Vwb25CYXNlKSxcbiAgICAgICAgYXBpRmV0Y2g8T3B0aW9uc1BheWxvYWQ+KGAke2NvdXBvbkJhc2V9L29wdGlvbnNgKSxcbiAgICAgIF0pXG4gICAgICBzZXRQcm9kdWN0cyhwcm9kdWN0c1BheWxvYWQuY291cG9uX3Byb2R1Y3RzIHx8IFtdKVxuICAgICAgc2V0T3B0aW9ucyhvcHRpb25zUGF5bG9hZCB8fCB7fSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFwiRmFpbGVkIHRvIGxvYWQgY291cG9uIHByb2R1Y3RzXCJcbiAgICAgIHNldExvYWRFcnJvcihtZXNzYWdlKVxuICAgICAgdG9hc3QuZXJyb3IobWVzc2FnZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFtjb3Vwb25CYXNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZvaWQgbG9hZCgpXG4gIH0sIFtsb2FkXSlcblxuICBjb25zdCBvcHRpb25EZWZhdWx0cyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHNhbGVzX2NoYW5uZWxfaWQ6IG9wdGlvbnMuc2FsZXNfY2hhbm5lbHM/LlswXT8uaWQgfHwgXCJcIixcbiAgICAgIGN1cnJlbmN5X2NvZGU6XG4gICAgICAgIG9wdGlvbnMuY3VycmVuY2llcz8uZmluZCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmlzX2RlZmF1bHQpPy5jb2RlIHx8XG4gICAgICAgIG9wdGlvbnMuY3VycmVuY2llcz8uWzBdPy5jb2RlIHx8XG4gICAgICAgIFwiXCIsXG4gICAgfSksXG4gICAgW29wdGlvbnNdLFxuICApXG5cbiAgY29uc3QgY3VycmVuY2llcyA9IG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXVxuICBjb25zdCBzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgU2V0KGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSkpLFxuICAgIFtjdXJyZW5jaWVzXSxcbiAgKVxuXG4gIGNvbnN0IHVwZGF0ZVByb2R1Y3QgPVxuICAgIChmaWVsZDoga2V5b2YgUHJvZHVjdEZvcm1TdGF0ZSkgPT5cbiAgICAoZXZlbnQ6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50PikgPT4ge1xuICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgIFtmaWVsZF06IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgIH0pKVxuICAgIH1cblxuICBjb25zdCB1cGRhdGVDb3Vwb24gPVxuICAgIChmaWVsZDoga2V5b2YgQ291cG9uRm9ybVN0YXRlKSA9PlxuICAgIChldmVudDogQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIFtmaWVsZF06IGV2ZW50LnRhcmdldC52YWx1ZSB9KSlcbiAgICB9XG5cbiAgY29uc3QgdXBkYXRlQ2FtcGFpZ24gPVxuICAgIChmaWVsZDoga2V5b2YgQ2FtcGFpZ25Gb3JtU3RhdGUpID0+XG4gICAgKGV2ZW50OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgc2V0Q2FtcGFpZ25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICBbZmllbGRdOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICB9KSlcbiAgICB9XG5cbiAgZnVuY3Rpb24gb3BlbkNyZWF0ZSgpIHtcbiAgICBjb25zdCBjdXJyZW5jeUNvZGUgPSBvcHRpb25EZWZhdWx0cy5jdXJyZW5jeV9jb2RlXG4gICAgc2V0UHJvZHVjdEZvcm0oe1xuICAgICAgLi4uZW1wdHlQcm9kdWN0LFxuICAgICAgLi4ub3B0aW9uRGVmYXVsdHMsXG4gICAgICB2YXJpYW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgLi4uZW1wdHlWYXJpYW50LFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICAgICAgICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pXG4gICAgc2V0Q291cG9uRm9ybSh7IC4uLmVtcHR5Q291cG9uLCBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUgfSlcbiAgICBzZXRDYW1wYWlnbkZvcm0oZW1wdHlDYW1wYWlnbilcbiAgICBzZXRBY3RpdmVTdGVwKFwiZGV0YWlsc1wiKVxuICAgIHNldE1vZGFsT3Blbih0cnVlKVxuICB9XG5cbiAgZnVuY3Rpb24gb3BlbkVkaXQocm93OiBDb3Vwb25Qcm9kdWN0Um93KSB7XG4gICAgY29uc3QgZm9ybXMgPSBmb3JtRnJvbVJvdyhyb3csIG9wdGlvbkRlZmF1bHRzLmN1cnJlbmN5X2NvZGUpXG4gICAgc2V0UHJvZHVjdEZvcm0oe1xuICAgICAgLi4uZm9ybXMucHJvZHVjdCxcbiAgICAgIHZhcmlhbnRzOiBmb3Jtcy5wcm9kdWN0LnZhcmlhbnRzLmxlbmd0aFxuICAgICAgICA/IGZvcm1zLnByb2R1Y3QudmFyaWFudHNcbiAgICAgICAgOiBbeyAuLi5lbXB0eVZhcmlhbnQgfV0sXG4gICAgfSlcbiAgICBzZXRDb3Vwb25Gb3JtKGZvcm1zLmNvdXBvbilcbiAgICBzZXRDYW1wYWlnbkZvcm0oZm9ybXMuY2FtcGFpZ24pXG4gICAgc2V0QWN0aXZlU3RlcChcImRldGFpbHNcIilcbiAgICBzZXRNb2RhbE9wZW4odHJ1ZSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFZhcmlhbnQoaW5kZXg6IG51bWJlciwgcGF0Y2g6IFBhcnRpYWw8VmFyaWFudEZvcm1TdGF0ZT4pIHtcbiAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICB2YXJpYW50czogY3VycmVudC52YXJpYW50cy5tYXAoKHZhcmlhbnQsIHZhcmlhbnRJbmRleCkgPT5cbiAgICAgICAgdmFyaWFudEluZGV4ID09PSBpbmRleCA/IHsgLi4udmFyaWFudCwgLi4ucGF0Y2ggfSA6IHZhcmlhbnQsXG4gICAgICApLFxuICAgIH0pKVxuICB9XG5cbiAgZnVuY3Rpb24gYWRkVmFyaWFudCgpIHtcbiAgICBjb25zdCBjdXJyZW5jeUNvZGUgPVxuICAgICAgY291cG9uRm9ybS5jdXJyZW5jeV9jb2RlIHx8IG9wdGlvbkRlZmF1bHRzLmN1cnJlbmN5X2NvZGVcbiAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICB2YXJpYW50czogW1xuICAgICAgICAuLi5jdXJyZW50LnZhcmlhbnRzLFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZW1wdHlWYXJpYW50LFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICAgICAgICBvdmVycmlkZV9jdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pKVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlVmFyaWFudChpbmRleDogbnVtYmVyKSB7XG4gICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAuLi5jdXJyZW50LFxuICAgICAgdmFyaWFudHM6IGN1cnJlbnQudmFyaWFudHMuZmlsdGVyKFxuICAgICAgICAoXywgdmFyaWFudEluZGV4KSA9PiB2YXJpYW50SW5kZXggIT09IGluZGV4LFxuICAgICAgKSxcbiAgICB9KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIHByb2R1Y3RQYXlsb2FkKGluY2x1ZGVWYXJpYW50czogYm9vbGVhbikge1xuICAgIGNvbnN0IHByb2R1Y3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgdGl0bGU6IHByb2R1Y3RGb3JtLnRpdGxlLFxuICAgICAgc3VidGl0bGU6IHByb2R1Y3RGb3JtLnN1YnRpdGxlIHx8IG51bGwsXG4gICAgICBoYW5kbGU6IHByb2R1Y3RGb3JtLmhhbmRsZSB8fCBudWxsLFxuICAgICAgZGVzY3JpcHRpb246IHByb2R1Y3RGb3JtLmRlc2NyaXB0aW9uIHx8IG51bGwsXG4gICAgICBzdGF0dXM6IHByb2R1Y3RGb3JtLnN0YXR1cyxcbiAgICAgIHRodW1ibmFpbDogcHJvZHVjdEZvcm0udGh1bWJuYWlsIHx8IG51bGwsXG4gICAgICBkaXNjb3VudGFibGU6IHByb2R1Y3RGb3JtLmRpc2NvdW50YWJsZSxcbiAgICAgIHR5cGVfaWQ6IHByb2R1Y3RGb3JtLnR5cGVfaWQgfHwgbnVsbCxcbiAgICAgIGNvbGxlY3Rpb25faWQ6IHByb2R1Y3RGb3JtLmNvbGxlY3Rpb25faWQgfHwgbnVsbCxcbiAgICAgIGNhdGVnb3JpZXM6IHByb2R1Y3RGb3JtLmNhdGVnb3J5X2lkXG4gICAgICAgID8gW3sgaWQ6IHByb2R1Y3RGb3JtLmNhdGVnb3J5X2lkIH1dXG4gICAgICAgIDogW10sXG4gICAgICB0YWdzOiBwcm9kdWN0Rm9ybS50YWdfaWQgPyBbeyBpZDogcHJvZHVjdEZvcm0udGFnX2lkIH1dIDogW10sXG4gICAgICBzYWxlc19jaGFubmVsczogcHJvZHVjdEZvcm0uc2FsZXNfY2hhbm5lbF9pZFxuICAgICAgICA/IFt7IGlkOiBwcm9kdWN0Rm9ybS5zYWxlc19jaGFubmVsX2lkIH1dXG4gICAgICAgIDogW10sXG4gICAgfVxuXG4gICAgaWYgKGluY2x1ZGVWYXJpYW50cykge1xuICAgICAgcHJvZHVjdC52YXJpYW50cyA9IHByb2R1Y3RGb3JtLnZhcmlhbnRzLm1hcCgodmFyaWFudCkgPT4gKHtcbiAgICAgICAgdGl0bGU6IHZhcmlhbnQudGl0bGUsXG4gICAgICAgIHNrdTogdmFyaWFudC5za3UgfHwgbnVsbCxcbiAgICAgICAgbWFuYWdlX2ludmVudG9yeTogZmFsc2UsXG4gICAgICAgIGFsbG93X2JhY2tvcmRlcjogdHJ1ZSxcbiAgICAgICAgcHJpY2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY3VycmVuY3lfY29kZTogdmFyaWFudC5jdXJyZW5jeV9jb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgYW1vdW50OiBOdW1iZXIodmFyaWFudC5hbW91bnQpIHx8IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pKVxuICAgIH1cblxuICAgIHJldHVybiBwcm9kdWN0XG4gIH1cblxuICBmdW5jdGlvbiB2YXJpYW50T3ZlcnJpZGVzKCkge1xuICAgIHJldHVybiBwcm9kdWN0Rm9ybS52YXJpYW50c1xuICAgICAgLm1hcCgodmFyaWFudCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKCF2YXJpYW50Lm92ZXJyaWRlX2VuYWJsZWQpIHJldHVybiBudWxsXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmFyaWFudF9pbmRleDogaW5kZXgsXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICBiZW5lZml0X3R5cGU6IHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlLFxuICAgICAgICAgIGFtb3VudDpcbiAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiXG4gICAgICAgICAgICAgID8gbnVtYmVyT3JOdWxsKHZhcmlhbnQub3ZlcnJpZGVfYW1vdW50KVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgcGVyY2VudGFnZTpcbiAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIlxuICAgICAgICAgICAgICA/IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX3BlcmNlbnRhZ2UpXG4gICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBjdXJyZW5jeV9jb2RlOlxuICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgPyB2YXJpYW50Lm92ZXJyaWRlX2N1cnJlbmN5X2NvZGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgICAgICBjb3Vwb25Gb3JtLmN1cnJlbmN5X2NvZGVcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVGb3JtKCkge1xuICAgIGlmICghcHJvZHVjdEZvcm0udGl0bGUudHJpbSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9kdWN0IHRpdGxlIGlzIHJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmICghcHJvZHVjdEZvcm0uaWQgJiYgIXByb2R1Y3RGb3JtLnZhcmlhbnRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXQgbGVhc3Qgb25lIHByb2R1Y3QgdmFyaWFudCBpcyByZXF1aXJlZFwiKVxuICAgIH1cbiAgICBpZiAoIWN1cnJlbmNpZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBZGQgYSBzdXBwb3J0ZWQgY3VycmVuY3kgdG8gdGhlIHN0b3JlIGJlZm9yZSBjb250aW51aW5nXCIpXG4gICAgfVxuICAgIGlmICghcHJvZHVjdEZvcm0uaWQpIHtcbiAgICAgIGZvciAoY29uc3QgdmFyaWFudCBvZiBwcm9kdWN0Rm9ybS52YXJpYW50cykge1xuICAgICAgICBpZiAoIXN1cHBvcnRlZEN1cnJlbmN5Q29kZXMuaGFzKHZhcmlhbnQuY3VycmVuY3lfY29kZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlbGVjdCBhbiBhdmFpbGFibGUgY3VycmVuY3kgZm9yICR7dmFyaWFudC50aXRsZX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvdXBvbkZvcm0uYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgICBudW1iZXJPck51bGwoY291cG9uRm9ybS5hbW91bnQpID09IG51bGxcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgcG9zaXRpdmUgY291cG9uIGFtb3VudCBpcyByZXF1aXJlZFwiKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgICAgIXN1cHBvcnRlZEN1cnJlbmN5Q29kZXMuaGFzKGNvdXBvbkZvcm0uY3VycmVuY3lfY29kZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhbiBhdmFpbGFibGUgY291cG9uIGN1cnJlbmN5XCIpXG4gICAgfVxuICAgIGlmIChjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCIpIHtcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBudW1iZXJPck51bGwoY291cG9uRm9ybS5wZXJjZW50YWdlKVxuICAgICAgaWYgKHBlcmNlbnRhZ2UgPT0gbnVsbCB8fCBwZXJjZW50YWdlID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdXBvbiBwZXJjZW50YWdlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAxMDBcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgY291cG9uRm9ybS5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCIgJiZcbiAgICAgICFjb3Vwb25Gb3JtLnNoYXJlZF9jb2RlLnRyaW0oKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSBzaGFyZWQgY291cG9uIGNvZGUgaXMgcmVxdWlyZWRcIilcbiAgICB9XG4gICAgaWYgKGNvdXBvbkZvcm0uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCIpIHtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSBuZXcgRGF0ZShjb3Vwb25Gb3JtLmV4cGlyYXRpb25fZGF0ZSlcbiAgICAgIGlmICghY291cG9uRm9ybS5leHBpcmF0aW9uX2RhdGUgfHwgTnVtYmVyLmlzTmFOKGV4cGlyYXRpb24uZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHZhbGlkIGZpeGVkIGV4cGlyYXRpb24gZGF0ZSBpcyByZXF1aXJlZFwiKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291cG9uRm9ybS5leHBpcmF0aW9uX2NhcF9hdCkge1xuICAgICAgY29uc3QgZXhwaXJhdGlvbkNhcCA9IG5ldyBEYXRlKGNvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYXQpXG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKGV4cGlyYXRpb25DYXAuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHZhbGlkIGV4cGlyYXRpb24gY2FwIGRhdGUgaXMgcmVxdWlyZWRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYW50IG9mIHByb2R1Y3RGb3JtLnZhcmlhbnRzKSB7XG4gICAgICBpZiAoIXZhcmlhbnQub3ZlcnJpZGVfZW5hYmxlZCkgY29udGludWVcbiAgICAgIGlmIChcbiAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCIgJiZcbiAgICAgICAgbnVtYmVyT3JOdWxsKHZhcmlhbnQub3ZlcnJpZGVfYW1vdW50KSA9PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBIHBvc2l0aXZlIGNvdXBvbiBhbW91bnQgaXMgcmVxdWlyZWQgZm9yICR7dmFyaWFudC50aXRsZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgICAgICFzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLmhhcyh2YXJpYW50Lm92ZXJyaWRlX2N1cnJlbmN5X2NvZGUpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTZWxlY3QgYW4gYXZhaWxhYmxlIGNvdXBvbiBjdXJyZW5jeSBmb3IgJHt2YXJpYW50LnRpdGxlfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICh2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCIpIHtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX3BlcmNlbnRhZ2UpXG4gICAgICAgIGlmIChwZXJjZW50YWdlID09IG51bGwgfHwgcGVyY2VudGFnZSA+IDEwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDb3Vwb24gcGVyY2VudGFnZSBmb3IgJHt2YXJpYW50LnRpdGxlfSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwYCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgYWxsb3dQcm9tb3Rpb25NaXJyb3IgJiZcbiAgICAgIGNhbXBhaWduRm9ybS5tb2RlID09PSBcImV4aXN0aW5nXCIgJiZcbiAgICAgICFjYW1wYWlnbkZvcm0uY2FtcGFpZ25faWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhbiBleGlzdGluZyBjYW1wYWlnblwiKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBhbGxvd1Byb21vdGlvbk1pcnJvciAmJlxuICAgICAgY2FtcGFpZ25Gb3JtLm1vZGUgPT09IFwibmV3XCIgJiZcbiAgICAgICghY2FtcGFpZ25Gb3JtLm5hbWUudHJpbSgpIHx8ICFjYW1wYWlnbkZvcm0uY2FtcGFpZ25faWRlbnRpZmllci50cmltKCkpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW1wYWlnbiBuYW1lIGFuZCBpZGVudGlmaWVyIGFyZSByZXF1aXJlZFwiKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN5bmNWYXJpYW50T3ZlcnJpZGVzKHByb2R1Y3RJZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwcm9kdWN0Rm9ybS52YXJpYW50cy5tYXAoYXN5bmMgKHZhcmlhbnQpID0+IHtcbiAgICAgICAgaWYgKCF2YXJpYW50LmlkKSByZXR1cm5cblxuICAgICAgICBpZiAoIXZhcmlhbnQub3ZlcnJpZGVfZW5hYmxlZCkge1xuICAgICAgICAgIGlmICh2YXJpYW50Lm92ZXJyaWRlX2NvbmZpZ19pZCkge1xuICAgICAgICAgICAgYXdhaXQgYXBpRmV0Y2goYCR7Y291cG9uQmFzZX0vJHtwcm9kdWN0SWR9L3ZhcmlhbnRzYCwge1xuICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgdmFyaWFudF9pZDogdmFyaWFudC5pZCxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGFwaUZldGNoKGAke2NvdXBvbkJhc2V9LyR7cHJvZHVjdElkfS92YXJpYW50c2AsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHZhcmlhbnRfaWQ6IHZhcmlhbnQuaWQsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgYmVuZWZpdF90eXBlOiB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSxcbiAgICAgICAgICAgIGFtb3VudDpcbiAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgICA/IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX2Ftb3VudClcbiAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBwZXJjZW50YWdlOlxuICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSA9PT0gXCJwZXJjZW50YWdlXCJcbiAgICAgICAgICAgICAgICA/IG51bWJlck9yTnVsbCh2YXJpYW50Lm92ZXJyaWRlX3BlcmNlbnRhZ2UpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgY3VycmVuY3lfY29kZTpcbiAgICAgICAgICAgICAgdmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgICA/IHZhcmlhbnQub3ZlcnJpZGVfY3VycmVuY3lfY29kZS50cmltKCkudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgICAgICAgY291cG9uRm9ybS5jdXJyZW5jeV9jb2RlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KVxuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZVByb2R1Y3QoKSB7XG4gICAgc2V0U2F2aW5nKHRydWUpXG4gICAgdHJ5IHtcbiAgICAgIHZhbGlkYXRlRm9ybSgpXG4gICAgICBjb25zdCBpc0VkaXQgPSBCb29sZWFuKHByb2R1Y3RGb3JtLmlkKVxuICAgICAgY29uc3QgcGF0aCA9IGlzRWRpdCA/IGAke2NvdXBvbkJhc2V9LyR7cHJvZHVjdEZvcm0uaWR9YCA6IGNvdXBvbkJhc2VcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGlzRWRpdCA/IFwiUEFUQ0hcIiA6IFwiUE9TVFwiXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICBwcm9kdWN0OiBwcm9kdWN0UGF5bG9hZCghaXNFZGl0KSxcbiAgICAgICAgY291cG9uOiBidWlsZENvdXBvblBheWxvYWQoY291cG9uRm9ybSwgYWxsb3dQcm9tb3Rpb25NaXJyb3IpLFxuICAgICAgICBjYW1wYWlnbjogYnVpbGRDYW1wYWlnblBheWxvYWQoY2FtcGFpZ25Gb3JtLCBhbGxvd1Byb21vdGlvbk1pcnJvciksXG4gICAgICAgIHNlbGxlcl9pZDogcHJvZHVjdEZvcm0uc2VsbGVyX2lkIHx8IG51bGwsXG4gICAgICAgIHZhcmlhbnRfb3ZlcnJpZGVzOiBpc0VkaXQgPyBbXSA6IHZhcmlhbnRPdmVycmlkZXMoKSxcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXBpRmV0Y2gocGF0aCwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgfSlcbiAgICAgIGlmIChpc0VkaXQpIHtcbiAgICAgICAgYXdhaXQgc3luY1ZhcmlhbnRPdmVycmlkZXMocHJvZHVjdEZvcm0uaWQpXG4gICAgICB9XG4gICAgICB0b2FzdC5zdWNjZXNzKFxuICAgICAgICBpc0VkaXQgPyBcIkNvdXBvbiBwcm9kdWN0IHVwZGF0ZWRcIiA6IFwiQ291cG9uIHByb2R1Y3QgY3JlYXRlZFwiLFxuICAgICAgKVxuICAgICAgc2V0TW9kYWxPcGVuKGZhbHNlKVxuICAgICAgYXdhaXQgbG9hZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBcIkZhaWxlZCB0byBzYXZlIGNvdXBvbiBwcm9kdWN0XCIsXG4gICAgICApXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNhdmluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkZWxldGVQcm9kdWN0KHJvdzogQ291cG9uUHJvZHVjdFJvdykge1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHByb21wdCh7XG4gICAgICB0aXRsZTogXCJSZW1vdmUgY291cG9uIHByb2R1Y3Q/XCIsXG4gICAgICBkZXNjcmlwdGlvbjogYFRoaXMgcmVtb3ZlcyBjb3Vwb24gaXNzdWFuY2UgZnJvbSAke1xuICAgICAgICByb3cucHJvZHVjdC50aXRsZSB8fCByb3cucHJvZHVjdC5pZFxuICAgICAgfS4gVGhlIHVuZGVybHlpbmcgTWVkdXNhIHByb2R1Y3Qgd2lsbCByZW1haW4gYXZhaWxhYmxlLmAsXG4gICAgICBjb25maXJtVGV4dDogXCJSZW1vdmUgcHJvZHVjdFwiLFxuICAgICAgY2FuY2VsVGV4dDogXCJDYW5jZWxcIixcbiAgICAgIHZhcmlhbnQ6IFwiZGFuZ2VyXCIsXG4gICAgfSlcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXBpRmV0Y2goYCR7Y291cG9uQmFzZX0vJHtyb3cucHJvZHVjdC5pZH1gLCB7IG1ldGhvZDogXCJERUxFVEVcIiB9KVxuICAgICAgdG9hc3Quc3VjY2VzcyhcIkNvdXBvbiBjb25maWd1cmF0aW9uIHJlbW92ZWRcIilcbiAgICAgIGF3YWl0IGxvYWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgIDogXCJGYWlsZWQgdG8gcmVtb3ZlIGNvdXBvbiBwcm9kdWN0XCIsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbWlycm9yUHJvbW90aW9uKHJvdzogQ291cG9uUHJvZHVjdFJvdykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcGlGZXRjaChcbiAgICAgICAgYC9hZG1pbi9jb3Vwb24tcHJvZHVjdHMvJHtyb3cucHJvZHVjdC5pZH0vbWlycm9yLXByb21vdGlvbmAsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHt9KSxcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHRvYXN0LnN1Y2Nlc3MoXCJQcm9tb3Rpb24gbWlycm9yIGNyZWF0ZWRcIilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIk1pcnJvciBmYWlsZWRcIilcbiAgICB9XG4gIH1cblxuICBjb25zdCBjdXJyZW50U3RlcEluZGV4ID0gc3RlcHMuaW5kZXhPZihhY3RpdmVTdGVwKVxuICBjb25zdCBjYW5Hb0JhY2sgPSBjdXJyZW50U3RlcEluZGV4ID4gMFxuICBjb25zdCBjYW5Hb05leHQgPSBjdXJyZW50U3RlcEluZGV4IDwgc3RlcHMubGVuZ3RoIC0gMVxuICBjb25zdCBzaG93Q2FtcGFpZ25TdGVwID0gYWxsb3dQcm9tb3Rpb25NaXJyb3JcbiAgY29uc3QgdmlzaWJsZVN0ZXBzID0gc2hvd0NhbXBhaWduU3RlcFxuICAgID8gc3RlcHNcbiAgICA6IHN0ZXBzLmZpbHRlcigoc3RlcCkgPT4gc3RlcCAhPT0gXCJjYW1wYWlnblwiKVxuXG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lciBjbGFzc05hbWU9XCJkaXZpZGUteSBwLTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTYgcHktNFwiPlxuICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgxXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgPEJ1dHRvbiBzaXplPVwic21hbGxcIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gdm9pZCBsb2FkKCl9PlxuICAgICAgICAgICAgPEFycm93UGF0aCAvPlxuICAgICAgICAgICAgUmVmcmVzaFxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDxCdXR0b24gc2l6ZT1cInNtYWxsXCIgb25DbGljaz17b3BlbkNyZWF0ZX0+XG4gICAgICAgICAgICA8UGx1cyAvPlxuICAgICAgICAgICAgQ3JlYXRlXG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9XCJMb2FkaW5nIGNvdXBvbiBwcm9kdWN0c1wiIC8+XG4gICAgICApIDogbG9hZEVycm9yID8gKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZSB0aXRsZT17bG9hZEVycm9yfSAvPlxuICAgICAgKSA6IHByb2R1Y3RzLmxlbmd0aCA/IChcbiAgICAgICAgPFRhYmxlPlxuICAgICAgICAgIDxUYWJsZS5IZWFkZXI+XG4gICAgICAgICAgICA8VGFibGUuUm93PlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Qcm9kdWN0PC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5TdGF0dXM8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkJlbmVmaXQ8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkNvZGU8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsPkNhbXBhaWduPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Jc3N1ZWQ8L1RhYmxlLkhlYWRlckNlbGw+XG4gICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsIC8+XG4gICAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgICA8L1RhYmxlLkhlYWRlcj5cbiAgICAgICAgICA8VGFibGUuQm9keT5cbiAgICAgICAgICAgIHtwcm9kdWN0cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSByb3cuY291cG9uX3Byb2R1Y3RfY29uZmlnXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPFRhYmxlLlJvdyBrZXk9e3Jvdy5pZH0+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3Jvdy5wcm9kdWN0LnRpdGxlIHx8IHJvdy5wcm9kdWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cm93LnByb2R1Y3QuaGFuZGxlIHx8IHJvdy5wcm9kdWN0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPFN0YXR1c0JhZGdlIGNvbG9yPXtwcm9kdWN0U3RhdHVzQ29sb3Iocm93LnByb2R1Y3Quc3RhdHVzKX0+XG4gICAgICAgICAgICAgICAgICAgICAge3Jvdy5wcm9kdWN0LnN0YXR1cyB8fCBcImRyYWZ0XCJ9XG4gICAgICAgICAgICAgICAgICAgIDwvU3RhdHVzQmFkZ2U+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57YmVuZWZpdExhYmVsKGNvbmZpZyl9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIHtjb25maWcuY29kZV9zdHJhdGVneSA9PT0gXCJzaGFyZWRfY29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb25maWcuc2hhcmVkX2NvZGUgfHwgXCItXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZy5jb2RlX3ByZWZpeCB8fCBcIkNPVVBPTlwifVxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+e2NhbXBhaWduTGFiZWwoY29uZmlnKX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57cm93LmVudGl0bGVtZW50c19jb3VudCB8fCAwfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIG1pcnJvclByb21vdGlvbihyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBNaXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb3BlbkVkaXQocm93KX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UGVuY2lsU3F1YXJlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICBFZGl0XG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCBkZWxldGVQcm9kdWN0KHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRyYXNoIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgIDwvVGFibGUuUm93PlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1RhYmxlLkJvZHk+XG4gICAgICAgIDwvVGFibGU+XG4gICAgICApIDogKFxuICAgICAgICA8Q291cG9uRW1wdHlTdGF0ZVxuICAgICAgICAgIHRpdGxlPVwiTm8gY291cG9uIHByb2R1Y3RzIGZvdW5kXCJcbiAgICAgICAgICBkZXNjcmlwdGlvbj1cIkNyZWF0ZSBhIG5ldyBjb3Vwb24gcHJvZHVjdCB0byBnZXQgc3RhcnRlZC5cIlxuICAgICAgICAvPlxuICAgICAgKX1cblxuICAgICAgPEZvY3VzTW9kYWwgb3Blbj17bW9kYWxPcGVufSBvbk9wZW5DaGFuZ2U9e3NldE1vZGFsT3Blbn0+XG4gICAgICAgIDxGb2N1c01vZGFsLkNvbnRlbnQgc3R5bGU9e21vZGFsQ29udGVudFN0eWxlfT5cbiAgICAgICAgICA8Rm9jdXNNb2RhbC5IZWFkZXIgc3R5bGU9e21vZGFsU3RhdGljUm93U3R5bGV9PlxuICAgICAgICAgICAgPEZvY3VzTW9kYWwuVGl0bGU+XG4gICAgICAgICAgICAgIHtwcm9kdWN0Rm9ybS5pZCA/IFwiRWRpdCBDb3Vwb24gUHJvZHVjdFwiIDogXCJDcmVhdGUgQ291cG9uIFByb2R1Y3RcIn1cbiAgICAgICAgICAgIDwvRm9jdXNNb2RhbC5UaXRsZT5cbiAgICAgICAgICA8L0ZvY3VzTW9kYWwuSGVhZGVyPlxuICAgICAgICAgIDxQcm9ncmVzc1RhYnNcbiAgICAgICAgICAgIHZhbHVlPXthY3RpdmVTdGVwfVxuICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PiBzZXRBY3RpdmVTdGVwKHZhbHVlIGFzIFdpemFyZFN0ZXApfVxuICAgICAgICAgICAgc3R5bGU9e21vZGFsV2l6YXJkU3R5bGV9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFByb2dyZXNzVGFicy5MaXN0IGNsYXNzTmFtZT1cImJvcmRlci1iXCIgc3R5bGU9e21vZGFsU3RhdGljUm93U3R5bGV9PlxuICAgICAgICAgICAgICB7dmlzaWJsZVN0ZXBzLm1hcCgoc3RlcCkgPT4gKFxuICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuVHJpZ2dlclxuICAgICAgICAgICAgICAgICAga2V5PXtzdGVwfVxuICAgICAgICAgICAgICAgICAgdmFsdWU9e3N0ZXB9XG4gICAgICAgICAgICAgICAgICBzdGF0dXM9e3N0ZXBTdGF0dXMoc3RlcCwgYWN0aXZlU3RlcCl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3N0ZXAgPT09IFwiZGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgID8gXCJEZXRhaWxzXCJcbiAgICAgICAgICAgICAgICAgICAgOiBzdGVwID09PSBcIm9yZ2FuaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiT3JnYW5pemVcIlxuICAgICAgICAgICAgICAgICAgICAgIDogc3RlcCA9PT0gXCJ2YXJpYW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiVmFyaWFudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGVwID09PSBcImNvdXBvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJDb3Vwb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiQ2FtcGFpZ25cIn1cbiAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5UcmlnZ2VyPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkxpc3Q+XG4gICAgICAgICAgICA8Rm9jdXNNb2RhbC5Cb2R5IHN0eWxlPXttb2RhbEJvZHlTdHlsZX0+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e21vZGFsRm9ybVN0eWxlfT5cbiAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJkZXRhaWxzXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dGhyZWVDb2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUaXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVByb2R1Y3QoXCJ0aXRsZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnN1YnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVByb2R1Y3QoXCJzdWJ0aXRsZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJIYW5kbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5oYW5kbGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlUHJvZHVjdChcImhhbmRsZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVQcm9kdWN0KFwiZGVzY3JpcHRpb25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTWVkaWEgVVJMXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0udGh1bWJuYWlsfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZVByb2R1Y3QoXCJ0aHVtYm5haWxcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG5cbiAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJvcmdhbml6ZVwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5zdGF0dXN9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJkcmFmdFwiPkRyYWZ0PC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwicHVibGlzaGVkXCI+UHVibGlzaGVkPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwicHJvcG9zZWRcIj5Qcm9wb3NlZDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInJlamVjdGVkXCI+UmVqZWN0ZWQ8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAge2FwaUJhc2UgPT09IFwiL2FkbWluXCIgJiYgIXByb2R1Y3RGb3JtLmlkICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTZWxsZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3RGb3JtLnNlbGxlcl9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5zZWxsZXJzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGxlcl9pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS50eXBlX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X3R5cGVzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ29sbGVjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0Rm9ybS5jb2xsZWN0aW9uX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X2NvbGxlY3Rpb25zIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdEZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uX2lkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uY2F0ZWdvcnlfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLnByb2R1Y3RfY2F0ZWdvcmllcyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3RGb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUYWdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0udGFnX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X3RhZ3MgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19pZDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNhbGVzIGNoYW5uZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdEZvcm0uc2FsZXNfY2hhbm5lbF9pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMuc2FsZXNfY2hhbm5lbHMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbGVzX2NoYW5uZWxfaWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgd2VpZ2h0PVwicGx1c1wiPkRpc2NvdW50YWJsZTwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY291bnRzIGNhbiBhcHBseSB0byB0aGlzIHByb2R1Y3RcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtwcm9kdWN0Rm9ybS5kaXNjb3VudGFibGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0Rm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50YWJsZTogQm9vbGVhbihjaGVja2VkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuXG4gICAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5Db250ZW50IHZhbHVlPVwidmFyaWFudHNcIiBzdHlsZT17c3RhY2tTdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyb3dCZXR3ZWVuU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgyXCI+VmFyaWFudHM8L0hlYWRpbmc+XG4gICAgICAgICAgICAgICAgICAgIHshcHJvZHVjdEZvcm0uaWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2FkZFZhcmlhbnR9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBsdXMgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCB2YXJpYW50XG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS00XCI+XG4gICAgICAgICAgICAgICAgICAgIHtwcm9kdWN0Rm9ybS52YXJpYW50cy5tYXAoKHZhcmlhbnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2Ake3ZhcmlhbnQuaWQgfHwgaW5kZXh9YH0gc3R5bGU9e3BhbmVsU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17Zm91ckNvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKHByb2R1Y3RGb3JtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHsgdGl0bGU6IGV2ZW50LnRhcmdldC52YWx1ZSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNLVVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQuc2t1fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e0Jvb2xlYW4ocHJvZHVjdEZvcm0uaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwgeyBza3U6IGV2ZW50LnRhcmdldC52YWx1ZSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkN1cnJlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQuY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKHByb2R1Y3RGb3JtLmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY3VycmVuY3lfY29kZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiUHJpY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q3VycmVuY3lBbW91bnRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZT17dmFyaWFudC5jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQuYW1vdW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e0Jvb2xlYW4ocHJvZHVjdEZvcm0uaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhhbW91bnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhcmlhbnQoaW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclRvcDogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAxNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAxNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17cm93QmV0d2VlblN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+Q291cG9uIGJlbmVmaXQgb3ZlcnJpZGU8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17dmFyaWFudC5vdmVycmlkZV9lbmFibGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX2VuYWJsZWQ6IEJvb2xlYW4oY2hlY2tlZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt2YXJpYW50Lm92ZXJyaWRlX2VuYWJsZWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IC4uLmZvdXJDb2x1bW5HcmlkU3R5bGUsIG1hcmdpblRvcDogMTIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJCZW5lZml0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5vdmVycmlkZV9iZW5lZml0X3R5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFyaWFudChpbmRleCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZV9iZW5lZml0X3R5cGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgQmVuZWZpdFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZpeGVkX2Ftb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZCBhbW91bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJwZXJjZW50YWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmNlbnRhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJmcmVlX3NoaXBwaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgc2hpcHBpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ3VycmVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFyaWFudC5vdmVycmlkZV9jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQub3ZlcnJpZGVfYmVuZWZpdF90eXBlICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmaXhlZF9hbW91bnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KG92ZXJyaWRlX2N1cnJlbmN5X2NvZGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX2N1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJBbW91bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5QW1vdW50SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5Q29kZT17dmFyaWFudC5vdmVycmlkZV9jdXJyZW5jeV9jb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt2YXJpYW50Lm92ZXJyaWRlX2Ftb3VudH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhvdmVycmlkZV9hbW91bnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX2Ftb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlBlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3ZhcmlhbnQub3ZlcnJpZGVfcGVyY2VudGFnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Lm92ZXJyaWRlX2JlbmVmaXRfdHlwZSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicGVyY2VudGFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYXJpYW50KGluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlX3BlcmNlbnRhZ2U6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyFwcm9kdWN0Rm9ybS5pZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RGb3JtLnZhcmlhbnRzLmxlbmd0aCA+IDEgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtdC00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgbWFyZ2luVG9wOiAxNiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gcmVtb3ZlVmFyaWFudChpbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSB2YXJpYW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cblxuICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cImNvdXBvblwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3BhbmVsU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyb3dCZXR3ZWVuU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+Q291cG9uIGlzc3VhbmNlPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBJc3N1ZSBjb3Vwb25zIHdoZW4gY3VzdG9tZXJzIHB1cmNoYXNlIHRoaXMgcHJvZHVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2NvdXBvbkZvcm0uZW5hYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBCb29sZWFuKGNoZWNrZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQmVuZWZpdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaXRfdHlwZTogdmFsdWUgYXMgQmVuZWZpdFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwiZml4ZWRfYW1vdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWQgYW1vdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInBlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJjZW50YWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZyZWVfc2hpcHBpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIHNoaXBwaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlByb21vdGlvbiBzdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0ucHJvbW90aW9uX3N0YXR1c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX3N0YXR1czogdmFsdWUgYXMgUHJvbW90aW9uU3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJkcmFmdFwiPkRyYWZ0PC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJhY3RpdmVcIj5BY3RpdmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImluYWN0aXZlXCI+SW5hY3RpdmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQW1vdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5QW1vdW50SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmNpZXM9e2N1cnJlbmNpZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeUNvZGU9e2NvdXBvbkZvcm0uY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSAhPT0gXCJmaXhlZF9hbW91bnRcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmFtb3VudH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoYW1vdW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBhbW91bnQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiUGVyY2VudGFnZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uRm9ybS5iZW5lZml0X3R5cGUgIT09IFwicGVyY2VudGFnZVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0ucGVyY2VudGFnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJwZXJjZW50YWdlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkN1cnJlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPEN1cnJlbmN5U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb25Gb3JtLmJlbmVmaXRfdHlwZSAhPT0gXCJmaXhlZF9hbW91bnRcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY3VycmVuY3lfY29kZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gcG9saWN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uZXhwaXJhdGlvbl90eXBlfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl90eXBlOiB2YWx1ZSBhcyBFeHBpcmF0aW9uUG9saWN5VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJkdXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uIGFmdGVyIGlzc3VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZpeGVkXCI+Rml4ZWQgZGF0ZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICB7Y291cG9uRm9ybS5leHBpcmF0aW9uX3R5cGUgPT09IFwiZHVyYXRpb25cIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIGRheXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPXsxfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5leHBpcmF0aW9uX2RheXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJleHBpcmF0aW9uX2RheXNcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhwaXJlcyBhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLmV4cGlyYXRpb25fZGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3VwZGF0ZUNvdXBvbihcImV4cGlyYXRpb25fZGF0ZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2FwIGV4cGlyYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtyb3dCZXR3ZWVuU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1wYWlnbiBlbmQgb3IgY2FwIGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y291cG9uRm9ybS5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb25Gb3JtKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduOiBCb29sZWFuKGNoZWNrZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJFeHBpcmF0aW9uIGNhcCBkYXRlIChvcHRpb25hbClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNvdXBvbkZvcm0uZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ259XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5leHBpcmF0aW9uX2NhcF9hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJleHBpcmF0aW9uX2NhcF9hdFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2RlIHN0cmF0ZWd5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uY29kZV9zdHJhdGVneX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfc3RyYXRlZ3k6IHZhbHVlIGFzIENvZGVTdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJ1bmlxdWVfY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXF1ZSBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cInNoYXJlZF9jb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhcmVkIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvZGUgcHJlZml4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y291cG9uRm9ybS5jb2RlX3N0cmF0ZWd5ICE9PSBcInVuaXF1ZV9jb2RlXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uRm9ybS5jb2RlX3ByZWZpeH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJjb2RlX3ByZWZpeFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTaGFyZWQgY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2NvdXBvbkZvcm0uY29kZV9zdHJhdGVneSAhPT0gXCJzaGFyZWRfY29kZVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbkZvcm0uc2hhcmVkX2NvZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ291cG9uKFwic2hhcmVkX2NvZGVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTWF4IGlzc3VhbmNlIHBlciBpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDb3Vwb24oXCJtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW1cIil9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJQcm9tb3Rpb24gbWlycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb25Gb3JtLnByb21vdGlvbl9taXJyb3JfbW9kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiB2YWx1ZSBhcyBNaXJyb3JNb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJub25lXCI+Tm9uZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibWFudWFsXCI+TWFudWFsPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJhdXRvXCI+QXV0bzwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cblxuICAgICAgICAgICAgICAgIHthbGxvd1Byb21vdGlvbk1pcnJvciAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJjYW1wYWlnblwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDYW1wYWlnblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLm1vZGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbkZvcm0oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogdmFsdWUgYXMgQ2FtcGFpZ25Nb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LlZhbHVlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJub25lXCI+Tm8gY2FtcGFpZ248L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImV4aXN0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGlzdGluZyBjYW1wYWlnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibmV3XCI+TmV3IGNhbXBhaWduPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAge2NhbXBhaWduRm9ybS5tb2RlID09PSBcImV4aXN0aW5nXCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhpc3RpbmcgY2FtcGFpZ25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0uY2FtcGFpZ25faWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5jYW1wYWlnbnMgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduRm9ybSgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ25faWQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIHtjYW1wYWlnbkZvcm0ubW9kZSA9PT0gXCJuZXdcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ25Gb3JtLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ2FtcGFpZ24oXCJuYW1lXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIklkZW50aWZpZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0uY2FtcGFpZ25faWRlbnRpZmllcn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDYW1wYWlnbihcImNhbXBhaWduX2lkZW50aWZpZXJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU3RhcnRzIGF0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduRm9ybS5zdGFydHNfYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlQ2FtcGFpZ24oXCJzdGFydHNfYXRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRW5kcyBhdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbkZvcm0uZW5kc19hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt1cGRhdGVDYW1wYWlnbihcImVuZHNfYXRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvRm9jdXNNb2RhbC5Cb2R5PlxuICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzPlxuICAgICAgICAgIDxGb2N1c01vZGFsLkZvb3RlciBzdHlsZT17bW9kYWxTdGF0aWNSb3dTdHlsZX0+XG4gICAgICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBvbkNsaWNrPXsoKSA9PiBzZXRNb2RhbE9wZW4oZmFsc2UpfT5cbiAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIHtjYW5Hb0JhY2sgJiYgKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZVN0ZXAodmlzaWJsZVN0ZXBzW2N1cnJlbnRTdGVwSW5kZXggLSAxXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBCYWNrXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtjYW5Hb05leHQgJiZcbiAgICAgICAgICAgIGFjdGl2ZVN0ZXAgIT09IHZpc2libGVTdGVwc1t2aXNpYmxlU3RlcHMubGVuZ3RoIC0gMV0gPyAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgc2V0QWN0aXZlU3RlcCh2aXNpYmxlU3RlcHNbY3VycmVudFN0ZXBJbmRleCArIDFdKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENvbnRpbnVlXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPEJ1dHRvbiBpc0xvYWRpbmc9e3NhdmluZ30gb25DbGljaz17KCkgPT4gdm9pZCBzYXZlUHJvZHVjdCgpfT5cbiAgICAgICAgICAgICAgICBTYXZlXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0ZvY3VzTW9kYWwuRm9vdGVyPlxuICAgICAgICA8L0ZvY3VzTW9kYWwuQ29udGVudD5cbiAgICAgIDwvRm9jdXNNb2RhbD5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBPcHRpb25TZWxlY3Qoe1xuICB2YWx1ZSxcbiAgb3B0aW9ucyxcbiAgb25DaGFuZ2UsXG59OiB7XG4gIHZhbHVlOiBzdHJpbmdcbiAgb3B0aW9uczogT3B0aW9uUmVjb3JkW11cbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG59KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFxuICAgICAgdmFsdWU9e3ZhbHVlIHx8IE5PTkV9XG4gICAgICBvblZhbHVlQ2hhbmdlPXsobmV4dCkgPT4gb25DaGFuZ2UobmV4dCA9PT0gTk9ORSA/IFwiXCIgOiBuZXh0KX1cbiAgICA+XG4gICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT17Tk9ORX0+Tm9uZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgIHtvcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17b3B0aW9uLmlkfSB2YWx1ZT17b3B0aW9uLmlkfT5cbiAgICAgICAgICAgIHtvcHRpb25MYWJlbChvcHRpb24pfVxuICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICkpfVxuICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICA8L1NlbGVjdD5cbiAgKVxufVxuIiwgImltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG4gIHR5cGUgQ2hhbmdlRXZlbnQsXG4gIHR5cGUgQ1NTUHJvcGVydGllcyxcbiAgdHlwZSBEcmFnRXZlbnQsXG4gIHR5cGUgUmVhY3ROb2RlLFxufSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtcbiAgQWRqdXN0bWVudHMsXG4gIEFycm93UGF0aCxcbiAgQXJyb3dVcFRyYXksXG4gIEluZm9ybWF0aW9uQ2lyY2xlLFxuICBQZW5jaWxTcXVhcmUsXG4gIFBsdXMsXG4gIFRheEV4Y2x1c2l2ZSxcbiAgVGF4SW5jbHVzaXZlLFxuICBUcmFzaCxcbiAgWE1hcmtNaW5pLFxufSBmcm9tIFwiQG1lZHVzYWpzL2ljb25zXCJcbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgQ2hlY2tib3gsXG4gIENvbnRhaW5lcixcbiAgQ3VycmVuY3lJbnB1dCxcbiAgRGl2aWRlcixcbiAgRHJvcGRvd25NZW51LFxuICBEcmF3ZXIsXG4gIEZvY3VzTW9kYWwsXG4gIEhlYWRpbmcsXG4gIElucHV0LFxuICBMYWJlbCxcbiAgUHJvZ3Jlc3NUYWJzLFxuICBSYWRpb0dyb3VwLFxuICBTZWxlY3QsXG4gIFN0YXR1c0JhZGdlLFxuICBTd2l0Y2gsXG4gIFRhYmxlLFxuICBUZXh0LFxuICBUZXh0YXJlYSxcbiAgVG9vbHRpcCxcbiAgdG9hc3QsXG4gIHVzZVByb21wdCxcbn0gZnJvbSBcIkBtZWR1c2Fqcy91aVwiXG5pbXBvcnQgeyBDb3Vwb25FbXB0eVN0YXRlIH0gZnJvbSBcIi4vZW1wdHktc3RhdGVcIlxuXG5kZWNsYXJlIGNvbnN0IF9fQkFDS0VORF9VUkxfXzogc3RyaW5nXG5cbnR5cGUgQXBpQmFzZSA9IFwiL2FkbWluXCIgfCBcIi92ZW5kb3JcIlxudHlwZSBCZW5lZml0VHlwZSA9IFwiZml4ZWRfYW1vdW50XCIgfCBcInBlcmNlbnRhZ2VcIiB8IFwiZnJlZV9zaGlwcGluZ1wiIHwgXCJidXlfZ2V0XCJcbnR5cGUgQ291cG9uVHlwZSA9XG4gIHwgXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCJcbiAgfCBcImFtb3VudF9vZmZfb3JkZXJcIlxuICB8IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiXG4gIHwgXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gIHwgXCJidXlfeF9nZXRfeVwiXG4gIHwgXCJmcmVlX3NoaXBwaW5nXCJcbnR5cGUgQ29kZVN0cmF0ZWd5ID0gXCJ1bmlxdWVfY29kZVwiIHwgXCJzaGFyZWRfY29kZVwiXG50eXBlIE1pcnJvck1vZGUgPSBcIm5vbmVcIiB8IFwibWFudWFsXCIgfCBcImF1dG9cIlxudHlwZSBQcm9tb3Rpb25TdGF0dXMgPSBcImRyYWZ0XCIgfCBcImFjdGl2ZVwiIHwgXCJpbmFjdGl2ZVwiXG50eXBlIENhbXBhaWduTW9kZSA9IFwibm9uZVwiIHwgXCJleGlzdGluZ1wiIHwgXCJuZXdcIlxudHlwZSBFeHBpcmF0aW9uUG9saWN5VHlwZSA9IFwibm9uZVwiIHwgXCJkdXJhdGlvblwiIHwgXCJmaXhlZFwiXG50eXBlIENvdXBvbkFsbG9jYXRpb24gPSBcImVhY2hcIiB8IFwib25jZVwiXG50eXBlIFdpemFyZFN0ZXAgPSBcImRldGFpbHNcIiB8IFwib3JnYW5pemVcIiB8IFwiY2FtcGFpZ25cIiB8IFwicHJpY2VzXCJcbnR5cGUgUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGUgPVxuICB8IFwiY3VzdG9tZXIuZ3JvdXBzLmlkXCJcbiAgfCBcInJlZ2lvbi5pZFwiXG4gIHwgXCJzaGlwcGluZ19hZGRyZXNzLmNvdW50cnlfY29kZVwiXG4gIHwgXCJzYWxlc19jaGFubmVsX2lkXCJcbiAgfCBcImN1cnJlbmN5X2NvZGVcIlxudHlwZSBQdXJjaGFzZUNvbmRpdGlvbk9wZXJhdG9yID0gXCJpblwiIHwgXCJlcVwiIHwgXCJuZVwiXG5cbnR5cGUgUHVyY2hhc2VDb25kaXRpb25Gb3JtID0ge1xuICBrZXk6IHN0cmluZ1xuICBhdHRyaWJ1dGU6IFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlIHwgXCJcIlxuICBvcGVyYXRvcjogUHVyY2hhc2VDb25kaXRpb25PcGVyYXRvciB8IFwiXCJcbiAgdmFsdWVzOiBzdHJpbmdbXVxufVxuXG50eXBlIE9wdGlvblJlY29yZCA9IHtcbiAgaWQ6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nIHwgbnVsbFxuICB0aXRsZT86IHN0cmluZyB8IG51bGxcbiAgdmFsdWU/OiBzdHJpbmcgfCBudWxsXG4gIGhhbmRsZT86IHN0cmluZyB8IG51bGxcbiAgY2FtcGFpZ25faWRlbnRpZmllcj86IHN0cmluZyB8IG51bGxcbiAgZGlzcGxheV9uYW1lPzogc3RyaW5nIHwgbnVsbFxuICBpc29fMj86IHN0cmluZyB8IG51bGxcbn1cblxudHlwZSBDdXJyZW5jeU9wdGlvbiA9IHtcbiAgY29kZTogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBzeW1ib2w6IHN0cmluZ1xuICBzeW1ib2xfbmF0aXZlOiBzdHJpbmdcbiAgaXNfZGVmYXVsdDogYm9vbGVhblxuICBpc190YXhfaW5jbHVzaXZlPzogYm9vbGVhblxufVxuXG50eXBlIE9wdGlvbnNQYXlsb2FkID0ge1xuICBjdXJyZW5jaWVzPzogQ3VycmVuY3lPcHRpb25bXVxuICBwcm9kdWN0X3R5cGVzPzogT3B0aW9uUmVjb3JkW11cbiAgcHJvZHVjdF9jb2xsZWN0aW9ucz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfY2F0ZWdvcmllcz86IE9wdGlvblJlY29yZFtdXG4gIHByb2R1Y3RfdGFncz86IE9wdGlvblJlY29yZFtdXG4gIHNhbGVzX2NoYW5uZWxzPzogT3B0aW9uUmVjb3JkW11cbiAgc2hpcHBpbmdfcHJvZmlsZXM/OiBPcHRpb25SZWNvcmRbXVxuICBjYW1wYWlnbnM/OiBPcHRpb25SZWNvcmRbXVxuICBzZWxsZXJzPzogT3B0aW9uUmVjb3JkW11cbiAgY3VzdG9tZXJfZ3JvdXBzPzogT3B0aW9uUmVjb3JkW11cbiAgcmVnaW9ucz86IE9wdGlvblJlY29yZFtdXG4gIGNvdW50cmllcz86IE9wdGlvblJlY29yZFtdXG59XG5cbnR5cGUgQ291cG9uUHJvZHVjdENvbmZpZyA9IHtcbiAgaWQ6IHN0cmluZ1xuICBlbmFibGVkOiBib29sZWFuXG4gIHByb2R1Y3RfaWQ6IHN0cmluZ1xuICBiZW5lZml0X3R5cGU6IEJlbmVmaXRUeXBlXG4gIHB1cmNoYXNlX2NvbmRpdGlvbnM/OiBBcnJheTx7XG4gICAgYXR0cmlidXRlOiBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZVxuICAgIG9wZXJhdG9yOiBQdXJjaGFzZUNvbmRpdGlvbk9wZXJhdG9yXG4gICAgdmFsdWVzOiBzdHJpbmdbXVxuICB9PiB8IG51bGxcbiAgYW1vdW50cz86IHsgY3VycmVuY3lfY29kZTogc3RyaW5nOyBhbW91bnQ6IG51bWJlciB9W10gfCBudWxsXG4gIGFtb3VudDogbnVtYmVyIHwgbnVsbFxuICBwZXJjZW50YWdlOiBudW1iZXIgfCBudWxsXG4gIGN1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGxcbiAgY29kZV9zdHJhdGVneTogQ29kZVN0cmF0ZWd5XG4gIGNvZGVfcHJlZml4OiBzdHJpbmcgfCBudWxsXG4gIHNoYXJlZF9jb2RlOiBzdHJpbmcgfCBudWxsXG4gIGV4cGlyYXRpb25fcG9saWN5OlxuICB8IHsgdHlwZTogXCJub25lXCIgfVxuICB8IHtcbiAgICB0eXBlOiBcImR1cmF0aW9uXCJcbiAgICBkdXJhdGlvbl9kYXlzOiBudW1iZXJcbiAgICBjYXBfYnlfY2FtcGFpZ24/OiBib29sZWFuXG4gICAgY2FwX2F0Pzogc3RyaW5nIHwgbnVsbFxuICB9XG4gIHwge1xuICAgIHR5cGU6IFwiZml4ZWRcIlxuICAgIGV4cGlyZXNfYXQ6IHN0cmluZ1xuICAgIGNhcF9ieV9jYW1wYWlnbj86IGJvb2xlYW5cbiAgICBjYXBfYXQ/OiBzdHJpbmcgfCBudWxsXG4gIH1cbiAgbWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtOiBudW1iZXJcbiAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBNaXJyb3JNb2RlXG4gIHByb21vdGlvbl9zdGF0dXM/OiBQcm9tb3Rpb25TdGF0dXMgfCBudWxsXG4gIHByb21vdGlvbl90ZW1wbGF0ZT86IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsXG4gIGNhbXBhaWduX2lkPzogc3RyaW5nIHwgbnVsbFxuICBjYW1wYWlnbl9zbmFwc2hvdD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbFxufVxuXG50eXBlIFByb2R1Y3RSZWNvcmQgPSB7XG4gIGlkOiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZyB8IG51bGxcbiAgc3VidGl0bGU/OiBzdHJpbmcgfCBudWxsXG4gIGhhbmRsZTogc3RyaW5nIHwgbnVsbFxuICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGxcbiAgc3RhdHVzOiBzdHJpbmcgfCBudWxsXG4gIHRodW1ibmFpbDogc3RyaW5nIHwgbnVsbFxuICB0aHVtYm5haWxfYXNzZXRfaWQ/OiBzdHJpbmcgfCBudWxsXG4gIGltYWdlcz86IHsgaWQ/OiBzdHJpbmc7IHVybD86IHN0cmluZyB8IG51bGw7IGFzc2V0X2lkPzogc3RyaW5nIHwgbnVsbCB9W11cbiAgZGlzY291bnRhYmxlPzogYm9vbGVhblxuICB0eXBlX2lkPzogc3RyaW5nIHwgbnVsbFxuICBjb2xsZWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbFxuICBzaGlwcGluZ19wcm9maWxlX2lkPzogc3RyaW5nIHwgbnVsbFxuICB2YXJpYW50cz86IHtcbiAgICBpZDogc3RyaW5nXG4gICAgc2t1Pzogc3RyaW5nIHwgbnVsbFxuICAgIHByaWNlcz86IHsgY3VycmVuY3lfY29kZT86IHN0cmluZzsgYW1vdW50PzogbnVtYmVyIH1bXVxuICB9W11cbiAgY2F0ZWdvcmllcz86IHsgaWQ6IHN0cmluZyB9W11cbiAgdGFncz86IHsgaWQ6IHN0cmluZyB9W11cbiAgc2FsZXNfY2hhbm5lbHM/OiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfCBudWxsIH1bXVxufVxuXG50eXBlIFByb2R1Y3RNZWRpYSA9IHtcbiAgdXJsOiBzdHJpbmdcbiAgYXNzZXRfaWQ/OiBzdHJpbmdcbn1cblxudHlwZSBDb3Vwb25Qcm9kdWN0Um93ID0ge1xuICBpZDogc3RyaW5nXG4gIHByb2R1Y3Q6IFByb2R1Y3RSZWNvcmRcbiAgY291cG9uX3Byb2R1Y3RfY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnXG4gIGVudGl0bGVtZW50c19jb3VudDogbnVtYmVyXG59XG5cbnR5cGUgUHJvZHVjdEZvcm1TdGF0ZSA9IHtcbiAgdGl0bGU6IHN0cmluZ1xuICBzdWJ0aXRsZTogc3RyaW5nXG4gIGhhbmRsZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgbWVkaWE6IFByb2R1Y3RNZWRpYVtdXG4gIHNrdTogc3RyaW5nXG4gIHByaWNlX2Ftb3VudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgc3RhdHVzOiBzdHJpbmdcbiAgZGlzY291bnRhYmxlOiBib29sZWFuXG4gIHNlbGxlcl9pZDogc3RyaW5nXG4gIHR5cGVfaWQ6IHN0cmluZ1xuICBjb2xsZWN0aW9uX2lkOiBzdHJpbmdcbiAgY2F0ZWdvcnlfaWQ6IHN0cmluZ1xuICB0YWdfaWQ6IHN0cmluZ1xufVxuXG50eXBlIENvdXBvbkZvcm1TdGF0ZSA9IHtcbiAgZW5hYmxlZDogYm9vbGVhblxuICB0eXBlOiBDb3Vwb25UeXBlXG4gIHB1cmNoYXNlX2NvbmRpdGlvbnM6IFB1cmNoYXNlQ29uZGl0aW9uRm9ybVtdXG4gIGFtb3VudHM6IENvdXBvbkFtb3VudEZvcm1Sb3dbXVxuICBwZXJjZW50YWdlOiBzdHJpbmdcbiAgYWxsb2NhdGlvbjogQ291cG9uQWxsb2NhdGlvblxuICBjb2RlX3N0cmF0ZWd5OiBDb2RlU3RyYXRlZ3lcbiAgY29kZV9wcmVmaXg6IHN0cmluZ1xuICBzaGFyZWRfY29kZTogc3RyaW5nXG4gIGV4cGlyYXRpb25fdHlwZTogRXhwaXJhdGlvblBvbGljeVR5cGVcbiAgZXhwaXJhdGlvbl9kYXlzOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl9kYXRlOiBzdHJpbmdcbiAgZXhwaXJhdGlvbl9jYXBfYnlfY2FtcGFpZ246IGJvb2xlYW5cbiAgZXhwaXJhdGlvbl9jYXBfYXQ6IHN0cmluZ1xuICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IHN0cmluZ1xuICBwcm9tb3Rpb25fbWlycm9yX21vZGU6IE1pcnJvck1vZGVcbiAgcHJvbW90aW9uX3N0YXR1czogUHJvbW90aW9uU3RhdHVzXG59XG5cbnR5cGUgQ291cG9uQW1vdW50Rm9ybVJvdyA9IHtcbiAga2V5OiBzdHJpbmdcbiAgY3VycmVuY3lfY29kZTogc3RyaW5nXG4gIGFtb3VudDogc3RyaW5nXG59XG5cbnR5cGUgQ2FtcGFpZ25Gb3JtU3RhdGUgPSB7XG4gIG1vZGU6IENhbXBhaWduTW9kZVxuICBjYW1wYWlnbl9pZDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBjYW1wYWlnbl9pZGVudGlmaWVyOiBzdHJpbmdcbiAgc3RhcnRzX2F0OiBzdHJpbmdcbiAgZW5kc19hdDogc3RyaW5nXG59XG5cbmNvbnN0IE5PTkUgPSBcIl9fbm9uZV9fXCJcbmNvbnN0IGFsbFN0ZXBzOiBXaXphcmRTdGVwW10gPSBbXCJkZXRhaWxzXCIsIFwib3JnYW5pemVcIiwgXCJjYW1wYWlnblwiLCBcInByaWNlc1wiXVxuXG5jb25zdCBjb25kaXRpb25BdHRyaWJ1dGVzOiBBcnJheTx7XG4gIHZhbHVlOiBQdXJjaGFzZUNvbmRpdGlvbkF0dHJpYnV0ZVxuICBsYWJlbDogc3RyaW5nXG59PiA9IFtcbiAgeyB2YWx1ZTogXCJjdXN0b21lci5ncm91cHMuaWRcIiwgbGFiZWw6IFwiQ3VzdG9tZXIgR3JvdXBcIiB9LFxuICB7IHZhbHVlOiBcInJlZ2lvbi5pZFwiLCBsYWJlbDogXCJSZWdpb25cIiB9LFxuICB7IHZhbHVlOiBcInNoaXBwaW5nX2FkZHJlc3MuY291bnRyeV9jb2RlXCIsIGxhYmVsOiBcIkNvdW50cnlcIiB9LFxuICB7IHZhbHVlOiBcInNhbGVzX2NoYW5uZWxfaWRcIiwgbGFiZWw6IFwiU2FsZXMgQ2hhbm5lbFwiIH0sXG4gIHsgdmFsdWU6IFwiY3VycmVuY3lfY29kZVwiLCBsYWJlbDogXCJDdXJyZW5jeSBDb2RlXCIgfSxcbl1cblxuY29uc3QgY29uZGl0aW9uT3BlcmF0b3JzOiBBcnJheTx7XG4gIHZhbHVlOiBQdXJjaGFzZUNvbmRpdGlvbk9wZXJhdG9yXG4gIGxhYmVsOiBzdHJpbmdcbn0+ID0gW1xuICB7IHZhbHVlOiBcImluXCIsIGxhYmVsOiBcIkluXCIgfSxcbiAgeyB2YWx1ZTogXCJlcVwiLCBsYWJlbDogXCJFcXVhbHNcIiB9LFxuICB7IHZhbHVlOiBcIm5lXCIsIGxhYmVsOiBcIk5vdCBJblwiIH0sXG5dXG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hvaWNlczoge1xuICB2YWx1ZTogQ291cG9uVHlwZVxuICBsYWJlbDogc3RyaW5nXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbn1bXSA9IFtcbiAgICB7XG4gICAgICB2YWx1ZTogXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIsXG4gICAgICBsYWJlbDogXCJBbW91bnQgb2ZmIHByb2R1Y3RzXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJEaXNjb3VudCBzcGVjaWZpYyBwcm9kdWN0cyBvciBhIGNvbGxlY3Rpb24gb2YgcHJvZHVjdHNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcImFtb3VudF9vZmZfb3JkZXJcIixcbiAgICAgIGxhYmVsOiBcIkFtb3VudCBvZmYgb3JkZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRpc2NvdW50IHRoZSB0b3RhbCBvcmRlciBhbW91bnRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIixcbiAgICAgIGxhYmVsOiBcIlBlcmNlbnRhZ2Ugb2ZmIHByb2R1Y3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRpc2NvdW50IGEgcGVyY2VudGFnZSBvZmYgc2VsZWN0ZWQgcHJvZHVjdHNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCIsXG4gICAgICBsYWJlbDogXCJQZXJjZW50YWdlIG9mZiBvcmRlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRGlzY291bnQgYSBwZXJjZW50YWdlIG9mZiB0aGUgdG90YWwgb3JkZXIgYW1vdW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJidXlfeF9nZXRfeVwiLFxuICAgICAgbGFiZWw6IFwiQnV5IFggR2V0IFlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIklzc3VlIGEgQnV5IFggR2V0IFkgY291cG9uIGVudGl0bGVtZW50XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJmcmVlX3NoaXBwaW5nXCIsXG4gICAgICBsYWJlbDogXCJGcmVlIHNoaXBwaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBcHBseSBhIDEwMCUgZGlzY291bnQgdG8gc2hpcHBpbmcgZmVlc1wiLFxuICAgIH0sXG4gIF1cblxuY29uc3Qgc3RhdHVzQ2hvaWNlczoge1xuICB2YWx1ZTogUHJvbW90aW9uU3RhdHVzXG4gIGxhYmVsOiBzdHJpbmdcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xufVtdID0gW1xuICAgIHtcbiAgICAgIHZhbHVlOiBcImRyYWZ0XCIsXG4gICAgICBsYWJlbDogXCJEcmFmdFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQ3VzdG9tZXJzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIHRoZSBjb2RlIHlldFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6IFwiYWN0aXZlXCIsXG4gICAgICBsYWJlbDogXCJBY3RpdmVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkN1c3RvbWVycyB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBjb2RlXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogXCJpbmFjdGl2ZVwiLFxuICAgICAgbGFiZWw6IFwiSW5hY3RpdmVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIktlZXAgdGhlIHByb21vdGlvbiB1bmF2YWlsYWJsZSB1bnRpbCByZWFjdGl2YXRlZFwiLFxuICAgIH0sXG4gIF1cblxuZnVuY3Rpb24gYmFja2VuZFVybCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBfX0JBQ0tFTkRfVVJMX18gPT09IFwic3RyaW5nXCJcbiAgICA/IF9fQkFDS0VORF9VUkxfXy5yZXBsYWNlKC9cXC8kLywgXCJcIilcbiAgICA6IFwiXCJcbn1cblxuZnVuY3Rpb24gYXBpRXJyb3JNZXNzYWdlKHBheWxvYWQ6IGFueSwgZmFsbGJhY2s6IHN0cmluZykge1xuICByZXR1cm4gKFxuICAgIFtwYXlsb2FkPy5tZXNzYWdlLCBwYXlsb2FkPy5lcnJvcj8ubWVzc2FnZSwgcGF5bG9hZD8uZXJyb3JdLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiB0eXBlb2YgY2FuZGlkYXRlID09PSBcInN0cmluZ1wiICYmIGNhbmRpZGF0ZS50cmltKCksXG4gICAgKSB8fFxuICAgIGZhbGxiYWNrIHx8XG4gICAgXCJSZXF1ZXN0IGZhaWxlZFwiXG4gIClcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBpRmV0Y2g8VD4oXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0aW9uczogUmVxdWVzdEluaXQgPSB7fSxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2JhY2tlbmRVcmwoKX0ke3BhdGh9YCwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIC4uLihvcHRpb25zLmJvZHkgPyB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0gOiB7fSksXG4gICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgfSxcbiAgfSlcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKVxuICAgIHRocm93IG5ldyBFcnJvcihhcGlFcnJvck1lc3NhZ2UocGF5bG9hZCwgcmVzcG9uc2Uuc3RhdHVzVGV4dCkpXG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG59XG5cbmZ1bmN0aW9uIG9wdGlvbkxhYmVsKG9wdGlvbjogT3B0aW9uUmVjb3JkKSB7XG4gIHJldHVybiAoXG4gICAgb3B0aW9uLm5hbWUgfHwgb3B0aW9uLnRpdGxlIHx8IG9wdGlvbi52YWx1ZSB8fCBvcHRpb24uaGFuZGxlIHx8IG9wdGlvbi5pZFxuICApXG59XG5cbmZ1bmN0aW9uIG51bWJlck9yTnVsbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+IDAgPyBwYXJzZWQgOiBudWxsXG59XG5cbmZ1bmN0aW9uIG5vbk5lZ2F0aXZlTnVtYmVyT3JOdWxsKHZhbHVlOiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZS50cmltKCkpIHJldHVybiBudWxsXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+PSAwID8gcGFyc2VkIDogbnVsbFxufVxuXG5mdW5jdGlvbiB0b0RhdGVUaW1lTG9jYWwodmFsdWU/OiBzdHJpbmcgfCBudWxsKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBcIlwiXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSlcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiBcIlwiXG4gIGNvbnN0IGxvY2FsRGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpIC0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjBfMDAwKVxuICByZXR1cm4gbG9jYWxEYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTYpXG59XG5cbmZ1bmN0aW9uIGN1cnJlbmN5RGVjaW1hbERpZ2l0cyhjb2RlOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KFwiZW5cIiwge1xuICAgICAgc3R5bGU6IFwiY3VycmVuY3lcIixcbiAgICAgIGN1cnJlbmN5OiBjb2RlLnRvVXBwZXJDYXNlKCksXG4gICAgfSkucmVzb2x2ZWRPcHRpb25zKCkubWF4aW11bUZyYWN0aW9uRGlnaXRzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAyXG4gIH1cbn1cblxuZnVuY3Rpb24gY3VycmVuY3lTeW1ib2woY29kZTogc3RyaW5nKSB7XG4gIGlmICghY29kZSkgcmV0dXJuIFwiXCJcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgbmV3IEludGwuTnVtYmVyRm9ybWF0KFwiZW5cIiwge1xuICAgICAgICBzdHlsZTogXCJjdXJyZW5jeVwiLFxuICAgICAgICBjdXJyZW5jeTogY29kZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICBjdXJyZW5jeURpc3BsYXk6IFwibmFycm93U3ltYm9sXCIsXG4gICAgICB9KVxuICAgICAgICAuZm9ybWF0VG9QYXJ0cygwKVxuICAgICAgICAuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSBcImN1cnJlbmN5XCIpPy52YWx1ZSB8fCBjb2RlLnRvVXBwZXJDYXNlKClcbiAgICApXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjb2RlLnRvVXBwZXJDYXNlKClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY291cG9uVHlwZUZyb21Db25maWcoY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnKTogQ291cG9uVHlwZSB7XG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcInBlcmNlbnRhZ2VcIikge1xuICAgIHJldHVybiBjb25maWcucHJvbW90aW9uX3RlbXBsYXRlPy5hcHBsaWNhdGlvbl9tZXRob2Q/LnRhcmdldF90eXBlID09PSBcIm9yZGVyXCJcbiAgICAgID8gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICAgICA6IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiXG4gIH1cbiAgaWYgKGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiYnV5X2dldFwiKSByZXR1cm4gXCJidXlfeF9nZXRfeVwiXG4gIGlmIChjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZyZWVfc2hpcHBpbmdcIikgcmV0dXJuIFwiZnJlZV9zaGlwcGluZ1wiXG5cbiAgcmV0dXJuIGNvbmZpZy5wcm9tb3Rpb25fdGVtcGxhdGU/LmFwcGxpY2F0aW9uX21ldGhvZD8udGFyZ2V0X3R5cGUgPT09IFwib3JkZXJcIlxuICAgID8gXCJhbW91bnRfb2ZmX29yZGVyXCJcbiAgICA6IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiXG59XG5cbmZ1bmN0aW9uIGJlbmVmaXRUeXBlRnJvbUNvdXBvblR5cGUodHlwZTogQ291cG9uVHlwZSk6IEJlbmVmaXRUeXBlIHtcbiAgaWYgKFxuICAgIHR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiIHx8XG4gICAgdHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICkgcmV0dXJuIFwicGVyY2VudGFnZVwiXG4gIGlmICh0eXBlID09PSBcImJ1eV94X2dldF95XCIpIHJldHVybiBcImJ1eV9nZXRcIlxuICBpZiAodHlwZSA9PT0gXCJmcmVlX3NoaXBwaW5nXCIpIHJldHVybiBcImZyZWVfc2hpcHBpbmdcIlxuICByZXR1cm4gXCJmaXhlZF9hbW91bnRcIlxufVxuXG5mdW5jdGlvbiBjb3Vwb25UeXBlTGFiZWwoY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnKSB7XG4gIHJldHVybiB0eXBlQ2hvaWNlcy5maW5kKFxuICAgIChjaG9pY2UpID0+IGNob2ljZS52YWx1ZSA9PT0gY291cG9uVHlwZUZyb21Db25maWcoY29uZmlnKSxcbiAgKT8ubGFiZWxcbn1cblxuZnVuY3Rpb24gY291cG9uU3RhdHVzQ29sb3Ioc3RhdHVzPzogUHJvbW90aW9uU3RhdHVzIHwgbnVsbCkge1xuICBpZiAoc3RhdHVzID09PSBcImFjdGl2ZVwiKSByZXR1cm4gXCJncmVlblwiIGFzIGNvbnN0XG4gIGlmIChzdGF0dXMgPT09IFwiaW5hY3RpdmVcIikgcmV0dXJuIFwib3JhbmdlXCIgYXMgY29uc3RcbiAgcmV0dXJuIFwiZ3JleVwiIGFzIGNvbnN0XG59XG5cbmZ1bmN0aW9uIHByb2R1Y3RTdGF0dXNGcm9tQ291cG9uU3RhdHVzKHN0YXR1czogUHJvbW90aW9uU3RhdHVzKSB7XG4gIHJldHVybiBzdGF0dXMgPT09IFwiYWN0aXZlXCIgPyBcInB1Ymxpc2hlZFwiIDogXCJkcmFmdFwiXG59XG5cbmZ1bmN0aW9uIGNhbXBhaWduTGFiZWwoY29uZmlnOiBDb3Vwb25Qcm9kdWN0Q29uZmlnKSB7XG4gIGNvbnN0IG5hbWUgPSBjb25maWcuY2FtcGFpZ25fc25hcHNob3Q/Lm5hbWVcbiAgcmV0dXJuIHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiICYmIG5hbWUgPyBuYW1lIDogY29uZmlnLmNhbXBhaWduX2lkIHx8IFwiTm9uZVwiXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDdXJyZW5jeShvcHRpb25zOiBPcHRpb25zUGF5bG9hZCkge1xuICByZXR1cm4gKFxuICAgIG9wdGlvbnMuY3VycmVuY2llcz8uZmluZCgoY3VycmVuY3kpID0+IGN1cnJlbmN5LmlzX2RlZmF1bHQpPy5jb2RlIHx8XG4gICAgb3B0aW9ucy5jdXJyZW5jaWVzPy5bMF0/LmNvZGUgfHxcbiAgICBcIlwiXG4gIClcbn1cblxuZnVuY3Rpb24gY29uZGl0aW9uS2V5KHByZWZpeCA9IFwiY29uZGl0aW9uXCIpIHtcbiAgcmV0dXJuIGAke3ByZWZpeH0tJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpfWBcbn1cblxuZnVuY3Rpb24gaXNBbW91bnRDb3Vwb25UeXBlKHR5cGU6IENvdXBvblR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgPT09IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiIHx8IHR5cGUgPT09IFwiYW1vdW50X29mZl9vcmRlclwiXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlZmZlY3RpdmVDb3Vwb25DdXJyZW5jaWVzKFxuICBjb25kaXRpb25zOiBQdXJjaGFzZUNvbmRpdGlvbkZvcm1bXSxcbiAgY3VycmVuY2llczogQ3VycmVuY3lPcHRpb25bXSxcbikge1xuICBjb25zdCBjb25kaXRpb24gPSBjb25kaXRpb25zLmZpbmQoXG4gICAgKGl0ZW0pID0+IGl0ZW0uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIixcbiAgKVxuICBpZiAoIWNvbmRpdGlvbiB8fCAhY29uZGl0aW9uLm9wZXJhdG9yKSByZXR1cm4gW11cbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0KGNvbmRpdGlvbi52YWx1ZXMpXG4gIGNvbnN0IHN1cHBvcnRlZCA9IGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSlcblxuICByZXR1cm4gY29uZGl0aW9uLm9wZXJhdG9yID09PSBcIm5lXCJcbiAgICA/IHN1cHBvcnRlZC5maWx0ZXIoKGNvZGUpID0+ICFzZWxlY3RlZC5oYXMoY29kZSkpXG4gICAgOiBzdXBwb3J0ZWQuZmlsdGVyKChjb2RlKSA9PiBzZWxlY3RlZC5oYXMoY29kZSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvbmNpbGVDb3Vwb25BbW91bnRzKFxuICBjdXJyZW50OiBDb3Vwb25BbW91bnRGb3JtUm93W10sXG4gIGN1cnJlbmN5Q29kZXM6IHN0cmluZ1tdLFxuKSB7XG4gIGNvbnN0IGJ5Q3VycmVuY3kgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgY3VycmVudC5tYXAoKHJvdykgPT4gW3Jvdy5jdXJyZW5jeV9jb2RlLCByb3ddKSxcbiAgKVxuICByZXR1cm4gY3VycmVuY3lDb2Rlcy5tYXAoKGN1cnJlbmN5Q29kZSkgPT4gKHtcbiAgICBrZXk6IGJ5Q3VycmVuY3lbY3VycmVuY3lDb2RlXT8ua2V5IHx8IGNvbmRpdGlvbktleShcImNvdXBvbi12YWx1ZVwiKSxcbiAgICBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeUNvZGUsXG4gICAgYW1vdW50OiBieUN1cnJlbmN5W2N1cnJlbmN5Q29kZV0/LmFtb3VudCB8fCBcIlwiLFxuICB9KSlcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFB1cmNoYXNlQ29uZGl0aW9ucyhvcHRpb25zOiBPcHRpb25zUGF5bG9hZCkge1xuICBjb25zdCBjdXJyZW5jeUNvZGUgPSBkZWZhdWx0Q3VycmVuY3kob3B0aW9ucylcbiAgcmV0dXJuIGN1cnJlbmN5Q29kZVxuICAgID8gW1xuICAgICAge1xuICAgICAgICBrZXk6IGNvbmRpdGlvbktleShcImN1cnJlbmN5XCIpLFxuICAgICAgICBhdHRyaWJ1dGU6IFwiY3VycmVuY3lfY29kZVwiIGFzIGNvbnN0LFxuICAgICAgICBvcGVyYXRvcjogXCJlcVwiIGFzIGNvbnN0LFxuICAgICAgICB2YWx1ZXM6IFtjdXJyZW5jeUNvZGVdLFxuICAgICAgfSxcbiAgICBdXG4gICAgOiBbXVxufVxuXG5mdW5jdGlvbiBlbXB0eVByb2R1Y3Qob3B0aW9uczogT3B0aW9uc1BheWxvYWQpOiBQcm9kdWN0Rm9ybVN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0aXRsZTogXCJcIixcbiAgICBzdWJ0aXRsZTogXCJcIixcbiAgICBoYW5kbGU6IFwiXCIsXG4gICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgbWVkaWE6IFtdLFxuICAgIHNrdTogXCJcIixcbiAgICBwcmljZV9hbW91bnRzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAob3B0aW9ucy5jdXJyZW5jaWVzIHx8IFtdKS5tYXAoKGN1cnJlbmN5KSA9PiBbY3VycmVuY3kuY29kZSwgXCJcIl0pLFxuICAgICksXG4gICAgc3RhdHVzOiBcImRyYWZ0XCIsXG4gICAgZGlzY291bnRhYmxlOiBmYWxzZSxcbiAgICBzZWxsZXJfaWQ6IFwiXCIsXG4gICAgdHlwZV9pZDogXCJcIixcbiAgICBjb2xsZWN0aW9uX2lkOiBcIlwiLFxuICAgIGNhdGVnb3J5X2lkOiBcIlwiLFxuICAgIHRhZ19pZDogXCJcIixcbiAgfVxufVxuXG5mdW5jdGlvbiBlbXB0eUNvdXBvbihvcHRpb25zOiBPcHRpb25zUGF5bG9hZCk6IENvdXBvbkZvcm1TdGF0ZSB7XG4gIGNvbnN0IGN1cnJlbmN5Q29kZSA9IGRlZmF1bHRDdXJyZW5jeShvcHRpb25zKVxuICBjb25zdCBwdXJjaGFzZUNvbmRpdGlvbnMgPSBkZWZhdWx0UHVyY2hhc2VDb25kaXRpb25zKG9wdGlvbnMpXG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICB0eXBlOiBcImFtb3VudF9vZmZfcHJvZHVjdHNcIixcbiAgICBwdXJjaGFzZV9jb25kaXRpb25zOiBwdXJjaGFzZUNvbmRpdGlvbnMsXG4gICAgYW1vdW50czogY3VycmVuY3lDb2RlXG4gICAgICA/IFtcbiAgICAgICAge1xuICAgICAgICAgIGtleTogXCJjb3Vwb24tdmFsdWUtZGVmYXVsdFwiLFxuICAgICAgICAgIGN1cnJlbmN5X2NvZGU6IGN1cnJlbmN5Q29kZSxcbiAgICAgICAgICBhbW91bnQ6IFwiXCIsXG4gICAgICAgIH0sXG4gICAgICBdXG4gICAgICA6IFtdLFxuICAgIHBlcmNlbnRhZ2U6IFwiXCIsXG4gICAgYWxsb2NhdGlvbjogXCJlYWNoXCIsXG4gICAgY29kZV9zdHJhdGVneTogXCJ1bmlxdWVfY29kZVwiLFxuICAgIGNvZGVfcHJlZml4OiBcIkNPVVBPTlwiLFxuICAgIHNoYXJlZF9jb2RlOiBcIlwiLFxuICAgIGV4cGlyYXRpb25fdHlwZTogXCJkdXJhdGlvblwiLFxuICAgIGV4cGlyYXRpb25fZGF5czogXCIzMFwiLFxuICAgIGV4cGlyYXRpb25fZGF0ZTogXCJcIixcbiAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogdHJ1ZSxcbiAgICBleHBpcmF0aW9uX2NhcF9hdDogXCJcIixcbiAgICBtYXhfaXNzdWFuY2VfcGVyX29yZGVyX2l0ZW06IFwiMVwiLFxuICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTogXCJub25lXCIsXG4gICAgcHJvbW90aW9uX3N0YXR1czogXCJkcmFmdFwiLFxuICB9XG59XG5cbmNvbnN0IGVtcHR5Q2FtcGFpZ246IENhbXBhaWduRm9ybVN0YXRlID0ge1xuICBtb2RlOiBcIm5vbmVcIixcbiAgY2FtcGFpZ25faWQ6IFwiXCIsXG4gIG5hbWU6IFwiXCIsXG4gIGNhbXBhaWduX2lkZW50aWZpZXI6IFwiXCIsXG4gIHN0YXJ0c19hdDogXCJcIixcbiAgZW5kc19hdDogXCJcIixcbn1cblxuZnVuY3Rpb24gZm9ybXNGcm9tUm93KFxuICByb3c6IENvdXBvblByb2R1Y3RSb3csXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkLFxuKToge1xuICBwcm9kdWN0OiBQcm9kdWN0Rm9ybVN0YXRlXG4gIGNvdXBvbjogQ291cG9uRm9ybVN0YXRlXG4gIGNhbXBhaWduOiBDYW1wYWlnbkZvcm1TdGF0ZVxufSB7XG4gIGNvbnN0IHByb2R1Y3QgPSByb3cucHJvZHVjdFxuICBjb25zdCBjb25maWcgPSByb3cuY291cG9uX3Byb2R1Y3RfY29uZmlnXG4gIGNvbnN0IHZhcmlhbnQgPSBwcm9kdWN0LnZhcmlhbnRzPy5bMF1cbiAgY29uc3QgcHJpY2VzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICh2YXJpYW50Py5wcmljZXMgfHwgW10pXG4gICAgICAuZmlsdGVyKChwcmljZSkgPT4gcHJpY2UuY3VycmVuY3lfY29kZSlcbiAgICAgIC5tYXAoKHByaWNlKSA9PiBbXG4gICAgICAgIFN0cmluZyhwcmljZS5jdXJyZW5jeV9jb2RlKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICBwcmljZS5hbW91bnQgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcocHJpY2UuYW1vdW50KSxcbiAgICAgIF0pLFxuICApXG4gIGNvbnN0IG1lZGlhID0gQXJyYXkuZnJvbShcbiAgICBuZXcgTWFwKFxuICAgICAgW1xuICAgICAgICAuLi4ocHJvZHVjdC50aHVtYm5haWxcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVybDogcHJvZHVjdC50aHVtYm5haWwsXG4gICAgICAgICAgICAgICAgYXNzZXRfaWQ6IHByb2R1Y3QudGh1bWJuYWlsX2Fzc2V0X2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHByb2R1Y3QuaW1hZ2VzIHx8IFtdKVxuICAgICAgICAgIC5maWx0ZXIoKGltYWdlKSA9PiBpbWFnZS51cmwpXG4gICAgICAgICAgLm1hcCgoaW1hZ2UpID0+ICh7XG4gICAgICAgICAgICB1cmw6IFN0cmluZyhpbWFnZS51cmwpLFxuICAgICAgICAgICAgYXNzZXRfaWQ6IGltYWdlLmFzc2V0X2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KSksXG4gICAgICBdLm1hcCgoaXRlbSkgPT4gW2l0ZW0udXJsLCBpdGVtXSksXG4gICAgKS52YWx1ZXMoKSxcbiAgKVxuICBjb25zdCBjb25maWd1cmVkQW1vdW50cyA9XG4gICAgQXJyYXkuaXNBcnJheShjb25maWcuYW1vdW50cykgJiYgY29uZmlnLmFtb3VudHMubGVuZ3RoXG4gICAgICA/IGNvbmZpZy5hbW91bnRzXG4gICAgICA6IGNvbmZpZy5hbW91bnQgIT0gbnVsbCAmJiBjb25maWcuY3VycmVuY3lfY29kZVxuICAgICAgICA/IFt7IGFtb3VudDogY29uZmlnLmFtb3VudCwgY3VycmVuY3lfY29kZTogY29uZmlnLmN1cnJlbmN5X2NvZGUgfV1cbiAgICAgICAgOiBbXVxuICBjb25zdCBjb25maWd1cmVkQ29uZGl0aW9ucyA9IChjb25maWcucHVyY2hhc2VfY29uZGl0aW9ucyB8fCBbXSkubWFwKFxuICAgIChjb25kaXRpb24sIGluZGV4KSA9PiAoe1xuICAgICAga2V5OiBgY29uZGl0aW9uLSR7aW5kZXh9YCxcbiAgICAgIGF0dHJpYnV0ZTogY29uZGl0aW9uLmF0dHJpYnV0ZSxcbiAgICAgIG9wZXJhdG9yOiBjb25kaXRpb24ub3BlcmF0b3IsXG4gICAgICB2YWx1ZXM6IGNvbmRpdGlvbi52YWx1ZXMubWFwKCh2YWx1ZSkgPT5cbiAgICAgICAgY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCIgfHxcbiAgICAgICAgICBjb25kaXRpb24uYXR0cmlidXRlID09PSBcInNoaXBwaW5nX2FkZHJlc3MuY291bnRyeV9jb2RlXCJcbiAgICAgICAgICA/IHZhbHVlLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA6IHZhbHVlLFxuICAgICAgKSxcbiAgICB9KSxcbiAgKVxuICBpZiAoXG4gICAgIWNvbmZpZ3VyZWRDb25kaXRpb25zLnNvbWUoXG4gICAgICAoY29uZGl0aW9uKSA9PiBjb25kaXRpb24uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIixcbiAgICApICYmXG4gICAgY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJlxuICAgIGNvbmZpZ3VyZWRBbW91bnRzLmxlbmd0aFxuICApIHtcbiAgICBjb25maWd1cmVkQ29uZGl0aW9ucy5wdXNoKHtcbiAgICAgIGtleTogXCJjb25kaXRpb24tbGVnYWN5LWN1cnJlbmN5XCIsXG4gICAgICBhdHRyaWJ1dGU6IFwiY3VycmVuY3lfY29kZVwiLFxuICAgICAgb3BlcmF0b3I6IGNvbmZpZ3VyZWRBbW91bnRzLmxlbmd0aCA9PT0gMSA/IFwiZXFcIiA6IFwiaW5cIixcbiAgICAgIHZhbHVlczogY29uZmlndXJlZEFtb3VudHMubWFwKChhbW91bnQpID0+XG4gICAgICAgIGFtb3VudC5jdXJyZW5jeV9jb2RlLnRvTG93ZXJDYXNlKCksXG4gICAgICApLFxuICAgIH0pXG4gIH1cbiAgaWYgKFxuICAgICFjb25maWd1cmVkQ29uZGl0aW9ucy5zb21lKFxuICAgICAgKGNvbmRpdGlvbikgPT4gY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJzYWxlc19jaGFubmVsX2lkXCIsXG4gICAgKSAmJlxuICAgIHByb2R1Y3Quc2FsZXNfY2hhbm5lbHM/Lmxlbmd0aFxuICApIHtcbiAgICBjb25maWd1cmVkQ29uZGl0aW9ucy5wdXNoKHtcbiAgICAgIGtleTogXCJjb25kaXRpb24tbGVnYWN5LXNhbGVzLWNoYW5uZWxcIixcbiAgICAgIGF0dHJpYnV0ZTogXCJzYWxlc19jaGFubmVsX2lkXCIsXG4gICAgICBvcGVyYXRvcjogcHJvZHVjdC5zYWxlc19jaGFubmVscy5sZW5ndGggPT09IDEgPyBcImVxXCIgOiBcImluXCIsXG4gICAgICB2YWx1ZXM6IHByb2R1Y3Quc2FsZXNfY2hhbm5lbHMubWFwKChjaGFubmVsKSA9PiBjaGFubmVsLmlkKSxcbiAgICB9KVxuICB9XG4gIGNvbnN0IGV4cGlyYXRpb25Qb2xpY3kgPSBjb25maWcuZXhwaXJhdGlvbl9wb2xpY3lcbiAgY29uc3QgY29uZmlndXJlZEFtb3VudFJvd3MgPSBjb25maWd1cmVkQW1vdW50cy5tYXAoKHJvdywgaW5kZXgpID0+ICh7XG4gICAga2V5OiBgY291cG9uLXZhbHVlLSR7aW5kZXh9YCxcbiAgICBhbW91bnQ6IFN0cmluZyhyb3cuYW1vdW50KSxcbiAgICBjdXJyZW5jeV9jb2RlOiByb3cuY3VycmVuY3lfY29kZS50b0xvd2VyQ2FzZSgpLFxuICB9KSlcbiAgY29uc3QgYW1vdW50Um93cyA9XG4gICAgY29uZmlnLmJlbmVmaXRfdHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIlxuICAgICAgPyByZWNvbmNpbGVDb3Vwb25BbW91bnRzKFxuICAgICAgICBjb25maWd1cmVkQW1vdW50Um93cyxcbiAgICAgICAgZWZmZWN0aXZlQ291cG9uQ3VycmVuY2llcyhjb25maWd1cmVkQ29uZGl0aW9ucywgb3B0aW9ucy5jdXJyZW5jaWVzIHx8IFtdKSxcbiAgICAgIClcbiAgICAgIDogY29uZmlndXJlZEFtb3VudFJvd3NcblxuICByZXR1cm4ge1xuICAgIHByb2R1Y3Q6IHtcbiAgICAgIC4uLmVtcHR5UHJvZHVjdChvcHRpb25zKSxcbiAgICAgIHRpdGxlOiBwcm9kdWN0LnRpdGxlIHx8IFwiXCIsXG4gICAgICBzdWJ0aXRsZTogcHJvZHVjdC5zdWJ0aXRsZSB8fCBcIlwiLFxuICAgICAgaGFuZGxlOiBwcm9kdWN0LmhhbmRsZSB8fCBcIlwiLFxuICAgICAgZGVzY3JpcHRpb246IHByb2R1Y3QuZGVzY3JpcHRpb24gfHwgXCJcIixcbiAgICAgIG1lZGlhLFxuICAgICAgc2t1OiB2YXJpYW50Py5za3UgfHwgXCJcIixcbiAgICAgIHByaWNlX2Ftb3VudHM6IHtcbiAgICAgICAgLi4uZW1wdHlQcm9kdWN0KG9wdGlvbnMpLnByaWNlX2Ftb3VudHMsXG4gICAgICAgIC4uLnByaWNlcyxcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHByb2R1Y3Quc3RhdHVzIHx8IFwiZHJhZnRcIixcbiAgICAgIGRpc2NvdW50YWJsZTogQm9vbGVhbihwcm9kdWN0LmRpc2NvdW50YWJsZSksXG4gICAgICB0eXBlX2lkOiBwcm9kdWN0LnR5cGVfaWQgfHwgXCJcIixcbiAgICAgIGNvbGxlY3Rpb25faWQ6IHByb2R1Y3QuY29sbGVjdGlvbl9pZCB8fCBcIlwiLFxuICAgICAgY2F0ZWdvcnlfaWQ6IHByb2R1Y3QuY2F0ZWdvcmllcz8uWzBdPy5pZCB8fCBcIlwiLFxuICAgICAgdGFnX2lkOiBwcm9kdWN0LnRhZ3M/LlswXT8uaWQgfHwgXCJcIixcbiAgICB9LFxuICAgIGNvdXBvbjoge1xuICAgICAgLi4uZW1wdHlDb3Vwb24ob3B0aW9ucyksXG4gICAgICBlbmFibGVkOiBjb25maWcuZW5hYmxlZCxcbiAgICAgIHR5cGU6IGNvdXBvblR5cGVGcm9tQ29uZmlnKGNvbmZpZyksXG4gICAgICBwdXJjaGFzZV9jb25kaXRpb25zOiBjb25maWd1cmVkQ29uZGl0aW9ucyxcbiAgICAgIGFtb3VudHM6XG4gICAgICAgIGNvbmZpZy5iZW5lZml0X3R5cGUgPT09IFwiZml4ZWRfYW1vdW50XCJcbiAgICAgICAgICA/IGFtb3VudFJvd3NcbiAgICAgICAgICA6IGFtb3VudFJvd3MubGVuZ3RoXG4gICAgICAgICAgICA/IGFtb3VudFJvd3NcbiAgICAgICAgICAgIDogZW1wdHlDb3Vwb24ob3B0aW9ucykuYW1vdW50cyxcbiAgICAgIHBlcmNlbnRhZ2U6IGNvbmZpZy5wZXJjZW50YWdlID09IG51bGwgPyBcIlwiIDogU3RyaW5nKGNvbmZpZy5wZXJjZW50YWdlKSxcbiAgICAgIGFsbG9jYXRpb246XG4gICAgICAgIGNvbmZpZy5wcm9tb3Rpb25fdGVtcGxhdGU/LmFwcGxpY2F0aW9uX21ldGhvZD8uYWxsb2NhdGlvbiA9PT0gXCJvbmNlXCJcbiAgICAgICAgICA/IChcIm9uY2VcIiBhcyBjb25zdClcbiAgICAgICAgICA6IChcImVhY2hcIiBhcyBjb25zdCksXG4gICAgICBjb2RlX3N0cmF0ZWd5OiBjb25maWcuY29kZV9zdHJhdGVneSxcbiAgICAgIGNvZGVfcHJlZml4OiBjb25maWcuY29kZV9wcmVmaXggfHwgXCJcIixcbiAgICAgIHNoYXJlZF9jb2RlOiBjb25maWcuc2hhcmVkX2NvZGUgfHwgXCJcIixcbiAgICAgIGV4cGlyYXRpb25fdHlwZTogY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlIHx8IFwiZHVyYXRpb25cIixcbiAgICAgIGV4cGlyYXRpb25fZGF5czpcbiAgICAgICAgY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlID09PSBcImR1cmF0aW9uXCJcbiAgICAgICAgICA/IFN0cmluZyhjb25maWcuZXhwaXJhdGlvbl9wb2xpY3kuZHVyYXRpb25fZGF5cylcbiAgICAgICAgICA6IFwiMzBcIixcbiAgICAgIGV4cGlyYXRpb25fZGF0ZTpcbiAgICAgICAgY29uZmlnLmV4cGlyYXRpb25fcG9saWN5Py50eXBlID09PSBcImZpeGVkXCJcbiAgICAgICAgICA/IHRvRGF0ZVRpbWVMb2NhbChjb25maWcuZXhwaXJhdGlvbl9wb2xpY3kuZXhwaXJlc19hdClcbiAgICAgICAgICA6IFwiXCIsXG4gICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjpcbiAgICAgICAgZXhwaXJhdGlvblBvbGljeS50eXBlID09PSBcIm5vbmVcIiB8fFxuICAgICAgICBleHBpcmF0aW9uUG9saWN5LmNhcF9ieV9jYW1wYWlnbiAhPT0gZmFsc2UsXG4gICAgICBleHBpcmF0aW9uX2NhcF9hdDpcbiAgICAgICAgZXhwaXJhdGlvblBvbGljeS50eXBlID09PSBcIm5vbmVcIlxuICAgICAgICAgID8gXCJcIlxuICAgICAgICAgIDogdG9EYXRlVGltZUxvY2FsKGV4cGlyYXRpb25Qb2xpY3kuY2FwX2F0KSxcbiAgICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogU3RyaW5nKFxuICAgICAgICBjb25maWcubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtIHx8IDEsXG4gICAgICApLFxuICAgICAgcHJvbW90aW9uX21pcnJvcl9tb2RlOiBjb25maWcucHJvbW90aW9uX21pcnJvcl9tb2RlIHx8IFwibm9uZVwiLFxuICAgICAgcHJvbW90aW9uX3N0YXR1czogY29uZmlnLnByb21vdGlvbl9zdGF0dXMgfHwgXCJkcmFmdFwiLFxuICAgIH0sXG4gICAgY2FtcGFpZ246IHtcbiAgICAgIC4uLmVtcHR5Q2FtcGFpZ24sXG4gICAgICBtb2RlOiBjb25maWcuY2FtcGFpZ25faWQgPyAoXCJleGlzdGluZ1wiIGFzIGNvbnN0KSA6IChcIm5vbmVcIiBhcyBjb25zdCksXG4gICAgICBjYW1wYWlnbl9pZDogY29uZmlnLmNhbXBhaWduX2lkIHx8IFwiXCIsXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCBtb2RhbENvbnRlbnRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIG92ZXJmbG93OiBcImhpZGRlblwiLFxufVxuXG5jb25zdCBtb2RhbFdpemFyZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImZsZXhcIixcbiAgZmxleDogXCIxIDEgYXV0b1wiLFxuICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiLFxuICBtaW5IZWlnaHQ6IDAsXG4gIG92ZXJmbG93OiBcImhpZGRlblwiLFxufVxuXG5jb25zdCB2aXN1YWxseUhpZGRlblN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBjbGlwOiBcInJlY3QoMCAwIDAgMClcIixcbiAgY2xpcFBhdGg6IFwiaW5zZXQoNTAlKVwiLFxuICBoZWlnaHQ6IDEsXG4gIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICB3aGl0ZVNwYWNlOiBcIm5vd3JhcFwiLFxuICB3aWR0aDogMSxcbn1cblxuY29uc3QgbW9kYWxCb2R5U3R5bGU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGZsZXg6IFwiMSAxIGF1dG9cIixcbiAgbWluSGVpZ2h0OiAwLFxuICBwYWRkaW5nOiAwLFxufVxuXG5jb25zdCBtb2RhbFNjcm9sbFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBoZWlnaHQ6IFwiMTAwJVwiLFxuICBvdmVyZmxvd1k6IFwiYXV0b1wiLFxuICBwYWRkaW5nOiBcIjY0cHggMjRweCAxMTJweFwiLFxuICB3aWR0aDogXCIxMDAlXCIsXG59XG5cbmNvbnN0IG1vZGFsRm9ybVN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBtYXJnaW46IFwiMCBhdXRvXCIsXG4gIG1heFdpZHRoOiA3MjAsXG4gIHdpZHRoOiBcIm1pbig3MjBweCwgMTAwJSlcIixcbn1cblxuY29uc3Qgc3RhY2tTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJmbGV4XCIsXG4gIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gIGdhcDogMjQsXG59XG5cbmNvbnN0IHR3b0NvbHVtbkdyaWRTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgZGlzcGxheTogXCJncmlkXCIsXG4gIGdhcDogMTYsXG4gIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjYwcHgsIDFmcikpXCIsXG59XG5cbmNvbnN0IHRocmVlQ29sdW1uR3JpZFN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBkaXNwbGF5OiBcImdyaWRcIixcbiAgZ2FwOiAxNixcbiAgZ3JpZFRlbXBsYXRlQ29sdW1uczogXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heCgxODBweCwgMWZyKSlcIixcbn1cblxuY29uc3QgcGFuZWxTdHlsZTogQ1NTUHJvcGVydGllcyA9IHtcbiAgYm9yZGVyOiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgYm9yZGVyUmFkaXVzOiA4LFxuICBwYWRkaW5nOiAxNixcbn1cblxuZnVuY3Rpb24gRmllbGQoe1xuICBjaGlsZHJlbixcbiAgbGFiZWwsXG4gIG9wdGlvbmFsLFxuICB0b29sdGlwLFxufToge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gIGxhYmVsOiBzdHJpbmdcbiAgb3B0aW9uYWw/OiBib29sZWFuXG4gIHRvb2x0aXA/OiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktMVwiIHN0eWxlPXt7IG1pbldpZHRoOiAwIH19PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0xXCI+XG4gICAgICAgIDxMYWJlbD57bGFiZWx9PC9MYWJlbD5cbiAgICAgICAge3Rvb2x0aXAgJiYgKFxuICAgICAgICAgIDxUb29sdGlwIGNvbnRlbnQ9e3Rvb2x0aXB9PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD17YCR7bGFiZWx9IGluZm9ybWF0aW9uYH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxJbmZvcm1hdGlvbkNpcmNsZSAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICApfVxuICAgICAgICB7b3B0aW9uYWwgJiYgKFxuICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgIChPcHRpb25hbClcbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWN0aW9uKHtcbiAgY2hpbGRyZW4sXG4gIGRlc2NyaXB0aW9uLFxuICB0aXRsZSxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZVxuICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS00XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgyXCI+e3RpdGxlfTwvSGVhZGluZz5cbiAgICAgICAge2Rlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICB7ZGVzY3JpcHRpb259XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9zZWN0aW9uPlxuICApXG59XG5cbmZ1bmN0aW9uIE9wdGlvblNlbGVjdCh7XG4gIG9uQ2hhbmdlLFxuICBvcHRpb25zLFxuICB2YWx1ZSxcbn06IHtcbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIG9wdGlvbnM6IE9wdGlvblJlY29yZFtdXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0XG4gICAgICB2YWx1ZT17dmFsdWUgfHwgTk9ORX1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9eyhuZXh0KSA9PiBvbkNoYW5nZShuZXh0ID09PSBOT05FID8gXCJcIiA6IG5leHQpfVxuICAgID5cbiAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPXtOT05FfT5Ob25lPC9TZWxlY3QuSXRlbT5cbiAgICAgICAge29wdGlvbnMubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtvcHRpb24uaWR9IHZhbHVlPXtvcHRpb24uaWR9PlxuICAgICAgICAgICAge29wdGlvbkxhYmVsKG9wdGlvbil9XG4gICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgKSl9XG4gICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgIDwvU2VsZWN0PlxuICApXG59XG5cbmZ1bmN0aW9uIEN1cnJlbmN5U2VsZWN0KHtcbiAgY3VycmVuY2llcyxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFxuICAgICAgdmFsdWU9e3ZhbHVlIHx8IHVuZGVmaW5lZH1cbiAgICAgIGRpc2FibGVkPXshY3VycmVuY2llcy5sZW5ndGh9XG4gICAgICBvblZhbHVlQ2hhbmdlPXtvbkNoYW5nZX1cbiAgICA+XG4gICAgICA8U2VsZWN0LlRyaWdnZXI+XG4gICAgICAgIDxTZWxlY3QuVmFsdWVcbiAgICAgICAgICBwbGFjZWhvbGRlcj17XG4gICAgICAgICAgICBjdXJyZW5jaWVzLmxlbmd0aCA/IFwiU2VsZWN0IGN1cnJlbmN5XCIgOiBcIk5vIGN1cnJlbmNpZXMgYXZhaWxhYmxlXCJcbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICB7Y3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiAoXG4gICAgICAgICAgPFNlbGVjdC5JdGVtIGtleT17Y3VycmVuY3kuY29kZX0gdmFsdWU9e2N1cnJlbmN5LmNvZGV9PlxuICAgICAgICAgICAge2N1cnJlbmN5Lm5hbWV9ICh7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfSlcbiAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICApKX1cbiAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgPC9TZWxlY3Q+XG4gIClcbn1cblxuZnVuY3Rpb24gQ3VycmVuY3lBbW91bnRGaWVsZCh7XG4gIGN1cnJlbmNpZXMsXG4gIGN1cnJlbmN5Q29kZSxcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBjdXJyZW5jaWVzOiBDdXJyZW5jeU9wdGlvbltdXG4gIGN1cnJlbmN5Q29kZTogc3RyaW5nXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIGNvbnN0IGN1cnJlbmN5ID0gY3VycmVuY2llcy5maW5kKChpdGVtKSA9PiBpdGVtLmNvZGUgPT09IGN1cnJlbmN5Q29kZSlcbiAgY29uc3QgY29kZSA9IGN1cnJlbmN5Q29kZS50b1VwcGVyQ2FzZSgpXG4gIGNvbnN0IGRlY2ltYWxzID0gY3VycmVuY3lEZWNpbWFsRGlnaXRzKGNvZGUgfHwgXCJVU0RcIilcbiAgcmV0dXJuIChcbiAgICA8Q3VycmVuY3lJbnB1dFxuICAgICAgY29kZT17Y29kZSB8fCBcIlVTRFwifVxuICAgICAgc3ltYm9sPXtcbiAgICAgICAgY3VycmVuY3k/LnN5bWJvbF9uYXRpdmUgfHxcbiAgICAgICAgY3VycmVuY3k/LnN5bWJvbCB8fFxuICAgICAgICBjdXJyZW5jeVN5bWJvbChjb2RlIHx8IFwiVVNEXCIpXG4gICAgICB9XG4gICAgICBtaW49ezB9XG4gICAgICBkZWNpbWFsU2NhbGU9e2RlY2ltYWxzfVxuICAgICAgZGVjaW1hbHNMaW1pdD17ZGVjaW1hbHN9XG4gICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICBkaXNhYmxlZD17IWN1cnJlbmN5Q29kZX1cbiAgICAgIG9uVmFsdWVDaGFuZ2U9eyhuZXh0VmFsdWUpID0+IG9uQ2hhbmdlKG5leHRWYWx1ZSB8fCBcIlwiKX1cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFBlcmNlbnRhZ2VJbnB1dCh7XG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHZhbHVlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGl0ZW1zLXN0cmV0Y2hcIiBzdHlsZT17eyB3aWR0aDogXCIxMDAlXCIgfX0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImJnLXVpLWJnLWZpZWxkIHRleHQtdWktZmctbXV0ZWQgZmxleCBpdGVtcy1jZW50ZXIgYm9yZGVyXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBib3JkZXJDb2xvcjogXCJ2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiNnB4IDAgMCA2cHhcIixcbiAgICAgICAgICBib3JkZXJSaWdodDogMCxcbiAgICAgICAgICBwYWRkaW5nOiBcIjAgMTJweFwiLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICAlXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwibWluLXctMCBmbGV4LTFcIlxuICAgICAgICBzdHlsZT17eyBmbGV4OiBcIjEgMSAwJVwiLCBtaW5XaWR0aDogMCB9fVxuICAgICAgPlxuICAgICAgICA8SW5wdXRcbiAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGxcIlxuICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgIG1pbj17MX1cbiAgICAgICAgICBtYXg9ezEwMH1cbiAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCIwIDZweCA2cHggMFwiLFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgIH19XG4gICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gb25DaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG5cbmZ1bmN0aW9uIEhhbmRsZUlucHV0KHtcbiAgb25DaGFuZ2UsXG4gIHZhbHVlLFxufToge1xuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgdmFsdWU6IHN0cmluZ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZCBwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGluc2V0LXktMCBsZWZ0LTAgei0xMCBmbGV4IG1pbi13LTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci1yIHB4LTIuNVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0eHQtY29tcGFjdC1zbWFsbCBmb250LW1lZGl1bVwiPi88L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxJbnB1dFxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIHBsYWNlaG9sZGVyPVwid2ludGVyLWphY2tldFwiXG4gICAgICAgIHN0eWxlPXt7IHBhZGRpbmdMZWZ0OiAzNCB9fVxuICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PiBvbkNoYW5nZShldmVudC50YXJnZXQudmFsdWUpfVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5mdW5jdGlvbiBNZWRpYVVwbG9hZCh7XG4gIGlzVXBsb2FkaW5nLFxuICBtZWRpYSxcbiAgb25SZW1vdmUsXG4gIG9uVXBsb2FkLFxufToge1xuICBpc1VwbG9hZGluZzogYm9vbGVhblxuICBtZWRpYTogUHJvZHVjdE1lZGlhW11cbiAgb25SZW1vdmU6IChtZWRpYTogUHJvZHVjdE1lZGlhKSA9PiB2b2lkXG4gIG9uVXBsb2FkOiAoZmlsZXM6IEZpbGVbXSkgPT4gdm9pZFxufSkge1xuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKVxuICBjb25zdCBhY2NlcHQgPVxuICAgIFwiaW1hZ2UvanBlZyxpbWFnZS9wbmcsaW1hZ2UvZ2lmLGltYWdlL3dlYnAsaW1hZ2UvaGVpYyxpbWFnZS9zdmcreG1sXCJcblxuICBjb25zdCBoYW5kbGVGaWxlcyA9IChmaWxlczogRmlsZUxpc3QgfCBudWxsKSA9PiB7XG4gICAgaWYgKCFmaWxlcz8ubGVuZ3RoKSByZXR1cm5cbiAgICBvblVwbG9hZChBcnJheS5mcm9tKGZpbGVzKSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyb3AgPSAoZXZlbnQ6IERyYWdFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgaGFuZGxlRmlsZXMoZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLXktM1wiPlxuICAgICAge21lZGlhLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtM1wiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IFwicmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDEyMHB4LCAxZnIpKVwiLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7bWVkaWEubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e2l0ZW0uYXNzZXRfaWQgfHwgaXRlbS51cmx9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1kIGJvcmRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBzcmM9e2l0ZW0udXJsfVxuICAgICAgICAgICAgICAgIGFsdD1cIlwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC0zMiB3LWZ1bGwgb2JqZWN0LWNvdmVyXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBoZWlnaHQ6IDEyOCB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXgtMCBib3R0b20tMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYmctYmxhY2svNjAgcHgtMiBweS0xXCI+XG4gICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInhzbWFsbFwiIHN0eWxlPXt7IGNvbG9yOiBcIndoaXRlXCIgfX0+XG4gICAgICAgICAgICAgICAgICB7aW5kZXggPT09IDAgPyBcIlRodW1ibmFpbFwiIDogYEltYWdlICR7aW5kZXggKyAxfWB9XG4gICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBpbWFnZVwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogXCJ3aGl0ZVwiIH19XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblJlbW92ZShpdGVtKX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8WE1hcmtNaW5pIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxpbnB1dFxuICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgIGhpZGRlblxuICAgICAgICBtdWx0aXBsZVxuICAgICAgICBhY2NlcHQ9e2FjY2VwdH1cbiAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4ge1xuICAgICAgICAgIGhhbmRsZUZpbGVzKGV2ZW50LnRhcmdldC5maWxlcylcbiAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBcIlwiXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgZGlzYWJsZWQ9e2lzVXBsb2FkaW5nfVxuICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkIGZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAteS0yIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1kYXNoZWQgcC04XCJcbiAgICAgICAgc3R5bGU9e3sgbWluSGVpZ2h0OiAxNDggfX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gaW5wdXRSZWYuY3VycmVudD8uY2xpY2soKX1cbiAgICAgICAgb25EcmFnT3Zlcj17KGV2ZW50KSA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpfVxuICAgICAgICBvbkRyb3A9e2hhbmRsZURyb3B9XG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtdWktZmctYmFzZSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0yXCI+XG4gICAgICAgICAgPEFycm93VXBUcmF5IC8+XG4gICAgICAgICAge2lzVXBsb2FkaW5nID8gXCJVcGxvYWRpbmcgaW1hZ2VzLi4uXCIgOiBcIlVwbG9hZCBpbWFnZXNcIn1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgRHJhZyBhbmQgZHJvcCBpbWFnZXMgaGVyZSBvciBjbGljayB0byB1cGxvYWQuXG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApXG59XG5cbnR5cGUgQ29uZGl0aW9uVmFsdWVPcHRpb24gPSB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVxuXG5mdW5jdGlvbiBjb25kaXRpb25WYWx1ZU9wdGlvbnMoXG4gIGF0dHJpYnV0ZTogUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGUgfCBcIlwiLFxuICBvcHRpb25zOiBPcHRpb25zUGF5bG9hZCxcbik6IENvbmRpdGlvblZhbHVlT3B0aW9uW10ge1xuICBpZiAoYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIikge1xuICAgIHJldHVybiAob3B0aW9ucy5jdXJyZW5jaWVzIHx8IFtdKS5tYXAoKGN1cnJlbmN5KSA9PiAoe1xuICAgICAgdmFsdWU6IGN1cnJlbmN5LmNvZGUsXG4gICAgICBsYWJlbDogYCR7Y3VycmVuY3kubmFtZX0gKCR7Y3VycmVuY3kuY29kZS50b1VwcGVyQ2FzZSgpfSlgLFxuICAgIH0pKVxuICB9XG4gIGlmIChhdHRyaWJ1dGUgPT09IFwic2hpcHBpbmdfYWRkcmVzcy5jb3VudHJ5X2NvZGVcIikge1xuICAgIHJldHVybiAob3B0aW9ucy5jb3VudHJpZXMgfHwgW10pLm1hcCgoY291bnRyeSkgPT4gKHtcbiAgICAgIHZhbHVlOiBTdHJpbmcoY291bnRyeS5pc29fMiB8fCBjb3VudHJ5LmlkKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbGFiZWw6IGNvdW50cnkuZGlzcGxheV9uYW1lIHx8IGNvdW50cnkubmFtZSB8fCBjb3VudHJ5LmlkLFxuICAgIH0pKVxuICB9XG5cbiAgY29uc3QgcmVjb3JkcyA9XG4gICAgYXR0cmlidXRlID09PSBcImN1c3RvbWVyLmdyb3Vwcy5pZFwiXG4gICAgICA/IG9wdGlvbnMuY3VzdG9tZXJfZ3JvdXBzXG4gICAgICA6IGF0dHJpYnV0ZSA9PT0gXCJyZWdpb24uaWRcIlxuICAgICAgICA/IG9wdGlvbnMucmVnaW9uc1xuICAgICAgICA6IGF0dHJpYnV0ZSA9PT0gXCJzYWxlc19jaGFubmVsX2lkXCJcbiAgICAgICAgICA/IG9wdGlvbnMuc2FsZXNfY2hhbm5lbHNcbiAgICAgICAgICA6IFtdXG4gIHJldHVybiAocmVjb3JkcyB8fCBbXSkubWFwKChyZWNvcmQpID0+ICh7XG4gICAgdmFsdWU6IHJlY29yZC5pZCxcbiAgICBsYWJlbDogb3B0aW9uTGFiZWwocmVjb3JkKSxcbiAgfSkpXG59XG5cbmZ1bmN0aW9uIE11bHRpQ29uZGl0aW9uVmFsdWVzKHtcbiAgYXR0cmlidXRlLFxuICBvbkNoYW5nZSxcbiAgb3B0aW9ucyxcbiAgdmFsdWUsXG59OiB7XG4gIGF0dHJpYnV0ZTogUHVyY2hhc2VDb25kaXRpb25BdHRyaWJ1dGVcbiAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nW10pID0+IHZvaWRcbiAgb3B0aW9uczogQ29uZGl0aW9uVmFsdWVPcHRpb25bXVxuICB2YWx1ZTogc3RyaW5nW11cbn0pIHtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtkcmFmdCwgc2V0RHJhZnRdID0gdXNlU3RhdGUodmFsdWUpXG4gIGNvbnN0IFtzZWFyY2gsIHNldFNlYXJjaF0gPSB1c2VTdGF0ZShcIlwiKVxuICBjb25zdCBsYWJlbHMgPSBPYmplY3QuZnJvbUVudHJpZXMob3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gW29wdGlvbi52YWx1ZSwgb3B0aW9uLmxhYmVsXSkpXG4gIGNvbnN0IGZpbHRlcmVkID0gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT5cbiAgICBvcHRpb24ubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCkpLFxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPEJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBqdXN0aWZ5LXN0YXJ0XCJcbiAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgIHNldERyYWZ0KHZhbHVlKVxuICAgICAgICAgIHNldFNlYXJjaChcIlwiKVxuICAgICAgICAgIHNldE9wZW4odHJ1ZSlcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge3ZhbHVlLmxlbmd0aFxuICAgICAgICAgID8gdmFsdWUubGVuZ3RoID09PSAxXG4gICAgICAgICAgICA/IGxhYmVsc1t2YWx1ZVswXV0gfHwgdmFsdWVbMF1cbiAgICAgICAgICAgIDogYCR7dmFsdWUubGVuZ3RofSB2YWx1ZXMgc2VsZWN0ZWRgXG4gICAgICAgICAgOiBcIlNlbGVjdCB2YWx1ZXNcIn1cbiAgICAgIDwvQnV0dG9uPlxuICAgICAge3ZhbHVlLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgZmxleCBmbGV4LXdyYXAgZ2FwLTFcIj5cbiAgICAgICAgICB7dmFsdWUubWFwKChpdGVtKSA9PiAoXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBrZXk9e2l0ZW19XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJnLXVpLWJnLWNvbXBvbmVudCB0ZXh0LXVpLWZnLXN1YnRsZSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0xIHJvdW5kZWQtbWQgYm9yZGVyIHB4LTIgcHktMSB0ZXh0LXhzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2xhYmVsc1tpdGVtXSB8fCBpdGVtfVxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17YFJlbW92ZSAke2xhYmVsc1tpdGVtXSB8fCBpdGVtfWB9XG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UodmFsdWUuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkgIT09IGl0ZW0pKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxYTWFya01pbmkgLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxEcmF3ZXIgb3Blbj17b3Blbn0gb25PcGVuQ2hhbmdlPXtzZXRPcGVufT5cbiAgICAgICAgPERyYXdlci5Db250ZW50PlxuICAgICAgICAgIDxEcmF3ZXIuSGVhZGVyPlxuICAgICAgICAgICAgPERyYXdlci5UaXRsZT5cbiAgICAgICAgICAgICAgU2VsZWN0IHtjb25kaXRpb25BdHRyaWJ1dGVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGF0dHJpYnV0ZSk/LmxhYmVsfVxuICAgICAgICAgICAgPC9EcmF3ZXIuVGl0bGU+XG4gICAgICAgICAgPC9EcmF3ZXIuSGVhZGVyPlxuICAgICAgICAgIDxEcmF3ZXIuQm9keSBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTMgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaH1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggdmFsdWVzXCJcbiAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gc2V0U2VhcmNoKGV2ZW50LnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge2ZpbHRlcmVkLmxlbmd0aCA/IChcbiAgICAgICAgICAgICAgZmlsdGVyZWQubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgIGtleT17b3B0aW9uLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgZ2FwLXgtMyByb3VuZGVkLW1kIGJvcmRlciBwLTNcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtkcmFmdC5pbmNsdWRlcyhvcHRpb24udmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldERyYWZ0KChjdXJyZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFycmF5LmZyb20obmV3IFNldChbLi4uY3VycmVudCwgb3B0aW9uLnZhbHVlXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudC5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gb3B0aW9uLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8VGV4dD57b3B0aW9uLmxhYmVsfTwvVGV4dD5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPFRleHQgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPk5vIG1hdGNoaW5nIHZhbHVlcy48L1RleHQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvRHJhd2VyLkJvZHk+XG4gICAgICAgICAgPERyYXdlci5Gb290ZXI+XG4gICAgICAgICAgICA8QnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gc2V0T3BlbihmYWxzZSl9PlxuICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFkcmFmdC5sZW5ndGh9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICBvbkNoYW5nZShkcmFmdClcbiAgICAgICAgICAgICAgICBzZXRPcGVuKGZhbHNlKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBBcHBseVxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9EcmF3ZXIuRm9vdGVyPlxuICAgICAgICA8L0RyYXdlci5Db250ZW50PlxuICAgICAgPC9EcmF3ZXI+XG4gICAgPC8+XG4gIClcbn1cblxuZnVuY3Rpb24gUHVyY2hhc2VDb25kaXRpb25zRmllbGQoe1xuICBmaXhlZEFtb3VudCxcbiAgb25DaGFuZ2UsXG4gIG9wdGlvbnMsXG4gIHZhbHVlLFxufToge1xuICBmaXhlZEFtb3VudDogYm9vbGVhblxuICBvbkNoYW5nZTogKGNvbmRpdGlvbnM6IFB1cmNoYXNlQ29uZGl0aW9uRm9ybVtdKSA9PiB2b2lkXG4gIG9wdGlvbnM6IE9wdGlvbnNQYXlsb2FkXG4gIHZhbHVlOiBQdXJjaGFzZUNvbmRpdGlvbkZvcm1bXVxufSkge1xuICBjb25zdCBzZWxlY3RlZEF0dHJpYnV0ZXMgPSBuZXcgU2V0KFxuICAgIHZhbHVlLm1hcCgoY29uZGl0aW9uKSA9PiBjb25kaXRpb24uYXR0cmlidXRlKS5maWx0ZXIoQm9vbGVhbiksXG4gIClcblxuICBjb25zdCByZXBsYWNlID0gKGtleTogc3RyaW5nLCB1cGRhdGU6IFBhcnRpYWw8UHVyY2hhc2VDb25kaXRpb25Gb3JtPikgPT5cbiAgICBvbkNoYW5nZShcbiAgICAgIHZhbHVlLm1hcCgoY29uZGl0aW9uKSA9PlxuICAgICAgICBjb25kaXRpb24ua2V5ID09PSBrZXkgPyB7IC4uLmNvbmRpdGlvbiwgLi4udXBkYXRlIH0gOiBjb25kaXRpb24sXG4gICAgICApLFxuICAgIClcblxuICByZXR1cm4gKFxuICAgIDxTZWN0aW9uXG4gICAgICB0aXRsZT1cIldobyBjYW4gcHVyY2hhc2UgdGhpcyBjb3Vwb24/XCJcbiAgICAgIGRlc2NyaXB0aW9uPVwiQ291cG9uIHByb2R1Y3RzIGNhbiBiZSBwdXJjaGFzZWQgYnkgYWxsIGN1c3RvbWVycyB3aGVuIG5vIGNvbmRpdGlvbnMgYXJlIGNvbmZpZ3VyZWQuIENvbmRpdGlvbnMgYXJlIGNvbWJpbmVkIHdpdGggQU5ELlwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTNcIj5cbiAgICAgICAge3ZhbHVlLm1hcCgoY29uZGl0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGNvbmRpdGlvblZhbHVlT3B0aW9ucyhjb25kaXRpb24uYXR0cmlidXRlLCBvcHRpb25zKVxuICAgICAgICAgIGNvbnN0IGN1cnJlbmN5UmVxdWlyZWQgPVxuICAgICAgICAgICAgZml4ZWRBbW91bnQgJiYgY29uZGl0aW9uLmF0dHJpYnV0ZSA9PT0gXCJjdXJyZW5jeV9jb2RlXCJcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBrZXk9e2NvbmRpdGlvbi5rZXl9PlxuICAgICAgICAgICAgICB7aW5kZXggPiAwICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWQgZmxleCBoLTggaXRlbXMtY2VudGVyIHRleHQteHMgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIEFORFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfSBjbGFzc05hbWU9XCJyZWxhdGl2ZSBmbGV4IGZsZXgtY29sIGdhcC15LTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQgZ2FwLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb25kaXRpb24uYXR0cmlidXRlIHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y3VycmVuY3lSZXF1aXJlZH1cbiAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoYXR0cmlidXRlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZShjb25kaXRpb24ua2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTogYXR0cmlidXRlIGFzIFB1cmNoYXNlQ29uZGl0aW9uQXR0cmlidXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSBwbGFjZWhvbGRlcj1cIlNlbGVjdCBhdHRyaWJ1dGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbmRpdGlvbkF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXR0cmlidXRlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnZhbHVlID09PSBjb25kaXRpb24uYXR0cmlidXRlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc2VsZWN0ZWRBdHRyaWJ1dGVzLmhhcyhhdHRyaWJ1dGUudmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGF0dHJpYnV0ZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSBrZXk9e2F0dHJpYnV0ZS52YWx1ZX0gdmFsdWU9e2F0dHJpYnV0ZS52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YXR0cmlidXRlLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17Y3VycmVuY3lSZXF1aXJlZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBjb25kaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHZhbHVlLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5rZXkgIT09IGNvbmRpdGlvbi5rZXkpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxYTWFya01pbmkgLz5cbiAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb25kaXRpb24ub3BlcmF0b3IgfHwgdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNvbmRpdGlvbi5hdHRyaWJ1dGV9XG4gICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhvcGVyYXRvcikgPT5cbiAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlKGNvbmRpdGlvbi5rZXksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBvcGVyYXRvciBhcyBQdXJjaGFzZUNvbmRpdGlvbk9wZXJhdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9PT0gXCJlcVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25kaXRpb24udmFsdWVzLnNsaWNlKDAsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb25kaXRpb24udmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgcGxhY2Vob2xkZXI9XCJTZWxlY3Qgb3BlcmF0b3JcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICA8U2VsZWN0LkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAge2NvbmRpdGlvbk9wZXJhdG9ycy5tYXAoKG9wZXJhdG9yKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtvcGVyYXRvci52YWx1ZX0gdmFsdWU9e29wZXJhdG9yLnZhbHVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge29wZXJhdG9yLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAge2NvbmRpdGlvbi5hdHRyaWJ1dGUgJiYgY29uZGl0aW9uLm9wZXJhdG9yID09PSBcImVxXCIgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29uZGl0aW9uLnZhbHVlc1swXSB8fCB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHNlbGVjdGVkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZShjb25kaXRpb24ua2V5LCB7IHZhbHVlczogW3NlbGVjdGVkXSB9KVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgcGxhY2Vob2xkZXI9XCJTZWxlY3QgdmFsdWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlcy5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0ga2V5PXtvcHRpb24udmFsdWV9IHZhbHVlPXtvcHRpb24udmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvcHRpb24ubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICkgOiBjb25kaXRpb24uYXR0cmlidXRlICYmIGNvbmRpdGlvbi5vcGVyYXRvciA/IChcbiAgICAgICAgICAgICAgICAgICAgPE11bHRpQ29uZGl0aW9uVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlPXtjb25kaXRpb24uYXR0cmlidXRlfVxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e3ZhbHVlc31cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y29uZGl0aW9uLnZhbHVlc31cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHZhbHVlcykgPT4gcmVwbGFjZShjb25kaXRpb24ua2V5LCB7IHZhbHVlcyB9KX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBkaXNhYmxlZCBjbGFzc05hbWU9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApXG4gICAgICAgIH0pfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgZGlzYWJsZWQ9e3NlbGVjdGVkQXR0cmlidXRlcy5zaXplID49IGNvbmRpdGlvbkF0dHJpYnV0ZXMubGVuZ3RofVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgb25DaGFuZ2UoW1xuICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgICAgIHsga2V5OiBjb25kaXRpb25LZXkoKSwgYXR0cmlidXRlOiBcIlwiLCBvcGVyYXRvcjogXCJcIiwgdmFsdWVzOiBbXSB9LFxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxQbHVzIC8+IEFkZCBjb25kaXRpb25cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICBvbkNoYW5nZShmaXhlZEFtb3VudCA/IGRlZmF1bHRQdXJjaGFzZUNvbmRpdGlvbnMob3B0aW9ucykgOiBbXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA+XG4gICAgICAgICAgICBDbGVhciBhbGxcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L1NlY3Rpb24+XG4gIClcbn1cblxuZnVuY3Rpb24gUHJvZHVjdFByaWNlc1RhYmxlKHtcbiAgY3VycmVuY2llcyxcbiAgY291cG9uVmFsdWUsXG4gIG9uQ2hhbmdlLFxuICBwcmljZXMsXG59OiB7XG4gIGN1cnJlbmNpZXM6IEN1cnJlbmN5T3B0aW9uW11cbiAgY291cG9uVmFsdWU6IHN0cmluZ1xuICBvbkNoYW5nZTogKGN1cnJlbmN5Q29kZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIHByaWNlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufSkge1xuICBjb25zdCBbdmlzaWJsZUN1cnJlbmNpZXMsIHNldFZpc2libGVDdXJyZW5jaWVzXSA9IHVzZVN0YXRlPHN0cmluZ1tdPigoKSA9PlxuICAgIGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSksXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFZpc2libGVDdXJyZW5jaWVzKChjdXJyZW50KSA9PiB7XG4gICAgICBjb25zdCBhdmFpbGFibGUgPSBuZXcgU2V0KGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSkpXG4gICAgICBjb25zdCByZXRhaW5lZCA9IGN1cnJlbnQuZmlsdGVyKChjb2RlKSA9PiBhdmFpbGFibGUuaGFzKGNvZGUpKVxuICAgICAgY29uc3QgYWRkZWQgPSBjdXJyZW5jaWVzXG4gICAgICAgIC5tYXAoKGN1cnJlbmN5KSA9PiBjdXJyZW5jeS5jb2RlKVxuICAgICAgICAuZmlsdGVyKChjb2RlKSA9PiAhY3VycmVudC5pbmNsdWRlcyhjb2RlKSlcbiAgICAgIHJldHVybiBbLi4ucmV0YWluZWQsIC4uLmFkZGVkXVxuICAgIH0pXG4gIH0sIFtjdXJyZW5jaWVzXSlcblxuICBjb25zdCBzaG93bkN1cnJlbmNpZXMgPSBjdXJyZW5jaWVzLmZpbHRlcigoY3VycmVuY3kpID0+XG4gICAgdmlzaWJsZUN1cnJlbmNpZXMuaW5jbHVkZXMoY3VycmVuY3kuY29kZSksXG4gIClcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBzaXplLWZ1bGwgZmxleC1jb2wgZGl2aWRlLXkgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXVpLWJnLXN1YnRsZSBmbGV4IHNpemUtZnVsbCBmbGV4LWNvbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLXVpLWJnLWJhc2UgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIHAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMlwiPlxuICAgICAgICAgICAgPERyb3Bkb3duTWVudT5cbiAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5UcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc2l6ZT1cInNtYWxsXCIgdmFyaWFudD1cInNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgICAgPEFkanVzdG1lbnRzIC8+XG4gICAgICAgICAgICAgICAgICBWaWV3XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LlRyaWdnZXI+XG4gICAgICAgICAgICAgIDxEcm9wZG93bk1lbnUuQ29udGVudCBhbGlnbj1cInN0YXJ0XCI+XG4gICAgICAgICAgICAgICAge2N1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPERyb3Bkb3duTWVudS5DaGVja2JveEl0ZW1cbiAgICAgICAgICAgICAgICAgICAga2V5PXtjdXJyZW5jeS5jb2RlfVxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXt2aXNpYmxlQ3VycmVuY2llcy5pbmNsdWRlcyhjdXJyZW5jeS5jb2RlKX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoY2hlY2tlZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRWaXNpYmxlQ3VycmVuY2llcygoY3VycmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmN1cnJlbnQsIGN1cnJlbmN5LmNvZGVdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50LmZpbHRlcigoY29kZSkgPT4gY29kZSAhPT0gY3VycmVuY3kuY29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIFByaWNlIHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duTWVudS5DaGVja2JveEl0ZW0+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvRHJvcGRvd25NZW51LkNvbnRlbnQ+XG4gICAgICAgICAgICA8L0Ryb3Bkb3duTWVudT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNpemUtZnVsbCBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgPFRhYmxlXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBib3JkZXJDb2xsYXBzZTogXCJjb2xsYXBzZVwiLFxuICAgICAgICAgICAgICB0YWJsZUxheW91dDogXCJmaXhlZFwiLFxuICAgICAgICAgICAgICB3aWR0aDogXCJtYXgtY29udGVudFwiXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxUYWJsZS5IZWFkZXIgc3R5bGU9e3sgYm9yZGVyVG9wOiBcIm5vbmVcIiB9fT5cbiAgICAgICAgICAgICAgPFRhYmxlLlJvdyBzdHlsZT17eyBoZWlnaHQ6IDQwIH19PlxuICAgICAgICAgICAgICAgIDxUYWJsZS5IZWFkZXJDZWxsXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWJnLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiA0MCxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIwIDE2cHhcIixcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IFwic3RpY2t5XCIsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ291cG9uIFZhbHVlXG4gICAgICAgICAgICAgICAgPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICAgIHtzaG93bkN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGxcbiAgICAgICAgICAgICAgICAgICAga2V5PXtjdXJyZW5jeS5jb2RlfVxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tYmctYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCB2YXIoLS1ib3JkZXItYmFzZSlcIixcbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjAgMTZweFwiLFxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRydW5jYXRlXCIgdGl0bGU9e2BQcmljZSAke2N1cnJlbmN5LmNvZGUudG9VcHBlckNhc2UoKX1gfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFByaWNlIHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHtjdXJyZW5jeS5pc190YXhfaW5jbHVzaXZlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFRheEluY2x1c2l2ZSBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkIHNocmluay0wXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFRheEV4Y2x1c2l2ZSBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkIHNocmluay0wXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgICA8L1RhYmxlLkhlYWRlcj5cbiAgICAgICAgICAgIDxUYWJsZS5Cb2R5PlxuICAgICAgICAgICAgICA8VGFibGUuUm93IGNsYXNzTmFtZT1cImJnLXVpLWJnLXN1YnRsZVwiIHN0eWxlPXt7IGhlaWdodDogNDAgfX0+XG4gICAgICAgICAgICAgICAgPFRhYmxlLkNlbGxcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tYmctc3VidGxlKVwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogNDAsXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAyMDAsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMCAxNnB4XCIsXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcInN0aWNreVwiLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDEsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJsb2NrIHRydW5jYXRlXCI+e2NvdXBvblZhbHVlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAge3Nob3duQ3VycmVuY2llcy5tYXAoKGN1cnJlbmN5KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbFxuICAgICAgICAgICAgICAgICAgICBrZXk9e2N1cnJlbmN5LmNvZGV9XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1iZy1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgdmFyKC0tYm9yZGVyLWJhc2UpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkIHZhcigtLWJvcmRlci1iYXNlKVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlUHJpY2VJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5PXtjdXJyZW5jeX1cbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJpY2VzW2N1cnJlbmN5LmNvZGVdIHx8IFwiXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh2YWx1ZSkgPT4gb25DaGFuZ2UoY3VycmVuY3kuY29kZSwgdmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L1RhYmxlLlJvdz5cbiAgICAgICAgICAgIDwvVGFibGUuQm9keT5cbiAgICAgICAgICA8L1RhYmxlPlxuXG4gICAgICAgICAgeyFjdXJyZW5jaWVzLmxlbmd0aCAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNFwiPlxuICAgICAgICAgICAgICA8VGV4dCBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgQWRkIGEgc3VwcG9ydGVkIGN1cnJlbmN5IHRvIHRoZSBzdG9yZSBiZWZvcmUgc2V0dGluZyBwcmljZXMuXG4gICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENvdXBvblZhbHVlKFxuICBjb3Vwb246IFBpY2s8Q291cG9uRm9ybVN0YXRlLCBcImFtb3VudHNcIiB8IFwicGVyY2VudGFnZVwiIHwgXCJ0eXBlXCI+LFxuICBjdXJyZW5jaWVzOiBQaWNrPEN1cnJlbmN5T3B0aW9uLCBcImNvZGVcIiB8IFwiaXNfZGVmYXVsdFwiPltdLFxuKSB7XG4gIGlmIChcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX3Byb2R1Y3RzXCIgfHxcbiAgICBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX29yZGVyXCJcbiAgKSB7XG4gICAgY29uc3QgZGVmYXVsdENvZGUgPVxuICAgICAgY3VycmVuY2llcy5maW5kKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuaXNfZGVmYXVsdCk/LmNvZGUgfHxcbiAgICAgIGN1cnJlbmNpZXNbMF0/LmNvZGVcbiAgICBjb25zdCBwcmltYXJ5ID1cbiAgICAgIGNvdXBvbi5hbW91bnRzLmZpbmQoKHJvdykgPT4gcm93LmN1cnJlbmN5X2NvZGUgPT09IGRlZmF1bHRDb2RlKSB8fFxuICAgICAgY291cG9uLmFtb3VudHNbMF1cbiAgICBjb25zdCBhbW91bnQgPSBudW1iZXJPck51bGwocHJpbWFyeT8uYW1vdW50KVxuICAgIGlmIChhbW91bnQgPT0gbnVsbCkgcmV0dXJuIFwiXHUyMDE0XCJcbiAgICBjb25zdCBhZGRpdGlvbmFsID0gTWF0aC5tYXgoMCwgY291cG9uLmFtb3VudHMubGVuZ3RoIC0gMSlcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBgJHthbW91bnR9JHtwcmltYXJ5LmN1cnJlbmN5X2NvZGUudG9VcHBlckNhc2UoKX1gXG4gICAgcmV0dXJuIGFkZGl0aW9uYWwgPyBgJHtmb3JtYXR0ZWR9ICske2FkZGl0aW9uYWx9YCA6IGZvcm1hdHRlZFxuICB9XG5cbiAgaWYgKFxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX3Byb2R1Y3RcIiB8fFxuICAgIGNvdXBvbi50eXBlID09PSBcInBlcmNlbnRhZ2Vfb2ZmX29yZGVyXCJcbiAgKSB7XG4gICAgY29uc3QgcGVyY2VudGFnZSA9IG51bWJlck9yTnVsbChjb3Vwb24ucGVyY2VudGFnZSlcbiAgICBpZiAocGVyY2VudGFnZSA9PSBudWxsKSByZXR1cm4gXCJcdTIwMTRcIlxuICAgIHJldHVybiBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICAgICA/IGAke3BlcmNlbnRhZ2V9JSBvZmYgb3JkZXJgXG4gICAgICA6IGAke3BlcmNlbnRhZ2V9JSBvZmYgcHJvZHVjdHNgXG4gIH1cblxuICByZXR1cm4gY291cG9uLnR5cGUgPT09IFwiZnJlZV9zaGlwcGluZ1wiID8gXCJGcmVlIHNoaXBwaW5nXCIgOiBcIkJ1eSBYIEdldCBZXCJcbn1cblxuZnVuY3Rpb24gVGFibGVQcmljZUlucHV0KHtcbiAgY3VycmVuY3ksXG4gIG9uQ2hhbmdlLFxuICB2YWx1ZSxcbn06IHtcbiAgY3VycmVuY3k6IEN1cnJlbmN5T3B0aW9uXG4gIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZFxuICB2YWx1ZTogc3RyaW5nXG59KSB7XG4gIGNvbnN0IHN5bWJvbCA9XG4gICAgY3VycmVuY3kuc3ltYm9sX25hdGl2ZSB8fFxuICAgIGN1cnJlbmN5LnN5bWJvbCB8fFxuICAgIGN1cnJlbmN5U3ltYm9sKGN1cnJlbmN5LmNvZGUgfHwgXCJVU0RcIilcblxuICByZXR1cm4gKFxuICAgIDxsYWJlbFxuICAgICAgY2xhc3NOYW1lPVwiYmctdWktYmctYmFzZSBob3ZlcjpiZy11aS1iZy1zdWJ0bGUgZm9jdXMtd2l0aGluOnNoYWRvdy1ib3JkZXJzLWludGVyYWN0aXZlLXdpdGgtYWN0aXZlIHRleHQtdWktZmctYmFzZVwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgc3R5bGU9e3sgZmxleDogXCIwIDAgNDBweFwiLCBwYWRkaW5nTGVmdDogMTYgfX1cbiAgICAgID5cbiAgICAgICAge3N5bWJvbH1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxpbnB1dFxuICAgICAgICBhcmlhLWxhYmVsPXtgUHJpY2UgJHtjdXJyZW5jeS5jb2RlLnRvVXBwZXJDYXNlKCl9YH1cbiAgICAgICAgaW5wdXRNb2RlPVwiZGVjaW1hbFwiXG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT4gb25DaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBhcHBlYXJhbmNlOiBcIm5vbmVcIixcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICAgICBmbGV4OiBcIjEgMSBhdXRvXCIsXG4gICAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgbWluV2lkdGg6IDAsXG4gICAgICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgICAgICAgcGFkZGluZzogXCIwIDE2cHggMCAwXCIsXG4gICAgICAgICAgdGV4dEFsaWduOiBcInJpZ2h0XCIsXG4gICAgICAgIH19XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIC8+XG4gICAgPC9sYWJlbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBDb3Vwb25Qcm9kdWN0TW9kYWwoe1xuICBhbGxvd1Byb21vdGlvbk1pcnJvcixcbiAgYXBpQmFzZSxcbiAgb25PcGVuQ2hhbmdlLFxuICBvblNhdmVkLFxuICBvcGVuLFxuICBvcHRpb25zLFxuICByb3csXG59OiB7XG4gIGFsbG93UHJvbW90aW9uTWlycm9yOiBib29sZWFuXG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgb25PcGVuQ2hhbmdlOiAob3BlbjogYm9vbGVhbikgPT4gdm9pZFxuICBvblNhdmVkOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIG9wZW46IGJvb2xlYW5cbiAgb3B0aW9uczogT3B0aW9uc1BheWxvYWRcbiAgcm93OiBDb3Vwb25Qcm9kdWN0Um93IHwgbnVsbFxufSkge1xuICBjb25zdCBbYWN0aXZlU3RlcCwgc2V0QWN0aXZlU3RlcF0gPSB1c2VTdGF0ZTxXaXphcmRTdGVwPihcImRldGFpbHNcIilcbiAgY29uc3QgW3Byb2R1Y3QsIHNldFByb2R1Y3RdID0gdXNlU3RhdGU8UHJvZHVjdEZvcm1TdGF0ZT4oKCkgPT5cbiAgICBlbXB0eVByb2R1Y3Qob3B0aW9ucyksXG4gIClcbiAgY29uc3QgW2NvdXBvbiwgc2V0Q291cG9uXSA9IHVzZVN0YXRlPENvdXBvbkZvcm1TdGF0ZT4oKCkgPT5cbiAgICBlbXB0eUNvdXBvbihvcHRpb25zKSxcbiAgKVxuICBjb25zdCBbY2FtcGFpZ24sIHNldENhbXBhaWduXSA9IHVzZVN0YXRlPENhbXBhaWduRm9ybVN0YXRlPihlbXB0eUNhbXBhaWduKVxuICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt1cGxvYWRpbmcsIHNldFVwbG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Z1cnRoZXN0U3RlcEluZGV4LCBzZXRGdXJ0aGVzdFN0ZXBJbmRleF0gPSB1c2VTdGF0ZSgwKVxuXG4gIGNvbnN0IHZpc2libGVTdGVwcyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGFsbG93UHJvbW90aW9uTWlycm9yXG4gICAgICAgID8gYWxsU3RlcHNcbiAgICAgICAgOiBhbGxTdGVwcy5maWx0ZXIoKHN0ZXApID0+IHN0ZXAgIT09IFwiY2FtcGFpZ25cIiksXG4gICAgW2FsbG93UHJvbW90aW9uTWlycm9yXSxcbiAgKVxuICBjb25zdCBjdXJyZW50U3RlcEluZGV4ID0gdmlzaWJsZVN0ZXBzLmluZGV4T2YoYWN0aXZlU3RlcClcbiAgY29uc3QgY3VycmVuY2llcyA9IG9wdGlvbnMuY3VycmVuY2llcyB8fCBbXVxuICBjb25zdCBzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzID0gdXNlTWVtbyhcbiAgICAoKSA9PiBuZXcgU2V0KGN1cnJlbmNpZXMubWFwKChjdXJyZW5jeSkgPT4gY3VycmVuY3kuY29kZSkpLFxuICAgIFtjdXJyZW5jaWVzXSxcbiAgKVxuICBjb25zdCBpc0Ftb3VudFR5cGUgPVxuICAgIGNvdXBvbi50eXBlID09PSBcImFtb3VudF9vZmZfcHJvZHVjdHNcIiB8fCBjb3Vwb24udHlwZSA9PT0gXCJhbW91bnRfb2ZmX29yZGVyXCJcbiAgY29uc3QgaXNQZXJjZW50YWdlVHlwZSA9XG4gICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiIHx8XG4gICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfb3JkZXJcIlxuICBjb25zdCBpc0l0ZW1TY29wZWREaXNjb3VudCA9XG4gICAgY291cG9uLnR5cGUgPT09IFwiYW1vdW50X29mZl9wcm9kdWN0c1wiIHx8XG4gICAgY291cG9uLnR5cGUgPT09IFwicGVyY2VudGFnZV9vZmZfcHJvZHVjdFwiXG4gIGNvbnN0IGVmZmVjdGl2ZUN1cnJlbmNpZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IGVmZmVjdGl2ZUNvdXBvbkN1cnJlbmNpZXMoY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMsIGN1cnJlbmNpZXMpLFxuICAgIFtjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucywgY3VycmVuY2llc10sXG4gIClcbiAgY29uc3QgcHJvZHVjdFByaWNlcyA9IGN1cnJlbmNpZXMuZmxhdE1hcCgoY3VycmVuY3kpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHByb2R1Y3QucHJpY2VfYW1vdW50c1tjdXJyZW5jeS5jb2RlXSB8fCBcIlwiXG4gICAgY29uc3QgYW1vdW50ID0gbm9uTmVnYXRpdmVOdW1iZXJPck51bGwodmFsdWUpXG4gICAgcmV0dXJuIGFtb3VudCA9PSBudWxsID8gW10gOiBbeyBjdXJyZW5jeV9jb2RlOiBjdXJyZW5jeS5jb2RlLCBhbW91bnQgfV1cbiAgfSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghb3BlbikgcmV0dXJuXG4gICAgY29uc3QgZm9ybXMgPSByb3dcbiAgICAgID8gZm9ybXNGcm9tUm93KHJvdywgb3B0aW9ucylcbiAgICAgIDoge1xuICAgICAgICBwcm9kdWN0OiBlbXB0eVByb2R1Y3Qob3B0aW9ucyksXG4gICAgICAgIGNvdXBvbjogZW1wdHlDb3Vwb24ob3B0aW9ucyksXG4gICAgICAgIGNhbXBhaWduOiBlbXB0eUNhbXBhaWduLFxuICAgICAgfVxuICAgIHNldFByb2R1Y3QoZm9ybXMucHJvZHVjdClcbiAgICBzZXRDb3Vwb24oZm9ybXMuY291cG9uKVxuICAgIHNldENhbXBhaWduKGZvcm1zLmNhbXBhaWduKVxuICAgIHNldEFjdGl2ZVN0ZXAoXCJkZXRhaWxzXCIpXG4gICAgc2V0RnVydGhlc3RTdGVwSW5kZXgoMClcbiAgfSwgW29wZW4sIHJvdywgb3B0aW9uc10pXG5cbiAgY29uc3QgdXBkYXRlUHVyY2hhc2VDb25kaXRpb25zID0gKFxuICAgIHB1cmNoYXNlQ29uZGl0aW9uczogUHVyY2hhc2VDb25kaXRpb25Gb3JtW10sXG4gICkgPT4ge1xuICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBwdXJjaGFzZV9jb25kaXRpb25zOiBwdXJjaGFzZUNvbmRpdGlvbnMsXG4gICAgICBhbW91bnRzOiBpc0Ftb3VudENvdXBvblR5cGUoY3VycmVudC50eXBlKVxuICAgICAgICA/IHJlY29uY2lsZUNvdXBvbkFtb3VudHMoXG4gICAgICAgICAgY3VycmVudC5hbW91bnRzLFxuICAgICAgICAgIGVmZmVjdGl2ZUNvdXBvbkN1cnJlbmNpZXMocHVyY2hhc2VDb25kaXRpb25zLCBjdXJyZW5jaWVzKSxcbiAgICAgICAgKVxuICAgICAgICA6IGN1cnJlbnQuYW1vdW50cyxcbiAgICB9KSlcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZUNvdXBvblR5cGUgPSAodHlwZTogQ291cG9uVHlwZSkgPT4ge1xuICAgIHNldENvdXBvbigoY3VycmVudCkgPT4ge1xuICAgICAgbGV0IHB1cmNoYXNlQ29uZGl0aW9ucyA9IGN1cnJlbnQucHVyY2hhc2VfY29uZGl0aW9uc1xuICAgICAgaWYgKFxuICAgICAgICBpc0Ftb3VudENvdXBvblR5cGUodHlwZSkgJiZcbiAgICAgICAgIXB1cmNoYXNlQ29uZGl0aW9ucy5zb21lKFxuICAgICAgICAgIChjb25kaXRpb24pID0+IGNvbmRpdGlvbi5hdHRyaWJ1dGUgPT09IFwiY3VycmVuY3lfY29kZVwiLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcHVyY2hhc2VDb25kaXRpb25zID0gW1xuICAgICAgICAgIC4uLnB1cmNoYXNlQ29uZGl0aW9ucyxcbiAgICAgICAgICAuLi5kZWZhdWx0UHVyY2hhc2VDb25kaXRpb25zKG9wdGlvbnMpLFxuICAgICAgICBdXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICB0eXBlLFxuICAgICAgICBwdXJjaGFzZV9jb25kaXRpb25zOiBwdXJjaGFzZUNvbmRpdGlvbnMsXG4gICAgICAgIGFtb3VudHM6IGlzQW1vdW50Q291cG9uVHlwZSh0eXBlKVxuICAgICAgICAgID8gcmVjb25jaWxlQ291cG9uQW1vdW50cyhcbiAgICAgICAgICAgIGN1cnJlbnQuYW1vdW50cyxcbiAgICAgICAgICAgIGVmZmVjdGl2ZUNvdXBvbkN1cnJlbmNpZXMocHVyY2hhc2VDb25kaXRpb25zLCBjdXJyZW5jaWVzKSxcbiAgICAgICAgICApXG4gICAgICAgICAgOiBjdXJyZW50LmFtb3VudHMsXG4gICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTpcbiAgICAgICAgICB0eXBlID09PSBcImJ1eV94X2dldF95XCIgPyBcIm5vbmVcIiA6IGN1cnJlbnQucHJvbW90aW9uX21pcnJvcl9tb2RlLFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjb25zdCB1cGxvYWRNZWRpYSA9IGFzeW5jIChmaWxlczogRmlsZVtdKSA9PiB7XG4gICAgaWYgKCFmaWxlcy5sZW5ndGgpIHJldHVyblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlc1wiLCBmaWxlKSlcbiAgICBpZiAoYXBpQmFzZSA9PT0gXCIvYWRtaW5cIiAmJiBwcm9kdWN0LnNlbGxlcl9pZCkge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKFwic2VsbGVyX2lkXCIsIHByb2R1Y3Quc2VsbGVyX2lkKVxuICAgIH1cbiAgICBzZXRVcGxvYWRpbmcodHJ1ZSlcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgYCR7YmFja2VuZFVybCgpfSR7YXBpQmFzZX0vY291cG9uLXByb2R1Y3RzL3VwbG9hZHNgLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGFwaUVycm9yTWVzc2FnZShwYXlsb2FkLCByZXNwb25zZS5zdGF0dXNUZXh0KSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBheWxvYWQgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICAgIGZpbGVzPzogeyBhc3NldF9pZD86IHN0cmluZzsgdXJsPzogc3RyaW5nIH1bXVxuICAgICAgfVxuICAgICAgY29uc3QgdXBsb2FkZWQgPSAocGF5bG9hZC5maWxlcyB8fCBbXSlcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoZmlsZSk6IGZpbGUgaXMgeyBhc3NldF9pZDogc3RyaW5nOyB1cmw6IHN0cmluZyB9ID0+XG4gICAgICAgICAgICBCb29sZWFuKGZpbGUuYXNzZXRfaWQgJiYgZmlsZS51cmwpLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGZpbGUpID0+ICh7IGFzc2V0X2lkOiBmaWxlLmFzc2V0X2lkLCB1cmw6IGZpbGUudXJsIH0pKVxuICAgICAgaWYgKCF1cGxvYWRlZC5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSB1cGxvYWQgZGlkIG5vdCByZXR1cm4gYW4gaW1hZ2UgVVJMXCIpXG4gICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICBtZWRpYTogQXJyYXkuZnJvbShcbiAgICAgICAgICBuZXcgTWFwKFxuICAgICAgICAgICAgWy4uLmN1cnJlbnQubWVkaWEsIC4uLnVwbG9hZGVkXS5tYXAoKGl0ZW0pID0+IFtpdGVtLnVybCwgaXRlbV0pLFxuICAgICAgICAgICkudmFsdWVzKCksXG4gICAgICAgICksXG4gICAgICB9KSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdG9hc3QuZXJyb3IoXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJJbWFnZSB1cGxvYWQgZmFpbGVkXCIsXG4gICAgICApXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFVwbG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZXRhaWxzQ29tcGxldGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIXByb2R1Y3QudGl0bGUudHJpbSgpKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoIWN1cnJlbmNpZXMubGVuZ3RoKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFjb25kaXRpb24uYXR0cmlidXRlIHx8XG4gICAgICAgICFjb25kaXRpb24ub3BlcmF0b3IgfHxcbiAgICAgICAgIWNvbmRpdGlvbi52YWx1ZXMubGVuZ3RoIHx8XG4gICAgICAgIChjb25kaXRpb24ub3BlcmF0b3IgPT09IFwiZXFcIiAmJiBjb25kaXRpb24udmFsdWVzLmxlbmd0aCAhPT0gMSkgfHxcbiAgICAgICAgYXR0cmlidXRlcy5oYXMoY29uZGl0aW9uLmF0dHJpYnV0ZSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIGF0dHJpYnV0ZXMuYWRkKGNvbmRpdGlvbi5hdHRyaWJ1dGUpXG4gICAgfVxuXG4gICAgaWYgKGlzQW1vdW50VHlwZSkge1xuICAgICAgaWYgKCFhdHRyaWJ1dGVzLmhhcyhcImN1cnJlbmN5X2NvZGVcIikpIHJldHVybiBmYWxzZVxuICAgICAgaWYgKCFjb3Vwb24uYW1vdW50cy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgaWYgKGNvdXBvbi5hbW91bnRzLmxlbmd0aCAhPT0gZWZmZWN0aXZlQ3VycmVuY2llcy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBjb3Vwb24uYW1vdW50cykge1xuICAgICAgICBpZiAoIXN1cHBvcnRlZEN1cnJlbmN5Q29kZXMuaGFzKHJvdy5jdXJyZW5jeV9jb2RlKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChzZWVuLmhhcyhyb3cuY3VycmVuY3lfY29kZSkpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAobnVtYmVyT3JOdWxsKHJvdy5hbW91bnQpID09IG51bGwpIHJldHVybiBmYWxzZVxuICAgICAgICBzZWVuLmFkZChyb3cuY3VycmVuY3lfY29kZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNQZXJjZW50YWdlVHlwZSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBudW1iZXJPck51bGwoY291cG9uLnBlcmNlbnRhZ2UpXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA+IDEwMCkgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCIgJiYgIWNvdXBvbi5zaGFyZWRfY29kZS50cmltKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImR1cmF0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGRheXMgPSBOdW1iZXIoY291cG9uLmV4cGlyYXRpb25fZGF5cylcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXlzKSB8fCBkYXlzIDwgMSkgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCIpIHtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9kYXRlKVxuICAgICAgaWYgKCFjb3Vwb24uZXhwaXJhdGlvbl9kYXRlIHx8IE51bWJlci5pc05hTihleHBpcmF0aW9uLmdldFRpbWUoKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgIT09IFwibm9uZVwiICYmIGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkge1xuICAgICAgY29uc3QgY2FwID0gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KVxuICAgICAgaWYgKE51bWJlci5pc05hTihjYXAuZ2V0VGltZSgpKSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgbWF4SXNzdWFuY2UgPSBOdW1iZXIoY291cG9uLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbSlcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihtYXhJc3N1YW5jZSkgJiYgbWF4SXNzdWFuY2UgPiAwXG4gIH0sIFtcbiAgICBjb3Vwb24sXG4gICAgY3VycmVuY2llcy5sZW5ndGgsXG4gICAgZWZmZWN0aXZlQ3VycmVuY2llcy5sZW5ndGgsXG4gICAgaXNBbW91bnRUeXBlLFxuICAgIGlzUGVyY2VudGFnZVR5cGUsXG4gICAgcHJvZHVjdC50aXRsZSxcbiAgICBzdXBwb3J0ZWRDdXJyZW5jeUNvZGVzLFxuICBdKVxuXG4gIGNvbnN0IGNhbXBhaWduQ29tcGxldGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWFsbG93UHJvbW90aW9uTWlycm9yIHx8IGNhbXBhaWduLm1vZGUgPT09IFwibm9uZVwiKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChjYW1wYWlnbi5tb2RlID09PSBcImV4aXN0aW5nXCIpIHJldHVybiBCb29sZWFuKGNhbXBhaWduLmNhbXBhaWduX2lkKVxuICAgIGlmICghY2FtcGFpZ24ubmFtZS50cmltKCkgfHwgIWNhbXBhaWduLmNhbXBhaWduX2lkZW50aWZpZXIudHJpbSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gW2NhbXBhaWduLnN0YXJ0c19hdCwgY2FtcGFpZ24uZW5kc19hdF0uZXZlcnkoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm4gdHJ1ZVxuICAgICAgcmV0dXJuICFOdW1iZXIuaXNOYU4obmV3IERhdGUodmFsdWUpLmdldFRpbWUoKSlcbiAgICB9KVxuICB9LCBbYWxsb3dQcm9tb3Rpb25NaXJyb3IsIGNhbXBhaWduXSlcblxuICBjb25zdCBwcmljZXNDb21wbGV0ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghY3VycmVuY2llcy5sZW5ndGggfHwgIXByb2R1Y3RQcmljZXMubGVuZ3RoKSByZXR1cm4gZmFsc2VcbiAgICByZXR1cm4gY3VycmVuY2llcy5ldmVyeSgoY3VycmVuY3kpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcHJvZHVjdC5wcmljZV9hbW91bnRzW2N1cnJlbmN5LmNvZGVdIHx8IFwiXCJcbiAgICAgIHJldHVybiAhdmFsdWUudHJpbSgpIHx8IG5vbk5lZ2F0aXZlTnVtYmVyT3JOdWxsKHZhbHVlKSAhPSBudWxsXG4gICAgfSlcbiAgfSwgW2N1cnJlbmNpZXMsIHByb2R1Y3QucHJpY2VfYW1vdW50cywgcHJvZHVjdFByaWNlcy5sZW5ndGhdKVxuXG4gIGNvbnN0IHN0ZXBWYWxpZGl0eSA9IHVzZU1lbW88UmVjb3JkPFdpemFyZFN0ZXAsIGJvb2xlYW4+PihcbiAgICAoKSA9PiAoe1xuICAgICAgZGV0YWlsczogZGV0YWlsc0NvbXBsZXRlLFxuICAgICAgb3JnYW5pemU6IHRydWUsXG4gICAgICBjYW1wYWlnbjogY2FtcGFpZ25Db21wbGV0ZSxcbiAgICAgIHByaWNlczogcHJpY2VzQ29tcGxldGUsXG4gICAgfSksXG4gICAgW2NhbXBhaWduQ29tcGxldGUsIGRldGFpbHNDb21wbGV0ZSwgcHJpY2VzQ29tcGxldGVdLFxuICApXG5cbiAgY29uc3QgYWN0aXZlU3RlcENvbXBsZXRlID0gc3RlcFZhbGlkaXR5W2FjdGl2ZVN0ZXBdXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW9wZW4gfHwgIWFjdGl2ZVN0ZXBDb21wbGV0ZSkgcmV0dXJuXG4gICAgc2V0RnVydGhlc3RTdGVwSW5kZXgoKGN1cnJlbnQpID0+XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgTWF0aC5taW4oY3VycmVudFN0ZXBJbmRleCArIDEsIHZpc2libGVTdGVwcy5sZW5ndGggLSAxKSxcbiAgICAgICksXG4gICAgKVxuICB9LCBbYWN0aXZlU3RlcENvbXBsZXRlLCBjdXJyZW50U3RlcEluZGV4LCBvcGVuLCB2aXNpYmxlU3RlcHMubGVuZ3RoXSlcblxuICBjb25zdCBpc1N0ZXBEaXNhYmxlZCA9IChpbmRleDogbnVtYmVyKSA9PlxuICAgIGluZGV4ID4gZnVydGhlc3RTdGVwSW5kZXggfHxcbiAgICB2aXNpYmxlU3RlcHMuc2xpY2UoMCwgaW5kZXgpLnNvbWUoKHByZXZpb3VzKSA9PiAhc3RlcFZhbGlkaXR5W3ByZXZpb3VzXSlcblxuICBjb25zdCB2YWxpZGF0ZSA9ICgpID0+IHtcbiAgICBpZiAoIXByb2R1Y3QudGl0bGUudHJpbSgpKSB0aHJvdyBuZXcgRXJyb3IoXCJQcm9kdWN0IHRpdGxlIGlzIHJlcXVpcmVkXCIpXG4gICAgaWYgKCFjdXJyZW5jaWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGEgc3VwcG9ydGVkIGN1cnJlbmN5IHRvIHRoZSBzdG9yZSBiZWZvcmUgY29udGludWluZ1wiKVxuICAgIH1cbiAgICBjb25zdCBpbnZhbGlkUHJpY2UgPSBjdXJyZW5jaWVzLnNvbWUoKGN1cnJlbmN5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb2R1Y3QucHJpY2VfYW1vdW50c1tjdXJyZW5jeS5jb2RlXSB8fCBcIlwiXG4gICAgICByZXR1cm4gdmFsdWUudHJpbSgpICYmIG5vbk5lZ2F0aXZlTnVtYmVyT3JOdWxsKHZhbHVlKSA9PSBudWxsXG4gICAgfSlcbiAgICBpZiAoaW52YWxpZFByaWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9kdWN0IHByaWNlcyBtdXN0IGJlIDAgb3IgbW9yZVwiKVxuICAgIH1cbiAgICBpZiAoIXByb2R1Y3RQcmljZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBZGQgYXQgbGVhc3Qgb25lIHByb2R1Y3QgcHJpY2VcIilcbiAgICB9XG4gICAgaWYgKGlzQW1vdW50VHlwZSkge1xuICAgICAgaWYgKCFjb3Vwb24uYW1vdW50cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGF0IGxlYXN0IG9uZSBjb3Vwb24gdmFsdWVcIilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgICAgY29uc3QgY3VycmVuY3lDb25kaXRpb24gPSBjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9ucy5maW5kKFxuICAgICAgICAoY29uZGl0aW9uKSA9PiBjb25kaXRpb24uYXR0cmlidXRlID09PSBcImN1cnJlbmN5X2NvZGVcIixcbiAgICAgIClcbiAgICAgIGlmICghY3VycmVuY3lDb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWRkIGEgQ3VycmVuY3kgQ29kZSBwdXJjaGFzZSBjb25kaXRpb25cIilcbiAgICAgIH1cbiAgICAgIGlmIChjb3Vwb24uYW1vdW50cy5sZW5ndGggIT09IGVmZmVjdGl2ZUN1cnJlbmNpZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBcIkNvdXBvbiB2YWx1ZXMgbXVzdCBtYXRjaCBldmVyeSBlZmZlY3RpdmUgY3VycmVuY3kgY29uZGl0aW9uIHZhbHVlXCIsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGNvdXBvbi5hbW91bnRzKSB7XG4gICAgICAgIGlmICghc3VwcG9ydGVkQ3VycmVuY3lDb2Rlcy5oYXMocm93LmN1cnJlbmN5X2NvZGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VsZWN0IGFuIGF2YWlsYWJsZSBjb3Vwb24gY3VycmVuY3lcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vlbi5oYXMocm93LmN1cnJlbmN5X2NvZGUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291cG9uIHZhbHVlIGN1cnJlbmNpZXMgY2Fubm90IGJlIGR1cGxpY2F0ZWRcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtYmVyT3JOdWxsKHJvdy5hbW91bnQpID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3Vwb24gdmFsdWVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDBcIilcbiAgICAgICAgfVxuICAgICAgICBzZWVuLmFkZChyb3cuY3VycmVuY3lfY29kZSlcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VlbkF0dHJpYnV0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvdXBvbi5wdXJjaGFzZV9jb25kaXRpb25zKSB7XG4gICAgICBpZiAoIWNvbmRpdGlvbi5hdHRyaWJ1dGUgfHwgIWNvbmRpdGlvbi5vcGVyYXRvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21wbGV0ZSBldmVyeSBwdXJjaGFzZSBjb25kaXRpb25cIilcbiAgICAgIH1cbiAgICAgIGlmICghY29uZGl0aW9uLnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2VsZWN0IGF0IGxlYXN0IG9uZSB2YWx1ZSBmb3IgZXZlcnkgcHVyY2hhc2UgY29uZGl0aW9uXCIpXG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uLm9wZXJhdG9yID09PSBcImVxXCIgJiYgY29uZGl0aW9uLnZhbHVlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXF1YWxzIGNvbmRpdGlvbnMgcmVxdWlyZSBleGFjdGx5IG9uZSB2YWx1ZVwiKVxuICAgICAgfVxuICAgICAgaWYgKHNlZW5BdHRyaWJ1dGVzLmhhcyhjb25kaXRpb24uYXR0cmlidXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQdXJjaGFzZSBjb25kaXRpb24gYXR0cmlidXRlcyBjYW5ub3QgYmUgZHVwbGljYXRlZFwiKVxuICAgICAgfVxuICAgICAgc2VlbkF0dHJpYnV0ZXMuYWRkKGNvbmRpdGlvbi5hdHRyaWJ1dGUpXG4gICAgfVxuICAgIGlmIChpc1BlcmNlbnRhZ2VUeXBlKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG51bWJlck9yTnVsbChjb3Vwb24ucGVyY2VudGFnZSlcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID4gMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdXBvbiB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwIHBlcmNlbnRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCIgJiYgIWNvdXBvbi5zaGFyZWRfY29kZS50cmltKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgc2hhcmVkIGNvdXBvbiBjb2RlIGlzIHJlcXVpcmVkXCIpXG4gICAgfVxuICAgIGlmIChjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCIpIHtcbiAgICAgIGNvbnN0IGV4cGlyYXRpb24gPSBuZXcgRGF0ZShjb3Vwb24uZXhwaXJhdGlvbl9kYXRlKVxuICAgICAgaWYgKCFjb3Vwb24uZXhwaXJhdGlvbl9kYXRlIHx8IE51bWJlci5pc05hTihleHBpcmF0aW9uLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQSB2YWxpZCBmaXhlZCBleHBpcmF0aW9uIGRhdGUgaXMgcmVxdWlyZWRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvdXBvbi5leHBpcmF0aW9uX3R5cGUgIT09IFwibm9uZVwiICYmIGNvdXBvbi5leHBpcmF0aW9uX2NhcF9hdCkge1xuICAgICAgY29uc3QgY2FwID0gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KVxuICAgICAgaWYgKE51bWJlci5pc05hTihjYXAuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIHZhbGlkIGV4cGlyYXRpb24gY2FwIGRhdGUgaXMgcmVxdWlyZWRcIilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNhbXBhaWduLm1vZGUgPT09IFwiZXhpc3RpbmdcIiAmJiAhY2FtcGFpZ24uY2FtcGFpZ25faWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlbGVjdCBhbiBleGlzdGluZyBjYW1wYWlnblwiKVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBjYW1wYWlnbi5tb2RlID09PSBcIm5ld1wiICYmXG4gICAgICAoIWNhbXBhaWduLm5hbWUudHJpbSgpIHx8ICFjYW1wYWlnbi5jYW1wYWlnbl9pZGVudGlmaWVyLnRyaW0oKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbXBhaWduIG5hbWUgYW5kIGlkZW50aWZpZXIgYXJlIHJlcXVpcmVkXCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2F2ZSA9IGFzeW5jICgpID0+IHtcbiAgICBzZXRTYXZpbmcodHJ1ZSlcbiAgICB0cnkge1xuICAgICAgdmFsaWRhdGUoKVxuICAgICAgY29uc3QgYmVuZWZpdFR5cGUgPSBiZW5lZml0VHlwZUZyb21Db3Vwb25UeXBlKGNvdXBvbi50eXBlKVxuICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9XG4gICAgICAgIGNvdXBvbi50eXBlID09PSBcImFtb3VudF9vZmZfb3JkZXJcIiB8fFxuICAgICAgICBjb3Vwb24udHlwZSA9PT0gXCJwZXJjZW50YWdlX29mZl9vcmRlclwiXG4gICAgICAgICAgPyBcIm9yZGVyXCJcbiAgICAgICAgICA6IFwiaXRlbXNcIlxuICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgcHJvZHVjdDoge1xuICAgICAgICAgIHRpdGxlOiBwcm9kdWN0LnRpdGxlLnRyaW0oKSxcbiAgICAgICAgICBzdWJ0aXRsZTogcHJvZHVjdC5zdWJ0aXRsZS50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICBoYW5kbGU6IHByb2R1Y3QuaGFuZGxlLnRyaW0oKSB8fCBudWxsLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwcm9kdWN0LmRlc2NyaXB0aW9uLnRyaW0oKSB8fCBudWxsLFxuICAgICAgICAgIHN0YXR1czogcHJvZHVjdFN0YXR1c0Zyb21Db3Vwb25TdGF0dXMoY291cG9uLnByb21vdGlvbl9zdGF0dXMpLFxuICAgICAgICAgIHRodW1ibmFpbDogcHJvZHVjdC5tZWRpYVswXT8udXJsIHx8IG51bGwsXG4gICAgICAgICAgdGh1bWJuYWlsX2Fzc2V0X2lkOiBwcm9kdWN0Lm1lZGlhWzBdPy5hc3NldF9pZCB8fCBudWxsLFxuICAgICAgICAgIGltYWdlczogcHJvZHVjdC5tZWRpYS5zbGljZSgxKS5tYXAoKG1lZGlhKSA9PiAoe1xuICAgICAgICAgICAgdXJsOiBtZWRpYS51cmwsXG4gICAgICAgICAgICAuLi4obWVkaWEuYXNzZXRfaWQgPyB7IGFzc2V0X2lkOiBtZWRpYS5hc3NldF9pZCB9IDoge30pLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBkaXNjb3VudGFibGU6IHByb2R1Y3QuZGlzY291bnRhYmxlLFxuICAgICAgICAgIHR5cGVfaWQ6IHByb2R1Y3QudHlwZV9pZCB8fCBudWxsLFxuICAgICAgICAgIGNvbGxlY3Rpb25faWQ6IHByb2R1Y3QuY29sbGVjdGlvbl9pZCB8fCBudWxsLFxuICAgICAgICAgIGNhdGVnb3JpZXM6IHByb2R1Y3QuY2F0ZWdvcnlfaWQgPyBbeyBpZDogcHJvZHVjdC5jYXRlZ29yeV9pZCB9XSA6IFtdLFxuICAgICAgICAgIHRhZ3M6IHByb2R1Y3QudGFnX2lkID8gW3sgaWQ6IHByb2R1Y3QudGFnX2lkIH1dIDogW10sXG4gICAgICAgICAgdmFyaWFudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGl0bGU6IFwiRGVmYXVsdFwiLFxuICAgICAgICAgICAgICBza3U6IHByb2R1Y3Quc2t1LnRyaW0oKSB8fCBudWxsLFxuICAgICAgICAgICAgICBtYW5hZ2VfaW52ZW50b3J5OiBmYWxzZSxcbiAgICAgICAgICAgICAgYWxsb3dfYmFja29yZGVyOiB0cnVlLFxuICAgICAgICAgICAgICBwcmljZXM6IHByb2R1Y3RQcmljZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGNvdXBvbjoge1xuICAgICAgICAgIGVuYWJsZWQ6IGNvdXBvbi5lbmFibGVkLFxuICAgICAgICAgIGJlbmVmaXRfdHlwZTogYmVuZWZpdFR5cGUsXG4gICAgICAgICAgcHVyY2hhc2VfY29uZGl0aW9uczogY291cG9uLnB1cmNoYXNlX2NvbmRpdGlvbnMubWFwKChjb25kaXRpb24pID0+ICh7XG4gICAgICAgICAgICBhdHRyaWJ1dGU6IGNvbmRpdGlvbi5hdHRyaWJ1dGUsXG4gICAgICAgICAgICBvcGVyYXRvcjogY29uZGl0aW9uLm9wZXJhdG9yLFxuICAgICAgICAgICAgdmFsdWVzOiBjb25kaXRpb24udmFsdWVzLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBhbW91bnRzOiBpc0Ftb3VudFR5cGVcbiAgICAgICAgICAgID8gY291cG9uLmFtb3VudHMubWFwKChyb3cpID0+ICh7XG4gICAgICAgICAgICAgIGFtb3VudDogbnVtYmVyT3JOdWxsKHJvdy5hbW91bnQpLFxuICAgICAgICAgICAgICBjdXJyZW5jeV9jb2RlOiByb3cuY3VycmVuY3lfY29kZSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIGFtb3VudDogbnVsbCxcbiAgICAgICAgICBwZXJjZW50YWdlOiBpc1BlcmNlbnRhZ2VUeXBlID8gbnVtYmVyT3JOdWxsKGNvdXBvbi5wZXJjZW50YWdlKSA6IG51bGwsXG4gICAgICAgICAgY3VycmVuY3lfY29kZTogbnVsbCxcbiAgICAgICAgICBjb2RlX3N0cmF0ZWd5OiBjb3Vwb24uY29kZV9zdHJhdGVneSxcbiAgICAgICAgICBjb2RlX3ByZWZpeDpcbiAgICAgICAgICAgIGNvdXBvbi5jb2RlX3N0cmF0ZWd5ID09PSBcInVuaXF1ZV9jb2RlXCJcbiAgICAgICAgICAgICAgPyBjb3Vwb24uY29kZV9wcmVmaXgudHJpbSgpIHx8IFwiQ09VUE9OXCJcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHNoYXJlZF9jb2RlOlxuICAgICAgICAgICAgY291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwic2hhcmVkX2NvZGVcIlxuICAgICAgICAgICAgICA/IGNvdXBvbi5zaGFyZWRfY29kZS50cmltKClcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIGV4cGlyYXRpb25fcG9saWN5OlxuICAgICAgICAgICAgY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJub25lXCJcbiAgICAgICAgICAgICAgPyB7IHR5cGU6IFwibm9uZVwiIH1cbiAgICAgICAgICAgICAgOiBjb3Vwb24uZXhwaXJhdGlvbl90eXBlID09PSBcImZpeGVkXCJcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIixcbiAgICAgICAgICAgICAgICAgIGV4cGlyZXNfYXQ6IG5ldyBEYXRlKGNvdXBvbi5leHBpcmF0aW9uX2RhdGUpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBjYXBfYnlfY2FtcGFpZ246IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgICAgICAgIGNhcF9hdDogY291cG9uLmV4cGlyYXRpb25fY2FwX2F0XG4gICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBcImR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbl9kYXlzOiBOdW1iZXIoY291cG9uLmV4cGlyYXRpb25fZGF5cykgfHwgMzAsXG4gICAgICAgICAgICAgICAgICBjYXBfYnlfY2FtcGFpZ246IGNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbixcbiAgICAgICAgICAgICAgICAgIGNhcF9hdDogY291cG9uLmV4cGlyYXRpb25fY2FwX2F0XG4gICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoY291cG9uLmV4cGlyYXRpb25fY2FwX2F0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTpcbiAgICAgICAgICAgIE51bWJlcihjb3Vwb24ubWF4X2lzc3VhbmNlX3Blcl9vcmRlcl9pdGVtKSB8fCAxLFxuICAgICAgICAgIHByb21vdGlvbl90ZW1wbGF0ZTpcbiAgICAgICAgICAgIGJlbmVmaXRUeXBlID09PSBcImZpeGVkX2Ftb3VudFwiIHx8IGJlbmVmaXRUeXBlID09PSBcInBlcmNlbnRhZ2VcIlxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9tZXRob2Q6IHtcbiAgICAgICAgICAgICAgICAgIHRhcmdldF90eXBlOiB0YXJnZXRUeXBlLFxuICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9PT0gXCJvcmRlclwiID8gXCJhY3Jvc3NcIiA6IGNvdXBvbi5hbGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHByb21vdGlvbl9zdGF0dXM6IGNvdXBvbi5wcm9tb3Rpb25fc3RhdHVzLFxuICAgICAgICAgIC4uLihhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTpcbiAgICAgICAgICAgICAgICBiZW5lZml0VHlwZSA9PT0gXCJidXlfZ2V0XCIgfHxcbiAgICAgICAgICAgICAgICAgIChiZW5lZml0VHlwZSA9PT0gXCJmaXhlZF9hbW91bnRcIiAmJiBjb3Vwb24uYW1vdW50cy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgICAgICAgPyBcIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgOiBjb3Vwb24ucHJvbW90aW9uX21pcnJvcl9tb2RlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIGNhbXBhaWduOiBhbGxvd1Byb21vdGlvbk1pcnJvclxuICAgICAgICAgID8gY2FtcGFpZ24ubW9kZSA9PT0gXCJleGlzdGluZ1wiXG4gICAgICAgICAgICA/IHsgbW9kZTogXCJleGlzdGluZ1wiLCBjYW1wYWlnbl9pZDogY2FtcGFpZ24uY2FtcGFpZ25faWQgfVxuICAgICAgICAgICAgOiBjYW1wYWlnbi5tb2RlID09PSBcIm5ld1wiXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIG1vZGU6IFwibmV3XCIsXG4gICAgICAgICAgICAgICAgY2FtcGFpZ246IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGNhbXBhaWduLm5hbWUsXG4gICAgICAgICAgICAgICAgICBjYW1wYWlnbl9pZGVudGlmaWVyOiBjYW1wYWlnbi5jYW1wYWlnbl9pZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgc3RhcnRzX2F0OiBjYW1wYWlnbi5zdGFydHNfYXRcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShjYW1wYWlnbi5zdGFydHNfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgZW5kc19hdDogY2FtcGFpZ24uZW5kc19hdFxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBEYXRlKGNhbXBhaWduLmVuZHNfYXQpLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7IG1vZGU6IFwibm9uZVwiIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VsbGVyX2lkOiBwcm9kdWN0LnNlbGxlcl9pZCB8fCBudWxsLFxuICAgICAgICB2YXJpYW50X292ZXJyaWRlczogW10sXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGFwaUZldGNoKFxuICAgICAgICByb3dcbiAgICAgICAgICA/IGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0cy8ke3Jvdy5wcm9kdWN0LmlkfWBcbiAgICAgICAgICA6IGAke2FwaUJhc2V9L2NvdXBvbi1wcm9kdWN0c2AsXG4gICAgICAgIHtcbiAgICAgICAgICBtZXRob2Q6IHJvdyA/IFwiUEFUQ0hcIiA6IFwiUE9TVFwiLFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgdG9hc3Quc3VjY2Vzcyhyb3cgPyBcIkNvdXBvbiBwcm9kdWN0IHVwZGF0ZWRcIiA6IFwiQ291cG9uIHByb2R1Y3QgY3JlYXRlZFwiKVxuICAgICAgb25PcGVuQ2hhbmdlKGZhbHNlKVxuICAgICAgYXdhaXQgb25TYXZlZCgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgPyBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgOiBcIkZhaWxlZCB0byBzYXZlIGNvdXBvbiBwcm9kdWN0XCIsXG4gICAgICApXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNhdmluZyhmYWxzZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGVwU3RhdHVzID0gKHN0ZXA6IFdpemFyZFN0ZXApID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHZpc2libGVTdGVwcy5pbmRleE9mKHN0ZXApXG4gICAgaWYgKGluZGV4IDwgY3VycmVudFN0ZXBJbmRleCAmJiBzdGVwVmFsaWRpdHlbc3RlcF0pIHtcbiAgICAgIHJldHVybiBcImNvbXBsZXRlZFwiIGFzIGNvbnN0XG4gICAgfVxuICAgIGlmIChpbmRleCA9PT0gY3VycmVudFN0ZXBJbmRleCkgcmV0dXJuIFwiaW4tcHJvZ3Jlc3NcIiBhcyBjb25zdFxuICAgIHJldHVybiBcIm5vdC1zdGFydGVkXCIgYXMgY29uc3RcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEZvY3VzTW9kYWwgb3Blbj17b3Blbn0gb25PcGVuQ2hhbmdlPXtvbk9wZW5DaGFuZ2V9PlxuICAgICAgPEZvY3VzTW9kYWwuQ29udGVudCBzdHlsZT17bW9kYWxDb250ZW50U3R5bGV9PlxuICAgICAgICA8Rm9jdXNNb2RhbC5UaXRsZSBzdHlsZT17dmlzdWFsbHlIaWRkZW5TdHlsZX0+XG4gICAgICAgICAge3JvdyA/IFwiRWRpdCBDb3Vwb24gUHJvZHVjdFwiIDogXCJDcmVhdGUgQ291cG9uIFByb2R1Y3RcIn1cbiAgICAgICAgPC9Gb2N1c01vZGFsLlRpdGxlPlxuICAgICAgICA8UHJvZ3Jlc3NUYWJzXG4gICAgICAgICAgdmFsdWU9e2FjdGl2ZVN0ZXB9XG4gICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGVwID0gdmFsdWUgYXMgV2l6YXJkU3RlcFxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB2aXNpYmxlU3RlcHMuaW5kZXhPZihzdGVwKVxuICAgICAgICAgICAgaWYgKCFpc1N0ZXBEaXNhYmxlZChpbmRleCkpIHNldEFjdGl2ZVN0ZXAoc3RlcClcbiAgICAgICAgICB9fVxuICAgICAgICAgIHN0eWxlPXttb2RhbFdpemFyZFN0eWxlfVxuICAgICAgICA+XG4gICAgICAgICAgPEZvY3VzTW9kYWwuSGVhZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCItbXktMiB3LWZ1bGwgYm9yZGVyLWxcIj5cbiAgICAgICAgICAgICAgPFByb2dyZXNzVGFicy5MaXN0IGNsYXNzTmFtZT1cImp1c3RpZnktc3RhcnQtc3RhcnQgZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAge3Zpc2libGVTdGVwcy5tYXAoKHN0ZXAsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLlRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAga2V5PXtzdGVwfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c3RlcH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXtzdGVwU3RhdHVzKHN0ZXApfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNTdGVwRGlzYWJsZWQoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtYXgtdy1bMjAwcHhdIHRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3N0ZXBbMF0udG9VcHBlckNhc2UoKSArIHN0ZXAuc2xpY2UoMSl9XG4gICAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5MaXN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Gb2N1c01vZGFsLkhlYWRlcj5cblxuICAgICAgICAgIDxGb2N1c01vZGFsLkJvZHkgY2xhc3NOYW1lPVwib3ZlcmZsb3ctaGlkZGVuIHAtMFwiIHN0eWxlPXttb2RhbEJvZHlTdHlsZX0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIHN0eWxlPXtcbiAgICAgICAgICAgICAgICBhY3RpdmVTdGVwID09PSBcInByaWNlc1wiXG4gICAgICAgICAgICAgICAgICA/IHsgaGVpZ2h0OiBcIjEwMCVcIiwgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsIHdpZHRoOiBcIjEwMCVcIiB9XG4gICAgICAgICAgICAgICAgICA6IG1vZGFsU2Nyb2xsU3R5bGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgc3R5bGU9e1xuICAgICAgICAgICAgICAgICAgYWN0aXZlU3RlcCA9PT0gXCJwcmljZXNcIlxuICAgICAgICAgICAgICAgICAgICA/IHsgaGVpZ2h0OiBcIjEwMCVcIiwgd2lkdGg6IFwiMTAwJVwiIH1cbiAgICAgICAgICAgICAgICAgICAgOiBtb2RhbEZvcm1TdHlsZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHthY3RpdmVTdGVwID09PSBcImRldGFpbHNcIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJkZXRhaWxzXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8SGVhZGluZyBsZXZlbD1cImgxXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3JvdyA/IFwiRWRpdCBDb3Vwb24gUHJvZHVjdFwiIDogXCJDcmVhdGUgQ291cG9uIFByb2R1Y3RcIn1cbiAgICAgICAgICAgICAgICAgICAgPC9IZWFkaW5nPlxuICAgICAgICAgICAgICAgICAgICA8RGl2aWRlciAvPlxuICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIkdlbmVyYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0aHJlZUNvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJUaXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIldpbnRlciBqYWNrZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlN1YnRpdGxlXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnN1YnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV2FybSBhbmQgY296eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSGFuZGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cIlRoZSBVUkwtZnJpZW5kbHkgaWRlbnRpZmllciBmb3IgdGhpcyBwcm9kdWN0LiBJZiBsZWZ0IGVtcHR5LCBNZWR1c2EgZ2VuZXJhdGVzIGl0IGZyb20gdGhlIHRpdGxlLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxIYW5kbGVJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LmhhbmRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGhhbmRsZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIGhhbmRsZSB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkRlc2NyaXB0aW9uXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3QuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQSB3YXJtIGFuZCBjb3p5IGphY2tldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiTWVkaWFcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNZWRpYVVwbG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1VwbG9hZGluZz17dXBsb2FkaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYT17cHJvZHVjdC5tZWRpYX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25VcGxvYWQ9eyhmaWxlcykgPT4gdm9pZCB1cGxvYWRNZWRpYShmaWxlcyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVtb3ZlPXsobWVkaWEpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTogY3VycmVudC5tZWRpYS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZWRpYS5hc3NldF9pZCAmJiBpdGVtLmFzc2V0X2lkICE9PSBtZWRpYS5hc3NldF9pZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW1lZGlhLmFzc2V0X2lkICYmIGl0ZW0udXJsICE9PSBtZWRpYS51cmwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNLVVwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnNrdX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDT1VQT04tMDAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrdTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPERpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgPFB1cmNoYXNlQ29uZGl0aW9uc0ZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgZml4ZWRBbW91bnQ9e2lzQW1vdW50VHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24ucHVyY2hhc2VfY29uZGl0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dXBkYXRlUHVyY2hhc2VDb25kaXRpb25zfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2FjdGl2ZVN0ZXAgPT09IFwib3JnYW5pemVcIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJvcmdhbml6ZVwiIHN0eWxlPXtzdGFja1N0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb24gdGl0bGU9XCJPcmdhbml6ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3BhbmVsU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLXgtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj5EaXNjb3VudGFibGU8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtYWxsXCIgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgcHJvbW90aW9ucyB0byBkaXNjb3VudCB0aGlzIHByb2R1Y3QncyBzYWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17cHJvZHVjdC5kaXNjb3VudGFibGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoZGlzY291bnRhYmxlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvZHVjdCgoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRhYmxlOiBCb29sZWFuKGRpc2NvdW50YWJsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt0d29Db2x1bW5HcmlkU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU2VsbGVyXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3Byb2R1Y3Quc2VsbGVyX2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5zZWxsZXJzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhzZWxsZXJfaWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIHNlbGxlcl9pZCB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlR5cGVcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LnR5cGVfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X3R5cGVzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsodHlwZV9pZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7IC4uLmN1cnJlbnQsIHR5cGVfaWQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvbGxlY3Rpb25cIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LmNvbGxlY3Rpb25faWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X2NvbGxlY3Rpb25zIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY29sbGVjdGlvbl9pZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFByb2R1Y3QoKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25faWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ2F0ZWdvcnlcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPE9wdGlvblNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtwcm9kdWN0LmNhdGVnb3J5X2lkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e29wdGlvbnMucHJvZHVjdF9jYXRlZ29yaWVzIHx8IFtdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY2F0ZWdvcnlfaWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCBjYXRlZ29yeV9pZCB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiVGFnXCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxPcHRpb25TZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17cHJvZHVjdC50YWdfaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17b3B0aW9ucy5wcm9kdWN0X3RhZ3MgfHwgW119XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyh0YWdfaWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoeyAuLi5jdXJyZW50LCB0YWdfaWQgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9Qcm9ncmVzc1RhYnMuQ29udGVudD5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2FjdGl2ZVN0ZXAgPT09IFwiZGV0YWlsc1wiICYmIChcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgLi4uc3RhY2tTdHlsZSwgbWFyZ2luVG9wOiAyNCB9fT5cbiAgICAgICAgICAgICAgICAgICAgPERpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkNvdXBvblwiXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJDb25maWd1cmUgdGhlIGNvdXBvbiBpc3N1ZWQgd2hlbiB0aGlzIHByb2R1Y3QgaXMgcHVyY2hhc2VkLlwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXtwYW5lbFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC14LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+Q291cG9uIGlzc3VhbmNlPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzc3VlIGNvdXBvbnMgd2hlbiBjdXN0b21lcnMgcHVyY2hhc2UgdGhpcyBwcm9kdWN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtjb3Vwb24uZW5hYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhlbmFibGVkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIlR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24udHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KHR5cGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ291cG9uVHlwZSh0eXBlIGFzIENvdXBvblR5cGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAteS0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGVDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuQ2hvaWNlQm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2Nob2ljZS52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjaG9pY2UudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17Y2hvaWNlLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e2Nob2ljZS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIlN0YXR1c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5wcm9tb3Rpb25fc3RhdHVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsocHJvbW90aW9uX3N0YXR1cykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX3N0YXR1czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uX3N0YXR1cyBhcyBQcm9tb3Rpb25TdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3N0YXR1c0Nob2ljZXMubWFwKChjaG9pY2UpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5DaG9pY2VCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y2hvaWNlLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Nob2ljZS52YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtjaG9pY2UubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17Y2hvaWNlLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIHsoaXNBbW91bnRUeXBlIHx8IGlzUGVyY2VudGFnZVR5cGUpICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPXtpc0Ftb3VudFR5cGUgPyBcIkNvdXBvbiBWYWx1ZXNcIiA6IFwiVmFsdWVcIn0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtpc0Ftb3VudFR5cGUgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb3Vwb24uYW1vdW50cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVuY3kgPSBjdXJyZW5jaWVzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0gcm93LmN1cnJlbmN5X2NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17cm93LmtleX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNoYWRvdy1lbGV2YXRpb24tY2FyZC1yZXN0IGJnLXVpLWJnLWNvbXBvbmVudCByb3VuZGVkLW1kIHB4LTQgcHktM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8TGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cm93LmN1cnJlbmN5X2NvZGUudG9VcHBlckNhc2UoKX0gQ291cG9uIFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y3VycmVuY3k/Lm5hbWUgfHwgcm93LmN1cnJlbmN5X2NvZGUudG9VcHBlckNhc2UoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDdXJyZW5jeUFtb3VudEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jaWVzPXtjdXJyZW5jaWVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlPXtyb3cuY3VycmVuY3lfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtyb3cuYW1vdW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhhbW91bnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudHM6IGN1cnJlbnQuYW1vdW50cy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbSwgaW5kZXgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID09PSByb3dJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyAuLi5pdGVtLCBhbW91bnQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHshY291cG9uLmFtb3VudHMubGVuZ3RoICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgY2xhc3NOYW1lPVwidGV4dC11aS1mZy1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBhdCBsZWFzdCBvbmUgZWZmZWN0aXZlIEN1cnJlbmN5IENvZGUgY29uZGl0aW9uIHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvdXBvbiBWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFBlcmNlbnRhZ2VJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLnBlcmNlbnRhZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsocGVyY2VudGFnZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICAgICAgICB7aXNJdGVtU2NvcGVkRGlzY291bnQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIkFsbG9jYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5hbGxvY2F0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17KGFsbG9jYXRpb24pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb246IGFsbG9jYXRpb24gYXMgQ291cG9uQWxsb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwLkNob2ljZUJveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cImVhY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkVhY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIkFwcGxpZXMgdmFsdWUgb24gZWFjaCBpdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5DaG9pY2VCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJvbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJPbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJMaW1pdCBkaXNjb3VudCB0byBtYXggcXVhbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICAgICAgICA8U2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBpcmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiQ29udHJvbCB3aGVuIGlzc3VlZCBjb3Vwb25zIGV4cGlyZS5cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gcG9saWN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5leHBpcmF0aW9uX3R5cGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoZXhwaXJhdGlvbl90eXBlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX3R5cGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX3R5cGUgYXMgRXhwaXJhdGlvblBvbGljeVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibm9uZVwiPk5vbmU8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJkdXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uIGFmdGVyIGlzc3VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImZpeGVkXCI+Rml4ZWQgZGF0ZTwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Y291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJkdXJhdGlvblwiID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gZGF5c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49ezF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uZXhwaXJhdGlvbl9kYXlzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2RheXM6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogY291cG9uLmV4cGlyYXRpb25fdHlwZSA9PT0gXCJmaXhlZFwiID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyZXMgYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmV4cGlyYXRpb25fZGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbl9kYXRlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtjb3Vwb24uZXhwaXJhdGlvbl90eXBlICE9PSBcIm5vbmVcIiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhcCBleHBpcmF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLXgtNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgLi4ucGFuZWxTdHlsZSwgcGFkZGluZzogXCI4cHggMTJweFwiIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21hbGxcIiBjbGFzc05hbWU9XCJ0ZXh0LXVpLWZnLW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1wYWlnbiBlbmQgb3IgY2FwIGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN3aXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y291cG9uLmV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWdufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkQ2hhbmdlPXsoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbjogQm9vbGVhbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fY2FwX2J5X2NhbXBhaWduLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkV4cGlyYXRpb24gY2FwIGRhdGVcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNvdXBvbi5leHBpcmF0aW9uX2NhcF9ieV9jYW1wYWlnbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmV4cGlyYXRpb25fY2FwX2F0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25fY2FwX2F0OiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TZWN0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPFNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIkNob29zZSB3aGV0aGVyIGV2ZXJ5IGlzc3VlZCBjb3Vwb24gaXMgdW5pcXVlIG9yIHNoYXJlcyBvbmUgY29kZS5cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNvZGUgc3RyYXRlZ3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLmNvZGVfc3RyYXRlZ3l9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoY29kZV9zdHJhdGVneSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9zdHJhdGVneTogY29kZV9zdHJhdGVneSBhcyBDb2RlU3RyYXRlZ3ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwidW5pcXVlX2NvZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWUgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJzaGFyZWRfY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXJlZCBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Y291cG9uLmNvZGVfc3RyYXRlZ3kgPT09IFwidW5pcXVlX2NvZGVcIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb2RlIHByZWZpeFwiIG9wdGlvbmFsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24uY29kZV9wcmVmaXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ09VUE9OXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9wcmVmaXg6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlNoYXJlZCBjb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvdXBvbi5zaGFyZWRfY29kZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTVU1NRVIxNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q291cG9uKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9jb2RlOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxTZWN0aW9uIHRpdGxlPVwiSXNzdWFuY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3R3b0NvbHVtbkdyaWRTdHlsZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk1heCBpc3N1YW5jZSBwZXIgaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49ezF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y291cG9uLm1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvdXBvbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pc3N1YW5jZV9wZXJfb3JkZXJfaXRlbTogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbW91bnRUeXBlICYmIGNvdXBvbi5hbW91bnRzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlByb21vdGlvbiBtaXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb3Vwb24ucHJvbW90aW9uX21pcnJvcl9tb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtjb3Vwb24udHlwZSA9PT0gXCJidXlfeF9nZXRfeVwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhwcm9tb3Rpb25fbWlycm9yX21vZGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb3Vwb24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbl9taXJyb3JfbW9kZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25fbWlycm9yX21vZGUgYXMgTWlycm9yTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuVmFsdWUgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm5vbmVcIj5Ob25lPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cIm1hbnVhbFwiPk1hbnVhbDwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U2VsZWN0Lkl0ZW0gdmFsdWU9XCJhdXRvXCI+QXV0bzwvU2VsZWN0Lkl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3QuQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvU2VjdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICB7YWxsb3dQcm9tb3Rpb25NaXJyb3IgJiYgYWN0aXZlU3RlcCA9PT0gXCJjYW1wYWlnblwiICYmIChcbiAgICAgICAgICAgICAgICAgIDxQcm9ncmVzc1RhYnMuQ29udGVudCB2YWx1ZT1cImNhbXBhaWduXCIgc3R5bGU9e3N0YWNrU3R5bGV9PlxuICAgICAgICAgICAgICAgICAgICA8U2VjdGlvbiB0aXRsZT1cIkNhbXBhaWduXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17dHdvQ29sdW1uR3JpZFN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkNhbXBhaWduIG1vZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjYW1wYWlnbi5tb2RlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVmFsdWVDaGFuZ2U9eyhtb2RlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IG1vZGUgYXMgQ2FtcGFpZ25Nb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5UcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5WYWx1ZSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0LlRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibm9uZVwiPk5vIGNhbXBhaWduPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTZWxlY3QuSXRlbSB2YWx1ZT1cImV4aXN0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXN0aW5nIGNhbXBhaWduXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5JdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFNlbGVjdC5JdGVtIHZhbHVlPVwibmV3XCI+TmV3IGNhbXBhaWduPC9TZWxlY3QuSXRlbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdC5Db250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2FtcGFpZ24ubW9kZSA9PT0gXCJleGlzdGluZ1wiICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiRXhpc3RpbmcgY2FtcGFpZ25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8T3B0aW9uU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24uY2FtcGFpZ25faWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zLmNhbXBhaWducyB8fCBbXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY2FtcGFpZ25faWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENhbXBhaWduKChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ25faWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAge2NhbXBhaWduLm1vZGUgPT09IFwibmV3XCIgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24ubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJJZGVudGlmaWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLmNhbXBhaWduX2lkZW50aWZpZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q2FtcGFpZ24oKGN1cnJlbnQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtcGFpZ25faWRlbnRpZmllcjogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiU3RhcnRzIGF0XCIgb3B0aW9uYWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NhbXBhaWduLnN0YXJ0c19hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHNfYXQ6IGV2ZW50LnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIkVuZHMgYXRcIiBvcHRpb25hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17Y2FtcGFpZ24uZW5kc19hdH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhldmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDYW1wYWlnbigoY3VycmVudCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRzX2F0OiBldmVudC50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9GaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L1NlY3Rpb24+XG4gICAgICAgICAgICAgICAgICA8L1Byb2dyZXNzVGFicy5Db250ZW50PlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICB7YWN0aXZlU3RlcCA9PT0gXCJwcmljZXNcIiAmJiAoXG4gICAgICAgICAgICAgICAgICA8UHJvZ3Jlc3NUYWJzLkNvbnRlbnQgdmFsdWU9XCJwcmljZXNcIiBzdHlsZT17eyBoZWlnaHQ6IFwiMTAwJVwiIH19PlxuICAgICAgICAgICAgICAgICAgICA8UHJvZHVjdFByaWNlc1RhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVuY2llcz17Y3VycmVuY2llc31cbiAgICAgICAgICAgICAgICAgICAgICBjb3Vwb25WYWx1ZT17Zm9ybWF0Q291cG9uVmFsdWUoY291cG9uLCBjdXJyZW5jaWVzKX1cbiAgICAgICAgICAgICAgICAgICAgICBwcmljZXM9e3Byb2R1Y3QucHJpY2VfYW1vdW50c31cbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGN1cnJlbmN5Q29kZSwgdmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9kdWN0KChjdXJyZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZV9hbW91bnRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudC5wcmljZV9hbW91bnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW5jeUNvZGVdOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvUHJvZ3Jlc3NUYWJzLkNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L0ZvY3VzTW9kYWwuQm9keT5cblxuICAgICAgICAgIDxGb2N1c01vZGFsLkZvb3RlciBzdHlsZT17eyBmbGV4U2hyaW5rOiAwIH19PlxuICAgICAgICAgICAgPEJ1dHRvbiB2YXJpYW50PVwic2Vjb25kYXJ5XCIgb25DbGljaz17KCkgPT4gb25PcGVuQ2hhbmdlKGZhbHNlKX0+XG4gICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICB7Y3VycmVudFN0ZXBJbmRleCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZVN0ZXAodmlzaWJsZVN0ZXBzW2N1cnJlbnRTdGVwSW5kZXggLSAxXSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBCYWNrXG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtjdXJyZW50U3RlcEluZGV4IDwgdmlzaWJsZVN0ZXBzLmxlbmd0aCAtIDEgPyAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWFjdGl2ZVN0ZXBDb21wbGV0ZX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBjdXJyZW50U3RlcEluZGV4ICsgMVxuICAgICAgICAgICAgICAgICAgc2V0RnVydGhlc3RTdGVwSW5kZXgoKGN1cnJlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGN1cnJlbnQsIG5leHRJbmRleCksXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBzZXRBY3RpdmVTdGVwKHZpc2libGVTdGVwc1tuZXh0SW5kZXhdKVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDb250aW51ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWFjdGl2ZVN0ZXBDb21wbGV0ZX1cbiAgICAgICAgICAgICAgICBpc0xvYWRpbmc9e3NhdmluZ31cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2b2lkIHNhdmUoKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFNhdmVcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvRm9jdXNNb2RhbC5Gb290ZXI+XG4gICAgICAgIDwvUHJvZ3Jlc3NUYWJzPlxuICAgICAgPC9Gb2N1c01vZGFsLkNvbnRlbnQ+XG4gICAgPC9Gb2N1c01vZGFsPlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb3Vwb25Qcm9kdWN0c1BhZ2Uoe1xuICBhbGxvd1Byb21vdGlvbk1pcnJvciA9IGZhbHNlLFxuICBhcGlCYXNlLFxuICB0aXRsZSxcbn06IHtcbiAgYWxsb3dQcm9tb3Rpb25NaXJyb3I/OiBib29sZWFuXG4gIGFwaUJhc2U6IEFwaUJhc2VcbiAgdGl0bGU6IHN0cmluZ1xufSkge1xuICBjb25zdCBbcHJvZHVjdHMsIHNldFByb2R1Y3RzXSA9IHVzZVN0YXRlPENvdXBvblByb2R1Y3RSb3dbXT4oW10pXG4gIGNvbnN0IFtvcHRpb25zLCBzZXRPcHRpb25zXSA9IHVzZVN0YXRlPE9wdGlvbnNQYXlsb2FkPih7fSlcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFttb2RhbE9wZW4sIHNldE1vZGFsT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2VkaXRpbmdSb3csIHNldEVkaXRpbmdSb3ddID0gdXNlU3RhdGU8Q291cG9uUHJvZHVjdFJvdyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHByb21wdCA9IHVzZVByb21wdCgpXG4gIGNvbnN0IGNvdXBvbkJhc2UgPSBgJHthcGlCYXNlfS9jb3Vwb24tcHJvZHVjdHNgXG5cbiAgY29uc3QgbG9hZCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgc2V0TG9hZEVycm9yKG51bGwpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtwcm9kdWN0c1BheWxvYWQsIG9wdGlvbnNQYXlsb2FkXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgYXBpRmV0Y2g8eyBjb3Vwb25fcHJvZHVjdHM6IENvdXBvblByb2R1Y3RSb3dbXSB9Pihjb3Vwb25CYXNlKSxcbiAgICAgICAgYXBpRmV0Y2g8T3B0aW9uc1BheWxvYWQ+KGAke2NvdXBvbkJhc2V9L29wdGlvbnNgKSxcbiAgICAgIF0pXG4gICAgICBzZXRQcm9kdWN0cyhwcm9kdWN0c1BheWxvYWQuY291cG9uX3Byb2R1Y3RzIHx8IFtdKVxuICAgICAgc2V0T3B0aW9ucyhvcHRpb25zUGF5bG9hZCB8fCB7fSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICA6IFwiRmFpbGVkIHRvIGxvYWQgY291cG9uIHByb2R1Y3RzXCJcbiAgICAgIHNldExvYWRFcnJvcihtZXNzYWdlKVxuICAgICAgdG9hc3QuZXJyb3IobWVzc2FnZSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFtjb3Vwb25CYXNlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHZvaWQgbG9hZCgpXG4gIH0sIFtsb2FkXSlcblxuICBjb25zdCByZW1vdmUgPSBhc3luYyAocm93OiBDb3Vwb25Qcm9kdWN0Um93KSA9PiB7XG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgcHJvbXB0KHtcbiAgICAgIHRpdGxlOiBcIlJlbW92ZSBjb3Vwb24gcHJvZHVjdD9cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBgVGhpcyByZW1vdmVzIGNvdXBvbiBpc3N1YW5jZSBmcm9tICR7cm93LnByb2R1Y3QudGl0bGUgfHwgcm93LnByb2R1Y3QuaWRcbiAgICAgICAgfS4gVGhlIHVuZGVybHlpbmcgTWVkdXNhIHByb2R1Y3Qgd2lsbCByZW1haW4gYXZhaWxhYmxlLmAsXG4gICAgICBjb25maXJtVGV4dDogXCJSZW1vdmUgcHJvZHVjdFwiLFxuICAgICAgY2FuY2VsVGV4dDogXCJDYW5jZWxcIixcbiAgICAgIHZhcmlhbnQ6IFwiZGFuZ2VyXCIsXG4gICAgfSlcbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXBpRmV0Y2goYCR7Y291cG9uQmFzZX0vJHtyb3cucHJvZHVjdC5pZH1gLCB7IG1ldGhvZDogXCJERUxFVEVcIiB9KVxuICAgICAgdG9hc3Quc3VjY2VzcyhcIkNvdXBvbiBjb25maWd1cmF0aW9uIHJlbW92ZWRcIilcbiAgICAgIGF3YWl0IGxvYWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0b2FzdC5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiRGVsZXRlIGZhaWxlZFwiKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1pcnJvciA9IGFzeW5jIChyb3c6IENvdXBvblByb2R1Y3RSb3cpID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYXBpRmV0Y2goXG4gICAgICAgIGAvYWRtaW4vY291cG9uLXByb2R1Y3RzLyR7cm93LnByb2R1Y3QuaWR9L21pcnJvci1wcm9tb3Rpb25gLFxuICAgICAgICB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7fSksXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICB0b2FzdC5zdWNjZXNzKFwiUHJvbW90aW9uIG1pcnJvciBjcmVhdGVkXCIpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRvYXN0LmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJNaXJyb3IgZmFpbGVkXCIpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGFpbmVyIGNsYXNzTmFtZT1cImRpdmlkZS15IHAtMFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNiBweS00XCI+XG4gICAgICAgIDxIZWFkaW5nIGxldmVsPVwiaDFcIj57dGl0bGV9PC9IZWFkaW5nPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIj5cbiAgICAgICAgICA8QnV0dG9uIHNpemU9XCJzbWFsbFwiIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIiBvbkNsaWNrPXsoKSA9PiB2b2lkIGxvYWQoKX0+XG4gICAgICAgICAgICA8QXJyb3dQYXRoIC8+IFJlZnJlc2hcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICBzZXRFZGl0aW5nUm93KG51bGwpXG4gICAgICAgICAgICAgIHNldE1vZGFsT3Blbih0cnVlKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8UGx1cyAvPiBDcmVhdGVcbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlIHRpdGxlPVwiTG9hZGluZyBjb3Vwb24gcHJvZHVjdHNcIiAvPlxuICAgICAgKSA6IGxvYWRFcnJvciA/IChcbiAgICAgICAgPENvdXBvbkVtcHR5U3RhdGUgdGl0bGU9e2xvYWRFcnJvcn0gLz5cbiAgICAgICkgOiBwcm9kdWN0cy5sZW5ndGggPyAoXG4gICAgICAgIDxUYWJsZT5cbiAgICAgICAgICA8VGFibGUuSGVhZGVyPlxuICAgICAgICAgICAgPFRhYmxlLlJvdz5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+UHJvZHVjdDwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+U3RhdHVzPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5UeXBlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5Db2RlPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbD5DYW1wYWlnbjwvVGFibGUuSGVhZGVyQ2VsbD5cbiAgICAgICAgICAgICAgPFRhYmxlLkhlYWRlckNlbGw+SXNzdWVkPC9UYWJsZS5IZWFkZXJDZWxsPlxuICAgICAgICAgICAgICA8VGFibGUuSGVhZGVyQ2VsbCAvPlxuICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgPC9UYWJsZS5IZWFkZXI+XG4gICAgICAgICAgPFRhYmxlLkJvZHlcbiAgICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckJvdHRvbTogJ25vbmUnIH19PlxuICAgICAgICAgICAge3Byb2R1Y3RzLm1hcCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHJvdy5jb3Vwb25fcHJvZHVjdF9jb25maWdcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8VGFibGUuUm93IGtleT17cm93LmlkfVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgYm9yZGVyQm90dG9tOiAnbm9uZScsIGJhY2tncm91bmQ6ICdub25lJyB9fT5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8VGV4dCB3ZWlnaHQ9XCJwbHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cm93LnByb2R1Y3QudGl0bGUgfHwgcm93LnByb2R1Y3QuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICAgIDxUZXh0IHNpemU9XCJzbWFsbFwiIGNsYXNzTmFtZT1cInRleHQtdWktZmctbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtyb3cucHJvZHVjdC5oYW5kbGUgfHwgcm93LnByb2R1Y3QuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgICA8U3RhdHVzQmFkZ2VcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcj17Y291cG9uU3RhdHVzQ29sb3IoY29uZmlnLnByb21vdGlvbl9zdGF0dXMpfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge2NvbmZpZy5wcm9tb3Rpb25fc3RhdHVzIHx8IFwiZHJhZnRcIn1cbiAgICAgICAgICAgICAgICAgICAgPC9TdGF0dXNCYWRnZT5cbiAgICAgICAgICAgICAgICAgIDwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPntjb3Vwb25UeXBlTGFiZWwoY29uZmlnKX08L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAge2NvbmZpZy5jb2RlX3N0cmF0ZWd5ID09PSBcInNoYXJlZF9jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZy5zaGFyZWRfY29kZSB8fCBcIlNoYXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBgJHtjb25maWcuY29kZV9wcmVmaXggfHwgXCJDT1VQT05cIn0tKmB9XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICA8VGFibGUuQ2VsbD57Y2FtcGFpZ25MYWJlbChjb25maWcpfTwvVGFibGUuQ2VsbD5cbiAgICAgICAgICAgICAgICAgIDxUYWJsZS5DZWxsPntyb3cuZW50aXRsZW1lbnRzX2NvdW50IHx8IDB9PC9UYWJsZS5DZWxsPlxuICAgICAgICAgICAgICAgICAgPFRhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAge2FsbG93UHJvbW90aW9uTWlycm9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYmVuZWZpdF90eXBlID09PSBcImZpeGVkX2Ftb3VudFwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maWcuYW1vdW50cz8ubGVuZ3RoIHx8IDApID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHZvaWQgbWlycm9yKHJvdyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RWRpdGluZ1Jvdyhyb3cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1vZGFsT3Blbih0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UGVuY2lsU3F1YXJlIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCByZW1vdmUocm93KX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VHJhc2ggLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L1RhYmxlLkNlbGw+XG4gICAgICAgICAgICAgICAgPC9UYWJsZS5Sb3c+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvVGFibGUuQm9keT5cbiAgICAgICAgPC9UYWJsZT5cbiAgICAgICkgOiAoXG4gICAgICAgIDxDb3Vwb25FbXB0eVN0YXRlXG4gICAgICAgICAgdGl0bGU9XCJObyBjb3Vwb24gcHJvZHVjdHMgZm91bmRcIlxuICAgICAgICAgIGRlc2NyaXB0aW9uPVwiQ3JlYXRlIGEgbmV3IGNvdXBvbiBwcm9kdWN0IHRvIGdldCBzdGFydGVkLlwiXG4gICAgICAgIC8+XG4gICAgICApfVxuXG4gICAgICA8Q291cG9uUHJvZHVjdE1vZGFsXG4gICAgICAgIG9wZW49e21vZGFsT3Blbn1cbiAgICAgICAgcm93PXtlZGl0aW5nUm93fVxuICAgICAgICBhcGlCYXNlPXthcGlCYXNlfVxuICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICBhbGxvd1Byb21vdGlvbk1pcnJvcj17YWxsb3dQcm9tb3Rpb25NaXJyb3J9XG4gICAgICAgIG9uT3BlbkNoYW5nZT17c2V0TW9kYWxPcGVufVxuICAgICAgICBvblNhdmVkPXtsb2FkfVxuICAgICAgLz5cbiAgICA8L0NvbnRhaW5lcj5cbiAgKVxufVxuIiwgImltcG9ydCB7IFRleHQgfSBmcm9tIFwiQG1lZHVzYWpzL3VpXCJcblxuZXhwb3J0IGZ1bmN0aW9uIENvdXBvbkVtcHR5U3RhdGUoe1xuICBkZXNjcmlwdGlvbixcbiAgdGl0bGUsXG59OiB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGZsZXgtMSBmbGV4LWNvbCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtaW4taC1bMjUwcHhdIHctZnVsbCBmbGV4LTEgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTYgcHktNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggc2l6ZS1mdWxsIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgIDxUZXh0IHdlaWdodD1cInBsdXNcIj57dGl0bGV9PC9UZXh0PlxuICAgICAgICAgIHtkZXNjcmlwdGlvbiA/IDxUZXh0PntkZXNjcmlwdGlvbn08L1RleHQ+IDogbnVsbH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwgImltcG9ydCB7IENvdXBvbkRldGFpbFBhZ2VWaWV3IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2Rhc2hib2FyZC9jb3Vwb25zL2NvdXBvbi1tYW5hZ2VyXCJcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVmVuZG9yQ291cG9uRGV0YWlsUGFnZSgpIHtcbiAgcmV0dXJuIDxDb3Vwb25EZXRhaWxQYWdlVmlldyBhcGlCYXNlPVwiL3ZlbmRvclwiIC8+XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBSb3V0ZUNvbmZpZyB9IGZyb20gXCJAbWVyY3VyanMvZGFzaGJvYXJkLXNka1wiXG5pbXBvcnQgeyBSZWNlaXB0UGVyY2VudCB9IGZyb20gXCJAbWVkdXNhanMvaWNvbnNcIlxuaW1wb3J0IHsgQ291cG9uUHJvZHVjdHNQYWdlVmlldyB9IGZyb20gXCIuLi8uLi8uLi8uLi9kYXNoYm9hcmQvY291cG9ucy9jb3Vwb24tbWFuYWdlclwiXG5cbmV4cG9ydCBjb25zdCBjb25maWc6IFJvdXRlQ29uZmlnID0ge1xuICBsYWJlbDogXCJDb3Vwb24gUHJvZHVjdHNcIixcbiAgaWNvbjogUmVjZWlwdFBlcmNlbnQsXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFZlbmRvckNvdXBvblByb2R1Y3RzUGFnZSgpIHtcbiAgcmV0dXJuIDxDb3Vwb25Qcm9kdWN0c1BhZ2VWaWV3IGFwaUJhc2U9XCIvdmVuZG9yXCIgdGl0bGU9XCJDb3Vwb24gUHJvZHVjdHNcIiAvPlxufVxuIiwgImltcG9ydCBpMThuUmVzb3VyY2VzIGZyb20gXCIuL2kxOG5cIlxuaW1wb3J0IENvdXBvbnNQYWdlLCB7IGNvbmZpZyBhcyBjb3Vwb25zQ29uZmlnIH0gZnJvbSBcIi4vcm91dGVzL2NvdXBvbnMvcGFnZVwiXG5pbXBvcnQgQ291cG9uRGV0YWlsUGFnZSBmcm9tIFwiLi9yb3V0ZXMvY291cG9ucy9baWRdL3BhZ2VcIlxuaW1wb3J0IENvdXBvblByb2R1Y3RzUGFnZSwge1xuICBjb25maWcgYXMgY291cG9uUHJvZHVjdHNDb25maWcsXG59IGZyb20gXCIuL3JvdXRlcy9jb3Vwb25zL3Byb2R1Y3RzL3BhZ2VcIlxuXG5jb25zdCByb3V0ZU1vZHVsZSA9IHtcbiAgcm91dGVzOiBbXG4gICAge1xuICAgICAgQ29tcG9uZW50OiBDb3Vwb25zUGFnZSxcbiAgICAgIHBhdGg6IFwiL2NvdXBvbnNcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIENvbXBvbmVudDogQ291cG9uUHJvZHVjdHNQYWdlLFxuICAgICAgcGF0aDogXCIvY291cG9ucy9wcm9kdWN0c1wiLFxuICAgIH0sXG4gICAge1xuICAgICAgQ29tcG9uZW50OiBDb3Vwb25EZXRhaWxQYWdlLFxuICAgICAgcGF0aDogXCIvY291cG9ucy86aWRcIixcbiAgICB9LFxuICBdLFxufVxuXG5jb25zdCBtZW51SXRlbU1vZHVsZSA9IHtcbiAgbWVudUl0ZW1zOiBbXG4gICAge1xuICAgICAgbGFiZWw6IGNvdXBvbnNDb25maWcubGFiZWwsXG4gICAgICBpY29uOiBjb3Vwb25zQ29uZmlnLmljb24sXG4gICAgICBwYXRoOiBcIi9jb3Vwb25zXCIsXG4gICAgICByYW5rOiBjb3Vwb25zQ29uZmlnLnJhbmssXG4gICAgICBuZXN0ZWQ6IGNvdXBvbnNDb25maWcubmVzdGVkLFxuICAgICAgdHJhbnNsYXRpb25OczogY291cG9uc0NvbmZpZy50cmFuc2xhdGlvbk5zLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IGNvdXBvblByb2R1Y3RzQ29uZmlnLmxhYmVsLFxuICAgICAgaWNvbjogY291cG9uUHJvZHVjdHNDb25maWcuaWNvbixcbiAgICAgIHBhdGg6IFwiL2NvdXBvbnMvcHJvZHVjdHNcIixcbiAgICAgIHJhbms6IDExLFxuICAgICAgbmVzdGVkOiBcIi9jb3Vwb25zXCIsXG4gICAgICB0cmFuc2xhdGlvbk5zOiBjb3Vwb25Qcm9kdWN0c0NvbmZpZy50cmFuc2xhdGlvbk5zLFxuICAgIH0sXG4gIF0sXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcm91dGVNb2R1bGUsXG4gIG1lbnVJdGVtTW9kdWxlLFxuICBpMThuTW9kdWxlOiBpMThuUmVzb3VyY2VzLFxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBO0FBQUEsRUFDRSxTQUFXO0FBQUEsSUFDVCxNQUFRO0FBQUEsSUFDUixjQUFnQjtBQUFBLEVBQ2xCO0FBQ0Y7OztBQ0hBLElBQU8sZUFBUTtBQUFBLEVBQ2IsSUFBSTtBQUFBLElBQ0YsYUFBYTtBQUFBLEVBQ2Y7QUFDRjs7O0FDTEEsU0FBUyxzQkFBc0I7OztBQ0QvQjtBQUFBLEVBQ0UsZUFBQUE7QUFBQSxFQUNBLGFBQUFDO0FBQUEsRUFDQSxXQUFBQztBQUFBLEVBQ0EsWUFBQUM7QUFBQSxPQUlLO0FBQ1A7QUFBQSxFQUNFLGFBQUFDO0FBQUEsRUFDQSxnQkFBQUM7QUFBQSxFQUNBLFFBQUFDO0FBQUEsRUFDQTtBQUFBLEVBQ0EsU0FBQUM7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRSxVQUFBQztBQUFBLEVBQ0EsYUFBQUM7QUFBQSxFQUNBO0FBQUEsRUFDQSxpQkFBQUM7QUFBQSxFQUNBLGNBQUFDO0FBQUEsRUFDQSxXQUFBQztBQUFBLEVBQ0EsU0FBQUM7QUFBQSxFQUNBLFNBQUFDO0FBQUEsRUFDQSxnQkFBQUM7QUFBQSxFQUNBLFVBQUFDO0FBQUEsRUFDQSxlQUFBQztBQUFBLEVBQ0EsVUFBQUM7QUFBQSxFQUNB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QUNOLFFBQVE7QUFBQSxNQUNSLGVBQWVBLFFBQXFCO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFPLGlCQUFRO0FBQUEsRUFDYjtBQUFBLEVBQ0E7QUFBQSxFQUNBLFlBQVk7QUFDZDsiLAogICJuYW1lcyI6IFsidXNlQ2FsbGJhY2siLCAidXNlRWZmZWN0IiwgInVzZU1lbW8iLCAidXNlU3RhdGUiLCAiQXJyb3dQYXRoIiwgIlBlbmNpbFNxdWFyZSIsICJQbHVzIiwgIlRyYXNoIiwgIkJ1dHRvbiIsICJDb250YWluZXIiLCAiQ3VycmVuY3lJbnB1dCIsICJGb2N1c01vZGFsIiwgIkhlYWRpbmciLCAiSW5wdXQiLCAiTGFiZWwiLCAiUHJvZ3Jlc3NUYWJzIiwgIlNlbGVjdCIsICJTdGF0dXNCYWRnZSIsICJTd2l0Y2giLCAiVGFibGUiLCAiVGV4dCIsICJUZXh0YXJlYSIsICJ0b2FzdCIsICJ1c2VQcm9tcHQiLCAiVGV4dCIsICJqc3giLCAianN4cyIsICJjb25maWciLCAicm93IiwgIlRleHQiLCAianN4IiwgImpzeHMiLCAiVGV4dCIsICJ2YWx1ZSIsICJ2YWx1ZXMiLCAicGF5bG9hZCIsICJyb3ciLCAiY29uZmlnIiwgIkZyYWdtZW50IiwgImpzeCIsICJqc3hzIiwgImJhY2tlbmRVcmwiLCAiYXBpRXJyb3JNZXNzYWdlIiwgImFwaUZldGNoIiwgImFtb3VudCIsICJjdXJyZW5jeSIsICJqc3hzIiwgImpzeCIsICJUZXh0IiwgIkhlYWRpbmciLCAiQ29udGFpbmVyIiwgIlN0YXR1c0JhZGdlIiwgIkZyYWdtZW50IiwgInVzZVN0YXRlIiwgInVzZUVmZmVjdCIsICJhcGlGZXRjaCIsICJ0b2FzdCIsICJUYWJsZSIsICJ1c2VDYWxsYmFjayIsICJCdXR0b24iLCAiQXJyb3dQYXRoIiwgImpzeCIsICJqc3giLCAiUmVjZWlwdFBlcmNlbnQiLCAianN4IiwgImNvbmZpZyIsICJSZWNlaXB0UGVyY2VudCIsICJjb25maWciXQp9Cg==
|