ng-easycommerce 1.1.2 → 1.1.3
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/README.md +10 -0
- package/assets/ec-i18n/ct.json +2 -0
- package/assets/ec-i18n/en.json +2 -0
- package/assets/ec-i18n/es.json +2 -0
- package/assets/ec-i18n/fr.json +2 -0
- package/assets/ec-i18n/gl.json +2 -0
- package/assets/ec-i18n/pr.json +2 -0
- package/bundles/ng-easycommerce.umd.js +5663 -4057
- package/bundles/ng-easycommerce.umd.js.map +1 -1
- package/bundles/ng-easycommerce.umd.min.js +1 -1
- package/bundles/ng-easycommerce.umd.min.js.map +1 -1
- package/esm2015/lib/api/connection.service.js +2 -2
- package/esm2015/lib/core.consts.js +4 -5
- package/esm2015/lib/ec-component/cart-bootstrap-navigation.js +27 -0
- package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +11 -1
- package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +23 -2
- package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +185 -13
- package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +3 -1
- package/esm2015/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +4 -2
- package/esm2015/lib/ec-component/coupon-ec/coupon-ec.component.js +6 -1
- package/esm2015/lib/guards/able-buyer-guard.service.js +2 -2
- package/esm2015/lib/guards/auth-guard.service.js +2 -2
- package/esm2015/lib/guards/checkout-ready.service.js +3 -3
- package/esm2015/lib/guards/loggedin-guard.service.js +2 -2
- package/esm2015/lib/guards/user-role-guard.service.js +2 -2
- package/esm2015/lib/services/account/orders.service.js +6 -4
- package/esm2015/lib/services/auth.service.js +4 -3
- package/esm2015/lib/services/captcha.service.js +6 -4
- package/esm2015/lib/services/cart.service.js +1186 -74
- package/esm2015/lib/services/channel-config.service.js +4 -6
- package/esm2015/lib/services/checkout/addressing.service.js +65 -9
- package/esm2015/lib/services/checkout/checkout.service.js +56 -9
- package/esm2015/lib/services/checkout/error-handler.service.js +4 -3
- package/esm2015/lib/services/checkout/payment.service.js +35 -15
- package/esm2015/lib/services/checkout/shipment.service.js +54 -3
- package/esm2015/lib/services/concatenated-associations.service.js +4 -3
- package/esm2015/lib/services/currency.service.js +5 -3
- package/esm2015/lib/services/filters.service.js +2 -2
- package/esm2015/lib/services/footer/footer.service.js +4 -3
- package/esm2015/lib/services/gift-card.service.js +56 -5
- package/esm2015/lib/services/parameters.service.js +5 -3
- package/esm2015/lib/services/reviews.service.js +5 -4
- package/esm2015/lib/services/seo.service.js +4 -5
- package/esm2015/lib/services/stores.service.js +4 -3
- package/esm2015/lib/services/wishlist.service.js +3 -4
- package/esm2015/lib/utils/analytics/google-analytics.service.js +1 -1
- package/esm2015/lib/utils/price-presentation.service.js +2 -3
- package/esm2015/lib/utils/shipping-price-display.service.js +2 -3
- package/esm5/lib/api/connection.service.js +2 -2
- package/esm5/lib/core.consts.js +4 -5
- package/esm5/lib/ec-component/cart-bootstrap-navigation.js +27 -0
- package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +11 -1
- package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +23 -2
- package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +206 -12
- package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +3 -1
- package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +5 -3
- package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +6 -1
- package/esm5/lib/guards/able-buyer-guard.service.js +2 -2
- package/esm5/lib/guards/auth-guard.service.js +2 -2
- package/esm5/lib/guards/checkout-ready.service.js +3 -3
- package/esm5/lib/guards/loggedin-guard.service.js +2 -2
- package/esm5/lib/guards/user-role-guard.service.js +2 -2
- package/esm5/lib/services/account/orders.service.js +6 -4
- package/esm5/lib/services/auth.service.js +4 -3
- package/esm5/lib/services/captcha.service.js +6 -4
- package/esm5/lib/services/cart.service.js +1231 -94
- package/esm5/lib/services/channel-config.service.js +4 -6
- package/esm5/lib/services/checkout/addressing.service.js +65 -9
- package/esm5/lib/services/checkout/checkout.service.js +63 -12
- package/esm5/lib/services/checkout/error-handler.service.js +4 -3
- package/esm5/lib/services/checkout/payment.service.js +29 -11
- package/esm5/lib/services/checkout/shipment.service.js +58 -7
- package/esm5/lib/services/concatenated-associations.service.js +4 -3
- package/esm5/lib/services/currency.service.js +5 -3
- package/esm5/lib/services/filters.service.js +2 -2
- package/esm5/lib/services/footer/footer.service.js +4 -3
- package/esm5/lib/services/gift-card.service.js +59 -5
- package/esm5/lib/services/parameters.service.js +5 -3
- package/esm5/lib/services/reviews.service.js +5 -4
- package/esm5/lib/services/seo.service.js +4 -5
- package/esm5/lib/services/stores.service.js +4 -3
- package/esm5/lib/services/wishlist.service.js +3 -4
- package/esm5/lib/utils/analytics/google-analytics.service.js +1 -1
- package/esm5/lib/utils/price-presentation.service.js +2 -3
- package/esm5/lib/utils/shipping-price-display.service.js +2 -3
- package/fesm2015/ng-easycommerce.js +3966 -2412
- package/fesm2015/ng-easycommerce.js.map +1 -1
- package/fesm5/ng-easycommerce.js +5667 -4061
- package/fesm5/ng-easycommerce.js.map +1 -1
- package/lib/ec-component/cart-bootstrap-navigation.d.ts +7 -0
- package/lib/ec-component/cart-ec/cart-ec.component.d.ts +5 -2
- package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +5 -0
- package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +27 -3
- package/lib/services/cart.service.d.ts +120 -7
- package/lib/services/checkout/addressing.service.d.ts +1 -1
- package/lib/services/checkout/checkout.service.d.ts +3 -0
- package/lib/services/checkout/shipment.service.d.ts +2 -2
- package/lib/services/gift-card.service.d.ts +1 -0
- package/ng-easycommerce.metadata.json +1 -1
- package/package.json +1 -1
|
@@ -14,8 +14,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
14
14
|
});
|
|
15
15
|
};
|
|
16
16
|
import { Injectable } from '@angular/core';
|
|
17
|
-
import { finalize } from 'rxjs/operators';
|
|
18
|
-
import { BehaviorSubject } from 'rxjs';
|
|
17
|
+
import { finalize, timeout } from 'rxjs/operators';
|
|
18
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
19
19
|
import { map } from 'rxjs/operators';
|
|
20
20
|
import { ConnectionService } from '../api/connection.service';
|
|
21
21
|
import { Constants } from '../core.consts';
|
|
@@ -23,15 +23,22 @@ import { AuthService } from './auth.service';
|
|
|
23
23
|
import { ToastService } from '../utils/toast.service';
|
|
24
24
|
import { OrderUtilityService } from '../utils/order-util.service';
|
|
25
25
|
import { ChannelConfigService } from './channel-config.service';
|
|
26
|
-
import { AnalyticsService } from '
|
|
27
|
-
import { Router } from '@angular/router';
|
|
26
|
+
import { AnalyticsService } from './analytics.service';
|
|
27
|
+
import { NavigationStart, Router } from '@angular/router';
|
|
28
28
|
import { CartItemPricePresentation, CartSummaryPricePresentation, PricePresentationService } from '../utils/price-presentation.service';
|
|
29
29
|
import * as i0 from "@angular/core";
|
|
30
|
-
import * as i1 from "
|
|
31
|
-
import * as i2 from "../utils/
|
|
32
|
-
import * as i3 from "
|
|
30
|
+
import * as i1 from "../api/connection.service";
|
|
31
|
+
import * as i2 from "../utils/toast.service";
|
|
32
|
+
import * as i3 from "../core.consts";
|
|
33
|
+
import * as i4 from "./auth.service";
|
|
34
|
+
import * as i5 from "../utils/order-util.service";
|
|
35
|
+
import * as i6 from "./analytics.service";
|
|
36
|
+
import * as i7 from "./channel-config.service";
|
|
37
|
+
import * as i8 from "@angular/router";
|
|
38
|
+
import * as i9 from "../utils/price-presentation.service";
|
|
33
39
|
let CartService = class CartService {
|
|
34
40
|
constructor(connection, toastrService, consts, authService, orderUtils, analyticsService, channelConfigService, router, pricePresentationService) {
|
|
41
|
+
var _a, _b, _c, _d, _e;
|
|
35
42
|
this.connection = connection;
|
|
36
43
|
this.toastrService = toastrService;
|
|
37
44
|
this.consts = consts;
|
|
@@ -45,9 +52,17 @@ let CartService = class CartService {
|
|
|
45
52
|
this.couponSubject = new BehaviorSubject(null);
|
|
46
53
|
this.cartSubject = new BehaviorSubject(null);
|
|
47
54
|
this.requestInProcess = new BehaviorSubject(false);
|
|
55
|
+
this.cartSyncStateSubject = new BehaviorSubject({ status: 'syncing' });
|
|
48
56
|
this.promotionsSubject = new BehaviorSubject([]);
|
|
57
|
+
this.cartBootstrapRecoverySubject = new Subject();
|
|
58
|
+
this.cartCheckoutInvalidationSubject = new Subject();
|
|
49
59
|
this.balanceCustomerSubject = new BehaviorSubject(null);
|
|
50
60
|
this.items = [];
|
|
61
|
+
this.pendingBootstrapCartAdds = [];
|
|
62
|
+
this.maxPendingBootstrapCartAdds = 10;
|
|
63
|
+
this.pendingBootstrapCartAddsLimitNotified = false;
|
|
64
|
+
this.pendingBootstrapCartAddInFlight = false;
|
|
65
|
+
this.pendingBootstrapCartQueueGeneration = 0;
|
|
51
66
|
this.count = 0;
|
|
52
67
|
this.locale = "";
|
|
53
68
|
this.logged_in = false;
|
|
@@ -62,9 +77,50 @@ let CartService = class CartService {
|
|
|
62
77
|
this.couponApi = () => this.cart_baseUrl + '/' + this.cart_token + '/coupon';
|
|
63
78
|
this.addressBookApi = () => 'shop-api/' + this.consts.getChannel() + '/address-book';
|
|
64
79
|
this.taxesApi = () => 'shop-api/' + this.consts.getChannel() + '/carts/tax';
|
|
80
|
+
this.cartLifecycleGeneration = 0;
|
|
81
|
+
this.cartRequestId = 0;
|
|
82
|
+
this.lastAppliedCartRequestId = 0;
|
|
83
|
+
this.cartSyncKey = '__easycommerce_cart_sync__';
|
|
84
|
+
this.tabId = `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
85
|
+
this.seenCartSyncEvents = [];
|
|
86
|
+
this.cartSyncBlocked = false;
|
|
87
|
+
this.cartSyncReading = false;
|
|
88
|
+
this.cartSyncReadAgain = false;
|
|
89
|
+
this.pendingCheckoutRecovery = false;
|
|
90
|
+
this.cartNotActiveRecovery = null;
|
|
91
|
+
this.cartNotActiveTransitionId = null;
|
|
92
|
+
this.cartNotActiveToken = null;
|
|
93
|
+
this.cartBootstrapLookupInFlight = false;
|
|
94
|
+
this.cartBootstrapPickup = null;
|
|
95
|
+
this.cartBootstrapAllowsPendingAdds = false;
|
|
96
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
97
|
+
this.cartBootstrapPickupRequiredForRetry = false;
|
|
98
|
+
this.cartBootstrapRecoveryNavigation = null;
|
|
99
|
+
this.lastRouterNavigationId = null;
|
|
100
|
+
this.routerNavigationSubscription = null;
|
|
101
|
+
this.activeCheckoutTransitionId = null;
|
|
102
|
+
this.completedCheckoutTransitionId = null;
|
|
103
|
+
this.authContextBlocked = false;
|
|
104
|
+
this.checkoutInvalidatedAt = 0;
|
|
105
|
+
this.checkoutRecoveryTimeoutMs = 10000;
|
|
106
|
+
this.cartRequestTimeoutMs = 15000;
|
|
107
|
+
this.authRetryAllowed = false;
|
|
108
|
+
this.pendingGuestCartAssociationToken = null;
|
|
109
|
+
this.storageListener = (event) => this.handleStorageEvent(event);
|
|
110
|
+
this.visibilityListener = () => {
|
|
111
|
+
if (document.visibilityState === 'visible')
|
|
112
|
+
this.checkPendingCartSync();
|
|
113
|
+
};
|
|
114
|
+
this.pageshowListener = () => this.checkPendingCartSync();
|
|
65
115
|
this.cartItems = this.cartItemsSubject.asObservable().pipe(map(items => this.switchPriceInCartItem(items)));
|
|
66
116
|
this.coupon = this.couponSubject.asObservable();
|
|
67
117
|
this.loading = this.requestInProcess.asObservable();
|
|
118
|
+
/** Estado que permite a los consumidores diferenciar el carrito listo de una recuperación pendiente o fallida. */
|
|
119
|
+
this.cartSyncState = this.cartSyncStateSubject.asObservable();
|
|
120
|
+
/** Emite únicamente si el bootstrap descartó un token inactivo y recuperó otro carrito correctamente. */
|
|
121
|
+
this.cartBootstrapRecovery = this.cartBootstrapRecoverySubject.asObservable();
|
|
122
|
+
/** Notifica al checkout montado cuando se invalida el token que su CartService estaba usando. */
|
|
123
|
+
this.cartCheckoutInvalidation = this.cartCheckoutInvalidationSubject.asObservable();
|
|
68
124
|
this.cart = this.cartSubject.asObservable();
|
|
69
125
|
this.promotions = this.promotionsSubject.asObservable();
|
|
70
126
|
this.deleting = false;
|
|
@@ -74,32 +130,910 @@ let CartService = class CartService {
|
|
|
74
130
|
this.creditAmount$ = this.balanceCustomer$.pipe(map(data => { var _a, _b; return _b = (_a = data) === null || _a === void 0 ? void 0 : _a.creditAmount, (_b !== null && _b !== void 0 ? _b : null); }));
|
|
75
131
|
this.showMax$ = this.balanceCustomer$.pipe(map(data => { var _a, _b; return _b = (_a = data) === null || _a === void 0 ? void 0 : _a.showMax, (_b !== null && _b !== void 0 ? _b : null); }));
|
|
76
132
|
this.showPrice$ = this.balanceCustomer$.pipe(map(data => { var _a, _b; return _b = (_a = data) === null || _a === void 0 ? void 0 : _a.showPrice, (_b !== null && _b !== void 0 ? _b : null); }));
|
|
133
|
+
this.getCurrentRouterNavigationId = () => { var _a, _b, _c, _d; return _d = (_c = (_b = (_a = this.router).getCurrentNavigation) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.id, (_d !== null && _d !== void 0 ? _d : this.lastRouterNavigationId); };
|
|
134
|
+
this.markCartBootstrapRecoveryPending = (navigationId) => {
|
|
135
|
+
this.cartBootstrapRecoveryNavigation = { navigationId, completed: false };
|
|
136
|
+
};
|
|
137
|
+
this.completeCartBootstrapRecovery = () => {
|
|
138
|
+
if (!this.cartBootstrapRecoveryNavigation || this.cartBootstrapRecoveryNavigation.completed)
|
|
139
|
+
return;
|
|
140
|
+
this.cartBootstrapRecoveryNavigation.completed = true;
|
|
141
|
+
this.cartBootstrapRecoverySubject.next({ reason: 'inactive-token-replaced' });
|
|
142
|
+
};
|
|
143
|
+
this.createCartSyncId = () => `${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
144
|
+
this.getAuthContext = () => JSON.stringify([
|
|
145
|
+
localStorage.getItem('JWT_TOKEN'), localStorage.getItem('USER'),
|
|
146
|
+
localStorage.getItem('CUSTOMER'), localStorage.getItem('CHANNEL')
|
|
147
|
+
]);
|
|
148
|
+
this.cartTransitionIdForToken = (token) => {
|
|
149
|
+
if (!token)
|
|
150
|
+
return null;
|
|
151
|
+
let first = 2166136261;
|
|
152
|
+
let second = 5381;
|
|
153
|
+
for (let index = 0; index < token.length; index++) {
|
|
154
|
+
const code = token.charCodeAt(index);
|
|
155
|
+
first = Math.imul(first ^ code, 16777619);
|
|
156
|
+
second = Math.imul(second, 33) ^ code;
|
|
157
|
+
}
|
|
158
|
+
return `${(first >>> 0).toString(36)}-${(second >>> 0).toString(36)}`;
|
|
159
|
+
};
|
|
160
|
+
this.notifyCheckoutInvalidation = (transitionId, reason, token = this.cart_token || null) => {
|
|
161
|
+
if (!token || token !== this.cart_token || this.cartTransitionIdForToken(token) !== transitionId)
|
|
162
|
+
return;
|
|
163
|
+
this.cartCheckoutInvalidationSubject.next({ transitionId, reason });
|
|
164
|
+
};
|
|
165
|
+
this.publishCartSync = (type, transitionId) => {
|
|
166
|
+
const event = Object.assign({ eventId: this.createCartSyncId(), type, sourceId: this.tabId }, (transitionId ? { transitionId } : {}));
|
|
167
|
+
localStorage.setItem(this.cartSyncKey, JSON.stringify(event));
|
|
168
|
+
};
|
|
169
|
+
this.handleStorageEvent = (event) => {
|
|
170
|
+
if (event.key === this.cartSyncKey && event.newValue) {
|
|
171
|
+
let signal;
|
|
172
|
+
try {
|
|
173
|
+
signal = JSON.parse(event.newValue);
|
|
174
|
+
}
|
|
175
|
+
catch (_) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
this.receiveCartSync(signal);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (['JWT_TOKEN', 'USER', 'CUSTOMER', 'CHANNEL'].indexOf(event.key) >= 0) {
|
|
182
|
+
const nextContext = this.getAuthContext();
|
|
183
|
+
if (nextContext !== this.authContext) {
|
|
184
|
+
this.authContext = nextContext;
|
|
185
|
+
this.authRetryAllowed = true;
|
|
186
|
+
this.invalidateLocalCart(true);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
this.receiveCartSync = (signal) => {
|
|
191
|
+
var _a;
|
|
192
|
+
if (!((_a = signal) === null || _a === void 0 ? void 0 : _a.eventId) || signal.sourceId === this.tabId || this.seenCartSyncEvents.indexOf(signal.eventId) >= 0)
|
|
193
|
+
return;
|
|
194
|
+
this.seenCartSyncEvents.push(signal.eventId);
|
|
195
|
+
if (this.seenCartSyncEvents.length > 50)
|
|
196
|
+
this.seenCartSyncEvents.shift();
|
|
197
|
+
if (this.authContextBlocked)
|
|
198
|
+
return;
|
|
199
|
+
if (signal.type === 'checkout-invalidated') {
|
|
200
|
+
this.discardPendingBootstrapCartAdds();
|
|
201
|
+
this.cartBootstrapAllowsPendingAdds = false;
|
|
202
|
+
const sharedToken = localStorage.getItem('cart_token');
|
|
203
|
+
const transitionId = signal.transitionId || null;
|
|
204
|
+
if (transitionId && this.completedCheckoutTransitionId === transitionId)
|
|
205
|
+
return;
|
|
206
|
+
if (this.activeCheckoutTransitionId && transitionId && this.activeCheckoutTransitionId !== transitionId && !sharedToken)
|
|
207
|
+
return;
|
|
208
|
+
this.notifyCheckoutInvalidation(transitionId, 'checkout-completed');
|
|
209
|
+
if (transitionId && sharedToken && this.cartTransitionIdForToken(sharedToken) !== transitionId) {
|
|
210
|
+
// La señal pertenece a un token previo. No borrar el sucesor y
|
|
211
|
+
// reconciliar el estado guardado actualmente.
|
|
212
|
+
this.pendingCheckoutRecovery = false;
|
|
213
|
+
this.scheduleCartRefresh(false);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (!transitionId && sharedToken && this.cart_token && sharedToken !== this.cart_token) {
|
|
217
|
+
this.scheduleCartRefresh(false);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
this.activeCheckoutTransitionId = transitionId;
|
|
221
|
+
this.pendingCheckoutRecovery = true;
|
|
222
|
+
this.checkoutInvalidatedAt = Date.now();
|
|
223
|
+
this.invalidateLocalCart(false, true, sharedToken || this.cart_token || null);
|
|
224
|
+
this.setCartSyncState('invalidated');
|
|
225
|
+
this.startCheckoutRecoveryWatchdog();
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (signal.type === 'checkout-ready') {
|
|
229
|
+
const transitionId = signal.transitionId || null;
|
|
230
|
+
if (this.activeCheckoutTransitionId && transitionId && this.activeCheckoutTransitionId !== transitionId)
|
|
231
|
+
return;
|
|
232
|
+
this.completedCheckoutTransitionId = transitionId || this.activeCheckoutTransitionId;
|
|
233
|
+
this.activeCheckoutTransitionId = null;
|
|
234
|
+
if (this.checkoutRecoveryTimer)
|
|
235
|
+
clearTimeout(this.checkoutRecoveryTimer);
|
|
236
|
+
this.checkoutInvalidatedAt = 0;
|
|
237
|
+
this.pendingCheckoutRecovery = true;
|
|
238
|
+
this.cartSyncBlocked = false;
|
|
239
|
+
this.scheduleCartRefresh(true);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (signal.type === 'cart-invalidated') {
|
|
243
|
+
this.discardPendingBootstrapCartAdds();
|
|
244
|
+
this.cartBootstrapAllowsPendingAdds = false;
|
|
245
|
+
const sharedToken = localStorage.getItem('cart_token');
|
|
246
|
+
const transitionId = signal.transitionId || null;
|
|
247
|
+
this.notifyCheckoutInvalidation(transitionId, 'cart-not-active');
|
|
248
|
+
if (transitionId && sharedToken && this.cartTransitionIdForToken(sharedToken) !== transitionId) {
|
|
249
|
+
this.scheduleCartRefresh(false);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
this.cartNotActiveTransitionId = transitionId;
|
|
253
|
+
this.cartNotActiveToken = this.cart_token || null;
|
|
254
|
+
this.pendingCheckoutRecovery = false;
|
|
255
|
+
this.invalidateLocalCart(false, true, sharedToken || this.cart_token || null);
|
|
256
|
+
this.setCartSyncState('invalidated', 'cart-not-active');
|
|
257
|
+
this.startCartNotActiveRecoveryWatchdog(transitionId);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (signal.type === 'cart-ready') {
|
|
261
|
+
const transitionId = signal.transitionId || null;
|
|
262
|
+
if (this.cartNotActiveTransitionId && transitionId !== this.cartNotActiveTransitionId)
|
|
263
|
+
return;
|
|
264
|
+
this.cartNotActiveTransitionId = null;
|
|
265
|
+
this.cartNotActiveToken = null;
|
|
266
|
+
if (this.cartNotActiveRecoveryTimer)
|
|
267
|
+
clearTimeout(this.cartNotActiveRecoveryTimer);
|
|
268
|
+
this.scheduleCartRefresh(false);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (signal.type === 'cart-recovery-failed') {
|
|
272
|
+
const transitionId = signal.transitionId || null;
|
|
273
|
+
if (this.cartNotActiveTransitionId && transitionId !== this.cartNotActiveTransitionId)
|
|
274
|
+
return;
|
|
275
|
+
this.cartNotActiveTransitionId = transitionId;
|
|
276
|
+
this.cartNotActiveToken = this.cartNotActiveToken || this.cart_token || null;
|
|
277
|
+
if (this.cartNotActiveRecoveryTimer)
|
|
278
|
+
clearTimeout(this.cartNotActiveRecoveryTimer);
|
|
279
|
+
this.cartSyncBlocked = true;
|
|
280
|
+
this.setCartSyncState('error', 'cart-not-active');
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (signal.type === 'changed') {
|
|
284
|
+
// La última señal de otra pestaña puede seguir en localStorage al
|
|
285
|
+
// abrir una sesión nueva. Sin token no hay resumen que refrescar;
|
|
286
|
+
// dejar que initialize/getCart haga el bootstrap evita invalidar
|
|
287
|
+
// el POST /carts que está iniciándose en paralelo.
|
|
288
|
+
if (!localStorage.getItem('cart_token'))
|
|
289
|
+
return;
|
|
290
|
+
if (this.checkoutRecoveryTimer)
|
|
291
|
+
clearTimeout(this.checkoutRecoveryTimer);
|
|
292
|
+
this.cartSyncBlocked = true;
|
|
293
|
+
this.pendingCheckoutRecovery = true;
|
|
294
|
+
this.cartLifecycleGeneration++;
|
|
295
|
+
this.lastAppliedCartRequestId = ++this.cartRequestId;
|
|
296
|
+
this.scheduleCartRefresh(false);
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
this.checkPendingCartSync = () => {
|
|
300
|
+
this.markInterruptedCheckoutIfExpired();
|
|
301
|
+
if (this.authContextBlocked)
|
|
302
|
+
return;
|
|
303
|
+
if (this.authContext !== this.getAuthContext()) {
|
|
304
|
+
this.authContext = this.getAuthContext();
|
|
305
|
+
this.invalidateLocalCart(true);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const value = localStorage.getItem(this.cartSyncKey);
|
|
309
|
+
if (this.pendingCheckoutRecovery && localStorage.getItem('cart_token')) {
|
|
310
|
+
this.scheduleCartRefresh(true);
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (!value)
|
|
314
|
+
return;
|
|
315
|
+
try {
|
|
316
|
+
this.receiveCartSync(JSON.parse(value));
|
|
317
|
+
}
|
|
318
|
+
catch (_) { }
|
|
319
|
+
};
|
|
320
|
+
this.scheduleCartRefresh = (checkoutReady) => {
|
|
321
|
+
this.cartSyncBlocked = true;
|
|
322
|
+
this.setCartSyncState('syncing');
|
|
323
|
+
this.cartLifecycleGeneration++;
|
|
324
|
+
this.lastAppliedCartRequestId = ++this.cartRequestId;
|
|
325
|
+
if (this.cartSyncTimer)
|
|
326
|
+
clearTimeout(this.cartSyncTimer);
|
|
327
|
+
this.cartSyncTimer = setTimeout(() => this.refreshCartFromBackend(checkoutReady), 0);
|
|
328
|
+
};
|
|
329
|
+
this.refreshCartFromBackend = (checkoutReady) => {
|
|
330
|
+
if (this.authContextBlocked)
|
|
331
|
+
return;
|
|
332
|
+
if (this.cartSyncReading) {
|
|
333
|
+
this.cartSyncReadAgain = true;
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
if (this.authContext !== this.getAuthContext()) {
|
|
337
|
+
this.authContext = this.getAuthContext();
|
|
338
|
+
this.invalidateLocalCart(true);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const token = localStorage.getItem('cart_token');
|
|
342
|
+
if (!token) {
|
|
343
|
+
this.invalidateLocalCart(false, false);
|
|
344
|
+
this.discardPendingBootstrapCartAdds();
|
|
345
|
+
this.pendingCheckoutRecovery = true;
|
|
346
|
+
this.setCartSyncState('invalidated', 'token-unavailable');
|
|
347
|
+
this.toastrService.show('operation-error-param');
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
this.cartSyncBlocked = true;
|
|
351
|
+
this.cartLifecycleGeneration++;
|
|
352
|
+
this.cart_token = token;
|
|
353
|
+
this.cartSyncReading = true;
|
|
354
|
+
const generation = this.cartLifecycleGeneration;
|
|
355
|
+
this.connection.getErrorNotHandler(`shop-api/${this.consts.getChannel()}/carts/${token}?locale=${this.consts.getLocale()}`)
|
|
356
|
+
.pipe(timeout(this.cartRequestTimeoutMs), finalize(() => {
|
|
357
|
+
this.cartSyncReading = false;
|
|
358
|
+
if (this.cartSyncReadAgain) {
|
|
359
|
+
this.cartSyncReadAgain = false;
|
|
360
|
+
this.scheduleCartRefresh(false);
|
|
361
|
+
}
|
|
362
|
+
}))
|
|
363
|
+
.subscribe(response => {
|
|
364
|
+
if (generation !== this.cartLifecycleGeneration)
|
|
365
|
+
return;
|
|
366
|
+
if (this.authContext !== this.getAuthContext()) {
|
|
367
|
+
this.authContext = this.getAuthContext();
|
|
368
|
+
this.invalidateLocalCart(true, true);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
if (!response || this.isCartBusinessError(response) || !response.tokenValue || !Array.isArray(response.items)) {
|
|
372
|
+
this.invalidateLocalCart(false, false);
|
|
373
|
+
this.discardPendingBootstrapCartAdds();
|
|
374
|
+
this.pendingCheckoutRecovery = checkoutReady;
|
|
375
|
+
this.setCartSyncState('error', 'invalid-response');
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
const context = {
|
|
379
|
+
token, generation, requestId: ++this.cartRequestId, allowTokenChange: false
|
|
380
|
+
};
|
|
381
|
+
if (this.applyCartResponse(response, context, false, false)) {
|
|
382
|
+
this.locale = response.locale || this.locale;
|
|
383
|
+
this.cartSyncBlocked = false;
|
|
384
|
+
this.pendingCheckoutRecovery = false;
|
|
385
|
+
this.setCartSyncState('ready');
|
|
386
|
+
this.completeCartBootstrapRecovery();
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
this.invalidateLocalCart(false, false);
|
|
390
|
+
this.discardPendingBootstrapCartAdds();
|
|
391
|
+
this.pendingCheckoutRecovery = checkoutReady;
|
|
392
|
+
this.setCartSyncState('error', 'invalid-response');
|
|
393
|
+
}
|
|
394
|
+
}, error => {
|
|
395
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
396
|
+
if (generation !== this.cartLifecycleGeneration || this.authContext !== this.getAuthContext())
|
|
397
|
+
return;
|
|
398
|
+
this.invalidateLocalCart(false, false);
|
|
399
|
+
if ([400, 404, 410].indexOf((_a = error) === null || _a === void 0 ? void 0 : _a.status) >= 0) {
|
|
400
|
+
this.discardPendingBootstrapCartAdds();
|
|
401
|
+
if (localStorage.getItem('cart_token') === token)
|
|
402
|
+
localStorage.removeItem('cart_token');
|
|
403
|
+
this.cart_token = null;
|
|
404
|
+
this.pendingCheckoutRecovery = false;
|
|
405
|
+
this.setCartSyncState('invalidated', 'token-unavailable');
|
|
406
|
+
this.toastrService.show('operation-error-param');
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
if (((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 401 || ((_c = error) === null || _c === void 0 ? void 0 : _c.status) === 403) {
|
|
410
|
+
this.discardPendingBootstrapCartAdds();
|
|
411
|
+
this.authContextBlocked = true;
|
|
412
|
+
this.authRetryAllowed = false;
|
|
413
|
+
if (localStorage.getItem('cart_token') === token)
|
|
414
|
+
localStorage.removeItem('cart_token');
|
|
415
|
+
this.pendingCheckoutRecovery = false;
|
|
416
|
+
this.setCartSyncState('authentication-changed', 'authentication');
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
this.discardPendingBootstrapCartAdds();
|
|
420
|
+
this.pendingCheckoutRecovery = checkoutReady;
|
|
421
|
+
const reason = ((_d = error) === null || _d === void 0 ? void 0 : _d.status) >= 500 ? 'server' : (((_e = error) === null || _e === void 0 ? void 0 : _e.status) >= 400 && ((_f = error) === null || _f === void 0 ? void 0 : _f.status) < 500 && ((_g = error) === null || _g === void 0 ? void 0 : _g.status) !== 429 ? 'invalid-response' : 'network');
|
|
422
|
+
this.setCartSyncState('error', reason);
|
|
423
|
+
this.toastrService.show('operation-error-param');
|
|
424
|
+
});
|
|
425
|
+
};
|
|
426
|
+
this.setCartSyncState = (status, reason) => {
|
|
427
|
+
this.cartSyncStateSubject.next(Object.assign({ status }, (reason ? { reason } : {})));
|
|
428
|
+
};
|
|
429
|
+
this.startCheckoutRecoveryWatchdog = () => {
|
|
430
|
+
if (this.checkoutRecoveryTimer)
|
|
431
|
+
clearTimeout(this.checkoutRecoveryTimer);
|
|
432
|
+
this.checkoutRecoveryTimer = setTimeout(() => this.markInterruptedCheckoutIfExpired(), this.checkoutRecoveryTimeoutMs);
|
|
433
|
+
};
|
|
434
|
+
this.markInterruptedCheckoutIfExpired = () => {
|
|
435
|
+
if (!this.pendingCheckoutRecovery || !this.checkoutInvalidatedAt ||
|
|
436
|
+
Date.now() - this.checkoutInvalidatedAt < this.checkoutRecoveryTimeoutMs ||
|
|
437
|
+
this.cartSyncStateSubject.value.status !== 'invalidated')
|
|
438
|
+
return;
|
|
439
|
+
this.setCartSyncState('error', 'checkout-interrupted');
|
|
440
|
+
this.toastrService.show('operation-error-param');
|
|
441
|
+
};
|
|
442
|
+
this.invalidateLocalCart = (authChanged, discardToken = false, expectedToken = this.cart_token || null) => {
|
|
443
|
+
this.cartLifecycleGeneration++;
|
|
444
|
+
this.lastAppliedCartRequestId = ++this.cartRequestId;
|
|
445
|
+
this.cartSyncBlocked = true;
|
|
446
|
+
this.items = [];
|
|
447
|
+
this.cart_token = null;
|
|
448
|
+
if (discardToken && expectedToken && localStorage.getItem('cart_token') === expectedToken)
|
|
449
|
+
localStorage.removeItem('cart_token');
|
|
450
|
+
this.cartSubject.next(null);
|
|
451
|
+
this.cartItemsSubject.next([]);
|
|
452
|
+
this.couponSubject.next(null);
|
|
453
|
+
this.promotionsSubject.next([]);
|
|
454
|
+
this.updateBalanceAttributes(null);
|
|
455
|
+
this.count = 0;
|
|
456
|
+
localStorage.setItem('cart', '[]');
|
|
457
|
+
this.requestInProcess.next(false);
|
|
458
|
+
if (authChanged) {
|
|
459
|
+
this.discardPendingBootstrapCartAdds();
|
|
460
|
+
this.pendingCheckoutRecovery = false;
|
|
461
|
+
this.authContextBlocked = true;
|
|
462
|
+
if (expectedToken && localStorage.getItem('cart_token') === expectedToken)
|
|
463
|
+
localStorage.removeItem('cart_token');
|
|
464
|
+
this.setCartSyncState('authentication-changed', 'authentication');
|
|
465
|
+
this.toastrService.show('operation-error-param');
|
|
466
|
+
}
|
|
467
|
+
else if (discardToken) {
|
|
468
|
+
this.setCartSyncState('invalidated');
|
|
469
|
+
}
|
|
470
|
+
};
|
|
471
|
+
/** Reintenta una lectura fallida. Si el token ya fue invalidado, no crea otro carrito. */
|
|
472
|
+
this.retryCartSync = () => {
|
|
473
|
+
var _a;
|
|
474
|
+
if (this.cartSyncStateSubject.value.status === 'syncing')
|
|
475
|
+
return false;
|
|
476
|
+
if (this.pendingGuestCartAssociationToken && this.cartSyncStateSubject.value.status === 'error') {
|
|
477
|
+
const token = this.pendingGuestCartAssociationToken;
|
|
478
|
+
if (this.authContext !== this.getAuthContext() || this.cart_token !== token || localStorage.getItem('cart_token') !== token)
|
|
479
|
+
return false;
|
|
480
|
+
this.setCartSyncState('syncing');
|
|
481
|
+
this.getCartByToken(token);
|
|
482
|
+
return true;
|
|
483
|
+
}
|
|
484
|
+
if (this.cartBootstrapPickupRequiredForRetry && this.cartSyncStateSubject.value.status === 'error') {
|
|
485
|
+
if (this.authContext !== this.getAuthContext())
|
|
486
|
+
return false;
|
|
487
|
+
this.setCartSyncState('syncing');
|
|
488
|
+
this.startCartBootstrapPickup(this.pendingCheckoutRecovery);
|
|
489
|
+
return true;
|
|
490
|
+
}
|
|
491
|
+
if (this.cartBootstrapLookupRequiredForRetry && this.cartSyncStateSubject.value.status === 'error') {
|
|
492
|
+
if (this.authContext !== this.getAuthContext())
|
|
493
|
+
return false;
|
|
494
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
495
|
+
this.setCartSyncState('syncing');
|
|
496
|
+
this.getCart(this.pendingCheckoutRecovery);
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
if (this.cartNotActiveToken && this.cartSyncStateSubject.value.status === 'error') {
|
|
500
|
+
const token = this.cartNotActiveToken || ((_a = this.cartNotActiveRecovery) === null || _a === void 0 ? void 0 : _a.token);
|
|
501
|
+
if (!token || this.authContext !== this.getAuthContext())
|
|
502
|
+
return false;
|
|
503
|
+
this.startCartNotActiveRecovery(token, this.cartTransitionIdForToken(token));
|
|
504
|
+
return true;
|
|
505
|
+
}
|
|
506
|
+
if (this.authContextBlocked) {
|
|
507
|
+
if (!this.authRetryAllowed || this.authContext !== this.getAuthContext())
|
|
508
|
+
return false;
|
|
509
|
+
this.authContext = this.getAuthContext();
|
|
510
|
+
this.authContextBlocked = false;
|
|
511
|
+
this.authRetryAllowed = false;
|
|
512
|
+
this.cartSyncBlocked = true;
|
|
513
|
+
this.pendingCheckoutRecovery = false;
|
|
514
|
+
this.setCartSyncState('syncing');
|
|
515
|
+
this.getCart();
|
|
516
|
+
return true;
|
|
517
|
+
}
|
|
518
|
+
if (this.cartSyncStateSubject.value.status !== 'error' || this.authContext !== this.getAuthContext())
|
|
519
|
+
return false;
|
|
520
|
+
if (!localStorage.getItem('cart_token'))
|
|
521
|
+
return false;
|
|
522
|
+
this.scheduleCartRefresh(this.pendingCheckoutRecovery);
|
|
523
|
+
return true;
|
|
524
|
+
};
|
|
525
|
+
/** Reanuda explícitamente un checkout interrumpido consultando /carts sin token. */
|
|
526
|
+
this.recoverInterruptedCheckout = () => {
|
|
527
|
+
if (!this.checkoutInvalidatedAt || this.cartSyncStateSubject.value.status !== 'error')
|
|
528
|
+
return false;
|
|
529
|
+
if (this.authContext !== this.getAuthContext()) {
|
|
530
|
+
this.invalidateLocalCart(true, true);
|
|
531
|
+
return false;
|
|
532
|
+
}
|
|
533
|
+
this.setCartSyncState('syncing');
|
|
534
|
+
this.cartSyncBlocked = true;
|
|
535
|
+
this.pendingCheckoutRecovery = true;
|
|
536
|
+
this.getCart(true);
|
|
537
|
+
return true;
|
|
538
|
+
};
|
|
539
|
+
/** Impide enviar nuevas mutaciones mientras la pestaña reconcilia una invalidación remota. */
|
|
540
|
+
this.canMutateCart = () => !this.authContextBlocked && !this.cartSyncBlocked && !!this.cart_token;
|
|
541
|
+
/** Confirma que el resumen listo ya pertenece al contexto de autenticación vigente. */
|
|
542
|
+
this.isCartReadyForCurrentAuthContext = () => this.cartSyncStateSubject.value.status === 'ready' &&
|
|
543
|
+
!this.authContextBlocked &&
|
|
544
|
+
!this.cartSyncBlocked &&
|
|
545
|
+
!this.pendingGuestCartAssociationToken &&
|
|
546
|
+
this.authContext === this.getAuthContext();
|
|
547
|
+
this.discardPendingBootstrapCartAdds = () => {
|
|
548
|
+
this.pendingBootstrapCartAdds = [];
|
|
549
|
+
this.pendingBootstrapCartAddsLimitNotified = false;
|
|
550
|
+
this.pendingBootstrapCartAddInFlight = false;
|
|
551
|
+
this.pendingBootstrapCartQueueGeneration++;
|
|
552
|
+
};
|
|
553
|
+
this.flushPendingBootstrapCartAdds = () => {
|
|
554
|
+
if (!this.pendingBootstrapCartAdds.length || this.pendingBootstrapCartAddInFlight ||
|
|
555
|
+
!this.canMutateCart() || this.requestInProcess.getValue())
|
|
556
|
+
return;
|
|
557
|
+
const pending = this.pendingBootstrapCartAdds.shift();
|
|
558
|
+
const queueGeneration = this.pendingBootstrapCartQueueGeneration;
|
|
559
|
+
this.pendingBootstrapCartAddInFlight = true;
|
|
560
|
+
this.addToCart(pending.product, pending.quantity, pending.variantId, pending.comments, true, queueGeneration);
|
|
561
|
+
// Las validaciones locales pueden terminar sin iniciar HTTP. Sigue con
|
|
562
|
+
// la próxima intención en vez de dejar el resto pendiente.
|
|
563
|
+
if (queueGeneration === this.pendingBootstrapCartQueueGeneration && !this.requestInProcess.getValue()) {
|
|
564
|
+
this.pendingBootstrapCartAddInFlight = false;
|
|
565
|
+
this.flushPendingBootstrapCartAdds();
|
|
566
|
+
}
|
|
567
|
+
};
|
|
568
|
+
/** Detecta el contrato de carrito finalizado sin tratar otros conflictos HTTP como invalidez del carrito. */
|
|
569
|
+
this.isCartNotActiveError = (error) => {
|
|
570
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
571
|
+
if (((_a = error) === null || _a === void 0 ? void 0 : _a.status) !== 409)
|
|
572
|
+
return false;
|
|
573
|
+
const headerCode = ((_c = (_b = error) === null || _b === void 0 ? void 0 : _b.headers) === null || _c === void 0 ? void 0 : _c.get) ? error.headers.get('X-Error-Code') : null;
|
|
574
|
+
const body = (_d = error) === null || _d === void 0 ? void 0 : _d.error;
|
|
575
|
+
const bodyCodes = typeof body === 'string' ? [body] : [
|
|
576
|
+
(_e = body) === null || _e === void 0 ? void 0 : _e.code,
|
|
577
|
+
(_f = body) === null || _f === void 0 ? void 0 : _f.errorCode,
|
|
578
|
+
(_g = body) === null || _g === void 0 ? void 0 : _g.error_code,
|
|
579
|
+
typeof ((_h = body) === null || _h === void 0 ? void 0 : _h.error) === 'string' ? body.error : (_k = (_j = body) === null || _j === void 0 ? void 0 : _j.error) === null || _k === void 0 ? void 0 : _k.code,
|
|
580
|
+
(_l = body) === null || _l === void 0 ? void 0 : _l.message,
|
|
581
|
+
(_m = body) === null || _m === void 0 ? void 0 : _m.detail,
|
|
582
|
+
(_o = body) === null || _o === void 0 ? void 0 : _o['hydra:description']
|
|
583
|
+
];
|
|
584
|
+
return headerCode === 'CART_NOT_ACTIVE' || bodyCodes.indexOf('CART_NOT_ACTIVE') >= 0;
|
|
585
|
+
};
|
|
586
|
+
/** Consume un CART_NOT_ACTIVE, invalida solo el token de esa solicitud e inicia una recuperación única. */
|
|
587
|
+
this.handleCartMutationError = (error, requestToken = this.cart_token || null) => {
|
|
588
|
+
var _a;
|
|
589
|
+
if (!this.isCartNotActiveError(error))
|
|
590
|
+
return false;
|
|
591
|
+
this.discardPendingBootstrapCartAdds();
|
|
592
|
+
this.cartBootstrapAllowsPendingAdds = false;
|
|
593
|
+
if (!requestToken)
|
|
594
|
+
return true;
|
|
595
|
+
const transitionId = this.cartTransitionIdForToken(requestToken);
|
|
596
|
+
if (((_a = this.cartNotActiveRecovery) === null || _a === void 0 ? void 0 : _a.token) === requestToken)
|
|
597
|
+
return true;
|
|
598
|
+
if (this.cartNotActiveTransitionId === transitionId)
|
|
599
|
+
return true;
|
|
600
|
+
const sharedToken = localStorage.getItem('cart_token') || null;
|
|
601
|
+
if (sharedToken && sharedToken !== requestToken) {
|
|
602
|
+
// Otro contexto ya adoptó un sucesor. Reconciliarlo en vez de invalidarlo o crear otro.
|
|
603
|
+
this.notifyCheckoutInvalidation(transitionId, 'cart-not-active', requestToken);
|
|
604
|
+
this.scheduleCartRefresh(false);
|
|
605
|
+
return true;
|
|
606
|
+
}
|
|
607
|
+
if (sharedToken !== requestToken) {
|
|
608
|
+
// El token compartido ya fue retirado por otra pestaña, que pudo cerrarse
|
|
609
|
+
// antes de publicar cart-ready. Dejar este contexto invalidado; el watchdog
|
|
610
|
+
// habilita el reintento manual, sin repetir esta mutación ni crear otro carrito.
|
|
611
|
+
if (this.cart_token === requestToken) {
|
|
612
|
+
this.notifyCheckoutInvalidation(transitionId, 'cart-not-active', requestToken);
|
|
613
|
+
this.cartNotActiveToken = requestToken;
|
|
614
|
+
this.cartNotActiveTransitionId = transitionId;
|
|
615
|
+
this.pendingCheckoutRecovery = false;
|
|
616
|
+
this.invalidateLocalCart(false, false);
|
|
617
|
+
this.setCartSyncState('invalidated', 'cart-not-active');
|
|
618
|
+
this.startCartNotActiveRecoveryWatchdog(transitionId);
|
|
619
|
+
}
|
|
620
|
+
return true;
|
|
621
|
+
}
|
|
622
|
+
this.cartNotActiveToken = requestToken;
|
|
623
|
+
this.cartNotActiveTransitionId = transitionId;
|
|
624
|
+
this.cartSyncBlocked = true;
|
|
625
|
+
this.pendingCheckoutRecovery = false;
|
|
626
|
+
this.notifyCheckoutInvalidation(transitionId, 'cart-not-active', requestToken);
|
|
627
|
+
this.invalidateLocalCart(false, true, requestToken);
|
|
628
|
+
this.setCartSyncState('syncing');
|
|
629
|
+
this.publishCartSync('cart-invalidated', transitionId);
|
|
630
|
+
this.toastrService.show('cart-not-active-recovering');
|
|
631
|
+
this.startCartNotActiveRecovery(requestToken, transitionId);
|
|
632
|
+
return true;
|
|
633
|
+
};
|
|
634
|
+
this.startCartNotActiveRecovery = (failedToken, transitionId) => {
|
|
635
|
+
var _a;
|
|
636
|
+
if (((_a = this.cartNotActiveRecovery) === null || _a === void 0 ? void 0 : _a.token) === failedToken)
|
|
637
|
+
return this.cartNotActiveRecovery.promise;
|
|
638
|
+
const sharedToken = localStorage.getItem('cart_token') || null;
|
|
639
|
+
if (sharedToken && sharedToken !== failedToken) {
|
|
640
|
+
this.scheduleCartRefresh(false);
|
|
641
|
+
return Promise.resolve(false);
|
|
642
|
+
}
|
|
643
|
+
this.cartSyncBlocked = true;
|
|
644
|
+
this.setCartSyncState('syncing');
|
|
645
|
+
const authContext = this.getAuthContext();
|
|
646
|
+
const context = this.captureCartResponseContext();
|
|
647
|
+
const promise = this.connection.post(this.cartItemsApi(), {}).pipe(timeout(this.cartRequestTimeoutMs)).toPromise()
|
|
648
|
+
.then(response => {
|
|
649
|
+
if (authContext !== this.getAuthContext()) {
|
|
650
|
+
this.authContext = this.getAuthContext();
|
|
651
|
+
this.invalidateLocalCart(true, true, failedToken);
|
|
652
|
+
return false;
|
|
653
|
+
}
|
|
654
|
+
if (context.generation !== this.cartLifecycleGeneration)
|
|
655
|
+
return false;
|
|
656
|
+
const currentToken = localStorage.getItem('cart_token') || null;
|
|
657
|
+
if (currentToken && currentToken !== failedToken) {
|
|
658
|
+
this.scheduleCartRefresh(false);
|
|
659
|
+
return false;
|
|
660
|
+
}
|
|
661
|
+
if (!this.initializeCart(response, context)) {
|
|
662
|
+
this.cartSyncBlocked = true;
|
|
663
|
+
this.setCartSyncState('error', 'cart-not-active');
|
|
664
|
+
this.publishCartSync('cart-recovery-failed', transitionId);
|
|
665
|
+
return false;
|
|
666
|
+
}
|
|
667
|
+
this.cartNotActiveTransitionId = null;
|
|
668
|
+
this.cartNotActiveToken = null;
|
|
669
|
+
if (this.cartNotActiveRecoveryTimer)
|
|
670
|
+
clearTimeout(this.cartNotActiveRecoveryTimer);
|
|
671
|
+
this.publishCartSync('cart-ready', transitionId);
|
|
672
|
+
return true;
|
|
673
|
+
})
|
|
674
|
+
.catch(error => {
|
|
675
|
+
var _a, _b, _c;
|
|
676
|
+
if (authContext !== this.getAuthContext()) {
|
|
677
|
+
this.authContext = this.getAuthContext();
|
|
678
|
+
this.invalidateLocalCart(true, true, failedToken);
|
|
679
|
+
return false;
|
|
680
|
+
}
|
|
681
|
+
if (context.generation !== this.cartLifecycleGeneration)
|
|
682
|
+
return false;
|
|
683
|
+
if (((_a = error) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 403) {
|
|
684
|
+
this.authContextBlocked = true;
|
|
685
|
+
this.authRetryAllowed = false;
|
|
686
|
+
this.cartNotActiveToken = null;
|
|
687
|
+
this.invalidateLocalCart(true, true, failedToken);
|
|
688
|
+
this.setCartSyncState('authentication-changed', 'authentication');
|
|
689
|
+
return false;
|
|
690
|
+
}
|
|
691
|
+
this.cartSyncBlocked = true;
|
|
692
|
+
this.setCartSyncState('error', ((_c = error) === null || _c === void 0 ? void 0 : _c.status) >= 500 ? 'server' : 'cart-not-active');
|
|
693
|
+
this.publishCartSync('cart-recovery-failed', transitionId);
|
|
694
|
+
return false;
|
|
695
|
+
})
|
|
696
|
+
.then(result => {
|
|
697
|
+
var _a;
|
|
698
|
+
if (((_a = this.cartNotActiveRecovery) === null || _a === void 0 ? void 0 : _a.token) === failedToken)
|
|
699
|
+
this.cartNotActiveRecovery = null;
|
|
700
|
+
return result;
|
|
701
|
+
});
|
|
702
|
+
this.cartNotActiveRecovery = { token: failedToken, transitionId, promise };
|
|
703
|
+
return promise;
|
|
704
|
+
};
|
|
705
|
+
this.startCartNotActiveRecoveryWatchdog = (transitionId) => {
|
|
706
|
+
if (this.cartNotActiveRecoveryTimer)
|
|
707
|
+
clearTimeout(this.cartNotActiveRecoveryTimer);
|
|
708
|
+
this.cartNotActiveRecoveryTimer = setTimeout(() => {
|
|
709
|
+
if (this.cartNotActiveTransitionId !== transitionId ||
|
|
710
|
+
this.cartSyncStateSubject.value.status !== 'invalidated')
|
|
711
|
+
return;
|
|
712
|
+
this.setCartSyncState('error', 'cart-not-active');
|
|
713
|
+
}, this.checkoutRecoveryTimeoutMs);
|
|
714
|
+
};
|
|
77
715
|
this.getAddressBook = () => __awaiter(this, void 0, void 0, function* () { return this.connection.get(this.addressBookApi()).pipe(map(res => { var _a; return ((_a = res) === null || _a === void 0 ? void 0 : _a.length) && res.map(addres => { return addres && Object.assign(Object.assign({}, addres), { selected: addres.default }); }) || null; })).toPromise(); });
|
|
78
716
|
this.getTaxes = () => __awaiter(this, void 0, void 0, function* () { return this.connection.post(this.taxesApi(), { token: this.cart_token }).subscribe(res => res); });
|
|
79
|
-
this.getCart = () => __awaiter(this, void 0, void 0, function* () {
|
|
80
|
-
|
|
717
|
+
this.getCart = (checkoutRecovery = false) => __awaiter(this, void 0, void 0, function* () {
|
|
718
|
+
if (this.cartBootstrapLookupInFlight)
|
|
719
|
+
return;
|
|
720
|
+
this.cartBootstrapAllowsPendingAdds = !checkoutRecovery;
|
|
721
|
+
this.pendingBootstrapCartAddsLimitNotified = false;
|
|
722
|
+
const token = this.cart_token || null;
|
|
723
|
+
if (!token) {
|
|
724
|
+
this.cartBootstrapPickupRequiredForRetry = true;
|
|
725
|
+
return this.startCartBootstrapPickup(checkoutRecovery);
|
|
726
|
+
}
|
|
727
|
+
const context = this.captureCartResponseContext(false);
|
|
728
|
+
const authContext = this.getAuthContext();
|
|
729
|
+
const navigationId = this.getCurrentRouterNavigationId();
|
|
730
|
+
this.cartBootstrapLookupInFlight = true;
|
|
731
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
732
|
+
this.cartSyncBlocked = true;
|
|
733
|
+
this.setCartSyncState('syncing');
|
|
734
|
+
return this.connection.getErrorNotHandler(`shop-api/${this.consts.getChannel()}/carts/${token}?locale=${this.consts.getLocale()}`).pipe(timeout(this.cartRequestTimeoutMs)).subscribe(response => {
|
|
735
|
+
this.cartBootstrapLookupInFlight = false;
|
|
736
|
+
if (context.generation !== this.cartLifecycleGeneration || context.requestId !== this.cartRequestId) {
|
|
737
|
+
this.resumeCartBootstrapIfInvalidated(checkoutRecovery);
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
if (authContext !== this.getAuthContext()) {
|
|
741
|
+
this.authContext = this.getAuthContext();
|
|
742
|
+
this.invalidateLocalCart(true, true, token);
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
745
|
+
if (this.cart_token !== token || localStorage.getItem('cart_token') !== token) {
|
|
746
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
747
|
+
if (localStorage.getItem('cart_token')) {
|
|
748
|
+
this.scheduleCartRefresh(false);
|
|
749
|
+
}
|
|
750
|
+
else if (!this.authContextBlocked) {
|
|
751
|
+
this.invalidateLocalCart(false, false);
|
|
752
|
+
this.cartBootstrapPickupRequiredForRetry = true;
|
|
753
|
+
this.startCartBootstrapPickup(checkoutRecovery);
|
|
754
|
+
}
|
|
755
|
+
return;
|
|
756
|
+
}
|
|
757
|
+
if (!this.initializeCart(response, context)) {
|
|
758
|
+
this.discardPendingBootstrapCartAdds();
|
|
759
|
+
this.cartBootstrapLookupRequiredForRetry = true;
|
|
760
|
+
this.cartSyncBlocked = true;
|
|
761
|
+
this.setCartSyncState('error', 'invalid-response');
|
|
762
|
+
this.toastrService.show('operation-error-param');
|
|
763
|
+
return;
|
|
764
|
+
}
|
|
765
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
766
|
+
this.cartBootstrapPickupRequiredForRetry = false;
|
|
767
|
+
if (checkoutRecovery)
|
|
768
|
+
this.finishCheckoutCartRecovery();
|
|
769
|
+
}, error => {
|
|
770
|
+
var _a, _b, _c, _d;
|
|
771
|
+
this.cartBootstrapLookupInFlight = false;
|
|
772
|
+
if (context.generation !== this.cartLifecycleGeneration || context.requestId !== this.cartRequestId) {
|
|
773
|
+
this.resumeCartBootstrapIfInvalidated(checkoutRecovery);
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
if (authContext !== this.getAuthContext()) {
|
|
777
|
+
this.authContext = this.getAuthContext();
|
|
778
|
+
this.discardPendingBootstrapCartAdds();
|
|
779
|
+
this.invalidateLocalCart(true, true, token);
|
|
780
|
+
return;
|
|
781
|
+
}
|
|
782
|
+
if (((_a = error) === null || _a === void 0 ? void 0 : _a.status) === 404) {
|
|
783
|
+
if (this.cart_token !== token || localStorage.getItem('cart_token') !== token) {
|
|
784
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
785
|
+
if (localStorage.getItem('cart_token')) {
|
|
786
|
+
this.scheduleCartRefresh(false);
|
|
787
|
+
}
|
|
788
|
+
else if (!this.authContextBlocked) {
|
|
789
|
+
this.invalidateLocalCart(false, false);
|
|
790
|
+
this.markCartBootstrapRecoveryPending(navigationId);
|
|
791
|
+
this.cartBootstrapPickupRequiredForRetry = true;
|
|
792
|
+
this.startCartBootstrapPickup(checkoutRecovery, true);
|
|
793
|
+
}
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
796
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
797
|
+
this.invalidateLocalCart(false, true, token);
|
|
798
|
+
this.markCartBootstrapRecoveryPending(navigationId);
|
|
799
|
+
this.cartBootstrapPickupRequiredForRetry = true;
|
|
800
|
+
this.startCartBootstrapPickup(checkoutRecovery, true);
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
this.requestInProcess.next(false);
|
|
804
|
+
if (((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 401 || ((_c = error) === null || _c === void 0 ? void 0 : _c.status) === 403) {
|
|
805
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
806
|
+
this.cartBootstrapPickupRequiredForRetry = false;
|
|
807
|
+
this.cartBootstrapRecoveryNavigation = null;
|
|
808
|
+
this.invalidateLocalCart(true, true, token);
|
|
809
|
+
}
|
|
810
|
+
else {
|
|
811
|
+
this.discardPendingBootstrapCartAdds();
|
|
812
|
+
this.cartBootstrapLookupRequiredForRetry = true;
|
|
813
|
+
this.setCartSyncState('error', checkoutRecovery ? 'checkout-interrupted' : (((_d = error) === null || _d === void 0 ? void 0 : _d.status) >= 500 ? 'server' : 'network'));
|
|
814
|
+
this.toastrService.show('operation-error-param');
|
|
815
|
+
}
|
|
816
|
+
});
|
|
81
817
|
});
|
|
82
|
-
this.
|
|
83
|
-
|
|
818
|
+
this.startCartBootstrapPickup = (checkoutRecovery = false, recoveredInactiveToken = false) => {
|
|
819
|
+
if (this.cartBootstrapPickup)
|
|
820
|
+
return this.cartBootstrapPickup;
|
|
821
|
+
recoveredInactiveToken = recoveredInactiveToken || !!this.cartBootstrapRecoveryNavigation;
|
|
822
|
+
const sharedToken = localStorage.getItem('cart_token') || null;
|
|
823
|
+
if (sharedToken) {
|
|
824
|
+
this.cartBootstrapPickupRequiredForRetry = false;
|
|
825
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
826
|
+
this.scheduleCartRefresh(false);
|
|
827
|
+
return Promise.resolve(false);
|
|
828
|
+
}
|
|
829
|
+
this.cartSyncBlocked = true;
|
|
830
|
+
this.setCartSyncState('syncing');
|
|
831
|
+
const authContext = this.getAuthContext();
|
|
832
|
+
const context = this.captureCartResponseContext(false);
|
|
833
|
+
const request = this.connection.post(this.cartItemsApi(), null).pipe(timeout(this.cartRequestTimeoutMs)).toPromise()
|
|
834
|
+
.then(response => {
|
|
835
|
+
if (authContext !== this.getAuthContext()) {
|
|
836
|
+
this.authContext = this.getAuthContext();
|
|
837
|
+
this.cartBootstrapPickupRequiredForRetry = false;
|
|
838
|
+
this.cartBootstrapRecoveryNavigation = null;
|
|
839
|
+
this.invalidateLocalCart(true, true);
|
|
840
|
+
return false;
|
|
841
|
+
}
|
|
842
|
+
if (context.generation !== this.cartLifecycleGeneration || context.requestId !== this.cartRequestId)
|
|
843
|
+
return false;
|
|
844
|
+
const currentSharedToken = localStorage.getItem('cart_token') || null;
|
|
845
|
+
if (currentSharedToken && currentSharedToken !== context.token) {
|
|
846
|
+
this.cartBootstrapPickupRequiredForRetry = false;
|
|
847
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
848
|
+
this.scheduleCartRefresh(false);
|
|
849
|
+
return false;
|
|
850
|
+
}
|
|
851
|
+
if (!this.initializeCart(response, context)) {
|
|
852
|
+
this.discardPendingBootstrapCartAdds();
|
|
853
|
+
this.cartBootstrapPickupRequiredForRetry = true;
|
|
854
|
+
this.cartSyncBlocked = true;
|
|
855
|
+
this.setCartSyncState('error', 'invalid-response');
|
|
856
|
+
this.toastrService.show('operation-error-param');
|
|
857
|
+
return false;
|
|
858
|
+
}
|
|
859
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
860
|
+
this.cartBootstrapPickupRequiredForRetry = false;
|
|
861
|
+
if (recoveredInactiveToken) {
|
|
862
|
+
this.publishCartSync('changed');
|
|
863
|
+
this.completeCartBootstrapRecovery();
|
|
864
|
+
}
|
|
865
|
+
if (checkoutRecovery)
|
|
866
|
+
this.finishCheckoutCartRecovery();
|
|
867
|
+
return true;
|
|
868
|
+
})
|
|
869
|
+
.catch(error => {
|
|
870
|
+
var _a, _b, _c;
|
|
871
|
+
if (authContext !== this.getAuthContext()) {
|
|
872
|
+
this.authContext = this.getAuthContext();
|
|
873
|
+
this.cartBootstrapPickupRequiredForRetry = false;
|
|
874
|
+
this.cartBootstrapRecoveryNavigation = null;
|
|
875
|
+
this.invalidateLocalCart(true, true);
|
|
876
|
+
return false;
|
|
877
|
+
}
|
|
878
|
+
if (context.generation !== this.cartLifecycleGeneration)
|
|
879
|
+
return false;
|
|
880
|
+
this.requestInProcess.next(false);
|
|
881
|
+
if (((_a = error) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 403) {
|
|
882
|
+
this.discardPendingBootstrapCartAdds();
|
|
883
|
+
this.cartBootstrapLookupRequiredForRetry = false;
|
|
884
|
+
this.cartBootstrapPickupRequiredForRetry = false;
|
|
885
|
+
this.cartBootstrapRecoveryNavigation = null;
|
|
886
|
+
this.invalidateLocalCart(true, true);
|
|
887
|
+
return false;
|
|
888
|
+
}
|
|
889
|
+
this.discardPendingBootstrapCartAdds();
|
|
890
|
+
this.cartBootstrapPickupRequiredForRetry = true;
|
|
891
|
+
this.cartSyncBlocked = true;
|
|
892
|
+
this.setCartSyncState('error', checkoutRecovery ? 'checkout-interrupted' : (((_c = error) === null || _c === void 0 ? void 0 : _c.status) >= 500 ? 'server' : 'network'));
|
|
893
|
+
this.toastrService.show('operation-error-param');
|
|
894
|
+
return false;
|
|
895
|
+
})
|
|
896
|
+
.then(result => {
|
|
897
|
+
if (this.cartBootstrapPickup === request)
|
|
898
|
+
this.cartBootstrapPickup = null;
|
|
899
|
+
if (!result)
|
|
900
|
+
this.resumeCartBootstrapIfInvalidated(checkoutRecovery);
|
|
901
|
+
return result;
|
|
902
|
+
});
|
|
903
|
+
this.cartBootstrapPickup = request;
|
|
904
|
+
return request;
|
|
905
|
+
};
|
|
906
|
+
this.resumeCartBootstrapIfInvalidated = (checkoutRecovery) => {
|
|
907
|
+
if (!this.authContextBlocked && !this.cart_token && this.cartSyncBlocked &&
|
|
908
|
+
this.cartSyncStateSubject.value.status === 'invalidated' &&
|
|
909
|
+
!this.cartNotActiveToken && !this.pendingCheckoutRecovery) {
|
|
910
|
+
this.getCart(checkoutRecovery);
|
|
911
|
+
}
|
|
912
|
+
};
|
|
913
|
+
this.finishCheckoutCartRecovery = () => {
|
|
914
|
+
this.pendingCheckoutRecovery = false;
|
|
915
|
+
this.checkoutInvalidatedAt = 0;
|
|
916
|
+
if (this.checkoutRecoveryTimer)
|
|
917
|
+
clearTimeout(this.checkoutRecoveryTimer);
|
|
918
|
+
this.completedCheckoutTransitionId = this.activeCheckoutTransitionId;
|
|
919
|
+
this.publishCartSync('checkout-ready', this.activeCheckoutTransitionId);
|
|
920
|
+
this.activeCheckoutTransitionId = null;
|
|
921
|
+
};
|
|
922
|
+
this.getCartByToken = (token = this.cart_token) => __awaiter(this, void 0, void 0, function* () {
|
|
923
|
+
if (!token || token !== this.cart_token || localStorage.getItem('cart_token') !== token)
|
|
924
|
+
return;
|
|
925
|
+
const context = this.captureCartResponseContext(false);
|
|
926
|
+
const authContext = this.getAuthContext();
|
|
927
|
+
this.cartSyncBlocked = true;
|
|
928
|
+
this.setCartSyncState('syncing');
|
|
929
|
+
this.requestInProcess.next(true);
|
|
930
|
+
return this.connection.post(this.cartItemsApi(), { token }).pipe(timeout(this.cartRequestTimeoutMs)).subscribe(res => {
|
|
931
|
+
if (authContext !== this.getAuthContext() || context.generation !== this.cartLifecycleGeneration || this.cart_token !== token)
|
|
932
|
+
return;
|
|
933
|
+
this.pendingGuestCartAssociationToken = null;
|
|
934
|
+
if (!this.initializeCart(res, context)) {
|
|
935
|
+
this.cartSyncBlocked = true;
|
|
936
|
+
this.pendingGuestCartAssociationToken = token;
|
|
937
|
+
this.setCartSyncState('error', 'invalid-response');
|
|
938
|
+
this.toastrService.show('operation-error-param');
|
|
939
|
+
return;
|
|
940
|
+
}
|
|
941
|
+
}, error => {
|
|
942
|
+
var _a, _b, _c;
|
|
943
|
+
if (authContext !== this.getAuthContext() || context.generation !== this.cartLifecycleGeneration || this.cart_token !== token)
|
|
944
|
+
return;
|
|
945
|
+
this.requestInProcess.next(false);
|
|
946
|
+
this.cartSyncBlocked = true;
|
|
947
|
+
this.pendingGuestCartAssociationToken = token;
|
|
948
|
+
this.setCartSyncState('error', ((_a = error) === null || _a === void 0 ? void 0 : _a.status) === 401 || ((_b = error) === null || _b === void 0 ? void 0 : _b.status) === 403 ? 'authentication' : (((_c = error) === null || _c === void 0 ? void 0 : _c.status) >= 500 ? 'server' : 'network'));
|
|
949
|
+
this.toastrService.show('operation-error-param');
|
|
950
|
+
});
|
|
84
951
|
});
|
|
85
952
|
this.getCartByCustomer = () => __awaiter(this, void 0, void 0, function* () {
|
|
86
|
-
|
|
953
|
+
const context = this.captureCartResponseContext(false);
|
|
954
|
+
this.cartSyncBlocked = true;
|
|
955
|
+
this.setCartSyncState('syncing');
|
|
956
|
+
return this.connection.post(this.cartItemsApi()).subscribe(res => this.initializeCart(res, context));
|
|
87
957
|
});
|
|
88
958
|
/**
|
|
89
959
|
* @private
|
|
90
960
|
* CART CRUD SERVER'S SYNCRONIZED
|
|
91
961
|
*/
|
|
92
|
-
this.initializeCart = (response) => {
|
|
93
|
-
this.
|
|
94
|
-
|
|
962
|
+
this.initializeCart = (response, context) => {
|
|
963
|
+
if (!this.applyCartResponse(response, context, false, false, false)) {
|
|
964
|
+
this.requestInProcess.next(false);
|
|
965
|
+
return false;
|
|
966
|
+
}
|
|
95
967
|
this.locale = response.locale;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.locale = localeFromStorage ? localeFromStorage : response.locale;
|
|
99
|
-
response.locale = this.locale */
|
|
100
|
-
this.updateCartObj(response, false);
|
|
101
|
-
this.updateCartItems(this.transformItems(response.items));
|
|
968
|
+
this.cartSyncBlocked = false;
|
|
969
|
+
this.setCartSyncState('ready');
|
|
102
970
|
this.requestInProcess.next(false);
|
|
971
|
+
this.flushPendingBootstrapCartAdds();
|
|
972
|
+
return true;
|
|
973
|
+
};
|
|
974
|
+
/** Captura la generación del ciclo del carrito y el orden de inicio de la petición. */
|
|
975
|
+
this.captureCartResponseContext = (allowTokenChange = true) => ({
|
|
976
|
+
token: this.cart_token || null,
|
|
977
|
+
generation: this.cartLifecycleGeneration,
|
|
978
|
+
requestId: ++this.cartRequestId,
|
|
979
|
+
allowTokenChange
|
|
980
|
+
});
|
|
981
|
+
this.isCartResponseContextCurrent = (context) => !!context &&
|
|
982
|
+
context.generation === this.cartLifecycleGeneration &&
|
|
983
|
+
(context.allowTokenChange || context.token === (this.cart_token || null)) &&
|
|
984
|
+
context.requestId >= this.lastAppliedCartRequestId;
|
|
985
|
+
this.isCartBusinessError = (response) => {
|
|
986
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
987
|
+
const errors = (_a = response) === null || _a === void 0 ? void 0 : _a.errors;
|
|
988
|
+
return !!(((_b = response) === null || _b === void 0 ? void 0 : _b.error) || ((_c = response) === null || _c === void 0 ? void 0 : _c.code) || (Array.isArray(errors) ? errors.length > 0 : errors) ||
|
|
989
|
+
((_d = response) === null || _d === void 0 ? void 0 : _d.status) === 'failure' || ((_f = (_e = response) === null || _e === void 0 ? void 0 : _e.cart_response) === null || _f === void 0 ? void 0 : _f.status) === 'failure' || ((_h = (_g = response) === null || _g === void 0 ? void 0 : _g.cart) === null || _h === void 0 ? void 0 : _h.error) || ((_k = (_j = response) === null || _j === void 0 ? void 0 : _j.cart) === null || _k === void 0 ? void 0 : _k.status) === 'failure');
|
|
990
|
+
};
|
|
991
|
+
/** Adopta y sincroniza un resumen exitoso si todavía pertenece a la versión vigente del carrito. */
|
|
992
|
+
this.applyCartResponse = (response, context, emitEvent = true, publishInvalidation = true, flushPendingAdds = true) => {
|
|
993
|
+
var _a;
|
|
994
|
+
if (this.isCartBusinessError(response))
|
|
995
|
+
return false;
|
|
996
|
+
const cart = ((_a = response) === null || _a === void 0 ? void 0 : _a.cart) && response.cart.tokenValue ? response.cart : response;
|
|
997
|
+
if (!cart || !cart.tokenValue || !Array.isArray(cart.items))
|
|
998
|
+
return false;
|
|
999
|
+
// Una respuesta de un ciclo anterior (por ejemplo, antes del checkout o
|
|
1000
|
+
// de una invalidación remota) no debe volver a activar la sincronización.
|
|
1001
|
+
if (!context || context.generation !== this.cartLifecycleGeneration)
|
|
1002
|
+
return false;
|
|
1003
|
+
const sharedToken = localStorage.getItem('cart_token') || null;
|
|
1004
|
+
if (sharedToken !== context.token) {
|
|
1005
|
+
// Otra pestaña ya avanzó el token compartido. La mutación pudo
|
|
1006
|
+
// ejecutarse, así que reconciliamos desde ese token sin adoptarla.
|
|
1007
|
+
if (publishInvalidation) {
|
|
1008
|
+
this.publishCartSync('changed');
|
|
1009
|
+
this.scheduleCartRefresh(this.pendingCheckoutRecovery);
|
|
1010
|
+
}
|
|
1011
|
+
return false;
|
|
1012
|
+
}
|
|
1013
|
+
// La mutación pudo ejecutarse en backend, aunque otra respuesta más nueva
|
|
1014
|
+
// ya haya sido aplicada localmente. Invalidamos y leemos el token vigente.
|
|
1015
|
+
if (context.requestId < this.lastAppliedCartRequestId) {
|
|
1016
|
+
if (publishInvalidation) {
|
|
1017
|
+
this.publishCartSync('changed');
|
|
1018
|
+
this.scheduleCartRefresh(this.pendingCheckoutRecovery);
|
|
1019
|
+
}
|
|
1020
|
+
return false;
|
|
1021
|
+
}
|
|
1022
|
+
if (!this.isCartResponseContextCurrent(context))
|
|
1023
|
+
return false;
|
|
1024
|
+
if (cart.tokenValue !== this.cart_token) {
|
|
1025
|
+
this.cart_token = cart.tokenValue;
|
|
1026
|
+
localStorage.setItem('cart_token', cart.tokenValue);
|
|
1027
|
+
}
|
|
1028
|
+
if (publishInvalidation)
|
|
1029
|
+
this.publishCartSync('changed');
|
|
1030
|
+
this.lastAppliedCartRequestId = context.requestId;
|
|
1031
|
+
this.updateCartObj(cart, emitEvent);
|
|
1032
|
+
this.syncCartItemsFromResponse(cart);
|
|
1033
|
+
this.cartSyncBlocked = false;
|
|
1034
|
+
this.setCartSyncState('ready');
|
|
1035
|
+
if (flushPendingAdds)
|
|
1036
|
+
this.flushPendingBootstrapCartAdds();
|
|
103
1037
|
return true;
|
|
104
1038
|
};
|
|
105
1039
|
/**
|
|
@@ -179,9 +1113,11 @@ let CartService = class CartService {
|
|
|
179
1113
|
this.syncCartItemsFromResponse(cart);
|
|
180
1114
|
// this.toastrService.show('product-added');
|
|
181
1115
|
};
|
|
182
|
-
this.removeCartItem = (cart, product, toast = true) => {
|
|
183
|
-
|
|
184
|
-
|
|
1116
|
+
this.removeCartItem = (cart, product, toast = true, alreadySynchronized = false) => {
|
|
1117
|
+
if (!alreadySynchronized) {
|
|
1118
|
+
this.updateCartObj(cart, false);
|
|
1119
|
+
this.syncCartItemsFromResponse(cart);
|
|
1120
|
+
}
|
|
185
1121
|
toast && this.requestInProcess.next(false);
|
|
186
1122
|
toast && this.toastrService.show('product-removed');
|
|
187
1123
|
// this.googleAnalytics.removeFromCart(product);
|
|
@@ -198,14 +1134,22 @@ let CartService = class CartService {
|
|
|
198
1134
|
localStorage.setItem('cart', JSON.stringify(this.items));
|
|
199
1135
|
};
|
|
200
1136
|
this.resetCart = (next) => {
|
|
1137
|
+
this.discardPendingBootstrapCartAdds();
|
|
1138
|
+
this.cartBootstrapAllowsPendingAdds = false;
|
|
1139
|
+
const tokenToReset = this.cart_token || null;
|
|
1140
|
+
this.cartLifecycleGeneration++;
|
|
201
1141
|
this.items = [];
|
|
202
1142
|
this.cartSubject.next(null);
|
|
203
1143
|
this.updateBalanceAttributes(null);
|
|
1144
|
+
this.couponSubject.next(null);
|
|
1145
|
+
this.promotionsSubject.next([]);
|
|
204
1146
|
this.cart_token = null;
|
|
205
1147
|
this.cartItemsSubject.next([]);
|
|
206
1148
|
this.count = 0;
|
|
1149
|
+
this.requestInProcess.next(false);
|
|
207
1150
|
localStorage.setItem('cart', "[]");
|
|
208
|
-
localStorage.
|
|
1151
|
+
if (tokenToReset && localStorage.getItem('cart_token') === tokenToReset)
|
|
1152
|
+
localStorage.removeItem('cart_token');
|
|
209
1153
|
next && next();
|
|
210
1154
|
};
|
|
211
1155
|
this.updateCartObj = (cart, emitEvent = true) => {
|
|
@@ -230,8 +1174,26 @@ let CartService = class CartService {
|
|
|
230
1174
|
* @public
|
|
231
1175
|
* CART CRUD
|
|
232
1176
|
*/
|
|
233
|
-
this.addToCart = (product, quantity, variant_id, comments) => {
|
|
1177
|
+
this.addToCart = (product, quantity, variant_id, comments, fromBootstrapQueue = false, queueGeneration) => {
|
|
234
1178
|
var _a, _b, _c, _d;
|
|
1179
|
+
if (!this.canMutateCart()) {
|
|
1180
|
+
// El agregado aún no se envió al backend. Retenerlo durante el
|
|
1181
|
+
// bootstrap evita perder el primer click después de F5, sin
|
|
1182
|
+
// habilitar mutaciones durante una invalidación o un error.
|
|
1183
|
+
if (this.cartBootstrapAllowsPendingAdds && !this.authContextBlocked &&
|
|
1184
|
+
(this.cartBootstrapLookupInFlight || this.cartBootstrapPickup)) {
|
|
1185
|
+
if (this.pendingBootstrapCartAdds.length >= this.maxPendingBootstrapCartAdds) {
|
|
1186
|
+
if (!this.pendingBootstrapCartAddsLimitNotified) {
|
|
1187
|
+
this.pendingBootstrapCartAddsLimitNotified = true;
|
|
1188
|
+
this.toastrService.show('operation-error-param');
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
else {
|
|
1192
|
+
this.pendingBootstrapCartAdds.push({ product, quantity, variantId: variant_id, comments });
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
return;
|
|
1196
|
+
}
|
|
235
1197
|
if (this.requestInProcess.getValue()) {
|
|
236
1198
|
return;
|
|
237
1199
|
}
|
|
@@ -246,9 +1208,10 @@ let CartService = class CartService {
|
|
|
246
1208
|
this.toastrService.show('must-select-customer');
|
|
247
1209
|
return;
|
|
248
1210
|
}
|
|
249
|
-
this.requestInProcess.next(true);
|
|
250
1211
|
let added = this.addIfAllreadyExists(product, variant_id, quantity, comments);
|
|
251
1212
|
if (!added) {
|
|
1213
|
+
this.requestInProcess.next(true);
|
|
1214
|
+
const context = this.captureCartResponseContext();
|
|
252
1215
|
const payload = {
|
|
253
1216
|
productCode: product.id,
|
|
254
1217
|
quantity: quantity,
|
|
@@ -258,68 +1221,97 @@ let CartService = class CartService {
|
|
|
258
1221
|
payload.comments = comments;
|
|
259
1222
|
}
|
|
260
1223
|
this.connection.post(this.addItemApi(), payload)
|
|
261
|
-
.pipe(finalize(() =>
|
|
1224
|
+
.pipe(finalize(() => {
|
|
1225
|
+
this.requestInProcess.next(false);
|
|
1226
|
+
if (fromBootstrapQueue && queueGeneration === this.pendingBootstrapCartQueueGeneration) {
|
|
1227
|
+
this.pendingBootstrapCartAddInFlight = false;
|
|
1228
|
+
}
|
|
1229
|
+
this.flushPendingBootstrapCartAdds();
|
|
1230
|
+
}))
|
|
262
1231
|
.subscribe(res => {
|
|
263
1232
|
// Manejar la respuesta HTTP exitosa (código 200)
|
|
264
|
-
this.
|
|
265
|
-
|
|
1233
|
+
if (this.applyCartResponse(res, context))
|
|
1234
|
+
this.toastrService.show('product-added');
|
|
266
1235
|
}, err => {
|
|
267
1236
|
// Manejar el error de la llamada HTTP (código 500 u otro error)
|
|
268
1237
|
if (err.status === 500) {
|
|
269
1238
|
// Código de error 500 (timeout)
|
|
270
|
-
this.handleError(err);
|
|
1239
|
+
this.handleError(err, context.token);
|
|
271
1240
|
this.toastrService.show('Ha ocurrido un error al agregar al carrito. Vuelva a intentarlo.');
|
|
272
1241
|
}
|
|
273
1242
|
else {
|
|
274
1243
|
// Otro código de error
|
|
275
|
-
this.handleError(err);
|
|
1244
|
+
this.handleError(err, context.token);
|
|
276
1245
|
// this.toastrService.show('Error inesperado. Vuelva a intentarlo');
|
|
277
1246
|
}
|
|
278
1247
|
});
|
|
279
1248
|
}
|
|
280
1249
|
};
|
|
281
1250
|
this.addToLot = (product, quantity, variant_id, id, order_item_id, lot_quantity, unit_price, unit_total, ajustement_total, total_lot, lot_status, date_request, notes, shipping_address_id, shipping_address_name, action) => {
|
|
1251
|
+
if (!this.canMutateCart())
|
|
1252
|
+
return;
|
|
282
1253
|
if (!this.authService.isAbleToBuy()) {
|
|
283
1254
|
this.toastrService.show('must-select-customer');
|
|
284
1255
|
return;
|
|
285
1256
|
}
|
|
1257
|
+
const context = this.captureCartResponseContext();
|
|
286
1258
|
let added = '';
|
|
287
1259
|
!added && this.connection.post(this.addItemApi(), { productCode: product.id, quantity: quantity, variantCode: variant_id, id: id || '', order_item_id: order_item_id || '', lot_quantity: lot_quantity || '', unit_price: unit_price || '', unit_total: unit_total || '', ajustement_total: ajustement_total || '', total_lot: total_lot || '', lot_status: lot_status || '', date_request: date_request || '', notes: notes || '', shipping_address_id: shipping_address_id || '', shipping_address_name: shipping_address_name || '', action: action || 'newlot' })
|
|
288
|
-
.subscribe(res => this.
|
|
1260
|
+
.subscribe(res => this.applyCartResponse(res, context), err => this.handleError(err, context.token));
|
|
289
1261
|
};
|
|
290
1262
|
this.addToCartPromise = (product, quantity, variant_id, comments) => __awaiter(this, void 0, void 0, function* () {
|
|
1263
|
+
if (!this.canMutateCart())
|
|
1264
|
+
return { error: true };
|
|
291
1265
|
if (!this.authService.isAbleToBuy()) {
|
|
292
1266
|
this.toastrService.show('must-select-customer');
|
|
293
|
-
return;
|
|
1267
|
+
return { error: true };
|
|
294
1268
|
}
|
|
295
|
-
this.requestInProcess.next(true);
|
|
296
1269
|
let added = this.addIfAllreadyExists(product, variant_id, quantity, comments);
|
|
297
1270
|
if (!added) {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
this.
|
|
303
|
-
|
|
1271
|
+
this.requestInProcess.next(true);
|
|
1272
|
+
const context = this.captureCartResponseContext();
|
|
1273
|
+
try {
|
|
1274
|
+
const result = yield this.connection.post(this.addItemApi(), { productCode: product.id, quantity: quantity, variantCode: variant_id }).toPromise();
|
|
1275
|
+
if (this.isCartBusinessError(result)) {
|
|
1276
|
+
this.handleError(result);
|
|
1277
|
+
return { error: true };
|
|
1278
|
+
}
|
|
1279
|
+
if (this.applyCartResponse(result, context))
|
|
1280
|
+
return { error: false };
|
|
1281
|
+
return { error: true };
|
|
1282
|
+
}
|
|
1283
|
+
catch (error) {
|
|
1284
|
+
this.handleError(error, context.token);
|
|
1285
|
+
return { error: true };
|
|
1286
|
+
}
|
|
1287
|
+
finally {
|
|
1288
|
+
this.requestInProcess.next(false);
|
|
304
1289
|
}
|
|
305
1290
|
}
|
|
306
1291
|
return { error: true };
|
|
307
1292
|
});
|
|
308
1293
|
this.addAllToCart = (items) => {
|
|
1294
|
+
if (!this.canMutateCart())
|
|
1295
|
+
return;
|
|
309
1296
|
if (!this.authService.isAbleToBuy()) {
|
|
310
1297
|
this.toastrService.show('must-select-customer');
|
|
311
1298
|
return;
|
|
312
1299
|
}
|
|
313
1300
|
this.requestInProcess.next(true);
|
|
1301
|
+
const context = this.captureCartResponseContext();
|
|
314
1302
|
const params = { items: this.mergeItemsAddAllToCart(items) };
|
|
315
1303
|
this.connection.post(this.addAllItemsApi(), params)
|
|
316
1304
|
.toPromise().then(res => {
|
|
317
|
-
this.
|
|
318
|
-
|
|
1305
|
+
if (this.applyCartResponse(res, context) && res.cart_response.status == 'success')
|
|
1306
|
+
this.toastrService.show('products-added');
|
|
319
1307
|
}, err => {
|
|
320
|
-
this.handleError(err);
|
|
1308
|
+
this.handleError(err, context.token);
|
|
321
1309
|
}).catch(err => {
|
|
322
|
-
this.handleError(err);
|
|
1310
|
+
this.handleError(err, context.token);
|
|
1311
|
+
}).then(() => {
|
|
1312
|
+
this.requestInProcess.next(false);
|
|
1313
|
+
}, () => {
|
|
1314
|
+
this.requestInProcess.next(false);
|
|
323
1315
|
});
|
|
324
1316
|
};
|
|
325
1317
|
this.mergeItemsAddAllToCart = (items) => {
|
|
@@ -336,8 +1328,12 @@ let CartService = class CartService {
|
|
|
336
1328
|
return [...items, ...paramsMerge];
|
|
337
1329
|
};
|
|
338
1330
|
this.updateItemQuantity = (item, quantity, comments) => {
|
|
1331
|
+
if (!this.canMutateCart())
|
|
1332
|
+
return;
|
|
339
1333
|
if (this.validateQuantity(item, quantity) && (this.validatePriceAndCredits(item, quantity))) {
|
|
1334
|
+
const queueGeneration = this.pendingBootstrapCartAddInFlight ? this.pendingBootstrapCartQueueGeneration : null;
|
|
340
1335
|
this.requestInProcess.next(true);
|
|
1336
|
+
const context = this.captureCartResponseContext();
|
|
341
1337
|
const payload = { quantity: Number(quantity) };
|
|
342
1338
|
if (comments !== undefined) {
|
|
343
1339
|
const cleaned = ((comments !== null && comments !== void 0 ? comments : '')).trim();
|
|
@@ -345,12 +1341,17 @@ let CartService = class CartService {
|
|
|
345
1341
|
}
|
|
346
1342
|
this.connection
|
|
347
1343
|
.put(this.updateItemQuantityApi(this.findItemByIdVariant(item.variant_id)), payload)
|
|
348
|
-
.pipe(finalize(() =>
|
|
1344
|
+
.pipe(finalize(() => {
|
|
1345
|
+
this.requestInProcess.next(false);
|
|
1346
|
+
if (queueGeneration !== null && queueGeneration === this.pendingBootstrapCartQueueGeneration) {
|
|
1347
|
+
this.pendingBootstrapCartAddInFlight = false;
|
|
1348
|
+
}
|
|
1349
|
+
this.flushPendingBootstrapCartAdds();
|
|
1350
|
+
}))
|
|
349
1351
|
.subscribe(res => {
|
|
350
|
-
this.
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
}, err => this.handleError(err));
|
|
1352
|
+
if (this.applyCartResponse(res, context))
|
|
1353
|
+
this.toastrService.show('product-updated', { quantity });
|
|
1354
|
+
}, err => this.handleError(err, context.token));
|
|
354
1355
|
}
|
|
355
1356
|
};
|
|
356
1357
|
this.validateQuantity = (item, quantity) => {
|
|
@@ -421,16 +1422,37 @@ let CartService = class CartService {
|
|
|
421
1422
|
return true;
|
|
422
1423
|
};
|
|
423
1424
|
this.deleteCartItem = (item, toast = true) => {
|
|
1425
|
+
if (!this.canMutateCart())
|
|
1426
|
+
return;
|
|
424
1427
|
let id_buscado = this.findItemByIdVariant(item.variant_id);
|
|
425
1428
|
this.requestInProcess.next(true);
|
|
1429
|
+
const context = this.captureCartResponseContext();
|
|
426
1430
|
// this.connection.post(this.addItemApi(), { productCode: item.product.id, quantity: 0, variantCode: item.variant_id, id: '', order_item_id: item.item_id, lot_quantity: '', unit_price: '', unit_total: '', ajustement_total: '', total_lot: '', lot_status: '', date_request: '', notes: '', shipping_address_id: '', shipping_address_name: '', action: 'deleteorderitem'})
|
|
427
1431
|
// .subscribe(
|
|
428
1432
|
// res => this.removeCartItem(res, item, toast),
|
|
429
1433
|
// err => this.handleError(err)
|
|
430
1434
|
// );
|
|
431
|
-
this.connection.delete(this.deleteItemApi(id_buscado)).subscribe(res => {
|
|
1435
|
+
this.connection.delete(this.deleteItemApi(id_buscado)).subscribe(res => {
|
|
1436
|
+
var _a, _b, _c;
|
|
1437
|
+
const applied = this.applyCartResponse(res, context, false);
|
|
1438
|
+
if (applied) {
|
|
1439
|
+
this.removeCartItem(res, item, toast, true);
|
|
1440
|
+
}
|
|
1441
|
+
else if (!this.isCartBusinessError(res) && context.generation === this.cartLifecycleGeneration &&
|
|
1442
|
+
!(((_a = res) === null || _a === void 0 ? void 0 : _a.tokenValue) && Array.isArray(res.items)) && !(((_c = (_b = res) === null || _b === void 0 ? void 0 : _b.cart) === null || _c === void 0 ? void 0 : _c.tokenValue) && Array.isArray(res.cart.items))) {
|
|
1443
|
+
// DELETE puede confirmar la eliminación sin devolver un resumen.
|
|
1444
|
+
// Solo esa operación conoce que el backend sí ejecutó el cambio.
|
|
1445
|
+
this.publishCartSync('changed');
|
|
1446
|
+
this.scheduleCartRefresh(this.pendingCheckoutRecovery);
|
|
1447
|
+
}
|
|
1448
|
+
this.requestInProcess.next(false);
|
|
1449
|
+
}, err => { this.handleError(err, context.token); this.requestInProcess.next(false); });
|
|
432
1450
|
};
|
|
433
|
-
this.handleError = (error) => {
|
|
1451
|
+
this.handleError = (error, requestToken = this.cart_token || null) => {
|
|
1452
|
+
if (this.handleCartMutationError(error, requestToken)) {
|
|
1453
|
+
this.requestInProcess.next(false);
|
|
1454
|
+
return;
|
|
1455
|
+
}
|
|
434
1456
|
this.toastrService.show('operation-error-param');
|
|
435
1457
|
this.requestInProcess.next(false);
|
|
436
1458
|
};
|
|
@@ -580,24 +1602,30 @@ let CartService = class CartService {
|
|
|
580
1602
|
};
|
|
581
1603
|
};
|
|
582
1604
|
this.addCoupon = (code) => __awaiter(this, void 0, void 0, function* () {
|
|
1605
|
+
if (!this.canMutateCart())
|
|
1606
|
+
return { error: true, message: 'invalid-coupon' };
|
|
1607
|
+
const context = this.captureCartResponseContext();
|
|
583
1608
|
try {
|
|
584
1609
|
let result = yield this.connection.put(this.couponApi(), { coupon: code }).toPromise();
|
|
585
|
-
if (result
|
|
1610
|
+
if (!this.applyCartResponse(result, context, false))
|
|
586
1611
|
return { error: true, message: 'invalid-coupon' };
|
|
587
|
-
this.updateCartObj(result, false);
|
|
588
|
-
this.syncCartItemsFromResponse(result);
|
|
589
1612
|
return { error: false, message: 'ok' };
|
|
590
1613
|
}
|
|
591
1614
|
catch (e) {
|
|
1615
|
+
if (this.handleCartMutationError(e, context.token))
|
|
1616
|
+
return { error: true, message: 'cart-not-active' };
|
|
592
1617
|
return { error: true, message: 'invalid-coupon' };
|
|
593
1618
|
}
|
|
594
1619
|
});
|
|
595
1620
|
this.removeCoupon = () => __awaiter(this, void 0, void 0, function* () {
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
1621
|
+
if (!this.canMutateCart())
|
|
1622
|
+
return false;
|
|
1623
|
+
const context = this.captureCartResponseContext();
|
|
1624
|
+
return this.connection.delete(this.couponApi()).pipe(map(res => this.applyCartResponse(res, context, false))).toPromise().catch(error => {
|
|
1625
|
+
if (this.handleCartMutationError(error, context.token))
|
|
1626
|
+
return false;
|
|
1627
|
+
throw error;
|
|
1628
|
+
});
|
|
601
1629
|
});
|
|
602
1630
|
this.formatCoupon = (cart) => {
|
|
603
1631
|
let current_coupon = this.couponSubject.value;
|
|
@@ -644,7 +1672,13 @@ let CartService = class CartService {
|
|
|
644
1672
|
this.updateCartItems(itemsUpdated);
|
|
645
1673
|
};
|
|
646
1674
|
this.loadCartByToken = (token) => __awaiter(this, void 0, void 0, function* () {
|
|
647
|
-
this.cart_token
|
|
1675
|
+
if (token && token !== this.cart_token) {
|
|
1676
|
+
this.cartLifecycleGeneration++;
|
|
1677
|
+
this.lastAppliedCartRequestId = ++this.cartRequestId;
|
|
1678
|
+
this.cart_token = token;
|
|
1679
|
+
localStorage.setItem('cart_token', token);
|
|
1680
|
+
this.publishCartSync('changed');
|
|
1681
|
+
}
|
|
648
1682
|
let result = yield this.getCartByToken();
|
|
649
1683
|
return result;
|
|
650
1684
|
});
|
|
@@ -788,13 +1822,78 @@ let CartService = class CartService {
|
|
|
788
1822
|
this.requestInProcess.next(true);
|
|
789
1823
|
this.items = JSON.parse(localStorage.getItem('cart')) || [];
|
|
790
1824
|
this.cart_token = localStorage.getItem('cart_token') || null;
|
|
791
|
-
this.
|
|
1825
|
+
this.authContext = this.getAuthContext();
|
|
1826
|
+
this.lastRouterNavigationId = (_d = (_c = (_b = (_a = this.router).getCurrentNavigation) === null || _b === void 0 ? void 0 : _b.call(_a)) === null || _c === void 0 ? void 0 : _c.id, (_d !== null && _d !== void 0 ? _d : null));
|
|
1827
|
+
this.routerNavigationSubscription = ((_e = this.router.events) === null || _e === void 0 ? void 0 : _e.subscribe(event => {
|
|
1828
|
+
if (event instanceof NavigationStart)
|
|
1829
|
+
this.lastRouterNavigationId = event.id;
|
|
1830
|
+
})) || null;
|
|
792
1831
|
this.channelConfigService.channelConfig$.subscribe(res => this.channelConfig = res);
|
|
1832
|
+
window.addEventListener('storage', this.storageListener);
|
|
1833
|
+
window.addEventListener('pageshow', this.pageshowListener);
|
|
1834
|
+
document.addEventListener('visibilitychange', this.visibilityListener);
|
|
1835
|
+
this.checkPendingCartSync();
|
|
1836
|
+
this.authService.loggedIn.subscribe(() => {
|
|
1837
|
+
var _a;
|
|
1838
|
+
const nextContext = this.getAuthContext();
|
|
1839
|
+
if (nextContext !== this.authContext) {
|
|
1840
|
+
const previousContext = JSON.parse(this.authContext || '[]');
|
|
1841
|
+
const guestToken = this.cart_token || localStorage.getItem('cart_token') || null;
|
|
1842
|
+
const hasGuestItems = ((_a = this.items) === null || _a === void 0 ? void 0 : _a.length) > 0 || this.pendingBootstrapCartAdds.length > 0;
|
|
1843
|
+
const guestToAuthenticated = !previousContext[0] && this.authService.isAuthenticated();
|
|
1844
|
+
this.authContext = nextContext;
|
|
1845
|
+
this.authContextBlocked = false;
|
|
1846
|
+
this.authRetryAllowed = false;
|
|
1847
|
+
if (guestToAuthenticated && guestToken && hasGuestItems) {
|
|
1848
|
+
this.pendingGuestCartAssociationToken = guestToken;
|
|
1849
|
+
this.cartLifecycleGeneration++;
|
|
1850
|
+
this.lastAppliedCartRequestId = ++this.cartRequestId;
|
|
1851
|
+
this.cart_token = guestToken;
|
|
1852
|
+
localStorage.setItem('cart_token', guestToken);
|
|
1853
|
+
this.cartSyncBlocked = true;
|
|
1854
|
+
this.pendingCheckoutRecovery = false;
|
|
1855
|
+
this.setCartSyncState('syncing');
|
|
1856
|
+
this.getCartByToken(guestToken);
|
|
1857
|
+
return;
|
|
1858
|
+
}
|
|
1859
|
+
this.pendingGuestCartAssociationToken = null;
|
|
1860
|
+
this.invalidateLocalCart(false, true);
|
|
1861
|
+
}
|
|
1862
|
+
if (this.pendingCheckoutRecovery && !localStorage.getItem('cart_token'))
|
|
1863
|
+
return;
|
|
1864
|
+
if (this.cartSyncBlocked && this.cartSyncStateSubject.value.status === 'syncing')
|
|
1865
|
+
return;
|
|
1866
|
+
this.getCart();
|
|
1867
|
+
});
|
|
1868
|
+
}
|
|
1869
|
+
ngOnDestroy() {
|
|
1870
|
+
var _a;
|
|
1871
|
+
window.removeEventListener('storage', this.storageListener);
|
|
1872
|
+
window.removeEventListener('pageshow', this.pageshowListener);
|
|
1873
|
+
document.removeEventListener('visibilitychange', this.visibilityListener);
|
|
1874
|
+
if (this.cartSyncTimer)
|
|
1875
|
+
clearTimeout(this.cartSyncTimer);
|
|
1876
|
+
if (this.checkoutRecoveryTimer)
|
|
1877
|
+
clearTimeout(this.checkoutRecoveryTimer);
|
|
1878
|
+
if (this.cartNotActiveRecoveryTimer)
|
|
1879
|
+
clearTimeout(this.cartNotActiveRecoveryTimer);
|
|
1880
|
+
(_a = this.routerNavigationSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
1881
|
+
}
|
|
1882
|
+
/** Consume el evento de bootstrap una sola vez y solo durante la navegación que inició la recuperación. */
|
|
1883
|
+
consumeCartBootstrapRecovery() {
|
|
1884
|
+
const pending = this.cartBootstrapRecoveryNavigation;
|
|
1885
|
+
if (!pending || !pending.completed)
|
|
1886
|
+
return false;
|
|
1887
|
+
this.cartBootstrapRecoveryNavigation = null;
|
|
1888
|
+
const currentNavigationId = this.getCurrentRouterNavigationId();
|
|
1889
|
+
return pending.navigationId !== null && pending.navigationId === currentNavigationId;
|
|
793
1890
|
}
|
|
794
1891
|
getCart2() {
|
|
795
1892
|
return this.cartItemsSubject.value;
|
|
796
1893
|
}
|
|
797
1894
|
addRepeatOrderToCart(items) {
|
|
1895
|
+
if (!this.canMutateCart())
|
|
1896
|
+
return;
|
|
798
1897
|
if (this.cartItemsSubject.value.length > 0) {
|
|
799
1898
|
this.toastrService.show('cart-not-empty');
|
|
800
1899
|
return;
|
|
@@ -816,17 +1915,20 @@ let CartService = class CartService {
|
|
|
816
1915
|
items: itemsToAdd
|
|
817
1916
|
};
|
|
818
1917
|
this.requestInProcess.next(true);
|
|
1918
|
+
const context = this.captureCartResponseContext();
|
|
819
1919
|
this.connection.post(this.addAllItemsApi(), params)
|
|
820
1920
|
.toPromise()
|
|
821
1921
|
.then(res => {
|
|
822
|
-
var _a, _b, _c, _d, _e;
|
|
823
|
-
if (((_a = res) === null || _a === void 0 ? void 0 : _a.status) === 'failure') {
|
|
824
|
-
const errorMessage = ((
|
|
1922
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
1923
|
+
if (((_a = res) === null || _a === void 0 ? void 0 : _a.status) === 'failure' || ((_c = (_b = res) === null || _b === void 0 ? void 0 : _b.cart_response) === null || _c === void 0 ? void 0 : _c.status) === 'failure') {
|
|
1924
|
+
const errorMessage = ((_d = res.error) === null || _d === void 0 ? void 0 : _d.toLowerCase().replace(/\s+/g, '_')) || 'unknown_error';
|
|
825
1925
|
this.toastrService.show(errorMessage);
|
|
826
1926
|
return;
|
|
827
1927
|
}
|
|
828
|
-
|
|
829
|
-
|
|
1928
|
+
if (!this.applyCartResponse(res, context))
|
|
1929
|
+
return;
|
|
1930
|
+
const itemsResponse = ((_e = res) === null || _e === void 0 ? void 0 : _e.items_response) || [];
|
|
1931
|
+
const cartItems = ((_g = (_f = res) === null || _f === void 0 ? void 0 : _f.cart) === null || _g === void 0 ? void 0 : _g.items) || [];
|
|
830
1932
|
const outOfStockItems = itemsResponse.filter(item => item.status === 'failure' &&
|
|
831
1933
|
item.errors.some(error => error.code === 'out_of_stock'));
|
|
832
1934
|
if (cartItems.length === 0 && outOfStockItems.length > 0) {
|
|
@@ -837,16 +1939,19 @@ let CartService = class CartService {
|
|
|
837
1939
|
this.toastrService.show('some-products-out-of-stock');
|
|
838
1940
|
}
|
|
839
1941
|
if (cartItems.length > 0) {
|
|
840
|
-
this.updateCartObj(res.cart);
|
|
841
|
-
this.updateCartItems(this.transformItems(cartItems));
|
|
842
1942
|
this.toastrService.show('products-added');
|
|
843
1943
|
this.router.navigate(['/cart']);
|
|
844
1944
|
}
|
|
845
1945
|
}, err => {
|
|
846
|
-
this.handleError(err);
|
|
1946
|
+
this.handleError(err, context.token);
|
|
847
1947
|
})
|
|
848
1948
|
.catch(err => {
|
|
849
|
-
this.handleError(err);
|
|
1949
|
+
this.handleError(err, context.token);
|
|
1950
|
+
})
|
|
1951
|
+
.then(() => {
|
|
1952
|
+
this.requestInProcess.next(false);
|
|
1953
|
+
}, () => {
|
|
1954
|
+
this.requestInProcess.next(false);
|
|
850
1955
|
});
|
|
851
1956
|
}
|
|
852
1957
|
clearCart() {
|
|
@@ -858,7 +1963,14 @@ let CartService = class CartService {
|
|
|
858
1963
|
//this.resetCart(this.getCart);
|
|
859
1964
|
}
|
|
860
1965
|
clearAndResetCart() {
|
|
861
|
-
this.
|
|
1966
|
+
this.activeCheckoutTransitionId = this.cartTransitionIdForToken(this.cart_token || localStorage.getItem('cart_token'));
|
|
1967
|
+
this.publishCartSync('checkout-invalidated', this.activeCheckoutTransitionId);
|
|
1968
|
+
this.pendingCheckoutRecovery = true;
|
|
1969
|
+
this.cartSyncBlocked = true;
|
|
1970
|
+
this.checkoutInvalidatedAt = Date.now();
|
|
1971
|
+
this.setCartSyncState('invalidated');
|
|
1972
|
+
this.startCheckoutRecoveryWatchdog();
|
|
1973
|
+
this.resetCart(() => this.getCart(true));
|
|
862
1974
|
}
|
|
863
1975
|
clearAndResetCustomerCart() {
|
|
864
1976
|
console.log("Clearing and reseting...");
|
|
@@ -907,11 +2019,11 @@ CartService.ctorParameters = () => [
|
|
|
907
2019
|
{ type: Router },
|
|
908
2020
|
{ type: PricePresentationService }
|
|
909
2021
|
];
|
|
910
|
-
CartService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CartService_Factory() { return new
|
|
2022
|
+
CartService.ɵprov = i0.ɵɵdefineInjectable({ factory: function CartService_Factory() { return new CartService(i0.ɵɵinject(i1.ConnectionService), i0.ɵɵinject(i2.ToastService), i0.ɵɵinject(i3.Constants), i0.ɵɵinject(i4.AuthService), i0.ɵɵinject(i5.OrderUtilityService), i0.ɵɵinject(i6.AnalyticsService), i0.ɵɵinject(i7.ChannelConfigService), i0.ɵɵinject(i8.Router), i0.ɵɵinject(i9.PricePresentationService)); }, token: CartService, providedIn: "root" });
|
|
911
2023
|
CartService = __decorate([
|
|
912
2024
|
Injectable({
|
|
913
2025
|
providedIn: 'root'
|
|
914
2026
|
})
|
|
915
2027
|
], CartService);
|
|
916
2028
|
export { CartService };
|
|
917
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcxQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHekMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLDRCQUE0QixFQUFFLHdCQUF3QixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7O0FBS3hJLElBQWEsV0FBVyxHQUF4QixNQUFhLFdBQVc7SUFrRHBCLFlBQW9CLFVBQTZCLEVBQVUsYUFBMkIsRUFBVSxNQUFpQixFQUNyRyxXQUF3QixFQUFVLFVBQStCLEVBQVUsZ0JBQWtDLEVBQzdHLG9CQUEwQyxFQUMxQyxNQUFjLEVBQ2Qsd0JBQWtEO1FBSjFDLGVB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LGNBQUwsS0FBSyxHQUFJLENBQUMsQ0FBQSxDQUFDO1FBRS9CLE1BQU0sV0FBVyxHQUFHO1lBQ2hCLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxxQkFBcUI7WUFDcEQsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7WUFDbEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM1QixnQkFBZ0IsRUFDWixPQUFPLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxXQUFXLElBQUksSUFBSSxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksV0FBVztnQkFDdEYsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsV0FBVztnQkFDcEMsQ0FBQyxDQUFDLENBQUM7WUFDWCxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7WUFDdEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1NBQy9CLENBQUM7UUFFRixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FFSixDQUFBOztZQS9nQ21DLGlCQUFpQjtZQUF5QixZQUFZO1lBQWtCLFNBQVM7WUFDeEYsV0FBVztZQUFzQixtQkFBbUI7WUFBNEIsZ0JBQWdCO1lBQ3ZGLG9CQUFvQjtZQUNsQyxNQUFNO1lBQ1ksd0JBQXdCOzs7QUF0RHJELFdBQVc7SUFIdkIsVUFBVSxDQUFDO1FBQ1IsVUFBVSxFQUFFLE1BQU07S0FDckIsQ0FBQztHQUNXLFdBQVcsQ0Fpa0N2QjtTQWprQ1ksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcHJvZHVjdCc7XG5pbXBvcnQgeyBDYXJ0SXRlbSwgQ2FydEl0ZW1QcmljaW5nIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0LWl0ZW0nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL2FwaS9jb25uZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi91dGlscy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENvdXBvbkkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvdXBvbic7XG5pbXBvcnQgeyBPcmRlclV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvb3JkZXItdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrb3V0RGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlY2tvdXQtZGF0YSc7XG5pbXBvcnQgeyBDYXJ0QWZmb3JkYWJsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FydC9jYXJ0LWFmZm9yZGFibGUnO1xuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uLy4uL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NoYW5uZWwnO1xuaW1wb3J0IHsgQ2FydFRvdGFsUHJpY2luZ1ZhbHVlLCBDYXJ0VG90YWxzUHJpY2luZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FydC10b3RhbHMnO1xuaW1wb3J0IHsgQ2FydEl0ZW1QcmljZVByZXNlbnRhdGlvbiwgQ2FydFN1bW1hcnlQcmljZVByZXNlbnRhdGlvbiwgUHJpY2VQcmVzZW50YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvcHJpY2UtcHJlc2VudGF0aW9uLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENhcnRTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGNhcnRJdGVtc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxDYXJ0SXRlbVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xuICAgIHByaXZhdGUgY291cG9uU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGFueT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICAgIHByaXZhdGUgY2FydFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICBwcml2YXRlIHJlcXVlc3RJblByb2Nlc3MgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgICBwcml2YXRlIHByb21vdGlvbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Q2hlY2tvdXREYXRhW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG5cbiAgICBwcml2YXRlIGJhbGFuY2VDdXN0b21lclN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgICAgIGFsbG93QW55UGF5bWVudE1ldGhvZD86IGJvb2xlYW47XG4gICAgICAgIGFsbG93RXhjZWVkQmFsYW5jZT86IGJvb2xlYW47XG4gICAgICAgIGNyZWRpdEFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgICAgIHNob3dNYXg/OiBib29sZWFuO1xuICAgICAgICBzaG93UHJpY2U/OiBib29sZWFuO1xuICAgICAgICByZW1haW5pbmdDcmVkaXRzPzogbnVtYmVyO1xuICAgICAgICBhcHBseU1heE9yZGVycz86IGJvb2xlYW47XG4gICAgICAgIG1heE9yZGVycz86IG51bWJlcjtcbiAgICB9IHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gICAgcHJpdmF0ZSBpdGVtcyA9IFtdO1xuXG4gICAgcHJpdmF0ZSBjb3VudDogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIGxvY2FsZSA9IFwiXCI7XG4gICAgcHJpdmF0ZSBsb2dnZWRfaW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGhhdmVfdG9fdXBkYXRlID0gdHJ1ZTtcbiAgICBwdWJsaWMgY2hhbm5lbENvbmZpZzogYW55ID0ge307XG4gICAgcHJpdmF0ZSBjYXJ0X2Jhc2VVcmwgPSAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvY2FydHMnO1xuXG4gICAgcHVibGljIGNhcnRJdGVtc0FwaSA9ICgpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBhZGRJdGVtQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zJyArICc/bG9jYWxlPScgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKTtcbiAgICBwdWJsaWMgYWRkQWxsSXRlbXNBcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvbXVsdGlwbGUtaXRlbXMnICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyB1cGRhdGVJdGVtUXVhbnRpdHlBcGkgPSAoaXRlbV9pZCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zLycgKyBpdGVtX2lkICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBkZWxldGVJdGVtQXBpID0gKGl0ZW1faWQpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJy8nICsgdGhpcy5jYXJ0X3Rva2VuICsgJy9pdGVtcy8nICsgaXRlbV9pZCArICc/bG9jYWxlPScgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKTtcbiAgICBwdWJsaWMgY291cG9uQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2NvdXBvbic7XG4gICAgcHVibGljIGFkZHJlc3NCb29rQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2FkZHJlc3MtYm9vayc7XG4gICAgcHVibGljIHRheGVzQXBpID0gKCkgPT4gJ3Nob3AtYXBpLycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnL2NhcnRzL3RheCc7XG5cbiAgICBwdWJsaWMgY2FydF90b2tlbjtcbiAgICBwdWJsaWMgY2FydEl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKGl0ZW1zID0+IHRoaXMuc3dpdGNoUHJpY2VJbkNhcnRJdGVtKGl0ZW1zKSkpXG4gICAgcHVibGljIGNvdXBvbiA9IHRoaXMuY291cG9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgY2FydCA9IHRoaXMuY2FydFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb21vdGlvbnMgPSB0aGlzLnByb21vdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkZWxldGluZzogQm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBiYWxhbmNlQ3VzdG9tZXIkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBhbGxvd0FueVBheW1lbnRNZXRob2QkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uYWxsb3dBbnlQYXltZW50TWV0aG9kID8/IG51bGwpKTtcbiAgICBwdWJsaWMgYWxsb3dFeGNlZWRCYWxhbmNlJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LmFsbG93RXhjZWVkQmFsYW5jZSA/PyBudWxsKSk7XG4gICAgcHVibGljIGNyZWRpdEFtb3VudCQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5jcmVkaXRBbW91bnQgPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBzaG93TWF4JCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LnNob3dNYXggPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBzaG93UHJpY2UkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uc2hvd1ByaWNlID8/IG51bGwpKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29ubmVjdGlvbjogQ29ubmVjdGlvblNlcnZpY2UsIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RTZXJ2aWNlLCBwcml2YXRlIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgcHJpdmF0ZSBvcmRlclV0aWxzOiBPcmRlclV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIGFuYWx5dGljc1NlcnZpY2U6IEFuYWx5dGljc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY2hhbm5lbENvbmZpZ1NlcnZpY2U6IENoYW5uZWxDb25maWdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHByaWNlUHJlc2VudGF0aW9uU2VydmljZTogUHJpY2VQcmVzZW50YXRpb25TZXJ2aWNlKSB7XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0JykpIHx8IFtdO1xuICAgICAgICB0aGlzLmNhcnRfdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpIHx8IG51bGw7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nZ2VkSW4uc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmdldENhcnQoKSk7XG4gICAgICAgIHRoaXMuY2hhbm5lbENvbmZpZ1NlcnZpY2UuY2hhbm5lbENvbmZpZyQuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmNoYW5uZWxDb25maWcgPSByZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDYXJ0MigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzQm9vayA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXQodGhpcy5hZGRyZXNzQm9va0FwaSgpKS5waXBlKG1hcChyZXMgPT4gcmVzPy5sZW5ndGggJiYgcmVzLm1hcChhZGRyZXMgPT4geyByZXR1cm4gYWRkcmVzICYmIHsgLi4uYWRkcmVzLCBzZWxlY3RlZDogYWRkcmVzLmRlZmF1bHQgfSB9KSB8fCBudWxsKSkudG9Qcm9taXNlKCk7XG5cbiAgICBwdWJsaWMgZ2V0VGF4ZXMgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnRheGVzQXBpKCksIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KS5zdWJzY3JpYmUocmVzID0+IHJlcylcblxuICAgIHByaXZhdGUgZ2V0Q2FydCA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuY2FydEl0ZW1zQXBpKCksICgodGhpcy5jYXJ0X3Rva2VuICYmIHRoaXMuaXRlbXMubGVuZ3RoID49IDEpICYmIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICBwcml2YXRlIGdldENhcnRCeVRva2VuID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSwgKCh0aGlzLmNhcnRfdG9rZW4pICYmIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICBwcml2YXRlIGdldENhcnRCeUN1c3RvbWVyID0gYXN5bmMgKCkgPT5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzKVxuICAgICAgICApXG5cbiAgICAvKipcbiAgICAgKiAgQHByaXZhdGVcbiAgICAgKiAgQ0FSVCBDUlVEIFNFUlZFUidTIFNZTkNST05JWkVEXG4gICAgICovXG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVDYXJ0ID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IHJlc3BvbnNlLnRva2VuVmFsdWU7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0X3Rva2VuJywgdGhpcy5jYXJ0X3Rva2VuKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSByZXNwb25zZS5sb2NhbGU7XG4gICAgICAgIC8qIGxldCBsb2NhbGVGcm9tU3RvcmFnZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdMT0NBTEUnKVxuICAgICAgICBjb25zb2xlLmxvZyhsb2NhbGVGcm9tU3RvcmFnZSlcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVGcm9tU3RvcmFnZSA/IGxvY2FsZUZyb21TdG9yYWdlIDogcmVzcG9uc2UubG9jYWxlO1xuICAgICAgICByZXNwb25zZS5sb2NhbGUgPSB0aGlzLmxvY2FsZSAqL1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzcG9uc2UsIGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXModGhpcy50cmFuc2Zvcm1JdGVtcyhyZXNwb25zZS5pdGVtcykpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYXNpZ25hIGBwcm9kdWN0LnByaWNlYCBhbCBwcmVjaW8gYmFzZSBsZWdhY3kgcXVlIGVzcGVyYSBlbCB0ZW1wbGF0ZSBoaXN0w7NyaWNvIGRlbCBjYXJyaXRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIMONdGVtcyBub3JtYWxpemFkb3MgZGVsIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgTG9zIG1pc21vcyDDrXRlbXMgY29uIGBwcm9kdWN0LnByaWNlYCBhbGluZWFkbyBhbCBwcmVjaW8gYmFzZSBtb3N0cmFkbyBlbiBsYSB0YWJsYS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXN0ZSBtw6l0b2RvIG5vIG1vZGlmaWNhIGBwcmljaW5nLmZpbmFsUHJpY2VgLiBTb2xvIHByZXNlcnZhIGNvbXBhdGliaWxpZGFkIGNvbiB0ZW1wbGF0ZXNcbiAgICAgKiB2aWVqb3MgcXVlIHRvZGF2w61hIGxlZW4gYGl0ZW0ucHJvZHVjdC5wcmljZWAgZGlyZWN0YW1lbnRlLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3dpdGNoUHJpY2VJbkNhcnRJdGVtID0gKGl0ZW1zOiBDYXJ0SXRlbVtdKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoXG4gICAgICAgICAgICBpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5wcm9kdWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByaWNpbmcgPSB0aGlzLmdldEl0ZW1QcmljaW5nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYW50ID0gaXRlbS5wcm9kdWN0LnZhcmlhbnRzPy5bMF07XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucHJvZHVjdC5wcmljZSA9IHByaWNpbmc/LmJhc2VQcmljZSB8fCB2YXJpYW50Py5zYWxlcHJpY2UgfHwgdmFyaWFudD8ucHJpY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0ZXBDYXJ0ID0gKHJlcykgPT4ge1xuICAgICAgICByZXMuaXRlbXMubGVuZ3RoID4gMCAmJiByZXMuaXRlbXMuZm9yRWFjaChcbiAgICAgICAgICAgIGl0ZW0gPT4gIXRoaXMuaXNJdGVtSW5Mb2NhbChpdGVtLmlkKSAmJiB0aGlzLmRlbGV0ZUNhcnRJdGVtKGl0ZW0sIGZhbHNlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFkZEFsbFRvQ2FydChcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGl0ZW0gPT4gIXJlcy5pdGVtcy5zb21lKGV4dGVybmFsX2l0ZW0gPT4gZXh0ZXJuYWxfaXRlbS5pZCA9PSBpdGVtLml0ZW1faWQpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRJdGVtcyA9IChpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgICAgIHRoaXMuY291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KHRoaXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsQ2FydCgpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2luY3Jvbml6YSBgY2FydEl0ZW1zU3ViamVjdGAgY29uIGxhIMO6bHRpbWEgcmVzcHVlc3RhIGRlbCBiYWNrZW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhcnQgUmVzcHVlc3RhIGRlIGNhcnJpdG8gcmVjaWJpZGEgZGVzZGUgY3VhbHF1aWVyIGVuZHBvaW50IHF1ZSBkZXZ1ZWx2YSBgaXRlbXNgLlxuICAgICAqIEByZXR1cm5zIGB2b2lkYFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTZSByZXV0aWxpemEgZGVzcHXDqXMgZGUgYWN0dWFsaXphciBjYW50aWRhZGVzLCBhcGxpY2FyIGN1cMOzbiBvIHJlbW92ZXIgcHJvZHVjdG9zIHBhcmEgZXZpdGFyXG4gICAgICogcXVlIGxhIHRhYmxhIHF1ZWRlIGNvbiBzdWJ0b3RhbGVzIG8gcHJvbW9jaW9uZXMgZGVzYWN0dWFsaXphZGFzLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZSA9IChjYXJ0KSA9PiB7XG4gICAgICAgIGlmICghY2FydD8uaXRlbXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbXMgPSB0aGlzLml0ZW1zIHx8IFtdO1xuICAgICAgICBjb25zdCBuZXh0SXRlbXMgPSB0aGlzLnRyYW5zZm9ybUl0ZW1zKGNhcnQuaXRlbXMpLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW06IGFueSA9IHByZXZpb3VzSXRlbXMuZmluZChwcmV2ID0+IHByZXYuaXRlbV9pZCA9PSBpdGVtLml0ZW1faWQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5wcmV2aW91c0l0ZW0sXG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICBmYWlsZWQ6IHByZXZpb3VzSXRlbT8uZmFpbGVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBwcmV2aW91c0l0ZW0/LmVycm9yXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyhuZXh0SXRlbXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2FydEl0ZW1RdWFudGl0eSA9ICh2YXJpYW50X2lkLCBxdWFudGl0eSwgY29tbWVudHM/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDb21tZW50cyA9IGNvbW1lbnRzICE9PSB1bmRlZmluZWQgPyAoY29tbWVudHMgPz8gJycpLnRyaW0oKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBuZXdJdGVtcyA9IHRoaXMuaXRlbXMubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIGlmIChpdC52YXJpYW50X2lkICE9PSB2YXJpYW50X2lkKSByZXR1cm4gaXQ7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkOiBhbnkgPSB7IC4uLml0LCBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSB9O1xuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRDb21tZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZC5jb21tZW50cyA9IG5vcm1hbGl6ZWRDb21tZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLml0ZW1zID0gbmV3SXRlbXM7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KHRoaXMuaXRlbXMpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMudXBkYXRlTG9jYWxDYXJ0KCk7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXVwZGF0ZWQnLCB7IHF1YW50aXR5IH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwZW5kVG9DYXJ0ID0gKGNhcnQpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQpO1xuICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UoY2FydCk7XG4gICAgICAgIC8vICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LWFkZGVkJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVDYXJ0SXRlbSA9IChjYXJ0LCBwcm9kdWN0LCB0b2FzdCA9IHRydWUpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKGNhcnQpO1xuICAgICAgICB0b2FzdCAmJiB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIHRvYXN0ICYmIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXJlbW92ZWQnKTtcbiAgICAgICAgLy8gdGhpcy5nb29nbGVBbmFseXRpY3MucmVtb3ZlRnJvbUNhcnQocHJvZHVjdCk7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3JlbW92ZV9mcm9tX2NhcnQnLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0cy5jdXJyZW5jeS5jb2RlIH0pXG5cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZElmQWxscmVhZHlFeGlzdHMgPSAocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHlBZGQgPSAxLCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+XG4gICAgICAgIHRoaXMuaXRlbXMuZmluZCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLnByb2R1Y3QuaWQgPT0gcHJvZHVjdC5pZCAmJiBpdGVtLnZhcmlhbnRfaWQgPT0gdmFyaWFudF9pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbVF1YW50aXR5KGl0ZW0sIHRoaXMuZmluZEl0ZW0ocHJvZHVjdC5pZCkucXVhbnRpdHkgKyBxdWFudGl0eUFkZCwgY29tbWVudHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIHByaXZhdGUgdXBkYXRlTG9jYWxDYXJ0ID0gKCkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydCcsIEpTT04uc3RyaW5naWZ5KHRoaXMuaXRlbXMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0Q2FydCA9IChuZXh0PykgPT4ge1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY2FydFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy51cGRhdGVCYWxhbmNlQXR0cmlidXRlcyhudWxsKTtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYXJ0SXRlbXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgICB0aGlzLmNvdW50ID0gMDtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnQnLCBcIltdXCIpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICBuZXh0ICYmIG5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRPYmogPSAoY2FydCwgZW1pdEV2ZW50ID0gdHJ1ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICB0aGlzLmNhcnRTdWJqZWN0Lm5leHQoY2FydCk7XG4gICAgICAgIHRoaXMudXBkYXRlQmFsYW5jZUF0dHJpYnV0ZXMoY2FydD8uYmFsYW5jZUN1c3RvbWVyLCBjYXJ0Py50b3RhbHM/LnRvdGFsKTtcbiAgICAgICAgZW1pdEV2ZW50ICYmIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ2FkZF90b19jYXJ0JywgY2FydCk7XG4gICAgICAgIHRoaXMucHJvbW90aW9uc1N1YmplY3QubmV4dCh0aGlzLm9yZGVyVXRpbHMuZ2V0UHJvbW90aW9ucyhjYXJ0LCB0cnVlKSk7XG5cbiAgICAgICAgY2FydC5jb3Vwb25Db2RlXG4gICAgICAgICAgICA/IHRoaXMuZm9ybWF0Q291cG9uKGNhcnQpXG4gICAgICAgICAgICA6IHRoaXMuY291cG9uU3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB1cGRhdGVDYXJ0QWZ0ZXJQYXltZW50UmVzcG9uc2UgPSAoY2FydDogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICghY2FydD8udG90YWxzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNhcnRPYmooY2FydCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJdGVtSW5Mb2NhbCA9IChpdGVtX2lkKSA9PiB0aGlzLml0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLml0ZW1faWQgPT0gaXRlbV9pZCk7XG5cbiAgICAvKipcbiAgICAgKiAgQHB1YmxpY1xuICAgICAqICBDQVJUIENSVURcbiAgICAgKi9cblxuICAgIGFkZFRvQ2FydCA9IChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBjb21tZW50cz86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuICAgICAgICBjb25zdCBhcHBseU1heE9yZGVycyA9IGJhbGFuY2U/LmFwcGx5TWF4T3JkZXJzID8/IGZhbHNlO1xuICAgICAgICBjb25zdCBtYXhPcmRlcnMgPSBiYWxhbmNlPy5tYXhPcmRlcnMgPz8gSW5maW5pdHk7XG5cbiAgICAgICAgaWYgKGFwcGx5TWF4T3JkZXJzICYmIChtYXhPcmRlcnMgPD0gMCB8fCBtYXhPcmRlcnMgPT09IG51bGwpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWF4LW9yZGVycy1yZWFjaGVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIGxldCBhZGRlZCA9IHRoaXMuYWRkSWZBbGxyZWFkeUV4aXN0cyhwcm9kdWN0LCB2YXJpYW50X2lkLCBxdWFudGl0eSwgY29tbWVudHMpO1xuICAgICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdENvZGU6IHByb2R1Y3QuaWQsXG4gICAgICAgICAgICAgICAgcXVhbnRpdHk6IHF1YW50aXR5LFxuICAgICAgICAgICAgICAgIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jb21tZW50cyA9IGNvbW1lbnRzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgcGF5bG9hZClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuZWphciBsYSByZXNwdWVzdGEgSFRUUCBleGl0b3NhIChjw7NkaWdvIDIwMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVG9DYXJ0KHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC1hZGRlZCcpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuZWphciBlbCBlcnJvciBkZSBsYSBsbGFtYWRhIEhUVFAgKGPDs2RpZ28gNTAwIHUgb3RybyBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIuc3RhdHVzID09PSA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDw7NkaWdvIGRlIGVycm9yIDUwMCAodGltZW91dClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ0hhIG9jdXJyaWRvIHVuIGVycm9yIGFsIGFncmVnYXIgYWwgY2Fycml0by4gVnVlbHZhIGEgaW50ZW50YXJsby4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RybyBjw7NkaWdvIGRlIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdFcnJvciBpbmVzcGVyYWRvLiBWdWVsdmEgYSBpbnRlbnRhcmxvJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIGFkZFRvTG90ID0gKHByb2R1Y3Q6IFByb2R1Y3QsIHF1YW50aXR5OiBudW1iZXIsIHZhcmlhbnRfaWQsIGlkPywgb3JkZXJfaXRlbV9pZD8sIGxvdF9xdWFudGl0eT8sIHVuaXRfcHJpY2U/LCB1bml0X3RvdGFsPywgYWp1c3RlbWVudF90b3RhbD8sIHRvdGFsX2xvdD8sIGxvdF9zdGF0dXM/LCBkYXRlX3JlcXVlc3Q/LCBub3Rlcz8sIHNoaXBwaW5nX2FkZHJlc3NfaWQ/LCBzaGlwcGluZ19hZGRyZXNzX25hbWU/LCBhY3Rpb24/KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkZWQgPSAnJztcbiAgICAgICAgIWFkZGVkICYmIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkSXRlbUFwaSgpLCB7IHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLCBxdWFudGl0eTogcXVhbnRpdHksIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLCBpZDogaWQgfHwgJycsIG9yZGVyX2l0ZW1faWQ6IG9yZGVyX2l0ZW1faWQgfHwgJycsIGxvdF9xdWFudGl0eTogbG90X3F1YW50aXR5IHx8ICcnLCB1bml0X3ByaWNlOiB1bml0X3ByaWNlIHx8ICcnLCB1bml0X3RvdGFsOiB1bml0X3RvdGFsIHx8ICcnLCBhanVzdGVtZW50X3RvdGFsOiBhanVzdGVtZW50X3RvdGFsIHx8ICcnLCB0b3RhbF9sb3Q6IHRvdGFsX2xvdCB8fCAnJywgbG90X3N0YXR1czogbG90X3N0YXR1cyB8fCAnJywgZGF0ZV9yZXF1ZXN0OiBkYXRlX3JlcXVlc3QgfHwgJycsIG5vdGVzOiBub3RlcyB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogc2hpcHBpbmdfYWRkcmVzc19pZCB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiBzaGlwcGluZ19hZGRyZXNzX25hbWUgfHwgJycsIGFjdGlvbjogYWN0aW9uIHx8ICduZXdsb3QnIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHJlcyA9PiB0aGlzLmFwcGVuZFRvQ2FydChyZXMpLFxuICAgICAgICAgICAgICAgIGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycilcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgYWRkVG9DYXJ0UHJvbWlzZSA9IGFzeW5jIChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBjb21tZW50cz86IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmlzQWJsZVRvQnV5KCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LXNlbGVjdC1jdXN0b21lcicpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0ICh0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogcHJvZHVjdC5pZCwgcXVhbnRpdHk6IHF1YW50aXR5LCB2YXJpYW50Q29kZTogdmFyaWFudF9pZCB9KS50b1Byb21pc2UoKSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQuZXJyb3IpIHRoaXMuaGFuZGxlRXJyb3IocmVzdWx0LmVycm9yKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kVG9DYXJ0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGZhbHNlIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSB9XG4gICAgfVxuXG5cbiAgICBhZGRBbGxUb0NhcnQgPSAoaXRlbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IGl0ZW1zOiB0aGlzLm1lcmdlSXRlbXNBZGRBbGxUb0NhcnQoaXRlbXMpIH07XG5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRBbGxJdGVtc0FwaSgpLCBwYXJhbXMpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCkudGhlbihcbiAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLmNhcnQpICYmIHRoaXMudXBkYXRlQ2FydEl0ZW1zKHRoaXMudHJhbnNmb3JtSXRlbXMocmVzLmNhcnQuaXRlbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLmNhcnRfcmVzcG9uc2Uuc3RhdHVzID09ICdzdWNjZXNzJyAmJiB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkUmVwZWF0T3JkZXJUb0NhcnQoaXRlbXM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNhcnRJdGVtc1N1YmplY3QudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhcnQtbm90LWVtcHR5Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbXNUb0FkZCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW0ucXVhbnRpdHksXG4gICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGVcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmIChpdGVtc1RvQWRkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vLXByb2R1Y3RzLXRvLWFkZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgaXRlbXM6IGl0ZW1zVG9BZGRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEFsbEl0ZW1zQXBpKCksIHBhcmFtcylcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcblxuICAgICAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHJlcy5lcnJvcj8udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICdfJykgfHwgJ3Vua25vd25fZXJyb3InO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdyhlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXNSZXNwb25zZSA9IHJlcz8uaXRlbXNfcmVzcG9uc2UgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgY2FydEl0ZW1zID0gcmVzPy5jYXJ0Py5pdGVtcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dE9mU3RvY2tJdGVtcyA9IGl0ZW1zUmVzcG9uc2UuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdGF0dXMgPT09ICdmYWlsdXJlJyAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtLmVycm9ycy5zb21lKGVycm9yID0+IGVycm9yLmNvZGUgPT09ICdvdXRfb2Zfc3RvY2snKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FydEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiBvdXRPZlN0b2NrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnYWxsLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG91dE9mU3RvY2tJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdzb21lLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYXJ0SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLmNhcnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyh0aGlzLnRyYW5zZm9ybUl0ZW1zKGNhcnRJdGVtcykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyZ2VJdGVtc0FkZEFsbFRvQ2FydCA9IChpdGVtczogYW55W10pID0+IHtcbiAgICAgICAgbGV0IHBhcmFtc01lcmdlID0gW11cbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1JbnRlcm5vID0gaXRlbXMuZmluZChpdGVtUGFyYW0gPT4gaXRlbVBhcmFtLnZhcmlhbnRDb2RlID09IGl0ZW0udmFyaWFudF9pZClcbiAgICAgICAgICAgIHBhcmFtc01lcmdlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS52YXJpYW50X2lkLFxuICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbUludGVybm8gJiYgaXRlbUludGVybm8ucXVhbnRpdHkgfHwgaXRlbS5xdWFudGl0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcblxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtUGFyYW0gPT4gIXRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW1QYXJhbS52YXJpYW50Q29kZSA9PSBpdGVtLnZhcmlhbnRfaWQpKVxuXG4gICAgICAgIHJldHVybiBbLi4uaXRlbXMsIC4uLnBhcmFtc01lcmdlXVxuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1RdWFudGl0eSA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHksIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZVF1YW50aXR5KGl0ZW0sIHF1YW50aXR5KSAmJiAodGhpcy52YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyhpdGVtLCBxdWFudGl0eSkpKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcblxuICAgICAgICAgICAgY29uc3QgcGF5bG9hZDogYW55ID0geyBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSB9O1xuICAgICAgICAgICAgaWYgKGNvbW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkID0gKGNvbW1lbnRzID8/ICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5jb21tZW50cyA9IGNsZWFuZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIC5wdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbVF1YW50aXR5QXBpKHRoaXMuZmluZEl0ZW1CeUlkVmFyaWFudChpdGVtLnZhcmlhbnRfaWQpKSxcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdwcm9kdWN0LXVwZGF0ZWQnLCB7IHF1YW50aXR5IH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICB2YWxpZGF0ZVF1YW50aXR5ID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eSkgPT4ge1xuICAgICAgICBpZiAoKHRoaXMuZ2V0Q291bnRGcm9tSXRlbUluQ2FydChpdGVtLnByb2R1Y3RDb2RlKSArIHF1YW50aXR5KSA+IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tYXhpbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21heGltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWF4aW11bUl0ZW1zUXVhbnRpdHkgfSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmICgodGhpcy5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGl0ZW0ucHJvZHVjdENvZGUpICsgcXVhbnRpdHkpIDwgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1pbmltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWluaW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5taW5pbXVtSXRlbXNRdWFudGl0eSB9KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ICYmIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ID4gMCkge1xuICAgICAgICAgICAgaWYgKCh0aGlzLmdldENvdW50RnJvbUl0ZW1JbkNhcnQoaXRlbS5wcm9kdWN0Q29kZSkgKyBxdWFudGl0eSkgJSBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtdXN0LWJlLW11bHRpcGxlJywgeyBxdWFudGl0eTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHk6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuXG4gICAgICAgIGlmICghYmFsYW5jZSB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gbnVsbCB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLmFsbG93QW55UGF5bWVudE1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5yZW1haW5pbmdDcmVkaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXRQcmljZSA9IGl0ZW0udG90YWwgLyBpdGVtLnF1YW50aXR5O1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUXVhbnRpdHkgPSBxdWFudGl0eSAtIGl0ZW0ucXVhbnRpdHk7XG5cbiAgICAgICAgaWYgKGFkZGl0aW9uYWxRdWFudGl0eSA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxDb3N0ID0gdW5pdFByaWNlICogYWRkaXRpb25hbFF1YW50aXR5O1xuXG4gICAgICAgIGlmIChhZGRpdGlvbmFsQ29zdCA+IGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cykge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIHB1YmxpYyBoYXNTdWZmaWNpZW50Q3JlZGl0c0ZvckNhcnRUb3RhbCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC52YWx1ZTtcblxuICAgICAgICBpZiAoIWJhbGFuY2UgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IG51bGwgfHwgYmFsYW5jZS5jcmVkaXRBbW91bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5hbGxvd0FueVBheW1lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UucmVtYWluaW5nQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMuY2FydFN1YmplY3QudmFsdWU/LnRvdGFscz8udG90YWwgfHwgMDtcblxuICAgICAgICAvLyBTaSBOTyBwdWVkZSBleGNlZGVyIHNhbGRvIHkgZWwgdG90YWwgc3VwZXJhIGVsIGNyZWRpdG8sIGJsb3F1ZWFyXG4gICAgICAgIGlmICghYmFsYW5jZS5hbGxvd0V4Y2VlZEJhbGFuY2UgJiYgdG90YWwgPiBiYWxhbmNlLmNyZWRpdEFtb3VudCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIGNhbGN1bGF0ZVN0b2NrQ291bnRzID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5wcm9kdWN0LnN0b2NrIDwgaXRlbS5xdWFudGl0eSArIHF1YW50aXR5KSB7XG4gICAgICAgICAgICAvLyB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGRlbGV0ZUNhcnRJdGVtID0gKGl0ZW0sIHRvYXN0ID0gdHJ1ZSkgPT4ge1xuICAgICAgICBsZXQgaWRfYnVzY2FkbyA9IHRoaXMuZmluZEl0ZW1CeUlkVmFyaWFudChpdGVtLnZhcmlhbnRfaWQpXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICAvLyAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLCBxdWFudGl0eTogMCwgdmFyaWFudENvZGU6IGl0ZW0udmFyaWFudF9pZCwgaWQ6ICcnLCBvcmRlcl9pdGVtX2lkOiBpdGVtLml0ZW1faWQsIGxvdF9xdWFudGl0eTogJycsIHVuaXRfcHJpY2U6ICcnLCB1bml0X3RvdGFsOiAnJywgYWp1c3RlbWVudF90b3RhbDogJycsIHRvdGFsX2xvdDogJycsIGxvdF9zdGF0dXM6ICcnLCBkYXRlX3JlcXVlc3Q6ICcnLCBub3RlczogICcnLCBzaGlwcGluZ19hZGRyZXNzX2lkOiAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiAnJywgYWN0aW9uOiAgJ2RlbGV0ZW9yZGVyaXRlbSd9KVxuICAgICAgICAvLyAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgLy8gICAgICAgICAgICByZXMgPT4gdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0KSxcbiAgICAgICAgLy8gICAgICAgICAgICBlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpXG4gICAgICAgIC8vICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZGVsZXRlKHRoaXMuZGVsZXRlSXRlbUFwaShpZF9idXNjYWRvKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHsgdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0KTsgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpOyB9LFxuICAgICAgICAgICAgZXJyID0+IHsgdGhpcy5oYW5kbGVFcnJvcihlcnIpOyB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7IH0sXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBjbGVhckNhcnQoKSB7XG4gICAgICAgIC8vc29sdWNpb24gcHJvdmlzYW9yaWFcbiAgICAgICAgbGV0IGl0ZW1zID0gWy4uLnRoaXMuaXRlbXNdXG4gICAgICAgIHdoaWxlIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZUNhcnRJdGVtKGl0ZW1zLnBvcCgpLCBmYWxzZSlcbiAgICAgICAgfVxuICAgICAgICAvL3RoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydCk7XG4gICAgfVxuXG4gICAgY2xlYXJBbmRSZXNldENhcnQoKSB7XG4gICAgICAgIHRoaXMucmVzZXRDYXJ0KHRoaXMuZ2V0Q2FydCk7XG4gICAgfVxuXG4gICAgY2xlYXJBbmRSZXNldEN1c3RvbWVyQ2FydCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJDbGVhcmluZyBhbmQgcmVzZXRpbmcuLi5cIilcbiAgICAgICAgdGhpcy5yZXNldENhcnQodGhpcy5nZXRDYXJ0QnlDdXN0b21lcilcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvciA9IChlcnJvcjogeyBlcnJvcjogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ29wZXJhdGlvbi1lcnJvci1wYXJhbScpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgfVxuXG4gICAgZ2V0Q291bnRGcm9tSXRlbUluQ2FydCA9IChjb2RlVmFyaWFudCk6IG51bWJlciA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnZhcmlhbnRfaWQgPT0gY29kZVZhcmlhbnQpPy5xdWFudGl0eSB8fCAwO1xuXG4gICAgZmluZEl0ZW1CeUlkVmFyaWFudCA9ICh2YXJpYW50X2lkKSA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnZhcmlhbnRfaWQgPT0gdmFyaWFudF9pZCkuaXRlbV9pZFxuXG4gICAgZmluZEl0ZW0gPSAocHJvZHVjdF9pZCkgPT4gdGhpcy5pdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5wcm9kdWN0LmlkID09IHByb2R1Y3RfaWQpO1xuXG4gICAgLyoqIERBVEEgRk9SIE9USEVSIFNFUlZJQ0VTICovXG4gICAgZ2V0Q2FydFRva2VuID0gKCkgPT4gdGhpcy5jYXJ0X3Rva2VuO1xuXG4gICAgZ2V0TG9jYWxlID0gKCkgPT4gdGhpcy5sb2NhbGU7XG5cbiAgICBnZXRUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRvdGFsKSk7XG5cbiAgICBnZXRQYXltZW50TWV0aG9kQWRqdXN0bWVudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy5wYXltZW50TWV0aG9kQWRqdXN0bWVudCA/PyBudWxsKSk7XG5cbiAgICBnZXRQYXltZW50TWV0aG9kQWRqdXN0bWVudExhYmVsID0gKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnBheW1lbnRNZXRob2RBZGp1c3RtZW50TGFiZWwgPz8gbnVsbCkpO1xuXG4gICAgLyoqIFRvdGFsIHBhcmEgY2Fycml0by9zaWRlYmFyLCBzaW4gZW52w61vIHBlcnNpc3RpZG8gbmkgcmVjYXJnb3MgZGUgY2hlY2tvdXQuICovXG4gICAgZ2V0Q2FydFRvdGFsQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VG90YWxBbW91bnQoY2FydCkpKTtcblxuICAgIGdldENvdW50Q2FydEl0ZW1zID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnRJdGVtcy5waXBlKG1hcCgoY2FydEl0ZW1zKSA9PiBjYXJ0SXRlbXM/Lmxlbmd0aCkpO1xuXG4gICAgZ2V0VGF4ZXNBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50YXhlcyA+IDAgPyBjYXJ0Py50b3RhbHM/LnRheGVzIDogMCkpO1xuXG4gICAgZ2V0U3ViVG90YWxBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlTdWJ0b3RhbEFtb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q2FydFRheGVzQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VGF4ZXNBbW91bnQoY2FydCkpKTtcblxuICAgIGdldENhcnRDbGllbnRUYXhlc0Ftb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLm9yZGVyVXRpbHMuZ2V0Q2FydENsaWVudFRheGVzQW1vdW50KGNhcnQpKSk7XG5cbiAgICAvKipcbiAgICAgKiBEZXZ1ZWx2ZSBlbCBkZXNjdWVudG8gcXVlIGRlYmUgbW9zdHJhcnNlIGVuIGVsIHJlc3VtZW4gZGUgY29tcHJhLlxuICAgICAqXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBjb24gZWwgbW9udG8gZGUgcHJvbW9jaW9uZXMgZGUgb3JkZW4uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogdGhpcy5zdW1tYXJ5UHJvbW90aW9uQW1vdW50JCA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTaSBlbCBiYWNrZW5kIG51ZXZvIGluZm9ybWEgYHRvdGFscy5vcmRlckRpc2NvdW50YCwgc2UgdXNhIGVzZSB2YWxvci5cbiAgICAgKiBFbiBzdSBhdXNlbmNpYSwgcHJpb3JpemEgYHRvdGFscy5wcm9tb3Rpb25CcmVha2Rvd24ub3JkZXJQcm9tb3Rpb25zYCB5XG4gICAgICogbHVlZ28gaGFjZSBmYWxsYmFjayBhIGB0b3RhbHMucHJvbW90aW9uYCBwYXJhIG1hbnRlbmVyIGNvbXBhdGliaWxpZGFkLlxuICAgICAqL1xuICAgIGdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5nZXRDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uKGNhcnQpLm9yZGVyRGlzY291bnQpKTtcblxuICAgIC8qKiBEZXNjdWVudG8gZXNwZWPDrWZpY28gZGVsIGN1cMOzbiwgc2kgZWwgYmFja2VuZCBsbyBpbmZvcm1hIHBvciBzZXBhcmFkby4gKi9cbiAgICBnZXRDb3Vwb25Qcm9tb3Rpb25BbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMuZ2V0Q2FydFN1bW1hcnlQcmljZVByZXNlbnRhdGlvbihjYXJ0KS5jb3Vwb25EaXNjb3VudCkpO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNpIGV4aXN0ZSB1biBjdXDDs24gYXBsaWNhZG8gZW4gZWwgY2Fycml0byBhY3R1YWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGJvb2xlYW5vIHBhcmEgY29udHJvbGFyIGxhIHZpc2liaWxpZGFkIGRlIGBRdWl0YXIgY3Vww7NuYC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogTm8gZGViZSBhdGFyc2UgYSBgZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCgpYCwgcG9ycXVlIHVuIGN1cMOzbiBwdWVkZSBhZmVjdGFyXG4gICAgICogc29sbyBwcm9tb2Npb25lcyB1bml0YXJpYXMgeSBkZWphciBlbCBkZXNjdWVudG8gZGUgb3JkZW4gZW4gYDBgLlxuICAgICAqL1xuICAgIGhhc0FwcGxpZWRDb3Vwb24gPSAoKTogT2JzZXJ2YWJsZTxib29sZWFuPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5oYXNBcHBsaWVkQ291cG9uKGNhcnQpKSk7XG5cbiAgICB0b0RlY2ltYWwgPSAodG90YWwpID0+ICh0b3RhbCAtIE1hdGguZmxvb3IodG90YWwpID09IDApID8gdG90YWwgLyAxMDAgOiB0b3RhbFxuXG4gICAgZ2V0RGlzY291bnQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydEl0ZW1zLnBpcGUobWFwKChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgdG90YWwgPSB0aGlzLml0ZW1zLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgY3Vyci5wcm9kdWN0LnNhbGVwcmljZSAqIGN1cnIucXVhbnRpdHk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIGxldCBzdWJ0b3RhbCA9IHRoaXMuaXRlbXMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgKyBjdXJyLnByb2R1Y3QucHJpY2UgKiBjdXJyLnF1YW50aXR5O1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICByZXR1cm4gc3VidG90YWwgLSB0b3RhbDtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9idGllbmUgZWwgcHJlY2lvIG5vcm1hbGl6YWRvIGRlIHVuIMOtdGVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gw410ZW0gZGUgY2Fycml0byBub3JtYWxpemFkby5cbiAgICAgKiBAcmV0dXJucyBPYmpldG8gYENhcnRJdGVtUHJpY2luZ2AgbGlzdG8gcGFyYSByZW5kZXJpemFyIHByZWNpbyBiYXNlLCB0YWNoYWRvIHkgZmluYWwuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcHJpY2luZyA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0SXRlbVByaWNpbmcoaXRlbSk7XG4gICAgICogY29uc3Qgc2hvd1Rvb2x0aXAgPSBwcmljaW5nLmhhc1VuaXRQcm9tb3Rpb25zO1xuICAgICAqIGNvbnN0IGZpbmFsUHJpY2UgPSBwcmljaW5nLmZpbmFsUHJpY2U7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0SXRlbVByaWNpbmcgPSAoaXRlbTogQ2FydEl0ZW0pOiBDYXJ0SXRlbVByaWNpbmcgPT4gaXRlbT8ucHJpY2luZyB8fCB0aGlzLmJ1aWxkQ2FydEl0ZW1QcmljaW5nKGl0ZW0pO1xuXG4gICAgLyoqIFJlc3VlbHZlIGxhIHByZXNlbnRhY2nDs24gbnVldmEgZGUgdW5hIGzDrW5lYSB5IGNvbnNlcnZhIGVsIGZhbGxiYWNrIGxlZ2FjeS4gKi9cbiAgICBnZXRDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uID0gKGl0ZW06IENhcnRJdGVtLCBjaGFubmVsPzogQ2hhbm5lbCk6IENhcnRJdGVtUHJpY2VQcmVzZW50YXRpb24gPT5cbiAgICAgICAgdGhpcy5wcmljZVByZXNlbnRhdGlvblNlcnZpY2UuZ2V0Q2FydEl0ZW1QcmljZVByZXNlbnRhdGlvbihcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICBjaGFubmVsIHx8IHRoaXMuY2hhbm5lbENvbmZpZyxcbiAgICAgICAgICAgIGl0ZW0/LmxpbmVQcmljaW5nID8gdW5kZWZpbmVkIDogdGhpcy5nZXRJdGVtUHJpY2luZyhpdGVtKVxuICAgICAgICApO1xuXG4gICAgLyoqIFJlc3VlbHZlIGVsIHJlc3VtZW4gdmlzaWJsZSB1c2FuZG8gbGluZVByaWNpbmcgc2luIGNvbnZlcnRpciBpbXBvcnRlcyBmaXNjYWxlcy4gKi9cbiAgICBnZXRDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uID0gKFxuICAgICAgICBjYXJ0OiBhbnkgPSB0aGlzLmNhcnRTdWJqZWN0LnZhbHVlLFxuICAgICAgICBjaGFubmVsPzogQ2hhbm5lbCxcbiAgICAgICAgaW5jbHVkZVNoaXBwaW5nOiBib29sZWFuID0gZmFsc2VcbiAgICApOiBDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VJdGVtcyA9IEFycmF5LmlzQXJyYXkoY2FydD8uaXRlbXMpICYmIGNhcnQuaXRlbXMubGVuZ3RoID8gY2FydC5pdGVtcyA6IG51bGw7XG4gICAgICAgIGNvbnN0IGl0ZW1zOiBDYXJ0SXRlbVtdID0gKHJlc3BvbnNlSXRlbXMgfHwgKHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZSB8fCBbXSkpXG4gICAgICAgICAgICAubWFwKGl0ZW0gPT4gdGhpcy5ub3JtYWxpemVDYXJ0SXRlbVByaWNpbmcoaXRlbSkpO1xuICAgICAgICBjb25zdCBoYXNMaW5lUHJpY2luZyA9IGl0ZW1zLmxlbmd0aCA+IDAgJiYgaXRlbXMuZXZlcnkoaXRlbSA9PiAhIWl0ZW0/LmxpbmVQcmljaW5nKTtcbiAgICAgICAgY29uc3Qgc2hvd0dyb3NzID0gKGNoYW5uZWwgfHwgdGhpcy5jaGFubmVsQ29uZmlnKT8uc2hvd1ByaWNlV2l0aFRheGVzV2hpbGVCcm93c2luZyA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcHJpY2luZ0tleSA9IHNob3dHcm9zcyA/ICdncm9zcycgOiAnbmV0JztcbiAgICAgICAgY29uc3QgdGF4ZXMgPSB0aGlzLm9yZGVyVXRpbHMuZ2V0Q2FydFRheGVzQW1vdW50KGNhcnQpO1xuICAgICAgICBjb25zdCBjbGllbnRUYXhlcyA9IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0Q2xpZW50VGF4ZXNBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVNoaXBwaW5nID0gaW5jbHVkZVNoaXBwaW5nID8gdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlTaGlwbWVudEFtb3VudChjYXJ0KSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHNoaXBwaW5nUHJpY2luZyA9IHRoaXMuZ2V0VG90YWxzUHJpY2luZyhjYXJ0LCAnc2hpcHBpbmdfcHJpY2luZycsICdzaGlwcGluZ1ByaWNpbmcnKTtcbiAgICAgICAgY29uc3Qgc2hpcHBpbmcgPSBpbmNsdWRlU2hpcHBpbmdcbiAgICAgICAgICAgID8gKHNoaXBwaW5nUHJpY2luZyA/IHNoaXBwaW5nUHJpY2luZ1twcmljaW5nS2V5XSA6IGxlZ2FjeVNoaXBwaW5nKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCB0b3RhbCA9IGluY2x1ZGVTaGlwcGluZ1xuICAgICAgICAgICAgPyBOdW1iZXIoY2FydD8udG90YWxzPy50b3RhbCB8fCAwKVxuICAgICAgICAgICAgOiB0aGlzLm9yZGVyVXRpbHMuZ2V0Q2FydFRvdGFsQW1vdW50KGNhcnQpO1xuICAgICAgICBjb25zdCBvcmRlckRpc2NvdW50UHJpY2luZyA9IHRoaXMuZ2V0VG90YWxzUHJpY2luZyhjYXJ0LCAnb3JkZXJfZGlzY291bnRfcHJpY2luZycsICdvcmRlckRpc2NvdW50UHJpY2luZycpO1xuICAgICAgICBjb25zdCBjb3Vwb25EaXNjb3VudFByaWNpbmcgPSB0aGlzLmdldFRvdGFsc1ByaWNpbmcoY2FydCwgJ2NvdXBvbl9kaXNjb3VudF9wcmljaW5nJywgJ2NvdXBvbkRpc2NvdW50UHJpY2luZycpO1xuICAgICAgICBjb25zdCBjb3Vwb25EaXNjb3VudCA9IGNvdXBvbkRpc2NvdW50UHJpY2luZ1xuICAgICAgICAgICAgPyBjb3Vwb25EaXNjb3VudFByaWNpbmdbcHJpY2luZ0tleV1cbiAgICAgICAgICAgIDogdGhpcy5vcmRlclV0aWxzLmdldENvdXBvblByb21vdGlvbkFtb3VudChjYXJ0KTtcbiAgICAgICAgY29uc3Qgb3JkZXJEaXNjb3VudCA9IG9yZGVyRGlzY291bnRQcmljaW5nXG4gICAgICAgICAgICA/IG9yZGVyRGlzY291bnRQcmljaW5nW3ByaWNpbmdLZXldXG4gICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRPcmRlclByb21vdGlvbkFtb3VudFxuICAgICAgICAgICAgICAgID8gdGhpcy5vcmRlclV0aWxzLmdldE9yZGVyUHJvbW90aW9uQW1vdW50KGNhcnQpXG4gICAgICAgICAgICAgICAgOiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudChjYXJ0KTtcblxuICAgICAgICBpZiAoaGFzTGluZVByaWNpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdHNCZWZvcmVEaXNjb3VudHM6IGl0ZW1zLnJlZHVjZSgodG90YWwsIGl0ZW06IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKyBOdW1iZXIoaXRlbS5saW5lUHJpY2luZy51bml0W3ByaWNpbmdLZXldIHx8IDApICogTnVtYmVyKGl0ZW0ucXVhbnRpdHkgfHwgMCksIDApLFxuICAgICAgICAgICAgICAgIGxpbmVEaXNjb3VudHM6IGl0ZW1zLnJlZHVjZSgodG90YWwsIGl0ZW06IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKyBOdW1iZXIoaXRlbS5saW5lUHJpY2luZy5kaXNjb3VudFtwcmljaW5nS2V5XSB8fCAwKSwgMCksXG4gICAgICAgICAgICAgICAgc3VidG90YWw6IGl0ZW1zLnJlZHVjZSgodG90YWwsIGl0ZW06IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKyBOdW1iZXIoaXRlbS5saW5lUHJpY2luZy5zdWJ0b3RhbFtwcmljaW5nS2V5XSB8fCAwKSwgMCksXG4gICAgICAgICAgICAgICAgb3JkZXJEaXNjb3VudCxcbiAgICAgICAgICAgICAgICBjb3Vwb25EaXNjb3VudCxcbiAgICAgICAgICAgICAgICB0YXhlcyxcbiAgICAgICAgICAgICAgICBjbGllbnRUYXhlcyxcbiAgICAgICAgICAgICAgICBzaGlwcGluZyxcbiAgICAgICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgICAgICB0YXhlc0luY2x1ZGVkSW5Ub3RhbDogc2hvd0dyb3NzICYmIHRheGVzICE9PSAwLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ2xpbmVQcmljaW5nJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm9kdWN0c0JlZm9yZURpc2NvdW50czogMCxcbiAgICAgICAgICAgIGxpbmVEaXNjb3VudHM6IDAsXG4gICAgICAgICAgICBzdWJ0b3RhbDogdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlTdWJ0b3RhbEFtb3VudChjYXJ0KSxcbiAgICAgICAgICAgIG9yZGVyRGlzY291bnQsXG4gICAgICAgICAgICBjb3Vwb25EaXNjb3VudCxcbiAgICAgICAgICAgIHRheGVzLFxuICAgICAgICAgICAgY2xpZW50VGF4ZXMsXG4gICAgICAgICAgICBzaGlwcGluZyxcbiAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgdGF4ZXNJbmNsdWRlZEluVG90YWw6IGZhbHNlLFxuICAgICAgICAgICAgc291cmNlOiAnbGVnYWN5J1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICAvKiogTm9ybWFsaXphIHPDs2xvIGVsIGFsaWFzIHNlcmlhbGl6YWRvIGRlbCBjb250cmF0byBkZSBsw61uZWEuICovXG4gICAgcHJpdmF0ZSBub3JtYWxpemVDYXJ0SXRlbVByaWNpbmcgPSAoaXRlbTogYW55KTogQ2FydEl0ZW0gPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgbGluZVByaWNpbmc6IGl0ZW0/LmxpbmVQcmljaW5nIHx8IGl0ZW0/LmxpbmVfcHJpY2luZ1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogTGVlIGVsIGNvbnRyYXRvIG51ZXZvIHNpbiBjb25mdW5kaXIgdW4gb2JqZXRvIHbDoWxpZG8gY29uIGZhbGxiYWNrIGxlZ2FjeSxcbiAgICAgKiBpbmNsdXNvIGN1YW5kbyB0b2RvcyBzdXMgaW1wb3J0ZXMgc29uIGNlcm8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRUb3RhbHNQcmljaW5nID0gKFxuICAgICAgICBjYXJ0OiBhbnksXG4gICAgICAgIHNuYWtlQ2FzZUtleToga2V5b2YgQ2FydFRvdGFsc1ByaWNpbmcsXG4gICAgICAgIGNhbWVsQ2FzZUtleToga2V5b2YgQ2FydFRvdGFsc1ByaWNpbmdcbiAgICApOiBDYXJ0VG90YWxQcmljaW5nVmFsdWUgfCBudWxsID0+IHtcbiAgICAgICAgY29uc3QgdG90YWxzID0gY2FydD8udG90YWxzIHx8IHt9O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRvdGFsc1tzbmFrZUNhc2VLZXldID8/IHRvdGFsc1tjYW1lbENhc2VLZXldO1xuICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIVt2YWx1ZS5uZXQsIHZhbHVlLnRheCwgdmFsdWUuZ3Jvc3NdLmV2ZXJ5KGFtb3VudCA9PiBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKGFtb3VudCkpKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5ldDogTnVtYmVyKHZhbHVlLm5ldCksXG4gICAgICAgICAgICB0YXg6IE51bWJlcih2YWx1ZS50YXgpLFxuICAgICAgICAgICAgZ3Jvc3M6IE51bWJlcih2YWx1ZS5ncm9zcylcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgYWRkQ291cG9uID0gYXN5bmMgKGNvZGUpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29ubmVjdGlvbi5wdXQodGhpcy5jb3Vwb25BcGkoKSwgeyBjb3Vwb246IGNvZGUgfSkudG9Qcm9taXNlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yIHx8IHJlc3VsdC5lcnJvcnMpIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnaW52YWxpZC1jb3Vwb24nIH07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzdWx0LCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgbWVzc2FnZTogJ29rJyB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ2ludmFsaWQtY291cG9uJyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlQ291cG9uID0gYXN5bmMgKCkgPT4gdGhpcy5jb25uZWN0aW9uLmRlbGV0ZSh0aGlzLmNvdXBvbkFwaSgpKS5waXBlKG1hcChyZXMgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmoocmVzLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZShyZXMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KSkudG9Qcm9taXNlKCk7XG5cbiAgICBmb3JtYXRDb3Vwb24gPSAoY2FydCkgPT4ge1xuICAgICAgICBsZXQgY3VycmVudF9jb3Vwb24gPSB0aGlzLmNvdXBvblN1YmplY3QudmFsdWU7XG4gICAgICAgIGxldCBjb3Vwb246IENvdXBvbkkgPSB7IGNvZGU6IGNhcnQuY291cG9uQ29kZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoY2FydC5jYXJ0RGlzY291bnRzKVswXTtcbiAgICAgICAgICAgIGNvdXBvbiA9IHtcbiAgICAgICAgICAgICAgICAuLi5jb3Vwb24sXG4gICAgICAgICAgICAgICAgYW1vdW50OiAoY2FydC5jYXJ0RGlzY291bnRzICYmIGNhcnQuY2FydERpc2NvdW50c1trZXldLmFtb3VudC5jdXJyZW50KSB8fCAwLFxuICAgICAgICAgICAgICAgIG5hbWU6IChjYXJ0LmNhcnREaXNjb3VudHMgJiYgY2FydC5jYXJ0RGlzY291bnRzW2tleV0ubmFtZSkgfHwgJ25vLW5hbWUnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICAgICAgKGNvdXBvbiAhPSBjdXJyZW50X2NvdXBvbikgJiYgdGhpcy5jb3Vwb25TdWJqZWN0Lm5leHQoY291cG9uKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VIYXZlVG9VcGRhdGUgPSAodmFsdWUpID0+IHRoaXMuaGF2ZV90b191cGRhdGUgPSB2YWx1ZTtcblxuICAgIHJlYWR5Rm9yQ2hlY2tvdXQgPSAoc3VjY2Vzc0NhbGxiYWNrPzogRnVuY3Rpb24sIGVycm9yQ2FsbGJhY2s/OiBGdW5jdGlvbik6IENhcnRBZmZvcmRhYmxlID0+IHtcbiAgICAgICAgbGV0IGNhcnQgPSB0aGlzLmNhcnRTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmNhcnRJdGVtc1N1YmplY3QudmFsdWU7XG4gICAgICAgIGxldCByZXN1bHQ6IENhcnRBZmZvcmRhYmxlID0geyBvazogdHJ1ZSB9O1xuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIDwgdGhpcy5jaGFubmVsQ29uZmlnLm1pbmltdW1RdWFudGl0eVB1cmNoYXNlSXRlbXMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vayA9IGZhbHNlOyByZXN1bHQucmVhc29ucy5wdXNoKHsgbWVzc2FnZTogJ25vdC1lbm91Z2h0LWl0ZW1zJyB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYXJ0LnRvdGFscy50b3RhbCA8IHRoaXMuY2hhbm5lbENvbmZpZy5taW5pbXVtUHVyY2hhc2VBbW91bnQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vayA9IGZhbHNlOyByZXN1bHQucmVhc29ucy5wdXNoKHsgbWVzc2FnZTogJ25vdC1lbm91Z2h0LWFtb3VudCcgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VjY2Vzc0NhbGxiYWNrIHx8IGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc3VsdC5va1xuICAgICAgICAgICAgICAgID8gc3VjY2Vzc0NhbGxiYWNrICYmIHN1Y2Nlc3NDYWxsYmFjaygpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNhbGxiYWNrICYmIGVycm9yQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1zT25FcnJvciA9IChpdGVtc1dpdGhFcnJvcjogYW55W10sIGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtc1dpdGhFcnJvcik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXRlbXMpO1xuICAgICAgICBsZXQgaXRlbXNVcGRhdGVkID0gdGhpcy5pdGVtcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBsZXQgaXRlbVdpdGhFcnJvciA9IGl0ZW1zV2l0aEVycm9yLmZpbmQoZmFpbGVkSXRlbSA9PiBpdGVtLml0ZW1faWQgPT0gZmFpbGVkSXRlbS5pZCk7XG4gICAgICAgICAgICBpZiAoaXRlbVdpdGhFcnJvcikge1xuICAgICAgICAgICAgICAgIGl0ZW0uZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpdGVtLmVycm9yID0gY29kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtc1VwZGF0ZWQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnRJdGVtcyhpdGVtc1VwZGF0ZWQpO1xuICAgIH1cblxuICAgIGxvYWRDYXJ0QnlUb2tlbiA9IGFzeW5jICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IHRva2VuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldENhcnRCeVRva2VuKClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBVVElMU1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtYSBsb3Mgw610ZW1zIGNydWRvcyBkZWwgYmFja2VuZCBhbCBjb250cmF0byBpbnRlcm5vIGBDYXJ0SXRlbWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmVyX2l0ZW0gUmVzcHVlc3RhIGBpdGVtc2AgZGVsIGVuZHBvaW50IGRlIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgQXJyZWdsbyBkZSDDrXRlbXMgbm9ybWFsaXphZG9zLCBjYWRhIHVubyBjb24gYHByaWNpbmdgIHByZWNvbXB1dGFkby5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXN0ZSBlcyBlbCBwdW50byBkb25kZSBlbCBjb3JlOlxuICAgICAqIC0gcHJlc2VydmEgYHVuaXRQcm9tb3Rpb25zYFxuICAgICAqIC0gYXJtYSBgcHJpY2luZ2BcbiAgICAgKiAtIG1hbnRpZW5lIGxhIGZvcm1hIGhpc3TDs3JpY2EgZGVsIGl0ZW0gY29uc3VtaWRvIHBvciBsb3MgdGVtcGxhdGVzXG4gICAgICovXG4gICAgdHJhbnNmb3JtSXRlbXMgPSAoc2VydmVyX2l0ZW0pID0+IHNlcnZlcl9pdGVtLm1hcChcbiAgICAgICAgaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtID0ge1xuICAgICAgICAgICAgICAgIHByb2R1Y3Q6IGl0ZW0ucHJvZHVjdCxcbiAgICAgICAgICAgICAgICB2YXJpYW50X2lkOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uY29kZSxcbiAgICAgICAgICAgICAgICBsb3Q6IGl0ZW0ub3JkZXJJdGVtTG90LFxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5LFxuICAgICAgICAgICAgICAgIGNvbW1lbnRzOiBpdGVtLmNvbW1lbnRzIHx8ICcnLFxuICAgICAgICAgICAgICAgIGl0ZW1faWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgdG90YWw6IGl0ZW0udG90YWwsXG4gICAgICAgICAgICAgICAgdW5pdFByaWNlOiBpdGVtLnVuaXRQcmljZSA/PyBpdGVtLnVuaXRfcHJpY2UsXG4gICAgICAgICAgICAgICAgZGlzY291bnQ6IGl0ZW0uZGlzY291bnQsXG4gICAgICAgICAgICAgICAgc3VidG90YWw6IGl0ZW0uc3VidG90YWwsXG4gICAgICAgICAgICAgICAgdGF4VG90YWw6IGl0ZW0udGF4VG90YWwgPz8gaXRlbS50YXhfdG90YWwsXG4gICAgICAgICAgICAgICAgdW5pdFByb21vdGlvbnM6IEFycmF5LmlzQXJyYXkoaXRlbS51bml0UHJvbW90aW9ucylcbiAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnVuaXRQcm9tb3Rpb25zXG4gICAgICAgICAgICAgICAgICAgIDogKEFycmF5LmlzQXJyYXkoaXRlbS51bml0X3Byb21vdGlvbnMpID8gaXRlbS51bml0X3Byb21vdGlvbnMgOiBbXSksXG4gICAgICAgICAgICAgICAgbGluZVByaWNpbmc6IGl0ZW0ubGluZVByaWNpbmcgfHwgaXRlbS5saW5lX3ByaWNpbmcsXG4gICAgICAgICAgICAgICAgbGluZV9wcmljaW5nOiBpdGVtLmxpbmVfcHJpY2luZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmljaW5nID0gdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID4gMCA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zZWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2UpO1xuICAgICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgaXRlbS5wcm9kdWN0LnByaWNlID0gaXRlbS50b3RhbCAvIGl0ZW0ucXVhbnRpdHkvLyA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zZWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2U7XG4gICAgICAgICAgICAvLyB9LCAxMDApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICApXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1eWUgbGEgbm9ybWFsaXphY2nDs24gZGUgcHJlY2lvcyBwYXJhIHVuIMOtdGVtIGRlbCBjYXJyaXRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gw410ZW0gbm9ybWFsaXphZG8gZGVsIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgRXN0cnVjdHVyYSBgQ2FydEl0ZW1QcmljaW5nYCBjb24gcHJlY2lvIGJhc2UsIHRhY2hhZG8sIGZpbmFsIHkgZmxhZ3MgZGUgVUkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcHJpY2luZyA9IHRoaXMuYnVpbGRDYXJ0SXRlbVByaWNpbmcoaXRlbSk7XG4gICAgICogLy8gcHJpY2luZy5iYXNlUHJpY2UgPT4gdW5pdFByaWNlIGRlbCBiYWNrZW5kIG51ZXZvIG8gZmFsbGJhY2sgbGVnYWN5XG4gICAgICogLy8gcHJpY2luZy5maW5hbFByaWNlID0+IHVuaXRQcmljZSBkZWwgYmFja2VuZCBudWV2byBvIGPDoWxjdWxvIGxlZ2FjeVxuICAgICAqIC8vIHByaWNpbmcuZWZmZWN0aXZlRGlzY291bnRQZXJjZW50ID0+ICUgdG90YWwgY29udHJhIGVsIHByZWNpbyBkZSByZWZlcmVuY2lhXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZENhcnRJdGVtUHJpY2luZyA9IChpdGVtOiBDYXJ0SXRlbSk6IENhcnRJdGVtUHJpY2luZyA9PiB7XG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSBpdGVtPy5wcm9kdWN0Py52YXJpYW50cz8uWzBdO1xuICAgICAgICBjb25zdCBjYXJ0QW5kU2lkZWJhclByaWNlcyA9IHZhcmlhbnQ/LmNhcnRBbmRTaWRlYmFyUHJpY2VzO1xuICAgICAgICAvLyBTaSBlbCBiYWNrZW5kIG51ZXZvIGluZm9ybWEgYGNhcnRBbmRTaWRlYmFyUHJpY2VzYCwgZXNlIGVzIGVsIHByZWNpbyBjb3JyZWN0b1xuICAgICAgICAvLyBwYXJhIGNhcnJpdG8vc2lkZWJhciBwb3JxdWUgZXhjbHV5ZSBpbXB1ZXN0b3MgZGUgb3JkZW4gcXVlIG5vIHNlIGxpc3RhbiBwb3Igw610ZW0uXG4gICAgICAgIC8vIFNpIG5vIGV4aXN0ZSwgc2UgbWFudGllbmUgZWwgZmFsbGJhY2sgaGlzdMOzcmljby5cbiAgICAgICAgY29uc3QgZXhwbGljaXRVbml0UHJpY2UgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShpdGVtPy51bml0UHJpY2UpO1xuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFVuaXRQcmljZSA9IE51bWJlci5pc0Zpbml0ZShleHBsaWNpdFVuaXRQcmljZSk7XG4gICAgICAgIGNvbnN0IGJhc2VQcmljZSA9IGhhc0V4cGxpY2l0VW5pdFByaWNlXG4gICAgICAgICAgICA/IGV4cGxpY2l0VW5pdFByaWNlXG4gICAgICAgICAgICA6IHRoaXMucGFyc2VQcmljZVZhbHVlKFxuICAgICAgICAgICAgICAgIGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5zYWxlcHJpY2VcbiAgICAgICAgICAgICAgICA/PyBjYXJ0QW5kU2lkZWJhclByaWNlcz8ucHJpY2VcbiAgICAgICAgICAgICAgICA/PyB2YXJpYW50Py5zYWxlcHJpY2VcbiAgICAgICAgICAgICAgICA/PyB2YXJpYW50Py5wcmljZVxuICAgICAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnNhbGVwcmljZVxuICAgICAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICAgICAgPz8gMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RyaWtlUHJpY2VDYW5kaWRhdGUgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShcbiAgICAgICAgICAgIGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5wcmljZVxuICAgICAgICAgICAgPz8gdmFyaWFudD8ucHJpY2VcbiAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICA/PyAwXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlUHJpY2UgPSBpc05hTihiYXNlUHJpY2UpID8gMCA6IGJhc2VQcmljZTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0cmlrZVByaWNlID0gaXNOYU4oc3RyaWtlUHJpY2VDYW5kaWRhdGUpID8gMCA6IHN0cmlrZVByaWNlQ2FuZGlkYXRlO1xuICAgICAgICBjb25zdCB1bml0UHJvbW90aW9uVG90YWwgPSBBcnJheS5pc0FycmF5KGl0ZW0/LnVuaXRQcm9tb3Rpb25zKVxuICAgICAgICAgICAgPyBpdGVtLnVuaXRQcm9tb3Rpb25zLnJlZHVjZSgodG90YWwsIHByb21vdGlvbikgPT4gdG90YWwgKyBOdW1iZXIocHJvbW90aW9uPy5hbW91bnQgfHwgMCksIDApXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGhhc1N0cmlrZVByaWNlID0gbm9ybWFsaXplZFN0cmlrZVByaWNlID4gbm9ybWFsaXplZEJhc2VQcmljZSAmJiBub3JtYWxpemVkQmFzZVByaWNlID4gMDtcbiAgICAgICAgY29uc3QgaGFzVW5pdFByb21vdGlvbnMgPSBBcnJheS5pc0FycmF5KGl0ZW0/LnVuaXRQcm9tb3Rpb25zKSAmJiBpdGVtLnVuaXRQcm9tb3Rpb25zLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IHF1YW50aXR5ID0gTnVtYmVyKGl0ZW0/LnF1YW50aXR5IHx8IDApO1xuICAgICAgICBjb25zdCBmaW5hbFByaWNlID0gaGFzRXhwbGljaXRVbml0UHJpY2VcbiAgICAgICAgICAgID8gbm9ybWFsaXplZEJhc2VQcmljZVxuICAgICAgICAgICAgOiBoYXNVbml0UHJvbW90aW9ucyA/IG5vcm1hbGl6ZWRCYXNlUHJpY2UgKyB1bml0UHJvbW90aW9uVG90YWwgOiBub3JtYWxpemVkQmFzZVByaWNlO1xuICAgICAgICBjb25zdCBwcm9kdWN0RGlzY291bnQgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShpdGVtPy5kaXNjb3VudCk7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVByb2R1Y3REaXNjb3VudCA9IE51bWJlcihpdGVtPy5wcm9kdWN0Py5kaXNjb3VudCB8fCAwKTtcbiAgICAgICAgY29uc3QgZGlzY291bnRQZXJjZW50ID0gTnVtYmVyLmlzRmluaXRlKHByb2R1Y3REaXNjb3VudCkgJiYgcHJvZHVjdERpc2NvdW50IDwgMCAmJiBub3JtYWxpemVkQmFzZVByaWNlID4gMCAmJiBxdWFudGl0eSA+IDBcbiAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoTWF0aC5hYnMocHJvZHVjdERpc2NvdW50KSAvIChub3JtYWxpemVkQmFzZVByaWNlICogcXVhbnRpdHkpKSAqIDEwMClcbiAgICAgICAgICAgIDogIWlzTmFOKGxlZ2FjeVByb2R1Y3REaXNjb3VudCkgJiYgbGVnYWN5UHJvZHVjdERpc2NvdW50ID4gMFxuICAgICAgICAgICAgICAgID8gTWF0aC5yb3VuZChsZWdhY3lQcm9kdWN0RGlzY291bnQpXG4gICAgICAgICAgICAgICAgOiBoYXNTdHJpa2VQcmljZVxuICAgICAgICAgICAgICAgICAgICA/IE1hdGgucm91bmQoKChub3JtYWxpemVkU3RyaWtlUHJpY2UgLSBub3JtYWxpemVkQmFzZVByaWNlKSAvIG5vcm1hbGl6ZWRTdHJpa2VQcmljZSkgKiAxMDApXG4gICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgPSBoYXNTdHJpa2VQcmljZSA/IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA6IG5vcm1hbGl6ZWRCYXNlUHJpY2U7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZURpc2NvdW50UGVyY2VudCA9IGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlID4gMCAmJiBmaW5hbFByaWNlID4gMCAmJiBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSA+IGZpbmFsUHJpY2VcbiAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoKGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlIC0gZmluYWxQcmljZSkgLyBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSkgKiAxMDApXG4gICAgICAgICAgICA6IGRpc2NvdW50UGVyY2VudDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmFzZVByaWNlOiBub3JtYWxpemVkQmFzZVByaWNlLFxuICAgICAgICAgICAgc3RyaWtlUHJpY2U6IGhhc1N0cmlrZVByaWNlID8gbm9ybWFsaXplZFN0cmlrZVByaWNlIDogbnVsbCxcbiAgICAgICAgICAgIGZpbmFsUHJpY2UsXG4gICAgICAgICAgICB1bml0UHJvbW90aW9uVG90YWwsXG4gICAgICAgICAgICBoYXNTdHJpa2VQcmljZSxcbiAgICAgICAgICAgIGhhc1VuaXRQcm9tb3Rpb25zLFxuICAgICAgICAgICAgZGlzY291bnRQZXJjZW50LFxuICAgICAgICAgICAgZWZmZWN0aXZlRGlzY291bnRQZXJjZW50XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXphIHZhbG9yZXMgZGUgcHJlY2lvIHByb3ZlbmllbnRlcyBkZWwgYmFja2VuZCBhIGBudW1iZXJgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFZhbG9yIG51bcOpcmljbyBvIHN0cmluZyBjb24gZm9ybWF0byBsb2NhbCAoYDEyMC4wMDBgLCBgMTIwMDAwYCwgYDEyMDAwMC0xYCwgZXRjLikuXG4gICAgICogQHJldHVybnMgTsO6bWVybyBwYXJzZWFkbyBvIGBOYU5gIHNpIGVsIHZhbG9yIG5vIGVzIHV0aWxpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNlIHVzYSBwYXJhIHNvcG9ydGFyIHJlc3B1ZXN0YXMgY29uIHNlcGFyYWRvcmVzIGRlIG1pbGVzLCBjb21hIGRlY2ltYWwgbyByYW5nb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVByaWNlVmFsdWUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXcgPSB2YWx1ZS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgaWYgKCFyYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gcmF3LmluY2x1ZGVzKCctJykgPyByYXcuc3BsaXQoJy0nKVswXS50cmltKCkgOiByYXc7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaXJzdFZhbHVlXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLig/PVxcZHszfShcXER8JCkpL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnLicpO1xuXG4gICAgICAgIHJldHVybiBOdW1iZXIobm9ybWFsaXplZCk7XG4gICAgfVxuXG5cbiAgICBnZXRDcmVkaXRBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QucGlwZShcbiAgICAgICAgICAgIG1hcCgoYmFsYW5jZUN1c3RvbWVyKSA9PiBiYWxhbmNlQ3VzdG9tZXI/LmNyZWRpdEFtb3VudCA/PyBudWxsKVxuICAgICAgICApO1xuXG4gICAgZ2V0Q2xpZW50VGF4ZXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50YXhlcyA+IDAgPyBjYXJ0Py50b3RhbHM/LmNsaWVudFRheGVzIDogMCkpO1xuXG4gICAgZ2V0UmVtYWluaW5nQ3JlZGl0cyA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnBpcGUobWFwKChiYWxhbmNlQ3VzdG9tZXIpID0+IGJhbGFuY2VDdXN0b21lcj8ucmVtYWluaW5nQ3JlZGl0cykpO1xuXG4gICAgcHVibGljIHVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKGJhbGFuY2U6IGFueSwgdG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghYmFsYW5jZSkge1xuICAgICAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRvdGFsID8/IDA7XG5cbiAgICAgICAgY29uc3QgYmFsYW5jZURhdGEgPSB7XG4gICAgICAgICAgICBhbGxvd0FueVBheW1lbnRNZXRob2Q6IGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kLFxuICAgICAgICAgICAgYWxsb3dFeGNlZWRCYWxhbmNlOiBiYWxhbmNlLmFsbG93RXhjZWVkQmFsYW5jZSxcbiAgICAgICAgICAgIGNyZWRpdEFtb3VudDogYmFsYW5jZS5jcmVkaXRBbW91bnQsXG4gICAgICAgICAgICBzaG93TWF4OiBiYWxhbmNlLnNob3dNYXgsXG4gICAgICAgICAgICBzaG93UHJpY2U6IGJhbGFuY2Uuc2hvd1ByaWNlLFxuICAgICAgICAgICAgcmVtYWluaW5nQ3JlZGl0czpcbiAgICAgICAgICAgICAgICBiYWxhbmNlLmNyZWRpdEFtb3VudCAhPSBudWxsICYmIHRvdGFsQW1vdW50ICE9IG51bGwgJiYgYmFsYW5jZS5jcmVkaXRBbW91bnQgPj0gdG90YWxBbW91bnRcbiAgICAgICAgICAgICAgICAgICAgPyBiYWxhbmNlLmNyZWRpdEFtb3VudCAtIHRvdGFsQW1vdW50XG4gICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGFwcGx5TWF4T3JkZXJzOiBiYWxhbmNlLmFwcGx5TWF4T3JkZXJzLFxuICAgICAgICAgICAgbWF4T3JkZXJzOiBiYWxhbmNlLm1heE9yZGVyc1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5uZXh0KGJhbGFuY2VEYXRhKTtcbiAgICB9XG5cbn1cbiJdfQ==
|
|
2029
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2NhcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSw0QkFBNEIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7Ozs7OztBQXdCeEksSUFBYSxXQUFXLEdBQXhCLE1BQWEsV0FBVztJQXNHcEIsWUFBb0IsVUFBNkIsRUFBVSxhQUEyQixFQUFVLE1BQWlCLEVBQ3JHLFdBQXdCLEVBQVUsVUFBK0IsRUFBVSxnQkFBa0MsRUFDN0cs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O1lBQzlDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtZQUNsQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLGdCQUFnQixFQUNaLE9BQU8sQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxXQUFXO2dCQUN0RixDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxXQUFXO2dCQUNwQyxDQUFDLENBQUMsQ0FBQztZQUNYLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUN0QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7U0FDL0IsQ0FBQztRQUVGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUVKLENBQUE7O1lBditEbUMsaUJBQWlCO1lBQXlCLFlBQVk7WUFBa0IsU0FBUztZQUN4RixXQUFXO1lBQXNCLG1CQUFtQjtZQUE0QixnQkFBZ0I7WUFDdkYsb0JBQW9CO1lBQ2xDLE1BQU07WUFDWSx3QkFBd0I7OztBQTFHckQsV0FBVztJQUh2QixVQUFVLENBQUM7UUFDUixVQUFVLEVBQUUsTUFBTTtLQUNyQixDQUFDO0dBQ1csV0FBVyxDQTZrRXZCO1NBN2tFWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Byb2R1Y3QnO1xuaW1wb3J0IHsgQ2FydEl0ZW0sIENhcnRJdGVtUHJpY2luZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FydC1pdGVtJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL2FwaS9jb25uZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi91dGlscy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENvdXBvbkkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvdXBvbic7XG5pbXBvcnQgeyBPcmRlclV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMvb3JkZXItdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IENoZWNrb3V0RGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlY2tvdXQtZGF0YSc7XG5pbXBvcnQgeyBDYXJ0QWZmb3JkYWJsZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FydC9jYXJ0LWFmZm9yZGFibGUnO1xuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4vYW5hbHl0aWNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblN0YXJ0LCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hhbm5lbCc7XG5pbXBvcnQgeyBDYXJ0VG90YWxQcmljaW5nVmFsdWUsIENhcnRUb3RhbHNQcmljaW5nIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jYXJ0LXRvdGFscyc7XG5pbXBvcnQgeyBDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uLCBDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uLCBQcmljZVByZXNlbnRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi91dGlscy9wcmljZS1wcmVzZW50YXRpb24uc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FydFJlc3BvbnNlQ29udGV4dCB7XG4gICAgdG9rZW46IHN0cmluZyB8IG51bGw7XG4gICAgZ2VuZXJhdGlvbjogbnVtYmVyO1xuICAgIHJlcXVlc3RJZDogbnVtYmVyO1xuICAgIGFsbG93VG9rZW5DaGFuZ2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIENhcnRTeW5jU3RhdHVzID0gJ3JlYWR5JyB8ICdzeW5jaW5nJyB8ICdpbnZhbGlkYXRlZCcgfCAnZXJyb3InIHwgJ2F1dGhlbnRpY2F0aW9uLWNoYW5nZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhcnRTeW5jU3RhdGUge1xuICAgIHN0YXR1czogQ2FydFN5bmNTdGF0dXM7XG4gICAgcmVhc29uPzogJ2NoZWNrb3V0LWludGVycnVwdGVkJyB8ICduZXR3b3JrJyB8ICdzZXJ2ZXInIHwgJ3Rva2VuLXVuYXZhaWxhYmxlJyB8ICdhdXRoZW50aWNhdGlvbicgfCAnaW52YWxpZC1yZXNwb25zZScgfCAnY2FydC1ub3QtYWN0aXZlJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYXJ0Q2hlY2tvdXRJbnZhbGlkYXRpb24ge1xuICAgIHRyYW5zaXRpb25JZDogc3RyaW5nO1xuICAgIHJlYXNvbjogJ2NoZWNrb3V0LWNvbXBsZXRlZCcgfCAnY2FydC1ub3QtYWN0aXZlJztcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDYXJ0U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBjYXJ0SXRlbXNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Q2FydEl0ZW1bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcbiAgICBwcml2YXRlIGNvdXBvblN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxhbnk+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgICBwcml2YXRlIGNhcnRTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8YW55PiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gICAgcHJpdmF0ZSByZXF1ZXN0SW5Qcm9jZXNzID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgcHJpdmF0ZSBjYXJ0U3luY1N0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FydFN5bmNTdGF0ZT4oeyBzdGF0dXM6ICdzeW5jaW5nJyB9KTtcbiAgICBwcml2YXRlIHByb21vdGlvbnNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Q2hlY2tvdXREYXRhW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG4gICAgcHJpdmF0ZSBjYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyByZWFzb246ICdpbmFjdGl2ZS10b2tlbi1yZXBsYWNlZCcgfT4oKTtcbiAgICBwcml2YXRlIGNhcnRDaGVja291dEludmFsaWRhdGlvblN1YmplY3QgPSBuZXcgU3ViamVjdDxDYXJ0Q2hlY2tvdXRJbnZhbGlkYXRpb24+KCk7XG5cbiAgICBwcml2YXRlIGJhbGFuY2VDdXN0b21lclN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgICAgIGFsbG93QW55UGF5bWVudE1ldGhvZD86IGJvb2xlYW47XG4gICAgICAgIGFsbG93RXhjZWVkQmFsYW5jZT86IGJvb2xlYW47XG4gICAgICAgIGNyZWRpdEFtb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgICAgIHNob3dNYXg/OiBib29sZWFuO1xuICAgICAgICBzaG93UHJpY2U/OiBib29sZWFuO1xuICAgICAgICByZW1haW5pbmdDcmVkaXRzPzogbnVtYmVyO1xuICAgICAgICBhcHBseU1heE9yZGVycz86IGJvb2xlYW47XG4gICAgICAgIG1heE9yZGVycz86IG51bWJlcjtcbiAgICB9IHwgbnVsbD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gICAgcHJpdmF0ZSBpdGVtcyA9IFtdO1xuICAgIHByaXZhdGUgcGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzOiBBcnJheTx7IHByb2R1Y3Q6IFByb2R1Y3Q7IHF1YW50aXR5OiBudW1iZXI7IHZhcmlhbnRJZDogYW55OyBjb21tZW50cz86IHN0cmluZyB9PiA9IFtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4UGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzID0gMTA7XG4gICAgcHJpdmF0ZSBwZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHNMaW1pdE5vdGlmaWVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwZW5kaW5nQm9vdHN0cmFwQ2FydEFkZEluRmxpZ2h0ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBwZW5kaW5nQm9vdHN0cmFwQ2FydFF1ZXVlR2VuZXJhdGlvbiA9IDA7XG5cbiAgICBwcml2YXRlIGNvdW50OiBudW1iZXIgPSAwO1xuICAgIHByaXZhdGUgbG9jYWxlID0gXCJcIjtcbiAgICBwcml2YXRlIGxvZ2dlZF9pbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgaGF2ZV90b191cGRhdGUgPSB0cnVlO1xuICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnOiBhbnkgPSB7fTtcbiAgICBwcml2YXRlIGNhcnRfYmFzZVVybCA9ICdzaG9wLWFwaS8nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJy9jYXJ0cyc7XG5cbiAgICBwdWJsaWMgY2FydEl0ZW1zQXBpID0gKCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIGFkZEl0ZW1BcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvaXRlbXMnICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBhZGRBbGxJdGVtc0FwaSA9ICgpID0+IHRoaXMuY2FydF9iYXNlVXJsICsgJy8nICsgdGhpcy5jYXJ0X3Rva2VuICsgJy9tdWx0aXBsZS1pdGVtcycgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIHVwZGF0ZUl0ZW1RdWFudGl0eUFwaSA9IChpdGVtX2lkKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvaXRlbXMvJyArIGl0ZW1faWQgKyAnP2xvY2FsZT0nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCk7XG4gICAgcHVibGljIGRlbGV0ZUl0ZW1BcGkgPSAoaXRlbV9pZCkgPT4gdGhpcy5jYXJ0X2Jhc2VVcmwgKyAnLycgKyB0aGlzLmNhcnRfdG9rZW4gKyAnL2l0ZW1zLycgKyBpdGVtX2lkICsgJz9sb2NhbGU9JyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpO1xuICAgIHB1YmxpYyBjb3Vwb25BcGkgPSAoKSA9PiB0aGlzLmNhcnRfYmFzZVVybCArICcvJyArIHRoaXMuY2FydF90b2tlbiArICcvY291cG9uJztcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2tBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvYWRkcmVzcy1ib29rJztcbiAgICBwdWJsaWMgdGF4ZXNBcGkgPSAoKSA9PiAnc2hvcC1hcGkvJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICcvY2FydHMvdGF4JztcblxuICAgIHB1YmxpYyBjYXJ0X3Rva2VuO1xuICAgIHByaXZhdGUgY2FydExpZmVjeWNsZUdlbmVyYXRpb24gPSAwO1xuICAgIHByaXZhdGUgY2FydFJlcXVlc3RJZCA9IDA7XG4gICAgcHJpdmF0ZSBsYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFN5bmNLZXkgPSAnX19lYXN5Y29tbWVyY2VfY2FydF9zeW5jX18nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFiSWQgPSBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZWVuQ2FydFN5bmNFdmVudHM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBjYXJ0U3luY0Jsb2NrZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGNhcnRTeW5jUmVhZGluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FydFN5bmNSZWFkQWdhaW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGNhcnRTeW5jVGltZXI6IGFueTtcbiAgICBwcml2YXRlIHBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjYXJ0Tm90QWN0aXZlUmVjb3Zlcnk6IHsgdG9rZW46IHN0cmluZzsgdHJhbnNpdGlvbklkOiBzdHJpbmc7IHByb21pc2U6IFByb21pc2U8Ym9vbGVhbj4gfSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBjYXJ0Tm90QWN0aXZlVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXI6IGFueTtcbiAgICBwcml2YXRlIGNhcnRCb290c3RyYXBMb29rdXBJbkZsaWdodCA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FydEJvb3RzdHJhcFBpY2t1cDogUHJvbWlzZTxib29sZWFuPiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgY2FydEJvb3RzdHJhcEFsbG93c1BlbmRpbmdBZGRzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICBwcml2YXRlIGNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb246IHsgbmF2aWdhdGlvbklkOiBudW1iZXIgfCBudWxsOyBjb21wbGV0ZWQ6IGJvb2xlYW4gfSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbGFzdFJvdXRlck5hdmlnYXRpb25JZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByb3V0ZXJOYXZpZ2F0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGNvbXBsZXRlZENoZWNrb3V0VHJhbnNpdGlvbklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGF1dGhDb250ZXh0QmxvY2tlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2hlY2tvdXRSZWNvdmVyeVRpbWVyOiBhbnk7XG4gICAgcHJpdmF0ZSBjaGVja291dEludmFsaWRhdGVkQXQgPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hlY2tvdXRSZWNvdmVyeVRpbWVvdXRNcyA9IDEwMDAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFJlcXVlc3RUaW1lb3V0TXMgPSAxNTAwMDtcbiAgICBwcml2YXRlIGF1dGhSZXRyeUFsbG93ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGF1dGhDb250ZXh0OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwZW5kaW5nR3Vlc3RDYXJ0QXNzb2NpYXRpb25Ub2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlTGlzdGVuZXIgPSAoZXZlbnQ6IFN0b3JhZ2VFdmVudCkgPT4gdGhpcy5oYW5kbGVTdG9yYWdlRXZlbnQoZXZlbnQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlzaWJpbGl0eUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHRoaXMuY2hlY2tQZW5kaW5nQ2FydFN5bmMoKTtcbiAgICB9O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZXNob3dMaXN0ZW5lciA9ICgpID0+IHRoaXMuY2hlY2tQZW5kaW5nQ2FydFN5bmMoKTtcbiAgICBwdWJsaWMgY2FydEl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKGl0ZW1zID0+IHRoaXMuc3dpdGNoUHJpY2VJbkNhcnRJdGVtKGl0ZW1zKSkpXG4gICAgcHVibGljIGNvdXBvbiA9IHRoaXMuY291cG9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgbG9hZGluZyA9IHRoaXMucmVxdWVzdEluUHJvY2Vzcy5hc09ic2VydmFibGUoKTtcbiAgICAvKiogRXN0YWRvIHF1ZSBwZXJtaXRlIGEgbG9zIGNvbnN1bWlkb3JlcyBkaWZlcmVuY2lhciBlbCBjYXJyaXRvIGxpc3RvIGRlIHVuYSByZWN1cGVyYWNpw7NuIHBlbmRpZW50ZSBvIGZhbGxpZGEuICovXG4gICAgcHVibGljIGNhcnRTeW5jU3RhdGUgPSB0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIC8qKiBFbWl0ZSDDum5pY2FtZW50ZSBzaSBlbCBib290c3RyYXAgZGVzY2FydMOzIHVuIHRva2VuIGluYWN0aXZvIHkgcmVjdXBlcsOzIG90cm8gY2Fycml0byBjb3JyZWN0YW1lbnRlLiAqL1xuICAgIHB1YmxpYyBjYXJ0Qm9vdHN0cmFwUmVjb3ZlcnkgPSB0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgLyoqIE5vdGlmaWNhIGFsIGNoZWNrb3V0IG1vbnRhZG8gY3VhbmRvIHNlIGludmFsaWRhIGVsIHRva2VuIHF1ZSBzdSBDYXJ0U2VydmljZSBlc3RhYmEgdXNhbmRvLiAqL1xuICAgIHB1YmxpYyBjYXJ0Q2hlY2tvdXRJbnZhbGlkYXRpb24gPSB0aGlzLmNhcnRDaGVja291dEludmFsaWRhdGlvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGNhcnQgPSB0aGlzLmNhcnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBwcm9tb3Rpb25zID0gdGhpcy5wcm9tb3Rpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgZGVsZXRpbmc6IEJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgYmFsYW5jZUN1c3RvbWVyJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgYWxsb3dBbnlQYXltZW50TWV0aG9kJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LmFsbG93QW55UGF5bWVudE1ldGhvZCA/PyBudWxsKSk7XG4gICAgcHVibGljIGFsbG93RXhjZWVkQmFsYW5jZSQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5hbGxvd0V4Y2VlZEJhbGFuY2UgPz8gbnVsbCkpO1xuICAgIHB1YmxpYyBjcmVkaXRBbW91bnQkID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXIkLnBpcGUobWFwKGRhdGEgPT4gZGF0YT8uY3JlZGl0QW1vdW50ID8/IG51bGwpKTtcbiAgICBwdWJsaWMgc2hvd01heCQgPSB0aGlzLmJhbGFuY2VDdXN0b21lciQucGlwZShtYXAoZGF0YSA9PiBkYXRhPy5zaG93TWF4ID8/IG51bGwpKTtcbiAgICBwdWJsaWMgc2hvd1ByaWNlJCA9IHRoaXMuYmFsYW5jZUN1c3RvbWVyJC5waXBlKG1hcChkYXRhID0+IGRhdGE/LnNob3dQcmljZSA/PyBudWxsKSk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbm5lY3Rpb246IENvbm5lY3Rpb25TZXJ2aWNlLCBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0U2VydmljZSwgcHJpdmF0ZSBjb25zdHM6IENvbnN0YW50cyxcbiAgICAgICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHByaXZhdGUgb3JkZXJVdGlsczogT3JkZXJVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSBhbmFseXRpY3NTZXJ2aWNlOiBBbmFseXRpY3NTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5uZWxDb25maWdTZXJ2aWNlOiBDaGFubmVsQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBwcmljZVByZXNlbnRhdGlvblNlcnZpY2U6IFByaWNlUHJlc2VudGF0aW9uU2VydmljZSkge1xuXG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLml0ZW1zID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydCcpKSB8fCBbXTtcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSB8fCBudWxsO1xuICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICB0aGlzLmxhc3RSb3V0ZXJOYXZpZ2F0aW9uSWQgPSB0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbj8uKCk/LmlkID8/IG51bGw7XG4gICAgICAgIHRoaXMucm91dGVyTmF2aWdhdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cz8uc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkgdGhpcy5sYXN0Um91dGVyTmF2aWdhdGlvbklkID0gZXZlbnQuaWQ7XG4gICAgICAgIH0pIHx8IG51bGw7XG4gICAgICAgIHRoaXMuY2hhbm5lbENvbmZpZ1NlcnZpY2UuY2hhbm5lbENvbmZpZyQuc3Vic2NyaWJlKHJlcyA9PiB0aGlzLmNoYW5uZWxDb25maWcgPSByZXMpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMuc3RvcmFnZUxpc3RlbmVyKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgdGhpcy5wYWdlc2hvd0xpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMudmlzaWJpbGl0eUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5jaGVja1BlbmRpbmdDYXJ0U3luYygpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmxvZ2dlZEluLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXh0Q29udGV4dCA9IHRoaXMuZ2V0QXV0aENvbnRleHQoKTtcbiAgICAgICAgICAgIGlmIChuZXh0Q29udGV4dCAhPT0gdGhpcy5hdXRoQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ29udGV4dCA9IEpTT04ucGFyc2UodGhpcy5hdXRoQ29udGV4dCB8fCAnW10nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBndWVzdFRva2VuID0gdGhpcy5jYXJ0X3Rva2VuIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNHdWVzdEl0ZW1zID0gdGhpcy5pdGVtcz8ubGVuZ3RoID4gMCB8fCB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGd1ZXN0VG9BdXRoZW50aWNhdGVkID0gIXByZXZpb3VzQ29udGV4dFswXSAmJiB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aFJldHJ5QWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChndWVzdFRvQXV0aGVudGljYXRlZCAmJiBndWVzdFRva2VuICYmIGhhc0d1ZXN0SXRlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nR3Vlc3RDYXJ0QXNzb2NpYXRpb25Ub2tlbiA9IGd1ZXN0VG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24rKztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSArK3RoaXMuY2FydFJlcXVlc3RJZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gZ3Vlc3RUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRfdG9rZW4nLCBndWVzdFRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENhcnRCeVRva2VuKGd1ZXN0VG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0d1ZXN0Q2FydEFzc29jaWF0aW9uVG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSAmJiAhbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFN5bmNCbG9ja2VkICYmIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QudmFsdWUuc3RhdHVzID09PSAnc3luY2luZycpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FydCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLnN0b3JhZ2VMaXN0ZW5lcik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlc2hvdycsIHRoaXMucGFnZXNob3dMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLnZpc2liaWxpdHlMaXN0ZW5lcik7XG4gICAgICAgIGlmICh0aGlzLmNhcnRTeW5jVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNhcnRTeW5jVGltZXIpO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNoZWNrb3V0UmVjb3ZlcnlUaW1lcik7XG4gICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnlUaW1lcik7XG4gICAgICAgIHRoaXMucm91dGVyTmF2aWdhdGlvblN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogQ29uc3VtZSBlbCBldmVudG8gZGUgYm9vdHN0cmFwIHVuYSBzb2xhIHZleiB5IHNvbG8gZHVyYW50ZSBsYSBuYXZlZ2FjacOzbiBxdWUgaW5pY2nDsyBsYSByZWN1cGVyYWNpw7NuLiAqL1xuICAgIHB1YmxpYyBjb25zdW1lQ2FydEJvb3RzdHJhcFJlY292ZXJ5KCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uO1xuICAgICAgICBpZiAoIXBlbmRpbmcgfHwgIXBlbmRpbmcuY29tcGxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFJlY292ZXJ5TmF2aWdhdGlvbiA9IG51bGw7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROYXZpZ2F0aW9uSWQgPSB0aGlzLmdldEN1cnJlbnRSb3V0ZXJOYXZpZ2F0aW9uSWQoKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmcubmF2aWdhdGlvbklkICE9PSBudWxsICYmIHBlbmRpbmcubmF2aWdhdGlvbklkID09PSBjdXJyZW50TmF2aWdhdGlvbklkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Q3VycmVudFJvdXRlck5hdmlnYXRpb25JZCA9ICgpOiBudW1iZXIgfCBudWxsID0+XG4gICAgICAgIHRoaXMucm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uPy4oKT8uaWQgPz8gdGhpcy5sYXN0Um91dGVyTmF2aWdhdGlvbklkO1xuXG4gICAgcHJpdmF0ZSBtYXJrQ2FydEJvb3RzdHJhcFJlY292ZXJ5UGVuZGluZyA9IChuYXZpZ2F0aW9uSWQ6IG51bWJlciB8IG51bGwpID0+IHtcbiAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uID0geyBuYXZpZ2F0aW9uSWQsIGNvbXBsZXRlZDogZmFsc2UgfTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjb21wbGV0ZUNhcnRCb290c3RyYXBSZWNvdmVyeSA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb24gfHwgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uLmNvbXBsZXRlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb24uY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlTdWJqZWN0Lm5leHQoeyByZWFzb246ICdpbmFjdGl2ZS10b2tlbi1yZXBsYWNlZCcgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgY3JlYXRlQ2FydFN5bmNJZCA9ICgpID0+IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YDtcblxuICAgIHByaXZhdGUgZ2V0QXV0aENvbnRleHQgPSAoKSA9PiBKU09OLnN0cmluZ2lmeShbXG4gICAgICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdKV1RfVE9LRU4nKSwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1VTRVInKSxcbiAgICAgICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0NVU1RPTUVSJyksIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdDSEFOTkVMJylcbiAgICBdKTtcblxuICAgIHByaXZhdGUgY2FydFRyYW5zaXRpb25JZEZvclRva2VuID0gKHRva2VuOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmICghdG9rZW4pIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgZmlyc3QgPSAyMTY2MTM2MjYxO1xuICAgICAgICBsZXQgc2Vjb25kID0gNTM4MTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2VuLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgY29kZSA9IHRva2VuLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgICAgICAgICAgZmlyc3QgPSBNYXRoLmltdWwoZmlyc3QgXiBjb2RlLCAxNjc3NzYxOSk7XG4gICAgICAgICAgICBzZWNvbmQgPSBNYXRoLmltdWwoc2Vjb25kLCAzMykgXiBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHsoZmlyc3QgPj4+IDApLnRvU3RyaW5nKDM2KX0tJHsoc2Vjb25kID4+PiAwKS50b1N0cmluZygzNil9YDtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBub3RpZnlDaGVja291dEludmFsaWRhdGlvbiA9ICh0cmFuc2l0aW9uSWQ6IHN0cmluZyB8IG51bGwsIHJlYXNvbjogQ2FydENoZWNrb3V0SW52YWxpZGF0aW9uWydyZWFzb24nXSwgdG9rZW4gPSB0aGlzLmNhcnRfdG9rZW4gfHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXRva2VuIHx8IHRva2VuICE9PSB0aGlzLmNhcnRfdG9rZW4gfHwgdGhpcy5jYXJ0VHJhbnNpdGlvbklkRm9yVG9rZW4odG9rZW4pICE9PSB0cmFuc2l0aW9uSWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYXJ0Q2hlY2tvdXRJbnZhbGlkYXRpb25TdWJqZWN0Lm5leHQoeyB0cmFuc2l0aW9uSWQsIHJlYXNvbiB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBwdWJsaXNoQ2FydFN5bmMgPSAodHlwZTogJ2NoYW5nZWQnIHwgJ2NoZWNrb3V0LWludmFsaWRhdGVkJyB8ICdjaGVja291dC1yZWFkeScgfCAnY2FydC1pbnZhbGlkYXRlZCcgfCAnY2FydC1yZWFkeScgfCAnY2FydC1yZWNvdmVyeS1mYWlsZWQnLCB0cmFuc2l0aW9uSWQ/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0geyBldmVudElkOiB0aGlzLmNyZWF0ZUNhcnRTeW5jSWQoKSwgdHlwZSwgc291cmNlSWQ6IHRoaXMudGFiSWQsIC4uLih0cmFuc2l0aW9uSWQgPyB7IHRyYW5zaXRpb25JZCB9IDoge30pIH07XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuY2FydFN5bmNLZXksIEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlU3RvcmFnZUV2ZW50ID0gKGV2ZW50OiBTdG9yYWdlRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gdGhpcy5jYXJ0U3luY0tleSAmJiBldmVudC5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgbGV0IHNpZ25hbDogYW55O1xuICAgICAgICAgICAgdHJ5IHsgc2lnbmFsID0gSlNPTi5wYXJzZShldmVudC5uZXdWYWx1ZSk7IH0gY2F0Y2ggKF8pIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVDYXJ0U3luYyhzaWduYWwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChbJ0pXVF9UT0tFTicsICdVU0VSJywgJ0NVU1RPTUVSJywgJ0NIQU5ORUwnXS5pbmRleE9mKGV2ZW50LmtleSkgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgICAgICBpZiAobmV4dENvbnRleHQgIT09IHRoaXMuYXV0aENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoUmV0cnlBbGxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZWNlaXZlQ2FydFN5bmMgPSAoc2lnbmFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFzaWduYWw/LmV2ZW50SWQgfHwgc2lnbmFsLnNvdXJjZUlkID09PSB0aGlzLnRhYklkIHx8IHRoaXMuc2VlbkNhcnRTeW5jRXZlbnRzLmluZGV4T2Yoc2lnbmFsLmV2ZW50SWQpID49IDApIHJldHVybjtcbiAgICAgICAgdGhpcy5zZWVuQ2FydFN5bmNFdmVudHMucHVzaChzaWduYWwuZXZlbnRJZCk7XG4gICAgICAgIGlmICh0aGlzLnNlZW5DYXJ0U3luY0V2ZW50cy5sZW5ndGggPiA1MCkgdGhpcy5zZWVuQ2FydFN5bmNFdmVudHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHRCbG9ja2VkKSByZXR1cm47XG4gICAgICAgIGlmIChzaWduYWwudHlwZSA9PT0gJ2NoZWNrb3V0LWludmFsaWRhdGVkJykge1xuICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBBbGxvd3NQZW5kaW5nQWRkcyA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbklkID0gc2lnbmFsLnRyYW5zaXRpb25JZCB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25JZCAmJiB0aGlzLmNvbXBsZXRlZENoZWNrb3V0VHJhbnNpdGlvbklkID09PSB0cmFuc2l0aW9uSWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkICYmIHRyYW5zaXRpb25JZCAmJiB0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkICE9PSB0cmFuc2l0aW9uSWQgJiYgIXNoYXJlZFRva2VuKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoZWNrb3V0SW52YWxpZGF0aW9uKHRyYW5zaXRpb25JZCwgJ2NoZWNrb3V0LWNvbXBsZXRlZCcpO1xuICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25JZCAmJiBzaGFyZWRUb2tlbiAmJiB0aGlzLmNhcnRUcmFuc2l0aW9uSWRGb3JUb2tlbihzaGFyZWRUb2tlbikgIT09IHRyYW5zaXRpb25JZCkge1xuICAgICAgICAgICAgICAgIC8vIExhIHNlw7FhbCBwZXJ0ZW5lY2UgYSB1biB0b2tlbiBwcmV2aW8uIE5vIGJvcnJhciBlbCBzdWNlc29yIHlcbiAgICAgICAgICAgICAgICAvLyByZWNvbmNpbGlhciBlbCBlc3RhZG8gZ3VhcmRhZG8gYWN0dWFsbWVudGUuXG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0cmFuc2l0aW9uSWQgJiYgc2hhcmVkVG9rZW4gJiYgdGhpcy5jYXJ0X3Rva2VuICYmIHNoYXJlZFRva2VuICE9PSB0aGlzLmNhcnRfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2goZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2hlY2tvdXRUcmFuc2l0aW9uSWQgPSB0cmFuc2l0aW9uSWQ7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRJbnZhbGlkYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgdHJ1ZSwgc2hhcmVkVG9rZW4gfHwgdGhpcy5jYXJ0X3Rva2VuIHx8IG51bGwpO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdpbnZhbGlkYXRlZCcpO1xuICAgICAgICAgICAgdGhpcy5zdGFydENoZWNrb3V0UmVjb3ZlcnlXYXRjaGRvZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaWduYWwudHlwZSA9PT0gJ2NoZWNrb3V0LXJlYWR5Jykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbklkID0gc2lnbmFsLnRyYW5zaXRpb25JZCB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2hlY2tvdXRUcmFuc2l0aW9uSWQgJiYgdHJhbnNpdGlvbklkICYmIHRoaXMuYWN0aXZlQ2hlY2tvdXRUcmFuc2l0aW9uSWQgIT09IHRyYW5zaXRpb25JZCkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWRDaGVja291dFRyYW5zaXRpb25JZCA9IHRyYW5zaXRpb25JZCB8fCB0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGVja291dFRyYW5zaXRpb25JZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNoZWNrb3V0UmVjb3ZlcnlUaW1lcik7XG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0SW52YWxpZGF0ZWRBdCA9IDA7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2godHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ25hbC50eXBlID09PSAnY2FydC1pbnZhbGlkYXRlZCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwQWxsb3dzUGVuZGluZ0FkZHMgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25JZCA9IHNpZ25hbC50cmFuc2l0aW9uSWQgfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hlY2tvdXRJbnZhbGlkYXRpb24odHJhbnNpdGlvbklkLCAnY2FydC1ub3QtYWN0aXZlJyk7XG4gICAgICAgICAgICBpZiAodHJhbnNpdGlvbklkICYmIHNoYXJlZFRva2VuICYmIHRoaXMuY2FydFRyYW5zaXRpb25JZEZvclRva2VuKHNoYXJlZFRva2VuKSAhPT0gdHJhbnNpdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQgPSB0cmFuc2l0aW9uSWQ7XG4gICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiA9IHRoaXMuY2FydF90b2tlbiB8fCBudWxsO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCB0cnVlLCBzaGFyZWRUb2tlbiB8fCB0aGlzLmNhcnRfdG9rZW4gfHwgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2ludmFsaWRhdGVkJywgJ2NhcnQtbm90LWFjdGl2ZScpO1xuICAgICAgICAgICAgdGhpcy5zdGFydENhcnROb3RBY3RpdmVSZWNvdmVyeVdhdGNoZG9nKHRyYW5zaXRpb25JZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ25hbC50eXBlID09PSAnY2FydC1yZWFkeScpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25JZCA9IHNpZ25hbC50cmFuc2l0aW9uSWQgfHwgbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQgJiYgdHJhbnNpdGlvbklkICE9PSB0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXIpO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnbmFsLnR5cGUgPT09ICdjYXJ0LXJlY292ZXJ5LWZhaWxlZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb25JZCA9IHNpZ25hbC50cmFuc2l0aW9uSWQgfHwgbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQgJiYgdHJhbnNpdGlvbklkICE9PSB0aGlzLmNhcnROb3RBY3RpdmVUcmFuc2l0aW9uSWQpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9IHRyYW5zaXRpb25JZDtcbiAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRva2VuID0gdGhpcy5jYXJ0Tm90QWN0aXZlVG9rZW4gfHwgdGhpcy5jYXJ0X3Rva2VuIHx8IG51bGw7XG4gICAgICAgICAgICBpZiAodGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXIpO1xuICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdlcnJvcicsICdjYXJ0LW5vdC1hY3RpdmUnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lnbmFsLnR5cGUgPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgLy8gTGEgw7psdGltYSBzZcOxYWwgZGUgb3RyYSBwZXN0YcOxYSBwdWVkZSBzZWd1aXIgZW4gbG9jYWxTdG9yYWdlIGFsXG4gICAgICAgICAgICAvLyBhYnJpciB1bmEgc2VzacOzbiBudWV2YS4gU2luIHRva2VuIG5vIGhheSByZXN1bWVuIHF1ZSByZWZyZXNjYXI7XG4gICAgICAgICAgICAvLyBkZWphciBxdWUgaW5pdGlhbGl6ZS9nZXRDYXJ0IGhhZ2EgZWwgYm9vdHN0cmFwIGV2aXRhIGludmFsaWRhclxuICAgICAgICAgICAgLy8gZWwgUE9TVCAvY2FydHMgcXVlIGVzdMOhIGluaWNpw6FuZG9zZSBlbiBwYXJhbGVsby5cbiAgICAgICAgICAgIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRSZWNvdmVyeVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIpO1xuICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uKys7XG4gICAgICAgICAgICB0aGlzLmxhc3RBcHBsaWVkQ2FydFJlcXVlc3RJZCA9ICsrdGhpcy5jYXJ0UmVxdWVzdElkO1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGNoZWNrUGVuZGluZ0NhcnRTeW5jID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm1hcmtJbnRlcnJ1cHRlZENoZWNrb3V0SWZFeHBpcmVkKCk7XG4gICAgICAgIGlmICh0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5jYXJ0U3luY0tleSk7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgICAgIHRyeSB7IHRoaXMucmVjZWl2ZUNhcnRTeW5jKEpTT04ucGFyc2UodmFsdWUpKTsgfSBjYXRjaCAoXykgeyB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgc2NoZWR1bGVDYXJ0UmVmcmVzaCA9IChjaGVja291dFJlYWR5OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgIHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24rKztcbiAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSArK3RoaXMuY2FydFJlcXVlc3RJZDtcbiAgICAgICAgaWYgKHRoaXMuY2FydFN5bmNUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2FydFN5bmNUaW1lcik7XG4gICAgICAgIHRoaXMuY2FydFN5bmNUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWZyZXNoQ2FydEZyb21CYWNrZW5kKGNoZWNrb3V0UmVhZHkpLCAwKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZWZyZXNoQ2FydEZyb21CYWNrZW5kID0gKGNoZWNrb3V0UmVhZHk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHRCbG9ja2VkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNhcnRTeW5jUmVhZGluZykge1xuICAgICAgICAgICAgdGhpcy5jYXJ0U3luY1JlYWRBZ2FpbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgdGhpcy5hdXRoQ29udGV4dCA9IHRoaXMuZ2V0QXV0aENvbnRleHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJyk7XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnaW52YWxpZGF0ZWQnLCAndG9rZW4tdW5hdmFpbGFibGUnKTtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24rKztcbiAgICAgICAgdGhpcy5jYXJ0X3Rva2VuID0gdG9rZW47XG4gICAgICAgIHRoaXMuY2FydFN5bmNSZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb247XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXRFcnJvck5vdEhhbmRsZXIoYHNob3AtYXBpLyR7dGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpfS9jYXJ0cy8ke3Rva2VufT9sb2NhbGU9JHt0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKX1gKVxuICAgICAgICAgICAgLnBpcGUodGltZW91dCh0aGlzLmNhcnRSZXF1ZXN0VGltZW91dE1zKSwgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNSZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydFN5bmNSZWFkQWdhaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U3luY1JlYWRBZ2FpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2goZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24pIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlIHx8IHRoaXMuaXNDYXJ0QnVzaW5lc3NFcnJvcihyZXNwb25zZSkgfHwgIXJlc3BvbnNlLnRva2VuVmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocmVzcG9uc2UuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGNoZWNrb3V0UmVhZHk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnaW52YWxpZC1yZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQ6IENhcnRSZXNwb25zZUNvbnRleHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLCBnZW5lcmF0aW9uLCByZXF1ZXN0SWQ6ICsrdGhpcy5jYXJ0UmVxdWVzdElkLCBhbGxvd1Rva2VuQ2hhbmdlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzcG9uc2UsIGNvbnRleHQsIGZhbHNlLCBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSByZXNwb25zZS5sb2NhbGUgfHwgdGhpcy5sb2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0UmVjb3ZlcnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdyZWFkeScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQ2FydEJvb3RzdHJhcFJlY292ZXJ5KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gY2hlY2tvdXRSZWFkeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdlcnJvcicsICdpbnZhbGlkLXJlc3BvbnNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uIHx8IHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChbNDAwLCA0MDQsIDQxMF0uaW5kZXhPZihlcnJvcj8uc3RhdHVzKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSA9PT0gdG9rZW4pIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdjYXJ0X3Rva2VuJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydF90b2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0UmVjb3ZlcnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdpbnZhbGlkYXRlZCcsICd0b2tlbi11bmF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yPy5zdGF0dXMgPT09IDQwMSB8fCBlcnJvcj8uc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHRCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoUmV0cnlBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpID09PSB0b2tlbikgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2NhcnRfdG9rZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2F1dGhlbnRpY2F0aW9uLWNoYW5nZWQnLCAnYXV0aGVudGljYXRpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gY2hlY2tvdXRSZWFkeTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFzb24gPSBlcnJvcj8uc3RhdHVzID49IDUwMCA/ICdzZXJ2ZXInIDogKGVycm9yPy5zdGF0dXMgPj0gNDAwICYmIGVycm9yPy5zdGF0dXMgPCA1MDAgJiYgZXJyb3I/LnN0YXR1cyAhPT0gNDI5ID8gJ2ludmFsaWQtcmVzcG9uc2UnIDogJ25ldHdvcmsnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2Vycm9yJywgcmVhc29uKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXRDYXJ0U3luY1N0YXRlID0gKHN0YXR1czogQ2FydFN5bmNTdGF0dXMsIHJlYXNvbj86IENhcnRTeW5jU3RhdGVbJ3JlYXNvbiddKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXR1cywgLi4uKHJlYXNvbiA/IHsgcmVhc29uIH0gOiB7fSkgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhcnRDaGVja291dFJlY292ZXJ5V2F0Y2hkb2cgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0UmVjb3ZlcnlUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2hlY2tvdXRSZWNvdmVyeVRpbWVyKTtcbiAgICAgICAgdGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMubWFya0ludGVycnVwdGVkQ2hlY2tvdXRJZkV4cGlyZWQoKSwgdGhpcy5jaGVja291dFJlY292ZXJ5VGltZW91dE1zKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBtYXJrSW50ZXJydXB0ZWRDaGVja291dElmRXhwaXJlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5IHx8ICF0aGlzLmNoZWNrb3V0SW52YWxpZGF0ZWRBdCB8fFxuICAgICAgICAgICAgRGF0ZS5ub3coKSAtIHRoaXMuY2hlY2tvdXRJbnZhbGlkYXRlZEF0IDwgdGhpcy5jaGVja291dFJlY292ZXJ5VGltZW91dE1zIHx8XG4gICAgICAgICAgICB0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyAhPT0gJ2ludmFsaWRhdGVkJykgcmV0dXJuO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2Vycm9yJywgJ2NoZWNrb3V0LWludGVycnVwdGVkJyk7XG4gICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBpbnZhbGlkYXRlTG9jYWxDYXJ0ID0gKGF1dGhDaGFuZ2VkOiBib29sZWFuLCBkaXNjYXJkVG9rZW4gPSBmYWxzZSwgZXhwZWN0ZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IHRoaXMuY2FydF90b2tlbiB8fCBudWxsKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24rKztcbiAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSArK3RoaXMuY2FydFJlcXVlc3RJZDtcbiAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IG51bGw7XG4gICAgICAgIGlmIChkaXNjYXJkVG9rZW4gJiYgZXhwZWN0ZWRUb2tlbiAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpID09PSBleHBlY3RlZFRva2VuKSBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICB0aGlzLmNhcnRTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5jb3Vwb25TdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMucHJvbW90aW9uc1N1YmplY3QubmV4dChbXSk7XG4gICAgICAgIHRoaXMudXBkYXRlQmFsYW5jZUF0dHJpYnV0ZXMobnVsbCk7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FydCcsICdbXScpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgIGlmIChhdXRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZXhwZWN0ZWRUb2tlbiAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpID09PSBleHBlY3RlZFRva2VuKSBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnY2FydF90b2tlbicpO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdhdXRoZW50aWNhdGlvbi1jaGFuZ2VkJywgJ2F1dGhlbnRpY2F0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzY2FyZFRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2ludmFsaWRhdGVkJyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFJlaW50ZW50YSB1bmEgbGVjdHVyYSBmYWxsaWRhLiBTaSBlbCB0b2tlbiB5YSBmdWUgaW52YWxpZGFkbywgbm8gY3JlYSBvdHJvIGNhcnJpdG8uICovXG4gICAgcHVibGljIHJldHJ5Q2FydFN5bmMgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyA9PT0gJ3N5bmNpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdHdWVzdENhcnRBc3NvY2lhdGlvblRva2VuICYmIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QudmFsdWUuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMucGVuZGluZ0d1ZXN0Q2FydEFzc29jaWF0aW9uVG9rZW47XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpIHx8IHRoaXMuY2FydF90b2tlbiAhPT0gdG9rZW4gfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSAhPT0gdG9rZW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICAgICAgdGhpcy5nZXRDYXJ0QnlUb2tlbih0b2tlbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwUmVxdWlyZWRGb3JSZXRyeSAmJiB0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0Q2FydEJvb3RzdHJhcFBpY2t1cCh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhcnRCb290c3RyYXBMb29rdXBSZXF1aXJlZEZvclJldHJ5ICYmIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QudmFsdWUuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBSZXF1aXJlZEZvclJldHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ3N5bmNpbmcnKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FydCh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiAmJiB0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiB8fCB0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeT8udG9rZW47XG4gICAgICAgICAgICBpZiAoIXRva2VuIHx8IHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zdGFydENhcnROb3RBY3RpdmVSZWNvdmVyeSh0b2tlbiwgdGhpcy5jYXJ0VHJhbnNpdGlvbklkRm9yVG9rZW4odG9rZW4pKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF1dGhSZXRyeUFsbG93ZWQgfHwgdGhpcy5hdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5hdXRoQ29udGV4dEJsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXV0aFJldHJ5QWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgICAgICB0aGlzLmdldENhcnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhcnRTeW5jU3RhdGVTdWJqZWN0LnZhbHVlLnN0YXR1cyAhPT0gJ2Vycm9yJyB8fCB0aGlzLmF1dGhDb250ZXh0ICE9PSB0aGlzLmdldEF1dGhDb250ZXh0KCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaCh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIC8qKiBSZWFudWRhIGV4cGzDrWNpdGFtZW50ZSB1biBjaGVja291dCBpbnRlcnJ1bXBpZG8gY29uc3VsdGFuZG8gL2NhcnRzIHNpbiB0b2tlbi4gKi9cbiAgICBwdWJsaWMgcmVjb3ZlckludGVycnVwdGVkQ2hlY2tvdXQgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICghdGhpcy5jaGVja291dEludmFsaWRhdGVkQXQgfHwgdGhpcy5jYXJ0U3luY1N0YXRlU3ViamVjdC52YWx1ZS5zdGF0dXMgIT09ICdlcnJvcicpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KHRydWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGVuZGluZ0NoZWNrb3V0UmVjb3ZlcnkgPSB0cnVlO1xuICAgICAgICB0aGlzLmdldENhcnQodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvKiogSW1waWRlIGVudmlhciBudWV2YXMgbXV0YWNpb25lcyBtaWVudHJhcyBsYSBwZXN0YcOxYSByZWNvbmNpbGlhIHVuYSBpbnZhbGlkYWNpw7NuIHJlbW90YS4gKi9cbiAgICBwdWJsaWMgY2FuTXV0YXRlQ2FydCA9ICgpID0+ICF0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCAmJiAhdGhpcy5jYXJ0U3luY0Jsb2NrZWQgJiYgISF0aGlzLmNhcnRfdG9rZW47XG5cbiAgICAvKiogQ29uZmlybWEgcXVlIGVsIHJlc3VtZW4gbGlzdG8geWEgcGVydGVuZWNlIGFsIGNvbnRleHRvIGRlIGF1dGVudGljYWNpw7NuIHZpZ2VudGUuICovXG4gICAgcHVibGljIGlzQ2FydFJlYWR5Rm9yQ3VycmVudEF1dGhDb250ZXh0ID0gKCkgPT5cbiAgICAgICAgdGhpcy5jYXJ0U3luY1N0YXRlU3ViamVjdC52YWx1ZS5zdGF0dXMgPT09ICdyZWFkeScgJiZcbiAgICAgICAgIXRoaXMuYXV0aENvbnRleHRCbG9ja2VkICYmXG4gICAgICAgICF0aGlzLmNhcnRTeW5jQmxvY2tlZCAmJlxuICAgICAgICAhdGhpcy5wZW5kaW5nR3Vlc3RDYXJ0QXNzb2NpYXRpb25Ub2tlbiAmJlxuICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID09PSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG5cbiAgICBwcml2YXRlIGRpc2NhcmRQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzID0gW107XG4gICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzTGltaXROb3RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydFF1ZXVlR2VuZXJhdGlvbisrO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGZsdXNoUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzLmxlbmd0aCB8fCB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkSW5GbGlnaHQgfHxcbiAgICAgICAgICAgICF0aGlzLmNhbk11dGF0ZUNhcnQoKSB8fCB0aGlzLnJlcXVlc3RJblByb2Nlc3MuZ2V0VmFsdWUoKSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMuc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcXVldWVHZW5lcmF0aW9uID0gdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydFF1ZXVlR2VuZXJhdGlvbjtcbiAgICAgICAgdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydEFkZEluRmxpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hZGRUb0NhcnQocGVuZGluZy5wcm9kdWN0LCBwZW5kaW5nLnF1YW50aXR5LCBwZW5kaW5nLnZhcmlhbnRJZCwgcGVuZGluZy5jb21tZW50cywgdHJ1ZSwgcXVldWVHZW5lcmF0aW9uKTtcbiAgICAgICAgLy8gTGFzIHZhbGlkYWNpb25lcyBsb2NhbGVzIHB1ZWRlbiB0ZXJtaW5hciBzaW4gaW5pY2lhciBIVFRQLiBTaWd1ZSBjb25cbiAgICAgICAgLy8gbGEgcHLDs3hpbWEgaW50ZW5jacOzbiBlbiB2ZXogZGUgZGVqYXIgZWwgcmVzdG8gcGVuZGllbnRlLlxuICAgICAgICBpZiAocXVldWVHZW5lcmF0aW9uID09PSB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0UXVldWVHZW5lcmF0aW9uICYmICF0aGlzLnJlcXVlc3RJblByb2Nlc3MuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydEFkZEluRmxpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZsdXNoUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIERldGVjdGEgZWwgY29udHJhdG8gZGUgY2Fycml0byBmaW5hbGl6YWRvIHNpbiB0cmF0YXIgb3Ryb3MgY29uZmxpY3RvcyBIVFRQIGNvbW8gaW52YWxpZGV6IGRlbCBjYXJyaXRvLiAqL1xuICAgIHB1YmxpYyBpc0NhcnROb3RBY3RpdmVFcnJvciA9IChlcnJvcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmIChlcnJvcj8uc3RhdHVzICE9PSA0MDkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgaGVhZGVyQ29kZSA9IGVycm9yPy5oZWFkZXJzPy5nZXQgPyBlcnJvci5oZWFkZXJzLmdldCgnWC1FcnJvci1Db2RlJykgOiBudWxsO1xuICAgICAgICBjb25zdCBib2R5ID0gZXJyb3I/LmVycm9yO1xuICAgICAgICBjb25zdCBib2R5Q29kZXMgPSB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgPyBbYm9keV0gOiBbXG4gICAgICAgICAgICBib2R5Py5jb2RlLCBib2R5Py5lcnJvckNvZGUsIGJvZHk/LmVycm9yX2NvZGUsXG4gICAgICAgICAgICB0eXBlb2YgYm9keT8uZXJyb3IgPT09ICdzdHJpbmcnID8gYm9keS5lcnJvciA6IGJvZHk/LmVycm9yPy5jb2RlLFxuICAgICAgICAgICAgYm9keT8ubWVzc2FnZSwgYm9keT8uZGV0YWlsLCBib2R5Py5bJ2h5ZHJhOmRlc2NyaXB0aW9uJ11cbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIGhlYWRlckNvZGUgPT09ICdDQVJUX05PVF9BQ1RJVkUnIHx8IGJvZHlDb2Rlcy5pbmRleE9mKCdDQVJUX05PVF9BQ1RJVkUnKSA+PSAwO1xuICAgIH07XG5cbiAgICAvKiogQ29uc3VtZSB1biBDQVJUX05PVF9BQ1RJVkUsIGludmFsaWRhIHNvbG8gZWwgdG9rZW4gZGUgZXNhIHNvbGljaXR1ZCBlIGluaWNpYSB1bmEgcmVjdXBlcmFjacOzbiDDum5pY2EuICovXG4gICAgcHVibGljIGhhbmRsZUNhcnRNdXRhdGlvbkVycm9yID0gKGVycm9yOiBhbnksIHJlcXVlc3RUb2tlbjogc3RyaW5nIHwgbnVsbCA9IHRoaXMuY2FydF90b2tlbiB8fCBudWxsKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc0NhcnROb3RBY3RpdmVFcnJvcihlcnJvcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcEFsbG93c1BlbmRpbmdBZGRzID0gZmFsc2U7XG4gICAgICAgIGlmICghcmVxdWVzdFRva2VuKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbklkID0gdGhpcy5jYXJ0VHJhbnNpdGlvbklkRm9yVG9rZW4ocmVxdWVzdFRva2VuKTtcbiAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5Py50b2tlbiA9PT0gcmVxdWVzdFRva2VuKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9PT0gdHJhbnNpdGlvbklkKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBjb25zdCBzaGFyZWRUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykgfHwgbnVsbDtcbiAgICAgICAgaWYgKHNoYXJlZFRva2VuICYmIHNoYXJlZFRva2VuICE9PSByZXF1ZXN0VG9rZW4pIHtcbiAgICAgICAgICAgIC8vIE90cm8gY29udGV4dG8geWEgYWRvcHTDsyB1biBzdWNlc29yLiBSZWNvbmNpbGlhcmxvIGVuIHZleiBkZSBpbnZhbGlkYXJsbyBvIGNyZWFyIG90cm8uXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoZWNrb3V0SW52YWxpZGF0aW9uKHRyYW5zaXRpb25JZCwgJ2NhcnQtbm90LWFjdGl2ZScsIHJlcXVlc3RUb2tlbik7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2goZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYXJlZFRva2VuICE9PSByZXF1ZXN0VG9rZW4pIHtcbiAgICAgICAgICAgIC8vIEVsIHRva2VuIGNvbXBhcnRpZG8geWEgZnVlIHJldGlyYWRvIHBvciBvdHJhIHBlc3Rhw7FhLCBxdWUgcHVkbyBjZXJyYXJzZVxuICAgICAgICAgICAgLy8gYW50ZXMgZGUgcHVibGljYXIgY2FydC1yZWFkeS4gRGVqYXIgZXN0ZSBjb250ZXh0byBpbnZhbGlkYWRvOyBlbCB3YXRjaGRvZ1xuICAgICAgICAgICAgLy8gaGFiaWxpdGEgZWwgcmVpbnRlbnRvIG1hbnVhbCwgc2luIHJlcGV0aXIgZXN0YSBtdXRhY2nDs24gbmkgY3JlYXIgb3RybyBjYXJyaXRvLlxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydF90b2tlbiA9PT0gcmVxdWVzdFRva2VuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGVja291dEludmFsaWRhdGlvbih0cmFuc2l0aW9uSWQsICdjYXJ0LW5vdC1hY3RpdmUnLCByZXF1ZXN0VG9rZW4pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRva2VuID0gcmVxdWVzdFRva2VuO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9IHRyYW5zaXRpb25JZDtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdpbnZhbGlkYXRlZCcsICdjYXJ0LW5vdC1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0Q2FydE5vdEFjdGl2ZVJlY292ZXJ5V2F0Y2hkb2codHJhbnNpdGlvbklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYXJ0Tm90QWN0aXZlVG9rZW4gPSByZXF1ZXN0VG9rZW47XG4gICAgICAgIHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCA9IHRyYW5zaXRpb25JZDtcbiAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hlY2tvdXRJbnZhbGlkYXRpb24odHJhbnNpdGlvbklkLCAnY2FydC1ub3QtYWN0aXZlJywgcmVxdWVzdFRva2VuKTtcbiAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCB0cnVlLCByZXF1ZXN0VG9rZW4pO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ3N5bmNpbmcnKTtcbiAgICAgICAgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NhcnQtaW52YWxpZGF0ZWQnLCB0cmFuc2l0aW9uSWQpO1xuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnY2FydC1ub3QtYWN0aXZlLXJlY292ZXJpbmcnKTtcbiAgICAgICAgdGhpcy5zdGFydENhcnROb3RBY3RpdmVSZWNvdmVyeShyZXF1ZXN0VG9rZW4sIHRyYW5zaXRpb25JZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBwcml2YXRlIHN0YXJ0Q2FydE5vdEFjdGl2ZVJlY292ZXJ5ID0gKGZhaWxlZFRva2VuOiBzdHJpbmcsIHRyYW5zaXRpb25JZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeT8udG9rZW4gPT09IGZhaWxlZFRva2VuKSByZXR1cm4gdGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnkucHJvbWlzZTtcbiAgICAgICAgY29uc3Qgc2hhcmVkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpIHx8IG51bGw7XG4gICAgICAgIGlmIChzaGFyZWRUb2tlbiAmJiBzaGFyZWRUb2tlbiAhPT0gZmFpbGVkVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgIGNvbnN0IGF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSwge30pLnBpcGUodGltZW91dCh0aGlzLmNhcnRSZXF1ZXN0VGltZW91dE1zKSkudG9Qcm9taXNlKClcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSwgdHJ1ZSwgZmFpbGVkVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbiAmJiBjdXJyZW50VG9rZW4gIT09IGZhaWxlZFRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVDYXJ0KHJlc3BvbnNlLCBjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnY2FydC1ub3QtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaENhcnRTeW5jKCdjYXJ0LXJlY292ZXJ5LWZhaWxlZCcsIHRyYW5zaXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0Tm90QWN0aXZlVHJhbnNpdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeVRpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2FydC1yZWFkeScsIHRyYW5zaXRpb25JZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSwgdHJ1ZSwgZmFpbGVkVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA9PT0gNDAxIHx8IGVycm9yPy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0QmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFJldHJ5QWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVUb2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlLCB0cnVlLCBmYWlsZWRUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnYXV0aGVudGljYXRpb24tY2hhbmdlZCcsICdhdXRoZW50aWNhdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2Vycm9yJywgZXJyb3I/LnN0YXR1cyA+PSA1MDAgPyAnc2VydmVyJyA6ICdjYXJ0LW5vdC1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2FydC1yZWNvdmVyeS1mYWlsZWQnLCB0cmFuc2l0aW9uSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeT8udG9rZW4gPT09IGZhaWxlZFRva2VuKSB0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeSA9IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeSA9IHsgdG9rZW46IGZhaWxlZFRva2VuLCB0cmFuc2l0aW9uSWQsIHByb21pc2UgfTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhcnRDYXJ0Tm90QWN0aXZlUmVjb3ZlcnlXYXRjaGRvZyA9ICh0cmFuc2l0aW9uSWQ6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVJlY292ZXJ5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLmNhcnROb3RBY3RpdmVSZWNvdmVyeVRpbWVyKTtcbiAgICAgICAgdGhpcy5jYXJ0Tm90QWN0aXZlUmVjb3ZlcnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FydE5vdEFjdGl2ZVRyYW5zaXRpb25JZCAhPT0gdHJhbnNpdGlvbklkIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0U3luY1N0YXRlU3ViamVjdC52YWx1ZS5zdGF0dXMgIT09ICdpbnZhbGlkYXRlZCcpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnY2FydC1ub3QtYWN0aXZlJyk7XG4gICAgICAgIH0sIHRoaXMuY2hlY2tvdXRSZWNvdmVyeVRpbWVvdXRNcyk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBnZXRDYXJ0MigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydEl0ZW1zU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzQm9vayA9IGFzeW5jICgpID0+XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5nZXQodGhpcy5hZGRyZXNzQm9va0FwaSgpKS5waXBlKG1hcChyZXMgPT4gcmVzPy5sZW5ndGggJiYgcmVzLm1hcChhZGRyZXMgPT4geyByZXR1cm4gYWRkcmVzICYmIHsgLi4uYWRkcmVzLCBzZWxlY3RlZDogYWRkcmVzLmRlZmF1bHQgfSB9KSB8fCBudWxsKSkudG9Qcm9taXNlKCk7XG5cbiAgICBwdWJsaWMgZ2V0VGF4ZXMgPSBhc3luYyAoKSA9PlxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLnRheGVzQXBpKCksIHsgdG9rZW46IHRoaXMuY2FydF90b2tlbiB9KS5zdWJzY3JpYmUocmVzID0+IHJlcylcblxuICAgIHByaXZhdGUgZ2V0Q2FydCA9IGFzeW5jIChjaGVja291dFJlY292ZXJ5ID0gZmFsc2UpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cEluRmxpZ2h0KSByZXR1cm47XG4gICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcEFsbG93c1BlbmRpbmdBZGRzID0gIWNoZWNrb3V0UmVjb3Zlcnk7XG4gICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzTGltaXROb3RpZmllZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuY2FydF90b2tlbiB8fCBudWxsO1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBQaWNrdXBSZXF1aXJlZEZvclJldHJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0Q2FydEJvb3RzdHJhcFBpY2t1cChjaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNhcHR1cmVDYXJ0UmVzcG9uc2VDb250ZXh0KGZhbHNlKTtcbiAgICAgICAgY29uc3QgYXV0aENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25JZCA9IHRoaXMuZ2V0Q3VycmVudFJvdXRlck5hdmlnYXRpb25JZCgpO1xuICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBJbkZsaWdodCA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ3N5bmNpbmcnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5nZXRFcnJvck5vdEhhbmRsZXIoXG4gICAgICAgICAgICBgc2hvcC1hcGkvJHt0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCl9L2NhcnRzLyR7dG9rZW59P2xvY2FsZT0ke3RoaXMuY29uc3RzLmdldExvY2FsZSgpfWBcbiAgICAgICAgKS5waXBlKHRpbWVvdXQodGhpcy5jYXJ0UmVxdWVzdFRpbWVvdXRNcykpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBJbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24gfHwgY29udGV4dC5yZXF1ZXN0SWQgIT09IHRoaXMuY2FydFJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VtZUNhcnRCb290c3RyYXBJZkludmFsaWRhdGVkKGNoZWNrb3V0UmVjb3ZlcnkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlLCB0cnVlLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydF90b2tlbiAhPT0gdG9rZW4gfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSAhPT0gdG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5hdXRoQ29udGV4dEJsb2NrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydChmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwUmVxdWlyZWRGb3JSZXRyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0Q2FydEJvb3RzdHJhcFBpY2t1cChjaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplQ2FydChyZXNwb25zZSwgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnaW52YWxpZC1yZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tvdXRSZWNvdmVyeSkgdGhpcy5maW5pc2hDaGVja291dENhcnRSZWNvdmVyeSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBJbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdlbmVyYXRpb24gIT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24gfHwgY29udGV4dC5yZXF1ZXN0SWQgIT09IHRoaXMuY2FydFJlcXVlc3RJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VtZUNhcnRCb290c3RyYXBJZkludmFsaWRhdGVkKGNoZWNrb3V0UmVjb3ZlcnkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENvbnRleHQgPSB0aGlzLmdldEF1dGhDb250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSwgdHJ1ZSwgdG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FydF90b2tlbiAhPT0gdG9rZW4gfHwgbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSAhPT0gdG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhcnRSZWZyZXNoKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuYXV0aENvbnRleHRCbG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrQ2FydEJvb3RzdHJhcFJlY292ZXJ5UGVuZGluZyhuYXZpZ2F0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRDYXJ0Qm9vdHN0cmFwUGlja3VwKGNoZWNrb3V0UmVjb3ZlcnksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KGZhbHNlLCB0cnVlLCB0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFya0NhcnRCb290c3RyYXBSZWNvdmVyeVBlbmRpbmcobmF2aWdhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwUmVxdWlyZWRGb3JSZXRyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRDYXJ0Qm9vdHN0cmFwUGlja3VwKGNoZWNrb3V0UmVjb3ZlcnksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LnN0YXR1cyA9PT0gNDAxIHx8IGVycm9yPy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBSZXF1aXJlZEZvclJldHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KHRydWUsIHRydWUsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2NhcmRQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCBjaGVja291dFJlY292ZXJ5ID8gJ2NoZWNrb3V0LWludGVycnVwdGVkJyA6IChlcnJvcj8uc3RhdHVzID49IDUwMCA/ICdzZXJ2ZXInIDogJ25ldHdvcmsnKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydENhcnRCb290c3RyYXBQaWNrdXAgPSAoY2hlY2tvdXRSZWNvdmVyeSA9IGZhbHNlLCByZWNvdmVyZWRJbmFjdGl2ZVRva2VuID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cCkgcmV0dXJuIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cDtcbiAgICAgICAgcmVjb3ZlcmVkSW5hY3RpdmVUb2tlbiA9IHJlY292ZXJlZEluYWN0aXZlVG9rZW4gfHwgISF0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb247XG4gICAgICAgIGNvbnN0IHNoYXJlZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSB8fCBudWxsO1xuICAgICAgICBpZiAoc2hhcmVkVG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcExvb2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaChmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdzeW5jaW5nJyk7XG4gICAgICAgIGNvbnN0IGF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dChmYWxzZSk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmNhcnRJdGVtc0FwaSgpLCBudWxsKS5waXBlKHRpbWVvdXQodGhpcy5jYXJ0UmVxdWVzdFRpbWVvdXRNcykpLnRvUHJvbWlzZSgpXG4gICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGF1dGhDb250ZXh0ICE9PSB0aGlzLmdldEF1dGhDb250ZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoQ29udGV4dCA9IHRoaXMuZ2V0QXV0aENvbnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBSZWNvdmVyeU5hdmlnYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludmFsaWRhdGVMb2NhbENhcnQodHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2VuZXJhdGlvbiAhPT0gdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbiB8fCBjb250ZXh0LnJlcXVlc3RJZCAhPT0gdGhpcy5jYXJ0UmVxdWVzdElkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNoYXJlZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2hhcmVkVG9rZW4gJiYgY3VycmVudFNoYXJlZFRva2VuICE9PSBjb250ZXh0LnRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2goZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsaXplQ2FydChyZXNwb25zZSwgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjYXJkUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnaW52YWxpZC1yZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwUmVxdWlyZWRGb3JSZXRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3ZlcmVkSW5hY3RpdmVUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2hhbmdlZCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlQ2FydEJvb3RzdHJhcFJlY292ZXJ5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaGVja291dFJlY292ZXJ5KSB0aGlzLmZpbmlzaENoZWNrb3V0Q2FydFJlY292ZXJ5KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXV0aENvbnRleHQgIT09IHRoaXMuZ2V0QXV0aENvbnRleHQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBQaWNrdXBSZXF1aXJlZEZvclJldHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFJlY292ZXJ5TmF2aWdhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52YWxpZGF0ZUxvY2FsQ2FydCh0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZW5lcmF0aW9uICE9PSB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uc3RhdHVzID09PSA0MDEgfHwgZXJyb3I/LnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBMb29rdXBSZXF1aXJlZEZvclJldHJ5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUmVjb3ZlcnlOYXZpZ2F0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZhbGlkYXRlTG9jYWxDYXJ0KHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydEJvb3RzdHJhcFBpY2t1cFJlcXVpcmVkRm9yUmV0cnkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2Vycm9yJywgY2hlY2tvdXRSZWNvdmVyeSA/ICdjaGVja291dC1pbnRlcnJ1cHRlZCcgOiAoZXJyb3I/LnN0YXR1cyA+PSA1MDAgPyAnc2VydmVyJyA6ICduZXR3b3JrJykpO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3ItcGFyYW0nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwID09PSByZXF1ZXN0KSB0aGlzLmNhcnRCb290c3RyYXBQaWNrdXAgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB0aGlzLnJlc3VtZUNhcnRCb290c3RyYXBJZkludmFsaWRhdGVkKGNoZWNrb3V0UmVjb3ZlcnkpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwID0gcmVxdWVzdDtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVzdW1lQ2FydEJvb3RzdHJhcElmSW52YWxpZGF0ZWQgPSAoY2hlY2tvdXRSZWNvdmVyeTogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYXV0aENvbnRleHRCbG9ja2VkICYmICF0aGlzLmNhcnRfdG9rZW4gJiYgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgJiZcbiAgICAgICAgICAgIHRoaXMuY2FydFN5bmNTdGF0ZVN1YmplY3QudmFsdWUuc3RhdHVzID09PSAnaW52YWxpZGF0ZWQnICYmXG4gICAgICAgICAgICAhdGhpcy5jYXJ0Tm90QWN0aXZlVG9rZW4gJiYgIXRoaXMucGVuZGluZ0NoZWNrb3V0UmVjb3ZlcnkpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FydChjaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGZpbmlzaENoZWNrb3V0Q2FydFJlY292ZXJ5ID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRJbnZhbGlkYXRlZEF0ID0gMDtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRSZWNvdmVyeVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5jaGVja291dFJlY292ZXJ5VGltZXIpO1xuICAgICAgICB0aGlzLmNvbXBsZXRlZENoZWNrb3V0VHJhbnNpdGlvbklkID0gdGhpcy5hY3RpdmVDaGVja291dFRyYW5zaXRpb25JZDtcbiAgICAgICAgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NoZWNrb3V0LXJlYWR5JywgdGhpcy5hY3RpdmVDaGVja291dFRyYW5zaXRpb25JZCk7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hlY2tvdXRUcmFuc2l0aW9uSWQgPSBudWxsO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGdldENhcnRCeVRva2VuID0gYXN5bmMgKHRva2VuID0gdGhpcy5jYXJ0X3Rva2VuKSA9PiB7XG4gICAgICAgIGlmICghdG9rZW4gfHwgdG9rZW4gIT09IHRoaXMuY2FydF90b2tlbiB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FydF90b2tlbicpICE9PSB0b2tlbikgcmV0dXJuO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dChmYWxzZSk7XG4gICAgICAgIGNvbnN0IGF1dGhDb250ZXh0ID0gdGhpcy5nZXRBdXRoQ29udGV4dCgpO1xuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuY2FydEl0ZW1zQXBpKCksIHsgdG9rZW4gfSkucGlwZSh0aW1lb3V0KHRoaXMuY2FydFJlcXVlc3RUaW1lb3V0TXMpKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpIHx8IGNvbnRleHQuZ2VuZXJhdGlvbiAhPT0gdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbiB8fCB0aGlzLmNhcnRfdG9rZW4gIT09IHRva2VuKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nR3Vlc3RDYXJ0QXNzb2NpYXRpb25Ub2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVDYXJ0KHJlcywgY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdHdWVzdENhcnRBc3NvY2lhdGlvblRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnZXJyb3InLCAnaW52YWxpZC1yZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhdXRoQ29udGV4dCAhPT0gdGhpcy5nZXRBdXRoQ29udGV4dCgpIHx8IGNvbnRleHQuZ2VuZXJhdGlvbiAhPT0gdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbiB8fCB0aGlzLmNhcnRfdG9rZW4gIT09IHRva2VuKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdHdWVzdENhcnRBc3NvY2lhdGlvblRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdlcnJvcicsIGVycm9yPy5zdGF0dXMgPT09IDQwMSB8fCBlcnJvcj8uc3RhdHVzID09PSA0MDMgPyAnYXV0aGVudGljYXRpb24nIDogKGVycm9yPy5zdGF0dXMgPj0gNTAwID8gJ3NlcnZlcicgOiAnbmV0d29yaycpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYXJ0QnlDdXN0b21lciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FwdHVyZUNhcnRSZXNwb25zZUNvbnRleHQoZmFsc2UpO1xuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0Q2FydFN5bmNTdGF0ZSgnc3luY2luZycpO1xuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5jYXJ0SXRlbXNBcGkoKSkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHRoaXMuaW5pdGlhbGl6ZUNhcnQocmVzLCBjb250ZXh0KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqICBDQVJUIENSVUQgU0VSVkVSJ1MgU1lOQ1JPTklaRURcbiAgICAgKi9cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZUNhcnQgPSAocmVzcG9uc2UsIGNvbnRleHQ6IENhcnRSZXNwb25zZUNvbnRleHQpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFwcGx5Q2FydFJlc3BvbnNlKHJlc3BvbnNlLCBjb250ZXh0LCBmYWxzZSwgZmFsc2UsIGZhbHNlKSkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9jYWxlID0gcmVzcG9uc2UubG9jYWxlO1xuICAgICAgICB0aGlzLmNhcnRTeW5jQmxvY2tlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ3JlYWR5Jyk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5mbHVzaFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogQ2FwdHVyYSBsYSBnZW5lcmFjacOzbiBkZWwgY2ljbG8gZGVsIGNhcnJpdG8geSBlbCBvcmRlbiBkZSBpbmljaW8gZGUgbGEgcGV0aWNpw7NuLiAqL1xuICAgIHB1YmxpYyBjYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCA9IChhbGxvd1Rva2VuQ2hhbmdlID0gdHJ1ZSk6IENhcnRSZXNwb25zZUNvbnRleHQgPT4gKHtcbiAgICAgICAgdG9rZW46IHRoaXMuY2FydF90b2tlbiB8fCBudWxsLFxuICAgICAgICBnZW5lcmF0aW9uOiB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uLFxuICAgICAgICByZXF1ZXN0SWQ6ICsrdGhpcy5jYXJ0UmVxdWVzdElkLFxuICAgICAgICBhbGxvd1Rva2VuQ2hhbmdlXG4gICAgfSk7XG5cbiAgICBwdWJsaWMgaXNDYXJ0UmVzcG9uc2VDb250ZXh0Q3VycmVudCA9IChjb250ZXh0OiBDYXJ0UmVzcG9uc2VDb250ZXh0KTogYm9vbGVhbiA9PiAhIWNvbnRleHQgJiZcbiAgICAgICAgY29udGV4dC5nZW5lcmF0aW9uID09PSB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uICYmXG4gICAgICAgIChjb250ZXh0LmFsbG93VG9rZW5DaGFuZ2UgfHwgY29udGV4dC50b2tlbiA9PT0gKHRoaXMuY2FydF90b2tlbiB8fCBudWxsKSkgJiZcbiAgICAgICAgY29udGV4dC5yZXF1ZXN0SWQgPj0gdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQ7XG5cbiAgICBwdWJsaWMgaXNDYXJ0QnVzaW5lc3NFcnJvciA9IChyZXNwb25zZTogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3BvbnNlPy5lcnJvcnM7XG4gICAgICAgIHJldHVybiAhIShyZXNwb25zZT8uZXJyb3IgfHwgcmVzcG9uc2U/LmNvZGUgfHwgKEFycmF5LmlzQXJyYXkoZXJyb3JzKSA/IGVycm9ycy5sZW5ndGggPiAwIDogZXJyb3JzKSB8fFxuICAgICAgICAgICAgcmVzcG9uc2U/LnN0YXR1cyA9PT0gJ2ZhaWx1cmUnIHx8IHJlc3BvbnNlPy5jYXJ0X3Jlc3BvbnNlPy5zdGF0dXMgPT09ICdmYWlsdXJlJyB8fFxuICAgICAgICAgICAgcmVzcG9uc2U/LmNhcnQ/LmVycm9yIHx8IHJlc3BvbnNlPy5jYXJ0Py5zdGF0dXMgPT09ICdmYWlsdXJlJyk7XG4gICAgfVxuXG4gICAgLyoqIEFkb3B0YSB5IHNpbmNyb25pemEgdW4gcmVzdW1lbiBleGl0b3NvIHNpIHRvZGF2w61hIHBlcnRlbmVjZSBhIGxhIHZlcnNpw7NuIHZpZ2VudGUgZGVsIGNhcnJpdG8uICovXG4gICAgcHVibGljIGFwcGx5Q2FydFJlc3BvbnNlID0gKHJlc3BvbnNlOiBhbnksIGNvbnRleHQ6IENhcnRSZXNwb25zZUNvbnRleHQsIGVtaXRFdmVudCA9IHRydWUsIHB1Ymxpc2hJbnZhbGlkYXRpb24gPSB0cnVlLCBmbHVzaFBlbmRpbmdBZGRzID0gdHJ1ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0NhcnRCdXNpbmVzc0Vycm9yKHJlc3BvbnNlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBjYXJ0ID0gcmVzcG9uc2U/LmNhcnQgJiYgcmVzcG9uc2UuY2FydC50b2tlblZhbHVlID8gcmVzcG9uc2UuY2FydCA6IHJlc3BvbnNlO1xuICAgICAgICBpZiAoIWNhcnQgfHwgIWNhcnQudG9rZW5WYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShjYXJ0Lml0ZW1zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBVbmEgcmVzcHVlc3RhIGRlIHVuIGNpY2xvIGFudGVyaW9yIChwb3IgZWplbXBsbywgYW50ZXMgZGVsIGNoZWNrb3V0IG9cbiAgICAgICAgLy8gZGUgdW5hIGludmFsaWRhY2nDs24gcmVtb3RhKSBubyBkZWJlIHZvbHZlciBhIGFjdGl2YXIgbGEgc2luY3Jvbml6YWNpw7NuLlxuICAgICAgICBpZiAoIWNvbnRleHQgfHwgY29udGV4dC5nZW5lcmF0aW9uICE9PSB0aGlzLmNhcnRMaWZlY3ljbGVHZW5lcmF0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHNoYXJlZFRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRfdG9rZW4nKSB8fCBudWxsO1xuICAgICAgICBpZiAoc2hhcmVkVG9rZW4gIT09IGNvbnRleHQudG9rZW4pIHtcbiAgICAgICAgICAgIC8vIE90cmEgcGVzdGHDsWEgeWEgYXZhbnrDsyBlbCB0b2tlbiBjb21wYXJ0aWRvLiBMYSBtdXRhY2nDs24gcHVkb1xuICAgICAgICAgICAgLy8gZWplY3V0YXJzZSwgYXPDrSBxdWUgcmVjb25jaWxpYW1vcyBkZXNkZSBlc2UgdG9rZW4gc2luIGFkb3B0YXJsYS5cbiAgICAgICAgICAgIGlmIChwdWJsaXNoSW52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NoYW5nZWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2godGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGEgbXV0YWNpw7NuIHB1ZG8gZWplY3V0YXJzZSBlbiBiYWNrZW5kLCBhdW5xdWUgb3RyYSByZXNwdWVzdGEgbcOhcyBudWV2YVxuICAgICAgICAvLyB5YSBoYXlhIHNpZG8gYXBsaWNhZGEgbG9jYWxtZW50ZS4gSW52YWxpZGFtb3MgeSBsZWVtb3MgZWwgdG9rZW4gdmlnZW50ZS5cbiAgICAgICAgaWYgKGNvbnRleHQucmVxdWVzdElkIDwgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgIGlmIChwdWJsaXNoSW52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NoYW5nZWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlQ2FydFJlZnJlc2godGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmlzQ2FydFJlc3BvbnNlQ29udGV4dEN1cnJlbnQoY29udGV4dCkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoY2FydC50b2tlblZhbHVlICE9PSB0aGlzLmNhcnRfdG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY2FydF90b2tlbiA9IGNhcnQudG9rZW5WYWx1ZTtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0X3Rva2VuJywgY2FydC50b2tlblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHVibGlzaEludmFsaWRhdGlvbikgdGhpcy5wdWJsaXNoQ2FydFN5bmMoJ2NoYW5nZWQnKTtcbiAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSBjb250ZXh0LnJlcXVlc3RJZDtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQsIGVtaXRFdmVudCk7XG4gICAgICAgIHRoaXMuc3luY0NhcnRJdGVtc0Zyb21SZXNwb25zZShjYXJ0KTtcbiAgICAgICAgdGhpcy5jYXJ0U3luY0Jsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRDYXJ0U3luY1N0YXRlKCdyZWFkeScpO1xuICAgICAgICBpZiAoZmx1c2hQZW5kaW5nQWRkcykgdGhpcy5mbHVzaFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWFzaWduYSBgcHJvZHVjdC5wcmljZWAgYWwgcHJlY2lvIGJhc2UgbGVnYWN5IHF1ZSBlc3BlcmEgZWwgdGVtcGxhdGUgaGlzdMOzcmljbyBkZWwgY2Fycml0by5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyDDjXRlbXMgbm9ybWFsaXphZG9zIGRlbCBjYXJyaXRvLlxuICAgICAqIEByZXR1cm5zIExvcyBtaXNtb3Mgw610ZW1zIGNvbiBgcHJvZHVjdC5wcmljZWAgYWxpbmVhZG8gYWwgcHJlY2lvIGJhc2UgbW9zdHJhZG8gZW4gbGEgdGFibGEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVzdGUgbcOpdG9kbyBubyBtb2RpZmljYSBgcHJpY2luZy5maW5hbFByaWNlYC4gU29sbyBwcmVzZXJ2YSBjb21wYXRpYmlsaWRhZCBjb24gdGVtcGxhdGVzXG4gICAgICogdmllam9zIHF1ZSB0b2RhdsOtYSBsZWVuIGBpdGVtLnByb2R1Y3QucHJpY2VgIGRpcmVjdGFtZW50ZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN3aXRjaFByaWNlSW5DYXJ0SXRlbSA9IChpdGVtczogQ2FydEl0ZW1bXSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKFxuICAgICAgICAgICAgaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmljaW5nID0gdGhpcy5nZXRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFyaWFudCA9IGl0ZW0ucHJvZHVjdC52YXJpYW50cz8uWzBdO1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnByb2R1Y3QucHJpY2UgPSBwcmljaW5nPy5iYXNlUHJpY2UgfHwgdmFyaWFudD8uc2FsZXByaWNlIHx8IHZhcmlhbnQ/LnByaWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICApXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGVwQ2FydCA9IChyZXMpID0+IHtcbiAgICAgICAgcmVzLml0ZW1zLmxlbmd0aCA+IDAgJiYgcmVzLml0ZW1zLmZvckVhY2goXG4gICAgICAgICAgICBpdGVtID0+ICF0aGlzLmlzSXRlbUluTG9jYWwoaXRlbS5pZCkgJiYgdGhpcy5kZWxldGVDYXJ0SXRlbShpdGVtLCBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hZGRBbGxUb0NhcnQoXG4gICAgICAgICAgICB0aGlzLml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgICBpdGVtID0+ICFyZXMuaXRlbXMuc29tZShleHRlcm5hbF9pdGVtID0+IGV4dGVybmFsX2l0ZW0uaWQgPT0gaXRlbS5pdGVtX2lkKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYXJ0SXRlbXMgPSAoaXRlbXMpID0+IHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICB0aGlzLmNvdW50ID0gaXRlbXMubGVuZ3RoO1xuICAgICAgICB0aGlzLmNhcnRJdGVtc1N1YmplY3QubmV4dCh0aGlzLml0ZW1zKTtcbiAgICAgICAgdGhpcy51cGRhdGVMb2NhbENhcnQoKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpbmNyb25pemEgYGNhcnRJdGVtc1N1YmplY3RgIGNvbiBsYSDDumx0aW1hIHJlc3B1ZXN0YSBkZWwgYmFja2VuZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXJ0IFJlc3B1ZXN0YSBkZSBjYXJyaXRvIHJlY2liaWRhIGRlc2RlIGN1YWxxdWllciBlbmRwb2ludCBxdWUgZGV2dWVsdmEgYGl0ZW1zYC5cbiAgICAgKiBAcmV0dXJucyBgdm9pZGBcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU2UgcmV1dGlsaXphIGRlc3B1w6lzIGRlIGFjdHVhbGl6YXIgY2FudGlkYWRlcywgYXBsaWNhciBjdXDDs24gbyByZW1vdmVyIHByb2R1Y3RvcyBwYXJhIGV2aXRhclxuICAgICAqIHF1ZSBsYSB0YWJsYSBxdWVkZSBjb24gc3VidG90YWxlcyBvIHByb21vY2lvbmVzIGRlc2FjdHVhbGl6YWRhcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN5bmNDYXJ0SXRlbXNGcm9tUmVzcG9uc2UgPSAoY2FydCkgPT4ge1xuICAgICAgICBpZiAoIWNhcnQ/Lml0ZW1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c0l0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTtcbiAgICAgICAgY29uc3QgbmV4dEl0ZW1zID0gdGhpcy50cmFuc2Zvcm1JdGVtcyhjYXJ0Lml0ZW1zKS5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtOiBhbnkgPSBwcmV2aW91c0l0ZW1zLmZpbmQocHJldiA9PiBwcmV2Lml0ZW1faWQgPT0gaXRlbS5pdGVtX2lkKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4ucHJldmlvdXNJdGVtLFxuICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgZmFpbGVkOiBwcmV2aW91c0l0ZW0/LmZhaWxlZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogcHJldmlvdXNJdGVtPy5lcnJvclxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXMobmV4dEl0ZW1zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNhcnRJdGVtUXVhbnRpdHkgPSAodmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkQ29tbWVudHMgPSBjb21tZW50cyAhPT0gdW5kZWZpbmVkID8gKGNvbW1lbnRzID8/ICcnKS50cmltKCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgbmV3SXRlbXMgPSB0aGlzLml0ZW1zLm1hcChpdCA9PiB7XG4gICAgICAgICAgICBpZiAoaXQudmFyaWFudF9pZCAhPT0gdmFyaWFudF9pZCkgcmV0dXJuIGl0O1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZDogYW55ID0geyAuLi5pdCwgcXVhbnRpdHk6IE51bWJlcihxdWFudGl0eSkgfTtcbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkQ29tbWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZWQuY29tbWVudHMgPSBub3JtYWxpemVkQ29tbWVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5pdGVtcyA9IG5ld0l0ZW1zO1xuICAgICAgICB0aGlzLmNhcnRJdGVtc1N1YmplY3QubmV4dCh0aGlzLml0ZW1zKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsQ2FydCgpO1xuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC11cGRhdGVkJywgeyBxdWFudGl0eSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGVuZFRvQ2FydCA9IChjYXJ0KSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FydE9iaihjYXJ0KTtcbiAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKGNhcnQpO1xuICAgICAgICAvLyAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdC1hZGRlZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlQ2FydEl0ZW0gPSAoY2FydCwgcHJvZHVjdCwgdG9hc3QgPSB0cnVlLCBhbHJlYWR5U3luY2hyb25pemVkID0gZmFsc2UpID0+IHtcbiAgICAgICAgaWYgKCFhbHJlYWR5U3luY2hyb25pemVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcnRPYmooY2FydCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zeW5jQ2FydEl0ZW1zRnJvbVJlc3BvbnNlKGNhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRvYXN0ICYmIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgdG9hc3QgJiYgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtcmVtb3ZlZCcpO1xuICAgICAgICAvLyB0aGlzLmdvb2dsZUFuYWx5dGljcy5yZW1vdmVGcm9tQ2FydChwcm9kdWN0KTtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgncmVtb3ZlX2Zyb21fY2FydCcsIHsgLi4ucHJvZHVjdCwgY3VycmVuY3k6IHRoaXMuY29uc3RzLmN1cnJlbmN5LmNvZGUgfSlcblxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkSWZBbGxyZWFkeUV4aXN0cyA9IChwcm9kdWN0LCB2YXJpYW50X2lkLCBxdWFudGl0eUFkZCA9IDEsIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT5cbiAgICAgICAgdGhpcy5pdGVtcy5maW5kKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ucHJvZHVjdC5pZCA9PSBwcm9kdWN0LmlkICYmIGl0ZW0udmFyaWFudF9pZCA9PSB2YXJpYW50X2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtUXVhbnRpdHkoaXRlbSwgdGhpcy5maW5kSXRlbShwcm9kdWN0LmlkKS5xdWFudGl0eSArIHF1YW50aXR5QWRkLCBjb21tZW50cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgcHJpdmF0ZSB1cGRhdGVMb2NhbENhcnQgPSAoKSA9PiB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5pdGVtcykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXRDYXJ0ID0gKG5leHQ/KSA9PiB7XG4gICAgICAgIHRoaXMuZGlzY2FyZFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICB0aGlzLmNhcnRCb290c3RyYXBBbGxvd3NQZW5kaW5nQWRkcyA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0b2tlblRvUmVzZXQgPSB0aGlzLmNhcnRfdG9rZW4gfHwgbnVsbDtcbiAgICAgICAgdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbisrO1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY2FydFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy51cGRhdGVCYWxhbmNlQXR0cmlidXRlcyhudWxsKTtcbiAgICAgICAgdGhpcy5jb3Vwb25TdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMucHJvbW90aW9uc1N1YmplY3QubmV4dChbXSk7XG4gICAgICAgIHRoaXMuY2FydF90b2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnQnLCBcIltdXCIpO1xuICAgICAgICBpZiAodG9rZW5Ub1Jlc2V0ICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykgPT09IHRva2VuVG9SZXNldCkgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2NhcnRfdG9rZW4nKTtcbiAgICAgICAgbmV4dCAmJiBuZXh0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDYXJ0T2JqID0gKGNhcnQsIGVtaXRFdmVudCA9IHRydWUpOiBib29sZWFuID0+IHtcbiAgICAgICAgdGhpcy5jYXJ0U3ViamVjdC5uZXh0KGNhcnQpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKGNhcnQ/LmJhbGFuY2VDdXN0b21lciwgY2FydD8udG90YWxzPy50b3RhbCk7XG4gICAgICAgIGVtaXRFdmVudCAmJiB0aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCdhZGRfdG9fY2FydCcsIGNhcnQpO1xuICAgICAgICB0aGlzLnByb21vdGlvbnNTdWJqZWN0Lm5leHQodGhpcy5vcmRlclV0aWxzLmdldFByb21vdGlvbnMoY2FydCwgdHJ1ZSkpO1xuXG4gICAgICAgIGNhcnQuY291cG9uQ29kZVxuICAgICAgICAgICAgPyB0aGlzLmZvcm1hdENvdXBvbihjYXJ0KVxuICAgICAgICAgICAgOiB0aGlzLmNvdXBvblN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlQ2FydEFmdGVyUGF5bWVudFJlc3BvbnNlID0gKGNhcnQ6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoIWNhcnQ/LnRvdGFscykgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVDYXJ0T2JqKGNhcnQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSXRlbUluTG9jYWwgPSAoaXRlbV9pZCkgPT4gdGhpcy5pdGVtcy5zb21lKGl0ZW0gPT4gaXRlbS5pdGVtX2lkID09IGl0ZW1faWQpO1xuXG4gICAgLyoqXG4gICAgICogIEBwdWJsaWNcbiAgICAgKiAgQ0FSVCBDUlVEXG4gICAgICovXG5cbiAgICBhZGRUb0NhcnQgPSAocHJvZHVjdDogUHJvZHVjdCwgcXVhbnRpdHk6IG51bWJlciwgdmFyaWFudF9pZCwgY29tbWVudHM/OiBzdHJpbmcsIGZyb21Cb290c3RyYXBRdWV1ZSA9IGZhbHNlLCBxdWV1ZUdlbmVyYXRpb24/OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbk11dGF0ZUNhcnQoKSkge1xuICAgICAgICAgICAgLy8gRWwgYWdyZWdhZG8gYcO6biBubyBzZSBlbnZpw7MgYWwgYmFja2VuZC4gUmV0ZW5lcmxvIGR1cmFudGUgZWxcbiAgICAgICAgICAgIC8vIGJvb3RzdHJhcCBldml0YSBwZXJkZXIgZWwgcHJpbWVyIGNsaWNrIGRlc3B1w6lzIGRlIEY1LCBzaW5cbiAgICAgICAgICAgIC8vIGhhYmlsaXRhciBtdXRhY2lvbmVzIGR1cmFudGUgdW5hIGludmFsaWRhY2nDs24gbyB1biBlcnJvci5cbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnRCb290c3RyYXBBbGxvd3NQZW5kaW5nQWRkcyAmJiAhdGhpcy5hdXRoQ29udGV4dEJsb2NrZWQgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5jYXJ0Qm9vdHN0cmFwTG9va3VwSW5GbGlnaHQgfHwgdGhpcy5jYXJ0Qm9vdHN0cmFwUGlja3VwKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcy5sZW5ndGggPj0gdGhpcy5tYXhQZW5kaW5nQm9vdHN0cmFwQ2FydEFkZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkc0xpbWl0Tm90aWZpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzTGltaXROb3RpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcy5wdXNoKHsgcHJvZHVjdCwgcXVhbnRpdHksIHZhcmlhbnRJZDogdmFyaWFudF9pZCwgY29tbWVudHMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RJblByb2Nlc3MuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QudmFsdWU7XG4gICAgICAgIGNvbnN0IGFwcGx5TWF4T3JkZXJzID0gYmFsYW5jZT8uYXBwbHlNYXhPcmRlcnMgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1heE9yZGVycyA9IGJhbGFuY2U/Lm1heE9yZGVycyA/PyBJbmZpbml0eTtcblxuICAgICAgICBpZiAoYXBwbHlNYXhPcmRlcnMgJiYgKG1heE9yZGVycyA8PSAwIHx8IG1heE9yZGVycyA9PT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtYXgtb3JkZXJzLXJlYWNoZWQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgICAgICAgICAgIHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBxdWFudGl0eSxcbiAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogdmFyaWFudF9pZCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50cykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuY29tbWVudHMgPSBjb21tZW50cztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tQm9vdHN0cmFwUXVldWUgJiYgcXVldWVHZW5lcmF0aW9uID09PSB0aGlzLnBlbmRpbmdCb290c3RyYXBDYXJ0UXVldWVHZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydEFkZEluRmxpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZsdXNoUGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYW5lamFyIGxhIHJlc3B1ZXN0YSBIVFRQIGV4aXRvc2EgKGPDs2RpZ28gMjAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0KSkgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hbmVqYXIgZWwgZXJyb3IgZGUgbGEgbGxhbWFkYSBIVFRQIChjw7NkaWdvIDUwMCB1IG90cm8gZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ8OzZGlnbyBkZSBlcnJvciA1MDAgKHRpbWVvdXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsIGNvbnRleHQudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdIYSBvY3VycmlkbyB1biBlcnJvciBhbCBhZ3JlZ2FyIGFsIGNhcnJpdG8uIFZ1ZWx2YSBhIGludGVudGFybG8uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90cm8gY8OzZGlnbyBkZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnRXJyb3IgaW5lc3BlcmFkby4gVnVlbHZhIGEgaW50ZW50YXJsbycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG5cbiAgICB9XG5cbiAgICBhZGRUb0xvdCA9IChwcm9kdWN0OiBQcm9kdWN0LCBxdWFudGl0eTogbnVtYmVyLCB2YXJpYW50X2lkLCBpZD8sIG9yZGVyX2l0ZW1faWQ/LCBsb3RfcXVhbnRpdHk/LCB1bml0X3ByaWNlPywgdW5pdF90b3RhbD8sIGFqdXN0ZW1lbnRfdG90YWw/LCB0b3RhbF9sb3Q/LCBsb3Rfc3RhdHVzPywgZGF0ZV9yZXF1ZXN0Pywgbm90ZXM/LCBzaGlwcGluZ19hZGRyZXNzX2lkPywgc2hpcHBpbmdfYWRkcmVzc19uYW1lPywgYWN0aW9uPykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pc0FibGVUb0J1eSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbXVzdC1zZWxlY3QtY3VzdG9tZXInKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuICAgICAgICBsZXQgYWRkZWQgPSAnJztcbiAgICAgICAgIWFkZGVkICYmIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkSXRlbUFwaSgpLCB7IHByb2R1Y3RDb2RlOiBwcm9kdWN0LmlkLCBxdWFudGl0eTogcXVhbnRpdHksIHZhcmlhbnRDb2RlOiB2YXJpYW50X2lkLCBpZDogaWQgfHwgJycsIG9yZGVyX2l0ZW1faWQ6IG9yZGVyX2l0ZW1faWQgfHwgJycsIGxvdF9xdWFudGl0eTogbG90X3F1YW50aXR5IHx8ICcnLCB1bml0X3ByaWNlOiB1bml0X3ByaWNlIHx8ICcnLCB1bml0X3RvdGFsOiB1bml0X3RvdGFsIHx8ICcnLCBhanVzdGVtZW50X3RvdGFsOiBhanVzdGVtZW50X3RvdGFsIHx8ICcnLCB0b3RhbF9sb3Q6IHRvdGFsX2xvdCB8fCAnJywgbG90X3N0YXR1czogbG90X3N0YXR1cyB8fCAnJywgZGF0ZV9yZXF1ZXN0OiBkYXRlX3JlcXVlc3QgfHwgJycsIG5vdGVzOiBub3RlcyB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogc2hpcHBpbmdfYWRkcmVzc19pZCB8fCAnJywgc2hpcHBpbmdfYWRkcmVzc19uYW1lOiBzaGlwcGluZ19hZGRyZXNzX25hbWUgfHwgJycsIGFjdGlvbjogYWN0aW9uIHx8ICduZXdsb3QnIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHJlcyA9PiB0aGlzLmFwcGx5Q2FydFJlc3BvbnNlKHJlcywgY29udGV4dCksXG4gICAgICAgICAgICAgICAgZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhZGRUb0NhcnRQcm9taXNlID0gYXN5bmMgKHByb2R1Y3Q6IFByb2R1Y3QsIHF1YW50aXR5OiBudW1iZXIsIHZhcmlhbnRfaWQsIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm4geyBlcnJvcjogdHJ1ZSB9O1xuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlIH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkZWQgPSB0aGlzLmFkZElmQWxscmVhZHlFeGlzdHMocHJvZHVjdCwgdmFyaWFudF9pZCwgcXVhbnRpdHksIGNvbW1lbnRzKTtcbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEl0ZW1BcGkoKSwgeyBwcm9kdWN0Q29kZTogcHJvZHVjdC5pZCwgcXVhbnRpdHk6IHF1YW50aXR5LCB2YXJpYW50Q29kZTogdmFyaWFudF9pZCB9KS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NhcnRCdXNpbmVzc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hcHBseUNhcnRSZXNwb25zZShyZXN1bHQsIGNvbnRleHQpKSByZXR1cm4geyBlcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvciwgY29udGV4dC50b2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUgfTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlIH1cbiAgICB9XG5cblxuICAgIGFkZEFsbFRvQ2FydCA9IChpdGVtczogYW55W10pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbk11dGF0ZUNhcnQoKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNhcHR1cmVDYXJ0UmVzcG9uc2VDb250ZXh0KCk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBpdGVtczogdGhpcy5tZXJnZUl0ZW1zQWRkQWxsVG9DYXJ0KGl0ZW1zKSB9O1xuXG4gICAgICAgIHRoaXMuY29ubmVjdGlvbi5wb3N0KHRoaXMuYWRkQWxsSXRlbXNBcGkoKSwgcGFyYW1zKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpLnRoZW4oXG4gICAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0KSAmJiByZXMuY2FydF9yZXNwb25zZS5zdGF0dXMgPT0gJ3N1Y2Nlc3MnKSB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsIGNvbnRleHQudG9rZW4pO1xuICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZFJlcGVhdE9yZGVyVG9DYXJ0KGl0ZW1zOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNhcnRJdGVtc1N1YmplY3QudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhcnQtbm90LWVtcHR5Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuaXNBYmxlVG9CdXkoKSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3Qtc2VsZWN0LWN1c3RvbWVyJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbXNUb0FkZCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgcXVhbnRpdHk6IGl0ZW0ucXVhbnRpdHksXG4gICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLmNvZGVcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmIChpdGVtc1RvQWRkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vLXByb2R1Y3RzLXRvLWFkZCcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgaXRlbXM6IGl0ZW1zVG9BZGRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FwdHVyZUNhcnRSZXNwb25zZUNvbnRleHQoKTtcblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucG9zdCh0aGlzLmFkZEFsbEl0ZW1zQXBpKCksIHBhcmFtcylcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcblxuICAgICAgICAgICAgICAgIGlmIChyZXM/LnN0YXR1cyA9PT0gJ2ZhaWx1cmUnIHx8IHJlcz8uY2FydF9yZXNwb25zZT8uc3RhdHVzID09PSAnZmFpbHVyZScpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yPy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJ18nKSB8fCAndW5rbm93bl9lcnJvcic7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0KSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXNSZXNwb25zZSA9IHJlcz8uaXRlbXNfcmVzcG9uc2UgfHwgW107XG4gICAgICAgICAgICAgICAgY29uc3QgY2FydEl0ZW1zID0gcmVzPy5jYXJ0Py5pdGVtcyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dE9mU3RvY2tJdGVtcyA9IGl0ZW1zUmVzcG9uc2UuZmlsdGVyKGl0ZW0gPT5cbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdGF0dXMgPT09ICdmYWlsdXJlJyAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtLmVycm9ycy5zb21lKGVycm9yID0+IGVycm9yLmNvZGUgPT09ICdvdXRfb2Zfc3RvY2snKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FydEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiBvdXRPZlN0b2NrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnYWxsLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG91dE9mU3RvY2tJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdzb21lLXByb2R1Y3RzLW91dC1vZi1zdG9jaycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYXJ0SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygncHJvZHVjdHMtYWRkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY2FydCddKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIsIGNvbnRleHQudG9rZW4pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyZ2VJdGVtc0FkZEFsbFRvQ2FydCA9IChpdGVtczogYW55W10pID0+IHtcbiAgICAgICAgbGV0IHBhcmFtc01lcmdlID0gW11cbiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1JbnRlcm5vID0gaXRlbXMuZmluZChpdGVtUGFyYW0gPT4gaXRlbVBhcmFtLnZhcmlhbnRDb2RlID09IGl0ZW0udmFyaWFudF9pZClcbiAgICAgICAgICAgIHBhcmFtc01lcmdlLnB1c2goXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0Q29kZTogaXRlbS5wcm9kdWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50Q29kZTogaXRlbS52YXJpYW50X2lkLFxuICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogaXRlbUludGVybm8gJiYgaXRlbUludGVybm8ucXVhbnRpdHkgfHwgaXRlbS5xdWFudGl0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcblxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpdGVtUGFyYW0gPT4gIXRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW1QYXJhbS52YXJpYW50Q29kZSA9PSBpdGVtLnZhcmlhbnRfaWQpKVxuXG4gICAgICAgIHJldHVybiBbLi4uaXRlbXMsIC4uLnBhcmFtc01lcmdlXVxuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1RdWFudGl0eSA9IChpdGVtOiBDYXJ0SXRlbSwgcXVhbnRpdHksIGNvbW1lbnRzPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRlUXVhbnRpdHkoaXRlbSwgcXVhbnRpdHkpICYmICh0aGlzLnZhbGlkYXRlUHJpY2VBbmRDcmVkaXRzKGl0ZW0sIHF1YW50aXR5KSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlR2VuZXJhdGlvbiA9IHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRJbkZsaWdodCA/IHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRRdWV1ZUdlbmVyYXRpb24gOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYXB0dXJlQ2FydFJlc3BvbnNlQ29udGV4dCgpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7IHF1YW50aXR5OiBOdW1iZXIocXVhbnRpdHkpIH07XG4gICAgICAgICAgICBpZiAoY29tbWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuZWQgPSAoY29tbWVudHMgPz8gJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNvbW1lbnRzID0gY2xlYW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uXG4gICAgICAgICAgICAgICAgLnB1dChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtUXVhbnRpdHlBcGkodGhpcy5maW5kSXRlbUJ5SWRWYXJpYW50KGl0ZW0udmFyaWFudF9pZCkpLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVldWVHZW5lcmF0aW9uICE9PSBudWxsICYmIHF1ZXVlR2VuZXJhdGlvbiA9PT0gdGhpcy5wZW5kaW5nQm9vdHN0cmFwQ2FydFF1ZXVlR2VuZXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0Jvb3RzdHJhcENhcnRBZGRJbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaFBlbmRpbmdCb290c3RyYXBDYXJ0QWRkcygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0KSkgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ3Byb2R1Y3QtdXBkYXRlZCcsIHsgcXVhbnRpdHkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVyciwgY29udGV4dC50b2tlbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhbGlkYXRlUXVhbnRpdHkgPSAoaXRlbTogQ2FydEl0ZW0sIHF1YW50aXR5KSA9PiB7XG4gICAgICAgIGlmICgodGhpcy5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KGl0ZW0ucHJvZHVjdENvZGUpICsgcXVhbnRpdHkpID4gaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1heGltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWF4aW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tYXhpbXVtSXRlbXNRdWFudGl0eSB9KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0aGlzLmdldENvdW50RnJvbUl0ZW1JbkNhcnQoaXRlbS5wcm9kdWN0Q29kZSkgKyBxdWFudGl0eSkgPCBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubWluaW11bUl0ZW1zUXVhbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtaW5pbXVtLWl0ZW1zLXF1YW50aXR5JywgeyBxdWFudGl0eTogaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm1pbmltdW1JdGVtc1F1YW50aXR5IH0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgJiYgaXRlbS5wcm9kdWN0LnZhcmlhbnRzWzBdLm11bHRpcGxlUXVhbnRpdHkgPiAwKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMuZ2V0Q291bnRGcm9tSXRlbUluQ2FydChpdGVtLnByb2R1Y3RDb2RlKSArIHF1YW50aXR5KSAlIGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5tdWx0aXBsZVF1YW50aXR5ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ211c3QtYmUtbXVsdGlwbGUnLCB7IHF1YW50aXR5OiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ubXVsdGlwbGVRdWFudGl0eSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYXRlUHJpY2VBbmRDcmVkaXRzID0gKGl0ZW06IENhcnRJdGVtLCBxdWFudGl0eTogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QudmFsdWU7XG5cbiAgICAgICAgaWYgKCFiYWxhbmNlIHx8IGJhbGFuY2UuY3JlZGl0QW1vdW50ID09PSBudWxsIHx8IGJhbGFuY2UuY3JlZGl0QW1vdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLnJlbWFpbmluZ0NyZWRpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pdFByaWNlID0gaXRlbS50b3RhbCAvIGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxRdWFudGl0eSA9IHF1YW50aXR5IC0gaXRlbS5xdWFudGl0eTtcblxuICAgICAgICBpZiAoYWRkaXRpb25hbFF1YW50aXR5IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbENvc3QgPSB1bml0UHJpY2UgKiBhZGRpdGlvbmFsUXVhbnRpdHk7XG5cbiAgICAgICAgaWYgKGFkZGl0aW9uYWxDb3N0ID4gYmFsYW5jZS5yZW1haW5pbmdDcmVkaXRzKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm90LWVub3VnaC1jcmVkaXRzJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcHVibGljIGhhc1N1ZmZpY2llbnRDcmVkaXRzRm9yQ2FydFRvdGFsID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBiYWxhbmNlID0gdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnZhbHVlO1xuXG4gICAgICAgIGlmICghYmFsYW5jZSB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gbnVsbCB8fCBiYWxhbmNlLmNyZWRpdEFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYWxhbmNlLmFsbG93QW55UGF5bWVudE1ldGhvZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFsYW5jZS5yZW1haW5pbmdDcmVkaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy5jYXJ0U3ViamVjdC52YWx1ZT8udG90YWxzPy50b3RhbCB8fCAwO1xuXG4gICAgICAgIC8vIFNpIE5PIHB1ZWRlIGV4Y2VkZXIgc2FsZG8geSBlbCB0b3RhbCBzdXBlcmEgZWwgY3JlZGl0bywgYmxvcXVlYXJcbiAgICAgICAgaWYgKCFiYWxhbmNlLmFsbG93RXhjZWVkQmFsYW5jZSAmJiB0b3RhbCA+IGJhbGFuY2UuY3JlZGl0QW1vdW50KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm90LWVub3VnaC1jcmVkaXRzJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgY2FsY3VsYXRlU3RvY2tDb3VudHMgPSAoaXRlbTogQ2FydEl0ZW0sIHF1YW50aXR5KSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnByb2R1Y3Quc3RvY2sgPCBpdGVtLnF1YW50aXR5ICsgcXVhbnRpdHkpIHtcbiAgICAgICAgICAgIC8vIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2snKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgZGVsZXRlQ2FydEl0ZW0gPSAoaXRlbSwgdG9hc3QgPSB0cnVlKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5jYW5NdXRhdGVDYXJ0KCkpIHJldHVybjtcbiAgICAgICAgbGV0IGlkX2J1c2NhZG8gPSB0aGlzLmZpbmRJdGVtQnlJZFZhcmlhbnQoaXRlbS52YXJpYW50X2lkKVxuICAgICAgICB0aGlzLnJlcXVlc3RJblByb2Nlc3MubmV4dCh0cnVlKTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FwdHVyZUNhcnRSZXNwb25zZUNvbnRleHQoKTtcbiAgICAgICAgLy8gICAgdGhpcy5jb25uZWN0aW9uLnBvc3QodGhpcy5hZGRJdGVtQXBpKCksIHsgcHJvZHVjdENvZGU6IGl0ZW0ucHJvZHVjdC5pZCwgcXVhbnRpdHk6IDAsIHZhcmlhbnRDb2RlOiBpdGVtLnZhcmlhbnRfaWQsIGlkOiAnJywgb3JkZXJfaXRlbV9pZDogaXRlbS5pdGVtX2lkLCBsb3RfcXVhbnRpdHk6ICcnLCB1bml0X3ByaWNlOiAnJywgdW5pdF90b3RhbDogJycsIGFqdXN0ZW1lbnRfdG90YWw6ICcnLCB0b3RhbF9sb3Q6ICcnLCBsb3Rfc3RhdHVzOiAnJywgZGF0ZV9yZXF1ZXN0OiAnJywgbm90ZXM6ICAnJywgc2hpcHBpbmdfYWRkcmVzc19pZDogJycsIHNoaXBwaW5nX2FkZHJlc3NfbmFtZTogJycsIGFjdGlvbjogICdkZWxldGVvcmRlcml0ZW0nfSlcbiAgICAgICAgLy8gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIC8vICAgICAgICAgICAgcmVzID0+IHRoaXMucmVtb3ZlQ2FydEl0ZW0ocmVzLCBpdGVtLCB0b2FzdCksXG4gICAgICAgIC8vICAgICAgICAgICAgZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKVxuICAgICAgICAvLyAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRlbGV0ZSh0aGlzLmRlbGV0ZUl0ZW1BcGkoaWRfYnVzY2FkbykpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXBwbGllZCA9IHRoaXMuYXBwbHlDYXJ0UmVzcG9uc2UocmVzLCBjb250ZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFwcGxpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDYXJ0SXRlbShyZXMsIGl0ZW0sIHRvYXN0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzQ2FydEJ1c2luZXNzRXJyb3IocmVzKSAmJiBjb250ZXh0LmdlbmVyYXRpb24gPT09IHRoaXMuY2FydExpZmVjeWNsZUdlbmVyYXRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgIShyZXM/LnRva2VuVmFsdWUgJiYgQXJyYXkuaXNBcnJheShyZXMuaXRlbXMpKSAmJiAhKHJlcz8uY2FydD8udG9rZW5WYWx1ZSAmJiBBcnJheS5pc0FycmF5KHJlcy5jYXJ0Lml0ZW1zKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gREVMRVRFIHB1ZWRlIGNvbmZpcm1hciBsYSBlbGltaW5hY2nDs24gc2luIGRldm9sdmVyIHVuIHJlc3VtZW4uXG4gICAgICAgICAgICAgICAgICAgIC8vIFNvbG8gZXNhIG9wZXJhY2nDs24gY29ub2NlIHF1ZSBlbCBiYWNrZW5kIHPDrSBlamVjdXTDsyBlbCBjYW1iaW8uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaENhcnRTeW5jKCdjaGFuZ2VkJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVDYXJ0UmVmcmVzaCh0aGlzLnBlbmRpbmdDaGVja291dFJlY292ZXJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVyciA9PiB7IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCBjb250ZXh0LnRva2VuKTsgdGhpcy5yZXF1ZXN0SW5Qcm9jZXNzLm5leHQoZmFsc2UpOyB9LFxuICAgICAgICApXG4gICAgfVxuXG4gICAgY2xlYXJDYXJ0KCkge1xuICAgICAgICAvL3NvbHVjaW9uIHByb3Zpc2FvcmlhXG4gICAgICAgIGxldCBpdGVtcyA9IFsuLi50aGlzLml0ZW1zXVxuICAgICAgICB3aGlsZSAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVDYXJ0SXRlbShpdGVtcy5wb3AoKSwgZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgLy90aGlzLnJlc2V0Q2FydCh0aGlzLmdldENhcnQpO1xuICAgIH1cblxuICAgIGNsZWFyQW5kUmVzZXRDYXJ0KCkge1xuICAgICAgICB0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkID0gdGhpcy5jYXJ0VHJhbnNpdGlvbklkRm9yVG9rZW4odGhpcy5jYXJ0X3Rva2VuIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0X3Rva2VuJykpO1xuICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2hlY2tvdXQtaW52YWxpZGF0ZWQnLCB0aGlzLmFjdGl2ZUNoZWNrb3V0VHJhbnNpdGlvbklkKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQ2hlY2tvdXRSZWNvdmVyeSA9IHRydWU7XG4gICAgICAgIHRoaXMuY2FydFN5bmNCbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGVja291dEludmFsaWRhdGVkQXQgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLnNldENhcnRTeW5jU3RhdGUoJ2ludmFsaWRhdGVkJyk7XG4gICAgICAgIHRoaXMuc3RhcnRDaGVja291dFJlY292ZXJ5V2F0Y2hkb2coKTtcbiAgICAgICAgdGhpcy5yZXNldENhcnQoKCkgPT4gdGhpcy5nZXRDYXJ0KHRydWUpKTtcbiAgICB9XG5cbiAgICBjbGVhckFuZFJlc2V0Q3VzdG9tZXJDYXJ0KCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIkNsZWFyaW5nIGFuZCByZXNldGluZy4uLlwiKVxuICAgICAgICB0aGlzLnJlc2V0Q2FydCh0aGlzLmdldENhcnRCeUN1c3RvbWVyKVxuICAgIH1cblxuICAgIGhhbmRsZUVycm9yID0gKGVycm9yOiB7IGVycm9yOiBzdHJpbmcgfSwgcmVxdWVzdFRva2VuOiBzdHJpbmcgfCBudWxsID0gdGhpcy5jYXJ0X3Rva2VuIHx8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlQ2FydE11dGF0aW9uRXJyb3IoZXJyb3IsIHJlcXVlc3RUb2tlbikpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yLXBhcmFtJyk7XG4gICAgICAgIHRoaXMucmVxdWVzdEluUHJvY2Vzcy5uZXh0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBnZXRDb3VudEZyb21JdGVtSW5DYXJ0ID0gKGNvZGVWYXJpYW50KTogbnVtYmVyID0+IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW0udmFyaWFudF9pZCA9PSBjb2RlVmFyaWFudCk/LnF1YW50aXR5IHx8IDA7XG5cbiAgICBmaW5kSXRlbUJ5SWRWYXJpYW50ID0gKHZhcmlhbnRfaWQpID0+IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW0udmFyaWFudF9pZCA9PSB2YXJpYW50X2lkKS5pdGVtX2lkXG5cbiAgICBmaW5kSXRlbSA9IChwcm9kdWN0X2lkKSA9PiB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnByb2R1Y3QuaWQgPT0gcHJvZHVjdF9pZCk7XG5cbiAgICAvKiogREFUQSBGT1IgT1RIRVIgU0VSVklDRVMgKi9cbiAgICBnZXRDYXJ0VG9rZW4gPSAoKSA9PiB0aGlzLmNhcnRfdG9rZW47XG5cbiAgICBnZXRMb2NhbGUgPSAoKSA9PiB0aGlzLmxvY2FsZTtcblxuICAgIGdldFRvdGFsQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IGNhcnQ/LnRvdGFscz8udG90YWwpKTtcblxuICAgIGdldFBheW1lbnRNZXRob2RBZGp1c3RtZW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnBheW1lbnRNZXRob2RBZGp1c3RtZW50ID8/IG51bGwpKTtcblxuICAgIGdldFBheW1lbnRNZXRob2RBZGp1c3RtZW50TGFiZWwgPSAoKTogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IGNhcnQ/LnRvdGFscz8ucGF5bWVudE1ldGhvZEFkanVzdG1lbnRMYWJlbCA/PyBudWxsKSk7XG5cbiAgICAvKiogVG90YWwgcGFyYSBjYXJyaXRvL3NpZGViYXIsIHNpbiBlbnbDrW8gcGVyc2lzdGlkbyBuaSByZWNhcmdvcyBkZSBjaGVja291dC4gKi9cbiAgICBnZXRDYXJ0VG90YWxBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldENhcnRUb3RhbEFtb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q291bnRDYXJ0SXRlbXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydEl0ZW1zLnBpcGUobWFwKChjYXJ0SXRlbXMpID0+IGNhcnRJdGVtcz8ubGVuZ3RoKSk7XG5cbiAgICBnZXRUYXhlc0Ftb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiBjYXJ0Py50b3RhbHM/LnRheGVzID4gMCA/IGNhcnQ/LnRvdGFscz8udGF4ZXMgOiAwKSk7XG5cbiAgICBnZXRTdWJUb3RhbEFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVN1YnRvdGFsQW1vdW50KGNhcnQpKSk7XG5cbiAgICBnZXRDYXJ0VGF4ZXNBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmdldENhcnRUYXhlc0Ftb3VudChjYXJ0KSkpO1xuXG4gICAgZ2V0Q2FydENsaWVudFRheGVzQW1vdW50ID0gKCk6IE9ic2VydmFibGU8bnVtYmVyPiA9PlxuICAgICAgICB0aGlzLmNhcnQucGlwZShtYXAoKGNhcnQpID0+IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0Q2xpZW50VGF4ZXNBbW91bnQoY2FydCkpKTtcblxuICAgIC8qKlxuICAgICAqIERldnVlbHZlIGVsIGRlc2N1ZW50byBxdWUgZGViZSBtb3N0cmFyc2UgZW4gZWwgcmVzdW1lbiBkZSBjb21wcmEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIGNvbiBlbCBtb250byBkZSBwcm9tb2Npb25lcyBkZSBvcmRlbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiB0aGlzLnN1bW1hcnlQcm9tb3Rpb25BbW91bnQkID0gdGhpcy5jYXJ0U2VydmljZS5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNpIGVsIGJhY2tlbmQgbnVldm8gaW5mb3JtYSBgdG90YWxzLm9yZGVyRGlzY291bnRgLCBzZSB1c2EgZXNlIHZhbG9yLlxuICAgICAqIEVuIHN1IGF1c2VuY2lhLCBwcmlvcml6YSBgdG90YWxzLnByb21vdGlvbkJyZWFrZG93bi5vcmRlclByb21vdGlvbnNgIHlcbiAgICAgKiBsdWVnbyBoYWNlIGZhbGxiYWNrIGEgYHRvdGFscy5wcm9tb3Rpb25gIHBhcmEgbWFudGVuZXIgY29tcGF0aWJpbGlkYWQuXG4gICAgICovXG4gICAgZ2V0U3VtbWFyeVByb21vdGlvbkFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5jYXJ0LnBpcGUobWFwKChjYXJ0KSA9PiB0aGlzLmdldENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24oY2FydCkub3JkZXJEaXNjb3VudCkpO1xuXG4gICAgLyoqIERlc2N1ZW50byBlc3BlY8OtZmljbyBkZWwgY3Vww7NuLCBzaSBlbCBiYWNrZW5kIGxvIGluZm9ybWEgcG9yIHNlcGFyYWRvLiAqL1xuICAgIGdldENvdXBvblByb21vdGlvbkFtb3VudCA9ICgpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5nZXRDYXJ0U3VtbWFyeVByaWNlUHJlc2VudGF0aW9uKGNhcnQpLmNvdXBvbkRpc2NvdW50KSk7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2Egc2kgZXhpc3RlIHVuIGN1cMOzbiBhcGxpY2FkbyBlbiBlbCBjYXJyaXRvIGFjdHVhbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgYm9vbGVhbm8gcGFyYSBjb250cm9sYXIgbGEgdmlzaWJpbGlkYWQgZGUgYFF1aXRhciBjdXDDs25gLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBObyBkZWJlIGF0YXJzZSBhIGBnZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KClgLCBwb3JxdWUgdW4gY3Vww7NuIHB1ZWRlIGFmZWN0YXJcbiAgICAgKiBzb2xvIHByb21vY2lvbmVzIHVuaXRhcmlhcyB5IGRlamFyIGVsIGRlc2N1ZW50byBkZSBvcmRlbiBlbiBgMGAuXG4gICAgICovXG4gICAgaGFzQXBwbGllZENvdXBvbiA9ICgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gdGhpcy5vcmRlclV0aWxzLmhhc0FwcGxpZWRDb3Vwb24oY2FydCkpKTtcblxuICAgIHRvRGVjaW1hbCA9ICh0b3RhbCkgPT4gKHRvdGFsIC0gTWF0aC5mbG9vcih0b3RhbCkgPT0gMCkgPyB0b3RhbCAvIDEwMCA6IHRvdGFsXG5cbiAgICBnZXREaXNjb3VudCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJ0SXRlbXMucGlwZShtYXAoKHByb2R1Y3QpID0+IHtcbiAgICAgICAgICAgIGxldCB0b3RhbCA9IHRoaXMuaXRlbXMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgKyBjdXJyLnByb2R1Y3Quc2FsZXByaWNlICogY3Vyci5xdWFudGl0eTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgbGV0IHN1YnRvdGFsID0gdGhpcy5pdGVtcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldiArIGN1cnIucHJvZHVjdC5wcmljZSAqIGN1cnIucXVhbnRpdHk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybiBzdWJ0b3RhbCAtIHRvdGFsO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2J0aWVuZSBlbCBwcmVjaW8gbm9ybWFsaXphZG8gZGUgdW4gw610ZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDDjXRlbSBkZSBjYXJyaXRvIG5vcm1hbGl6YWRvLlxuICAgICAqIEByZXR1cm5zIE9iamV0byBgQ2FydEl0ZW1QcmljaW5nYCBsaXN0byBwYXJhIHJlbmRlcml6YXIgcHJlY2lvIGJhc2UsIHRhY2hhZG8geSBmaW5hbC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwcmljaW5nID0gdGhpcy5jYXJ0U2VydmljZS5nZXRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgKiBjb25zdCBzaG93VG9vbHRpcCA9IHByaWNpbmcuaGFzVW5pdFByb21vdGlvbnM7XG4gICAgICogY29uc3QgZmluYWxQcmljZSA9IHByaWNpbmcuZmluYWxQcmljZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRJdGVtUHJpY2luZyA9IChpdGVtOiBDYXJ0SXRlbSk6IENhcnRJdGVtUHJpY2luZyA9PiBpdGVtPy5wcmljaW5nIHx8IHRoaXMuYnVpbGRDYXJ0SXRlbVByaWNpbmcoaXRlbSk7XG5cbiAgICAvKiogUmVzdWVsdmUgbGEgcHJlc2VudGFjacOzbiBudWV2YSBkZSB1bmEgbMOtbmVhIHkgY29uc2VydmEgZWwgZmFsbGJhY2sgbGVnYWN5LiAqL1xuICAgIGdldENhcnRJdGVtUHJpY2VQcmVzZW50YXRpb24gPSAoaXRlbTogQ2FydEl0ZW0sIGNoYW5uZWw/OiBDaGFubmVsKTogQ2FydEl0ZW1QcmljZVByZXNlbnRhdGlvbiA9PlxuICAgICAgICB0aGlzLnByaWNlUHJlc2VudGF0aW9uU2VydmljZS5nZXRDYXJ0SXRlbVByaWNlUHJlc2VudGF0aW9uKFxuICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgIGNoYW5uZWwgfHwgdGhpcy5jaGFubmVsQ29uZmlnLFxuICAgICAgICAgICAgaXRlbT8ubGluZVByaWNpbmcgPyB1bmRlZmluZWQgOiB0aGlzLmdldEl0ZW1QcmljaW5nKGl0ZW0pXG4gICAgICAgICk7XG5cbiAgICAvKiogUmVzdWVsdmUgZWwgcmVzdW1lbiB2aXNpYmxlIHVzYW5kbyBsaW5lUHJpY2luZyBzaW4gY29udmVydGlyIGltcG9ydGVzIGZpc2NhbGVzLiAqL1xuICAgIGdldENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24gPSAoXG4gICAgICAgIGNhcnQ6IGFueSA9IHRoaXMuY2FydFN1YmplY3QudmFsdWUsXG4gICAgICAgIGNoYW5uZWw/OiBDaGFubmVsLFxuICAgICAgICBpbmNsdWRlU2hpcHBpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IENhcnRTdW1tYXJ5UHJpY2VQcmVzZW50YXRpb24gPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZUl0ZW1zID0gQXJyYXkuaXNBcnJheShjYXJ0Py5pdGVtcykgJiYgY2FydC5pdGVtcy5sZW5ndGggPyBjYXJ0Lml0ZW1zIDogbnVsbDtcbiAgICAgICAgY29uc3QgaXRlbXM6IENhcnRJdGVtW10gPSAocmVzcG9uc2VJdGVtcyB8fCAodGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlIHx8IFtdKSlcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiB0aGlzLm5vcm1hbGl6ZUNhcnRJdGVtUHJpY2luZyhpdGVtKSk7XG4gICAgICAgIGNvbnN0IGhhc0xpbmVQcmljaW5nID0gaXRlbXMubGVuZ3RoID4gMCAmJiBpdGVtcy5ldmVyeShpdGVtID0+ICEhaXRlbT8ubGluZVByaWNpbmcpO1xuICAgICAgICBjb25zdCBzaG93R3Jvc3MgPSAoY2hhbm5lbCB8fCB0aGlzLmNoYW5uZWxDb25maWcpPy5zaG93UHJpY2VXaXRoVGF4ZXNXaGlsZUJyb3dzaW5nID09PSB0cnVlO1xuICAgICAgICBjb25zdCBwcmljaW5nS2V5ID0gc2hvd0dyb3NzID8gJ2dyb3NzJyA6ICduZXQnO1xuICAgICAgICBjb25zdCB0YXhlcyA9IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VGF4ZXNBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IGNsaWVudFRheGVzID0gdGhpcy5vcmRlclV0aWxzLmdldENhcnRDbGllbnRUYXhlc0Ftb3VudChjYXJ0KTtcbiAgICAgICAgY29uc3QgbGVnYWN5U2hpcHBpbmcgPSBpbmNsdWRlU2hpcHBpbmcgPyB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVNoaXBtZW50QW1vdW50KGNhcnQpIDogbnVsbDtcbiAgICAgICAgY29uc3Qgc2hpcHBpbmdQcmljaW5nID0gdGhpcy5nZXRUb3RhbHNQcmljaW5nKGNhcnQsICdzaGlwcGluZ19wcmljaW5nJywgJ3NoaXBwaW5nUHJpY2luZycpO1xuICAgICAgICBjb25zdCBzaGlwcGluZyA9IGluY2x1ZGVTaGlwcGluZ1xuICAgICAgICAgICAgPyAoc2hpcHBpbmdQcmljaW5nID8gc2hpcHBpbmdQcmljaW5nW3ByaWNpbmdLZXldIDogbGVnYWN5U2hpcHBpbmcpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaW5jbHVkZVNoaXBwaW5nXG4gICAgICAgICAgICA/IE51bWJlcihjYXJ0Py50b3RhbHM/LnRvdGFsIHx8IDApXG4gICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRDYXJ0VG90YWxBbW91bnQoY2FydCk7XG4gICAgICAgIGNvbnN0IG9yZGVyRGlzY291bnRQcmljaW5nID0gdGhpcy5nZXRUb3RhbHNQcmljaW5nKGNhcnQsICdvcmRlcl9kaXNjb3VudF9wcmljaW5nJywgJ29yZGVyRGlzY291bnRQcmljaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvdXBvbkRpc2NvdW50UHJpY2luZyA9IHRoaXMuZ2V0VG90YWxzUHJpY2luZyhjYXJ0LCAnY291cG9uX2Rpc2NvdW50X3ByaWNpbmcnLCAnY291cG9uRGlzY291bnRQcmljaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvdXBvbkRpc2NvdW50ID0gY291cG9uRGlzY291bnRQcmljaW5nXG4gICAgICAgICAgICA/IGNvdXBvbkRpc2NvdW50UHJpY2luZ1twcmljaW5nS2V5XVxuICAgICAgICAgICAgOiB0aGlzLm9yZGVyVXRpbHMuZ2V0Q291cG9uUHJvbW90aW9uQW1vdW50KGNhcnQpO1xuICAgICAgICBjb25zdCBvcmRlckRpc2NvdW50ID0gb3JkZXJEaXNjb3VudFByaWNpbmdcbiAgICAgICAgICAgID8gb3JkZXJEaXNjb3VudFByaWNpbmdbcHJpY2luZ0tleV1cbiAgICAgICAgICAgIDogdGhpcy5vcmRlclV0aWxzLmdldE9yZGVyUHJvbW90aW9uQW1vdW50XG4gICAgICAgICAgICAgICAgPyB0aGlzLm9yZGVyVXRpbHMuZ2V0T3JkZXJQcm9tb3Rpb25BbW91bnQoY2FydClcbiAgICAgICAgICAgICAgICA6IHRoaXMub3JkZXJVdGlscy5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KGNhcnQpO1xuXG4gICAgICAgIGlmIChoYXNMaW5lUHJpY2luZykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0c0JlZm9yZURpc2NvdW50czogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLnVuaXRbcHJpY2luZ0tleV0gfHwgMCkgKiBOdW1iZXIoaXRlbS5xdWFudGl0eSB8fCAwKSwgMCksXG4gICAgICAgICAgICAgICAgbGluZURpc2NvdW50czogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLmRpc2NvdW50W3ByaWNpbmdLZXldIHx8IDApLCAwKSxcbiAgICAgICAgICAgICAgICBzdWJ0b3RhbDogaXRlbXMucmVkdWNlKCh0b3RhbCwgaXRlbTogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0b3RhbCArIE51bWJlcihpdGVtLmxpbmVQcmljaW5nLnN1YnRvdGFsW3ByaWNpbmdLZXldIHx8IDApLCAwKSxcbiAgICAgICAgICAgICAgICBvcmRlckRpc2NvdW50LFxuICAgICAgICAgICAgICAgIGNvdXBvbkRpc2NvdW50LFxuICAgICAgICAgICAgICAgIHRheGVzLFxuICAgICAgICAgICAgICAgIGNsaWVudFRheGVzLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nLFxuICAgICAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgICAgIHRheGVzSW5jbHVkZWRJblRvdGFsOiBzaG93R3Jvc3MgJiYgdGF4ZXMgIT09IDAsXG4gICAgICAgICAgICAgICAgc291cmNlOiAnbGluZVByaWNpbmcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb2R1Y3RzQmVmb3JlRGlzY291bnRzOiAwLFxuICAgICAgICAgICAgbGluZURpc2NvdW50czogMCxcbiAgICAgICAgICAgIHN1YnRvdGFsOiB0aGlzLm9yZGVyVXRpbHMuZ2V0U3VtbWFyeVN1YnRvdGFsQW1vdW50KGNhcnQpLFxuICAgICAgICAgICAgb3JkZXJEaXNjb3VudCxcbiAgICAgICAgICAgIGNvdXBvbkRpc2NvdW50LFxuICAgICAgICAgICAgdGF4ZXMsXG4gICAgICAgICAgICBjbGllbnRUYXhlcyxcbiAgICAgICAgICAgIHNoaXBwaW5nLFxuICAgICAgICAgICAgdG90YWwsXG4gICAgICAgICAgICB0YXhlc0luY2x1ZGVkSW5Ub3RhbDogZmFsc2UsXG4gICAgICAgICAgICBzb3VyY2U6ICdsZWdhY3knXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKiBOb3JtYWxpemEgc8OzbG8gZWwgYWxpYXMgc2VyaWFsaXphZG8gZGVsIGNvbnRyYXRvIGRlIGzDrW5lYS4gKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZUNhcnRJdGVtUHJpY2luZyA9IChpdGVtOiBhbnkpOiBDYXJ0SXRlbSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBsaW5lUHJpY2luZzogaXRlbT8ubGluZVByaWNpbmcgfHwgaXRlbT8ubGluZV9wcmljaW5nXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBMZWUgZWwgY29udHJhdG8gbnVldm8gc2luIGNvbmZ1bmRpciB1biBvYmpldG8gdsOhbGlkbyBjb24gZmFsbGJhY2sgbGVnYWN5LFxuICAgICAqIGluY2x1c28gY3VhbmRvIHRvZG9zIHN1cyBpbXBvcnRlcyBzb24gY2Vyby5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFRvdGFsc1ByaWNpbmcgPSAoXG4gICAgICAgIGNhcnQ6IGFueSxcbiAgICAgICAgc25ha2VDYXNlS2V5OiBrZXlvZiBDYXJ0VG90YWxzUHJpY2luZyxcbiAgICAgICAgY2FtZWxDYXNlS2V5OiBrZXlvZiBDYXJ0VG90YWxzUHJpY2luZ1xuICAgICk6IENhcnRUb3RhbFByaWNpbmdWYWx1ZSB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCB0b3RhbHMgPSBjYXJ0Py50b3RhbHMgfHwge307XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdG90YWxzW3NuYWtlQ2FzZUtleV0gPz8gdG90YWxzW2NhbWVsQ2FzZUtleV07XG4gICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghW3ZhbHVlLm5ldCwgdmFsdWUudGF4LCB2YWx1ZS5ncm9zc10uZXZlcnkoYW1vdW50ID0+IE51bWJlci5pc0Zpbml0ZShOdW1iZXIoYW1vdW50KSkpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV0OiBOdW1iZXIodmFsdWUubmV0KSxcbiAgICAgICAgICAgIHRheDogTnVtYmVyKHZhbHVlLnRheCksXG4gICAgICAgICAgICBncm9zczogTnVtYmVyKHZhbHVlLmdyb3NzKVxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBhZGRDb3Vwb24gPSBhc3luYyAoY29kZSk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgIGlmICghdGhpcy5jYW5NdXRhdGVDYXJ0KCkpIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnaW52YWxpZC1jb3Vwb24nIH07XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNhcHR1cmVDYXJ0UmVzcG9uc2VDb250ZXh0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb25uZWN0aW9uLnB1dCh0aGlzLmNvdXBvbkFwaSgpLCB7IGNvdXBvbjogY29kZSB9KS50b1Byb21pc2UoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5hcHBseUNhcnRSZXNwb25zZShyZXN1bHQsIGNvbnRleHQsIGZhbHNlKSkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdpbnZhbGlkLWNvdXBvbicgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgbWVzc2FnZTogJ29rJyB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYW5kbGVDYXJ0TXV0YXRpb25FcnJvcihlLCBjb250ZXh0LnRva2VuKSkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdjYXJ0LW5vdC1hY3RpdmUnIH07XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ2ludmFsaWQtY291cG9uJyB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlQ291cG9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuTXV0YXRlQ2FydCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNhcHR1cmVDYXJ0UmVzcG9uc2VDb250ZXh0KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uZGVsZXRlKHRoaXMuY291cG9uQXBpKCkpLnBpcGUobWFwKHJlcyA9PiB0aGlzLmFwcGx5Q2FydFJlc3BvbnNlKHJlcywgY29udGV4dCwgZmFsc2UpKSkudG9Qcm9taXNlKCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlQ2FydE11dGF0aW9uRXJyb3IoZXJyb3IsIGNvbnRleHQudG9rZW4pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9ybWF0Q291cG9uID0gKGNhcnQpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnRfY291cG9uID0gdGhpcy5jb3Vwb25TdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgY291cG9uOiBDb3Vwb25JID0geyBjb2RlOiBjYXJ0LmNvdXBvbkNvZGUgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGNhcnQuY2FydERpc2NvdW50cylbMF07XG4gICAgICAgICAgICBjb3Vwb24gPSB7XG4gICAgICAgICAgICAgICAgLi4uY291cG9uLFxuICAgICAgICAgICAgICAgIGFtb3VudDogKGNhcnQuY2FydERpc2NvdW50cyAmJiBjYXJ0LmNhcnREaXNjb3VudHNba2V5XS5hbW91bnQuY3VycmVudCkgfHwgMCxcbiAgICAgICAgICAgICAgICBuYW1lOiAoY2FydC5jYXJ0RGlzY291bnRzICYmIGNhcnQuY2FydERpc2NvdW50c1trZXldLm5hbWUpIHx8ICduby1uYW1lJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgIChjb3Vwb24gIT0gY3VycmVudF9jb3Vwb24pICYmIHRoaXMuY291cG9uU3ViamVjdC5uZXh0KGNvdXBvbik7XG4gICAgfVxuXG4gICAgY2hhbmdlSGF2ZVRvVXBkYXRlID0gKHZhbHVlKSA9PiB0aGlzLmhhdmVfdG9fdXBkYXRlID0gdmFsdWU7XG5cbiAgICByZWFkeUZvckNoZWNrb3V0ID0gKHN1Y2Nlc3NDYWxsYmFjaz86IEZ1bmN0aW9uLCBlcnJvckNhbGxiYWNrPzogRnVuY3Rpb24pOiBDYXJ0QWZmb3JkYWJsZSA9PiB7XG4gICAgICAgIGxldCBjYXJ0ID0gdGhpcy5jYXJ0U3ViamVjdC52YWx1ZTtcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5jYXJ0SXRlbXNTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgcmVzdWx0OiBDYXJ0QWZmb3JkYWJsZSA9IHsgb2s6IHRydWUgfTtcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA8IHRoaXMuY2hhbm5lbENvbmZpZy5taW5pbXVtUXVhbnRpdHlQdXJjaGFzZUl0ZW1zKSB7XG4gICAgICAgICAgICByZXN1bHQub2sgPSBmYWxzZTsgcmVzdWx0LnJlYXNvbnMucHVzaCh7IG1lc3NhZ2U6ICdub3QtZW5vdWdodC1pdGVtcycgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FydC50b3RhbHMudG90YWwgPCB0aGlzLmNoYW5uZWxDb25maWcubWluaW11bVB1cmNoYXNlQW1vdW50KSB7XG4gICAgICAgICAgICByZXN1bHQub2sgPSBmYWxzZTsgcmVzdWx0LnJlYXNvbnMucHVzaCh7IG1lc3NhZ2U6ICdub3QtZW5vdWdodC1hbW91bnQnIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjayB8fCBlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXN1bHQub2tcbiAgICAgICAgICAgICAgICA/IHN1Y2Nlc3NDYWxsYmFjayAmJiBzdWNjZXNzQ2FsbGJhY2soKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDYWxsYmFjayAmJiBlcnJvckNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB1cGRhdGVJdGVtc09uRXJyb3IgPSAoaXRlbXNXaXRoRXJyb3I6IGFueVtdLCBjb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbXNXaXRoRXJyb3IpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLml0ZW1zKTtcbiAgICAgICAgbGV0IGl0ZW1zVXBkYXRlZCA9IHRoaXMuaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1XaXRoRXJyb3IgPSBpdGVtc1dpdGhFcnJvci5maW5kKGZhaWxlZEl0ZW0gPT4gaXRlbS5pdGVtX2lkID09IGZhaWxlZEl0ZW0uaWQpO1xuICAgICAgICAgICAgaWYgKGl0ZW1XaXRoRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaXRlbS5lcnJvciA9IGNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSlcbiAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbXNVcGRhdGVkKTtcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0SXRlbXMoaXRlbXNVcGRhdGVkKTtcbiAgICB9XG5cbiAgICBsb2FkQ2FydEJ5VG9rZW4gPSBhc3luYyAodG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodG9rZW4gJiYgdG9rZW4gIT09IHRoaXMuY2FydF90b2tlbikge1xuICAgICAgICAgICAgdGhpcy5jYXJ0TGlmZWN5Y2xlR2VuZXJhdGlvbisrO1xuICAgICAgICAgICAgdGhpcy5sYXN0QXBwbGllZENhcnRSZXF1ZXN0SWQgPSArK3RoaXMuY2FydFJlcXVlc3RJZDtcbiAgICAgICAgICAgIHRoaXMuY2FydF90b2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRfdG9rZW4nLCB0b2tlbik7XG4gICAgICAgICAgICB0aGlzLnB1Ymxpc2hDYXJ0U3luYygnY2hhbmdlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldENhcnRCeVRva2VuKClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBVVElMU1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtYSBsb3Mgw610ZW1zIGNydWRvcyBkZWwgYmFja2VuZCBhbCBjb250cmF0byBpbnRlcm5vIGBDYXJ0SXRlbWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmVyX2l0ZW0gUmVzcHVlc3RhIGBpdGVtc2AgZGVsIGVuZHBvaW50IGRlIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgQXJyZWdsbyBkZSDDrXRlbXMgbm9ybWFsaXphZG9zLCBjYWRhIHVubyBjb24gYHByaWNpbmdgIHByZWNvbXB1dGFkby5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXN0ZSBlcyBlbCBwdW50byBkb25kZSBlbCBjb3JlOlxuICAgICAqIC0gcHJlc2VydmEgYHVuaXRQcm9tb3Rpb25zYFxuICAgICAqIC0gYXJtYSBgcHJpY2luZ2BcbiAgICAgKiAtIG1hbnRpZW5lIGxhIGZvcm1hIGhpc3TDs3JpY2EgZGVsIGl0ZW0gY29uc3VtaWRvIHBvciBsb3MgdGVtcGxhdGVzXG4gICAgICovXG4gICAgdHJhbnNmb3JtSXRlbXMgPSAoc2VydmVyX2l0ZW0pID0+IHNlcnZlcl9pdGVtLm1hcChcbiAgICAgICAgaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtID0ge1xuICAgICAgICAgICAgICAgIHByb2R1Y3Q6IGl0ZW0ucHJvZHVjdCxcbiAgICAgICAgICAgICAgICB2YXJpYW50X2lkOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uY29kZSxcbiAgICAgICAgICAgICAgICBsb3Q6IGl0ZW0ub3JkZXJJdGVtTG90LFxuICAgICAgICAgICAgICAgIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5LFxuICAgICAgICAgICAgICAgIGNvbW1lbnRzOiBpdGVtLmNvbW1lbnRzIHx8ICcnLFxuICAgICAgICAgICAgICAgIGl0ZW1faWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgICAgICAgdG90YWw6IGl0ZW0udG90YWwsXG4gICAgICAgICAgICAgICAgdW5pdFByaWNlOiBpdGVtLnVuaXRQcmljZSA/PyBpdGVtLnVuaXRfcHJpY2UsXG4gICAgICAgICAgICAgICAgZGlzY291bnQ6IGl0ZW0uZGlzY291bnQsXG4gICAgICAgICAgICAgICAgc3VidG90YWw6IGl0ZW0uc3VidG90YWwsXG4gICAgICAgICAgICAgICAgdGF4VG90YWw6IGl0ZW0udGF4VG90YWwgPz8gaXRlbS50YXhfdG90YWwsXG4gICAgICAgICAgICAgICAgdW5pdFByb21vdGlvbnM6IEFycmF5LmlzQXJyYXkoaXRlbS51bml0UHJvbW90aW9ucylcbiAgICAgICAgICAgICAgICAgICAgPyBpdGVtLnVuaXRQcm9tb3Rpb25zXG4gICAgICAgICAgICAgICAgICAgIDogKEFycmF5LmlzQXJyYXkoaXRlbS51bml0X3Byb21vdGlvbnMpID8gaXRlbS51bml0X3Byb21vdGlvbnMgOiBbXSksXG4gICAgICAgICAgICAgICAgbGluZVByaWNpbmc6IGl0ZW0ubGluZVByaWNpbmcgfHwgaXRlbS5saW5lX3ByaWNpbmcsXG4gICAgICAgICAgICAgICAgbGluZV9wcmljaW5nOiBpdGVtLmxpbmVfcHJpY2luZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmljaW5nID0gdGhpcy5idWlsZENhcnRJdGVtUHJpY2luZyhpdGVtKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5wcmljZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0uc2FsZXByaWNlID4gMCA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zZWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2UpO1xuICAgICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgaXRlbS5wcm9kdWN0LnByaWNlID0gaXRlbS50b3RhbCAvIGl0ZW0ucXVhbnRpdHkvLyA/IGl0ZW0ucHJvZHVjdC52YXJpYW50c1swXS5zZWxlcHJpY2UgOiBpdGVtLnByb2R1Y3QudmFyaWFudHNbMF0ucHJpY2U7XG4gICAgICAgICAgICAvLyB9LCAxMDApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICApXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1eWUgbGEgbm9ybWFsaXphY2nDs24gZGUgcHJlY2lvcyBwYXJhIHVuIMOtdGVtIGRlbCBjYXJyaXRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0gw410ZW0gbm9ybWFsaXphZG8gZGVsIGNhcnJpdG8uXG4gICAgICogQHJldHVybnMgRXN0cnVjdHVyYSBgQ2FydEl0ZW1QcmljaW5nYCBjb24gcHJlY2lvIGJhc2UsIHRhY2hhZG8sIGZpbmFsIHkgZmxhZ3MgZGUgVUkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcHJpY2luZyA9IHRoaXMuYnVpbGRDYXJ0SXRlbVByaWNpbmcoaXRlbSk7XG4gICAgICogLy8gcHJpY2luZy5iYXNlUHJpY2UgPT4gdW5pdFByaWNlIGRlbCBiYWNrZW5kIG51ZXZvIG8gZmFsbGJhY2sgbGVnYWN5XG4gICAgICogLy8gcHJpY2luZy5maW5hbFByaWNlID0+IHVuaXRQcmljZSBkZWwgYmFja2VuZCBudWV2byBvIGPDoWxjdWxvIGxlZ2FjeVxuICAgICAqIC8vIHByaWNpbmcuZWZmZWN0aXZlRGlzY291bnRQZXJjZW50ID0+ICUgdG90YWwgY29udHJhIGVsIHByZWNpbyBkZSByZWZlcmVuY2lhXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZENhcnRJdGVtUHJpY2luZyA9IChpdGVtOiBDYXJ0SXRlbSk6IENhcnRJdGVtUHJpY2luZyA9PiB7XG4gICAgICAgIGNvbnN0IHZhcmlhbnQgPSBpdGVtPy5wcm9kdWN0Py52YXJpYW50cz8uWzBdO1xuICAgICAgICBjb25zdCBjYXJ0QW5kU2lkZWJhclByaWNlcyA9IHZhcmlhbnQ/LmNhcnRBbmRTaWRlYmFyUHJpY2VzO1xuICAgICAgICAvLyBTaSBlbCBiYWNrZW5kIG51ZXZvIGluZm9ybWEgYGNhcnRBbmRTaWRlYmFyUHJpY2VzYCwgZXNlIGVzIGVsIHByZWNpbyBjb3JyZWN0b1xuICAgICAgICAvLyBwYXJhIGNhcnJpdG8vc2lkZWJhciBwb3JxdWUgZXhjbHV5ZSBpbXB1ZXN0b3MgZGUgb3JkZW4gcXVlIG5vIHNlIGxpc3RhbiBwb3Igw610ZW0uXG4gICAgICAgIC8vIFNpIG5vIGV4aXN0ZSwgc2UgbWFudGllbmUgZWwgZmFsbGJhY2sgaGlzdMOzcmljby5cbiAgICAgICAgY29uc3QgZXhwbGljaXRVbml0UHJpY2UgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShpdGVtPy51bml0UHJpY2UpO1xuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFVuaXRQcmljZSA9IE51bWJlci5pc0Zpbml0ZShleHBsaWNpdFVuaXRQcmljZSk7XG4gICAgICAgIGNvbnN0IGJhc2VQcmljZSA9IGhhc0V4cGxpY2l0VW5pdFByaWNlXG4gICAgICAgICAgICA/IGV4cGxpY2l0VW5pdFByaWNlXG4gICAgICAgICAgICA6IHRoaXMucGFyc2VQcmljZVZhbHVlKFxuICAgICAgICAgICAgICAgIGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5zYWxlcHJpY2VcbiAgICAgICAgICAgICAgICA/PyBjYXJ0QW5kU2lkZWJhclByaWNlcz8ucHJpY2VcbiAgICAgICAgICAgICAgICA/PyB2YXJpYW50Py5zYWxlcHJpY2VcbiAgICAgICAgICAgICAgICA/PyB2YXJpYW50Py5wcmljZVxuICAgICAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnNhbGVwcmljZVxuICAgICAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICAgICAgPz8gMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RyaWtlUHJpY2VDYW5kaWRhdGUgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShcbiAgICAgICAgICAgIGNhcnRBbmRTaWRlYmFyUHJpY2VzPy5wcmljZVxuICAgICAgICAgICAgPz8gdmFyaWFudD8ucHJpY2VcbiAgICAgICAgICAgID8/IGl0ZW0/LnByb2R1Y3Q/LnByaWNlXG4gICAgICAgICAgICA/PyAwXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlUHJpY2UgPSBpc05hTihiYXNlUHJpY2UpID8gMCA6IGJhc2VQcmljZTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN0cmlrZVByaWNlID0gaXNOYU4oc3RyaWtlUHJpY2VDYW5kaWRhdGUpID8gMCA6IHN0cmlrZVByaWNlQ2FuZGlkYXRlO1xuICAgICAgICBjb25zdCB1bml0UHJvbW90aW9uVG90YWwgPSBBcnJheS5pc0FycmF5KGl0ZW0/LnVuaXRQcm9tb3Rpb25zKVxuICAgICAgICAgICAgPyBpdGVtLnVuaXRQcm9tb3Rpb25zLnJlZHVjZSgodG90YWwsIHByb21vdGlvbikgPT4gdG90YWwgKyBOdW1iZXIocHJvbW90aW9uPy5hbW91bnQgfHwgMCksIDApXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIGNvbnN0IGhhc1N0cmlrZVByaWNlID0gbm9ybWFsaXplZFN0cmlrZVByaWNlID4gbm9ybWFsaXplZEJhc2VQcmljZSAmJiBub3JtYWxpemVkQmFzZVByaWNlID4gMDtcbiAgICAgICAgY29uc3QgaGFzVW5pdFByb21vdGlvbnMgPSBBcnJheS5pc0FycmF5KGl0ZW0/LnVuaXRQcm9tb3Rpb25zKSAmJiBpdGVtLnVuaXRQcm9tb3Rpb25zLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IHF1YW50aXR5ID0gTnVtYmVyKGl0ZW0/LnF1YW50aXR5IHx8IDApO1xuICAgICAgICBjb25zdCBmaW5hbFByaWNlID0gaGFzRXhwbGljaXRVbml0UHJpY2VcbiAgICAgICAgICAgID8gbm9ybWFsaXplZEJhc2VQcmljZVxuICAgICAgICAgICAgOiBoYXNVbml0UHJvbW90aW9ucyA/IG5vcm1hbGl6ZWRCYXNlUHJpY2UgKyB1bml0UHJvbW90aW9uVG90YWwgOiBub3JtYWxpemVkQmFzZVByaWNlO1xuICAgICAgICBjb25zdCBwcm9kdWN0RGlzY291bnQgPSB0aGlzLnBhcnNlUHJpY2VWYWx1ZShpdGVtPy5kaXNjb3VudCk7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVByb2R1Y3REaXNjb3VudCA9IE51bWJlcihpdGVtPy5wcm9kdWN0Py5kaXNjb3VudCB8fCAwKTtcbiAgICAgICAgY29uc3QgZGlzY291bnRQZXJjZW50ID0gTnVtYmVyLmlzRmluaXRlKHByb2R1Y3REaXNjb3VudCkgJiYgcHJvZHVjdERpc2NvdW50IDwgMCAmJiBub3JtYWxpemVkQmFzZVByaWNlID4gMCAmJiBxdWFudGl0eSA+IDBcbiAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoTWF0aC5hYnMocHJvZHVjdERpc2NvdW50KSAvIChub3JtYWxpemVkQmFzZVByaWNlICogcXVhbnRpdHkpKSAqIDEwMClcbiAgICAgICAgICAgIDogIWlzTmFOKGxlZ2FjeVByb2R1Y3REaXNjb3VudCkgJiYgbGVnYWN5UHJvZHVjdERpc2NvdW50ID4gMFxuICAgICAgICAgICAgICAgID8gTWF0aC5yb3VuZChsZWdhY3lQcm9kdWN0RGlzY291bnQpXG4gICAgICAgICAgICAgICAgOiBoYXNTdHJpa2VQcmljZVxuICAgICAgICAgICAgICAgICAgICA/IE1hdGgucm91bmQoKChub3JtYWxpemVkU3RyaWtlUHJpY2UgLSBub3JtYWxpemVkQmFzZVByaWNlKSAvIG5vcm1hbGl6ZWRTdHJpa2VQcmljZSkgKiAxMDApXG4gICAgICAgICAgICAgICAgICAgIDogMDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlUmVmZXJlbmNlUHJpY2UgPSBoYXNTdHJpa2VQcmljZSA/IG5vcm1hbGl6ZWRTdHJpa2VQcmljZSA6IG5vcm1hbGl6ZWRCYXNlUHJpY2U7XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZURpc2NvdW50UGVyY2VudCA9IGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlID4gMCAmJiBmaW5hbFByaWNlID4gMCAmJiBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSA+IGZpbmFsUHJpY2VcbiAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoKGVmZmVjdGl2ZVJlZmVyZW5jZVByaWNlIC0gZmluYWxQcmljZSkgLyBlZmZlY3RpdmVSZWZlcmVuY2VQcmljZSkgKiAxMDApXG4gICAgICAgICAgICA6IGRpc2NvdW50UGVyY2VudDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmFzZVByaWNlOiBub3JtYWxpemVkQmFzZVByaWNlLFxuICAgICAgICAgICAgc3RyaWtlUHJpY2U6IGhhc1N0cmlrZVByaWNlID8gbm9ybWFsaXplZFN0cmlrZVByaWNlIDogbnVsbCxcbiAgICAgICAgICAgIGZpbmFsUHJpY2UsXG4gICAgICAgICAgICB1bml0UHJvbW90aW9uVG90YWwsXG4gICAgICAgICAgICBoYXNTdHJpa2VQcmljZSxcbiAgICAgICAgICAgIGhhc1VuaXRQcm9tb3Rpb25zLFxuICAgICAgICAgICAgZGlzY291bnRQZXJjZW50LFxuICAgICAgICAgICAgZWZmZWN0aXZlRGlzY291bnRQZXJjZW50XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXphIHZhbG9yZXMgZGUgcHJlY2lvIHByb3ZlbmllbnRlcyBkZWwgYmFja2VuZCBhIGBudW1iZXJgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIFZhbG9yIG51bcOpcmljbyBvIHN0cmluZyBjb24gZm9ybWF0byBsb2NhbCAoYDEyMC4wMDBgLCBgMTIwMDAwYCwgYDEyMDAwMC0xYCwgZXRjLikuXG4gICAgICogQHJldHVybnMgTsO6bWVybyBwYXJzZWFkbyBvIGBOYU5gIHNpIGVsIHZhbG9yIG5vIGVzIHV0aWxpemFibGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNlIHVzYSBwYXJhIHNvcG9ydGFyIHJlc3B1ZXN0YXMgY29uIHNlcGFyYWRvcmVzIGRlIG1pbGVzLCBjb21hIGRlY2ltYWwgbyByYW5nb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVByaWNlVmFsdWUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXcgPSB2YWx1ZS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgaWYgKCFyYXcpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gcmF3LmluY2x1ZGVzKCctJykgPyByYXcuc3BsaXQoJy0nKVswXS50cmltKCkgOiByYXc7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmaXJzdFZhbHVlXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLig/PVxcZHszfShcXER8JCkpL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJywnLCAnLicpO1xuXG4gICAgICAgIHJldHVybiBOdW1iZXIobm9ybWFsaXplZCk7XG4gICAgfVxuXG5cbiAgICBnZXRDcmVkaXRBbW91bnQgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPiA9PlxuICAgICAgICB0aGlzLmJhbGFuY2VDdXN0b21lclN1YmplY3QucGlwZShcbiAgICAgICAgICAgIG1hcCgoYmFsYW5jZUN1c3RvbWVyKSA9PiBiYWxhbmNlQ3VzdG9tZXI/LmNyZWRpdEFtb3VudCA/PyBudWxsKVxuICAgICAgICApO1xuXG4gICAgZ2V0Q2xpZW50VGF4ZXMgPSAoKTogT2JzZXJ2YWJsZTxudW1iZXI+ID0+XG4gICAgICAgIHRoaXMuY2FydC5waXBlKG1hcCgoY2FydCkgPT4gY2FydD8udG90YWxzPy50YXhlcyA+IDAgPyBjYXJ0Py50b3RhbHM/LmNsaWVudFRheGVzIDogMCkpO1xuXG4gICAgZ2V0UmVtYWluaW5nQ3JlZGl0cyA9ICgpOiBPYnNlcnZhYmxlPG51bWJlcj4gPT5cbiAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0LnBpcGUobWFwKChiYWxhbmNlQ3VzdG9tZXIpID0+IGJhbGFuY2VDdXN0b21lcj8ucmVtYWluaW5nQ3JlZGl0cykpO1xuXG4gICAgcHVibGljIHVwZGF0ZUJhbGFuY2VBdHRyaWJ1dGVzKGJhbGFuY2U6IGFueSwgdG90YWw6IG51bWJlciB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGlmICghYmFsYW5jZSkge1xuICAgICAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRvdGFsID8/IDA7XG5cbiAgICAgICAgY29uc3QgYmFsYW5jZURhdGEgPSB7XG4gICAgICAgICAgICBhbGxvd0FueVBheW1lbnRNZXRob2Q6IGJhbGFuY2UuYWxsb3dBbnlQYXltZW50TWV0aG9kLFxuICAgICAgICAgICAgYWxsb3dFeGNlZWRCYWxhbmNlOiBiYWxhbmNlLmFsbG93RXhjZWVkQmFsYW5jZSxcbiAgICAgICAgICAgIGNyZWRpdEFtb3VudDogYmFsYW5jZS5jcmVkaXRBbW91bnQsXG4gICAgICAgICAgICBzaG93TWF4OiBiYWxhbmNlLnNob3dNYXgsXG4gICAgICAgICAgICBzaG93UHJpY2U6IGJhbGFuY2Uuc2hvd1ByaWNlLFxuICAgICAgICAgICAgcmVtYWluaW5nQ3JlZGl0czpcbiAgICAgICAgICAgICAgICBiYWxhbmNlLmNyZWRpdEFtb3VudCAhPSBudWxsICYmIHRvdGFsQW1vdW50ICE9IG51bGwgJiYgYmFsYW5jZS5jcmVkaXRBbW91bnQgPj0gdG90YWxBbW91bnRcbiAgICAgICAgICAgICAgICAgICAgPyBiYWxhbmNlLmNyZWRpdEFtb3VudCAtIHRvdGFsQW1vdW50XG4gICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGFwcGx5TWF4T3JkZXJzOiBiYWxhbmNlLmFwcGx5TWF4T3JkZXJzLFxuICAgICAgICAgICAgbWF4T3JkZXJzOiBiYWxhbmNlLm1heE9yZGVyc1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyU3ViamVjdC5uZXh0KGJhbGFuY2VEYXRhKTtcbiAgICB9XG5cbn1cbiJdfQ==
|