ng-miam 9.2.0 → 9.2.2
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/bundles/ng-miam.umd.js +927 -634
- package/bundles/ng-miam.umd.js.map +1 -1
- package/bundles/ng-miam.umd.min.js +1 -1
- package/bundles/ng-miam.umd.min.js.map +1 -1
- package/esm2015/lib/_components/accordion/accordion.component.js +2 -2
- package/esm2015/lib/_components/addon-link/addon-link.component.js +3 -3
- package/esm2015/lib/_components/counter-input/counter-input.component.js +14 -12
- package/esm2015/lib/_components/guests-dropdown/guests-dropdown.component.js +8 -5
- package/esm2015/lib/_components/icon/icon.component.js +2 -2
- package/esm2015/lib/_components/like-button/like-button.component.js +6 -5
- package/esm2015/lib/_components/modal/modal.component.js +39 -36
- package/esm2015/lib/_components/no-pos-selected/no-pos-selected.component.js +2 -2
- package/esm2015/lib/_components/product-card/out-of-stock-overlay/out-of-stock-overlay.component.js +15 -6
- package/esm2015/lib/_components/product-card/product-card-skeleton/product-card-skeleton.component.js +1 -1
- package/esm2015/lib/_components/product-card/product-card.component.js +25 -7
- package/esm2015/lib/_components/products-picker/products-picker.component.js +2 -2
- package/esm2015/lib/_components/recipe-promotion-badge/recipe-promotion-badge.component.js +2 -2
- package/esm2015/lib/_components/sponsor-blocks/sponsor-image-and-text-block/sponsor-image-and-text-block.component.js +4 -4
- package/esm2015/lib/_components/sponsor-blocks/sponsor-logo-block/sponsor-logo-block.component.js +4 -4
- package/esm2015/lib/_components/sponsor-blocks/sponsor-picture-block/sponsor-picture-block.component.js +3 -3
- package/esm2015/lib/_components/sponsor-blocks/sponsor-small-picture-block/sponsor-small-picture-block.component.js +3 -3
- package/esm2015/lib/_components/sponsor-blocks/sponsor-text-and-image-block/sponsor-text-and-image-block.component.js +4 -4
- package/esm2015/lib/_models/basket-actions/basket-action.js +2 -2
- package/esm2015/lib/_services/basket-recipe-cleanup.service.js +62 -0
- package/esm2015/lib/_services/basket-transfer.service.js +3 -2
- package/esm2015/lib/_services/baskets-synchronizing/baskets-synchronizer.service.js +9 -3
- package/esm2015/lib/_services/context.service.js +17 -13
- package/esm2015/lib/_services/interceptor.service.js +10 -3
- package/esm2015/lib/_services/recipe-details.service.js +22 -7
- package/esm2015/lib/_services/recipes.service.js +5 -5
- package/esm2015/lib/_services/store-locator.service.js +10 -3
- package/esm2015/lib/_services/store-out-of-stock.service.js +57 -0
- package/esm2015/lib/_services/user.service.js +3 -3
- package/esm2015/lib/_types/builded/mealz-interface.js +1 -1
- package/esm2015/lib/_web-components/basket-preview/basket-preview-block/basket-preview-block.component.js +3 -2
- package/esm2015/lib/_web-components/basket-preview/basket-preview-line/basket-preview-line.component.js +130 -122
- package/esm2015/lib/_web-components/basket-preview/basket-preview-product/basket-preview-product.component.js +44 -34
- package/esm2015/lib/_web-components/basket-preview/replace-item/replace-item.component.js +14 -7
- package/esm2015/lib/_web-components/list-scan/files-inputs/files-inputs.component.js +2 -2
- package/esm2015/lib/_web-components/meals-planner/meals-planner-form/meals-planner-form.component.js +13 -13
- package/esm2015/lib/_web-components/no-supplier-onboarding/no-supplier-onboarding.component.js +8 -12
- package/esm2015/lib/_web-components/preferences/preferences-search/preferences-search.component.js +2 -2
- package/esm2015/lib/_web-components/preferences/preferences.component.js +28 -28
- package/esm2015/lib/_web-components/recipe-cards/recipe-card/recipe-card.component.js +118 -97
- package/esm2015/lib/_web-components/recipe-cards/recipe-card-cta/recipe-card-cta.component.js +21 -14
- package/esm2015/lib/_web-components/recipe-catalog/catalog-article-card/catalog-article-card.component.js +9 -8
- package/esm2015/lib/_web-components/recipe-catalog/catalog-category/catalog-category.component.js +10 -8
- package/esm2015/lib/_web-components/recipe-catalog/catalog-header/catalog-header.component.js +3 -3
- package/esm2015/lib/_web-components/recipe-catalog/catalog-toolbar/catalog-toolbar.component.js +14 -10
- package/esm2015/lib/_web-components/recipe-catalog/recipe-catalog.component.js +42 -37
- package/esm2015/lib/_web-components/recipe-details/last-order-modal/last-order-modal.component.js +2 -2
- package/esm2015/lib/_web-components/recipe-details/recipe-addon/recipe-addon.component.js +4 -3
- package/esm2015/lib/_web-components/recipe-details/recipe-details-infos/recipe-details-infos.component.js +16 -13
- package/esm2015/lib/_web-components/recipe-details/recipe-details-ingredients/recipe-details-ingredients.component.js +4 -3
- package/esm2015/lib/_web-components/recipe-details/recipe-details.component.js +98 -103
- package/esm2015/lib/_web-components/recipe-details/store-locator-link/store-locator-link.component.js +8 -7
- package/esm2015/lib/_web-components/recipe-modal/recipe-modal.component.js +7 -2
- package/esm2015/lib/environments/environment.js +2 -2
- package/esm2015/lib/environments/environment.prod.js +2 -2
- package/esm2015/lib/environments/version.js +2 -2
- package/esm2015/lib/ng-miam.module.js +4 -1
- package/fesm2015/ng-miam.js +882 -627
- package/fesm2015/ng-miam.js.map +1 -1
- package/lib/_components/components.module.d.ts +2 -1
- package/lib/_components/components.module.d.ts.map +1 -1
- package/lib/_components/product-card/out-of-stock-overlay/out-of-stock-overlay.component.d.ts +7 -3
- package/lib/_components/product-card/out-of-stock-overlay/out-of-stock-overlay.component.d.ts.map +1 -1
- package/lib/_components/product-card/product-card.component.d.ts +2 -0
- package/lib/_components/product-card/product-card.component.d.ts.map +1 -1
- package/lib/_models/basket-actions/basket-action.d.ts.map +1 -1
- package/lib/_services/basket-recipe-cleanup.service.d.ts +21 -0
- package/lib/_services/basket-recipe-cleanup.service.d.ts.map +1 -0
- package/lib/_services/basket-transfer.service.d.ts.map +1 -1
- package/lib/_services/baskets-synchronizing/baskets-synchronizer.service.d.ts +1 -1
- package/lib/_services/baskets-synchronizing/baskets-synchronizer.service.d.ts.map +1 -1
- package/lib/_services/context.service.d.ts +3 -1
- package/lib/_services/context.service.d.ts.map +1 -1
- package/lib/_services/interceptor.service.d.ts +1 -0
- package/lib/_services/interceptor.service.d.ts.map +1 -1
- package/lib/_services/recipe-details.service.d.ts +8 -2
- package/lib/_services/recipe-details.service.d.ts.map +1 -1
- package/lib/_services/recipes.service.d.ts +2 -6
- package/lib/_services/recipes.service.d.ts.map +1 -1
- package/lib/_services/store-locator.service.d.ts +1 -0
- package/lib/_services/store-locator.service.d.ts.map +1 -1
- package/lib/_services/store-out-of-stock.service.d.ts +13 -0
- package/lib/_services/store-out-of-stock.service.d.ts.map +1 -0
- package/lib/_services/user.service.d.ts +2 -2
- package/lib/_services/user.service.d.ts.map +1 -1
- package/lib/_types/builded/mealz-interface.d.ts +4 -0
- package/lib/_types/builded/mealz-interface.d.ts.map +1 -1
- package/lib/_web-components/basket-preview/replace-item/replace-item.component.d.ts +1 -0
- package/lib/_web-components/basket-preview/replace-item/replace-item.component.d.ts.map +1 -1
- package/lib/_web-components/recipe-cards/recipe-card/recipe-card.component.d.ts +1 -0
- package/lib/_web-components/recipe-cards/recipe-card/recipe-card.component.d.ts.map +1 -1
- package/lib/_web-components/recipe-cards/recipe-card-cta/recipe-card-cta.component.d.ts +1 -1
- package/lib/_web-components/recipe-cards/recipe-card-cta/recipe-card-cta.component.d.ts.map +1 -1
- package/lib/_web-components/recipe-details/recipe-details.component.d.ts +1 -1
- package/lib/_web-components/recipe-details/recipe-details.component.d.ts.map +1 -1
- package/lib/_web-components/recipe-modal/recipe-modal.component.d.ts.map +1 -1
- package/lib/environments/version.d.ts +1 -1
- package/lib/ng-miam.module.d.ts.map +1 -1
- package/miam-style.css +1 -1
- package/package.json +1 -1
|
@@ -54,8 +54,11 @@ export class BasketsSynchronizerService {
|
|
|
54
54
|
this.subscriptions.push(this.mealzActionList.pipe(map((actions) => actions.filter(action => action.status === ActionStatus.INITIAL_STATE)), filter((actions) => actions.length > 0), switchMap((actions) => this.createActionsForRetailer(actions))).subscribe((actionsForRetailer) => {
|
|
55
55
|
if (actionsForRetailer.length > 0) {
|
|
56
56
|
mealzDebug('[Mealz] Pushing products to retailer cart', actionsForRetailer);
|
|
57
|
-
this.checkActionsToSkip(actionsForRetailer);
|
|
58
|
-
|
|
57
|
+
const skipped = this.checkActionsToSkip(actionsForRetailer);
|
|
58
|
+
const actionsToCommunicate = actionsForRetailer.filter(action => !skipped.some(a => a.id === action.id));
|
|
59
|
+
if (actionsToCommunicate.length > 0) {
|
|
60
|
+
this.sendActionsToRetailerCart(actionsForRetailer.filter(action => actionsToCommunicate.includes(action)));
|
|
61
|
+
}
|
|
59
62
|
}
|
|
60
63
|
else {
|
|
61
64
|
this.syncMealzBasketWithRetailerCart(this.supplierService.lastSupplierCart);
|
|
@@ -278,12 +281,15 @@ export class BasketsSynchronizerService {
|
|
|
278
281
|
});
|
|
279
282
|
}
|
|
280
283
|
checkActionsToSkip(retailerActions) {
|
|
284
|
+
const actionsToSkip = [];
|
|
281
285
|
retailerActions.forEach((retailerAction) => {
|
|
282
286
|
// If the quantity is 0, skip the update from retailer
|
|
283
287
|
if (retailerAction.quantity === 0) {
|
|
288
|
+
actionsToSkip.push(retailerAction);
|
|
284
289
|
this.skipRetailerUpdateForAction(this.mealzActionList.value.find(action => action.id === retailerAction.id));
|
|
285
290
|
}
|
|
286
291
|
});
|
|
292
|
+
return actionsToSkip;
|
|
287
293
|
}
|
|
288
294
|
skipRetailerUpdateForAction(action) {
|
|
289
295
|
mealzDebug('[Mealz] Skipping retailer update for action', action.loggable);
|
|
@@ -433,4 +439,4 @@ BasketsSynchronizerService.ɵprov = i0.ɵɵdefineInjectable({ token: BasketsSync
|
|
|
433
439
|
providedIn: 'root'
|
|
434
440
|
}]
|
|
435
441
|
}], function () { return [{ type: i1.BasketsService }, { type: i2.SuppliersService }]; }, null); })();
|
|
436
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0cy1zeW5jaHJvbml6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1pYW0vc3JjL2xpYi9fc2VydmljZXMvYmFza2V0cy1zeW5jaHJvbml6aW5nL2Jhc2tldHMtc3luY2hyb25pemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM5RyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekYsT0FBTyxFQUFFLFlBQVksRUFBZ0IsTUFBTSw0Q0FBNEMsQ0FBQztBQUV4RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQU14RCxNQUFNLE9BQU8sMEJBQTBCO0lBd0JyQyxZQUNVLGNBQThCLEVBQzlCLGVBQWlDO1FBRGpDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUF6QjNDLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxvQkFBZSxHQUFvQyxJQUFJLGVBQWUsQ0FBQyxFQUFvQixDQUFDLENBQUM7UUFDN0YsNkJBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ2hD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QUFFLENBQUM7U0FDaEU7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZTtRQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDakMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FDdkUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFO2dCQUNqRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDbkI7WUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDOztvR0ExZ0JVLDBCQUEwQjtrRUFBMUIsMEJBQTBCLFdBQTFCLDBCQUEwQixtQkFIekIsTUFBTTt1RkFHUCwwQkFBMEI7Y0FKdEMsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmb3JrSm9pbiwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBza2lwV2hpbGUsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCYXNrZXRFbnRyeSB9IGZyb20gJy4uLy4uL19tb2RlbHMnO1xuaW1wb3J0IHsgQWN0aW9uU3RhdHVzLCBCYXNrZXRBY3Rpb24gfSBmcm9tICcuLi8uLi9fbW9kZWxzL2Jhc2tldC1hY3Rpb25zL2Jhc2tldC1hY3Rpb24nO1xuaW1wb3J0IHsgQ29tcGFyYWJsZVByb2R1Y3QgfSBmcm9tICcuLi8uLi9fdHlwZXMvYnVpbGRlZC9jb21wYXJhYmxlLXByb2R1Y3QnO1xuaW1wb3J0IHsgRXZlbnRUcmFjZSB9IGZyb20gJy4uLy4uL190eXBlcy9ldmVudC10cmFjZSc7XG5pbXBvcnQgeyBtZWFsekRlYnVnIH0gZnJvbSAnLi4vLi4vX3V0aWxzL21ldGhvZHMvbG9nZ2luZyc7XG5pbXBvcnQgeyBCYXNrZXRzU2VydmljZSB9IGZyb20gJy4uL2Jhc2tldHMuc2VydmljZSc7XG5pbXBvcnQgeyBTdXBwbGllcnNTZXJ2aWNlIH0gZnJvbSAnLi4vc3VwcGxpZXJzLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcblxuZXhwb3J0IGNsYXNzIEJhc2tldHNTeW5jaHJvbml6ZXJTZXJ2aWNlIHtcbiAgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgbWVhbHpBY3Rpb25MaXN0OiBCZWhhdmlvclN1YmplY3Q8QmFza2V0QWN0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSBhcyBCYXNrZXRBY3Rpb25bXSk7XG4gIGZpcnN0UmV0YWlsZXJDYXJ0Q2hhbmdlZCA9IHRydWU7XG4gIG5vU3VwcGxpZXIkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBsb2NrV2hpbGVDb25maXJtaW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbG9ja1doaWxlU3luY2hyb25pemluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gYmUgZGVmaW5lZCB0aHJvdWdoIGNvbnRleHQgLSBTZW5kcyBib3RoIGFkZCBhbmQgcmVtb3ZlIGFjdGlvbnMgdG8gcmV0YWlsZXJcbiAgICogQ2xpZW50IG5lZWRzIHRvIGVpdGhlciBkZWZpbmUgcHVzaFByb2R1Y3RzIG9yIGJvdGggYWRkUHJvZHVjdHMgYW5kIHJlbW92ZVByb2R1Y3RzXG4gICAqL1xuICBwdXNoUHJvZHVjdHNUb1JldGFpbGVyQ2FydDogKGNvbXBhcmFibGVQcm9kdWN0czogQ29tcGFyYWJsZVByb2R1Y3RbXSkgPT4gdm9pZDtcblxuICAvKipcbiAgICogTWV0aG9kIHRvIGJlIGRlZmluZWQgdGhyb3VnaCBjb250ZXh0IC0gU2VuZHMgYWRkIGFjdGlvbnMgdG8gcmV0YWlsZXJcbiAgICovXG4gIGFkZFByb2R1Y3RzVG9SZXRhaWxlckNhcnQ6IChjb21wYXJhYmxlUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBiZSBkZWZpbmVkIHRocm91Z2ggY29udGV4dCAtIFNlbmRzIHJlbW92ZSBhY3Rpb25zIHRvIHJldGFpbGVyXG4gICAqL1xuICByZW1vdmVQcm9kdWN0c0Zyb21SZXRhaWxlckNhcnQ6IChjb21wYXJhYmxlUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10pID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYXNrZXRzU2VydmljZTogQmFza2V0c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdXBwbGllclNlcnZpY2U6IFN1cHBsaWVyc1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XG4gICAgLy8gQmVnaW4gbGlzdGVuaW5nIGZvciBtaWFtJ3MgYmFza2V0ICh3aWxsIG5vdCBmZXRjaCBiYXNrZXQgYXV0b21hdGljYWxseSlcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIEluaXRpYWxpemluZyBCYXNrZXRzU3luY2hyb25pemVyU2VydmljZScpO1xuICAgIG1lcmdlKHRoaXMuc3VwcGxpZXJTZXJ2aWNlLnN1cHBsaWVyJCwgdGhpcy5ub1N1cHBsaWVyJCkucGlwZShcbiAgICAgIHNraXBXaGlsZSgoc3VwcGxpZXIsIG5vU3VwcGxpZXIpID0+ICFzdXBwbGllciAmJiAhbm9TdXBwbGllciksXG4gICAgICB0YWtlKDEpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5saXN0ZW5BY3Rpb25MaXN0KCk7XG4gICAgICAgIHRoaXMubGlzdGVuVG9Db25maXJtKCk7XG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdXNoQmFza2V0RW50cmllc1RvQmFza2V0OiAoZW50cmllczogYW55W10pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBtZXRob2Qgd2FzIHBhc3NlZCB0byBcXCd3aW5kb3cubWVhbHouYmFza2V0U3luYy5kZWZpbmVQdXNoQmFza2V0RW50cmllc1RvQmFza2V0XFwnJyk7XG4gIH07XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFDVElPTiBMSVNUIE1BTkFHRU1FTlQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3Qgb2YgYmFza2V0IGVudHJpZXMgdG8gdGhlIGFjdGlvbiBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBhY3Rpb24gdHlwZVxuICAgKiBAcGFyYW0gYWN0aW9uc1xuICAgKi9cbiAgYWRkVG9BY3Rpb25MaXN0KFxuICAgIGFjdGlvbnM6IEJhc2tldEFjdGlvbltdXG4gICk6IHZvaWQge1xuICAgIGFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBCYXNrZXRBY3Rpb24pID0+IHtcbiAgICAgIGFjdGlvbi51cGRhdGVCYXNrZXRFbnRyeVF1YW50aXR5KCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUodXBkYXRlZEJFID0+IHtcbiAgICAgICAgYWN0aW9uLmJhc2tldEVudHJ5ID0gdXBkYXRlZEJFO1xuICAgICAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC52YWx1ZS5wdXNoKGFjdGlvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC5uZXh0KHRoaXMubWVhbHpBY3Rpb25MaXN0LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGFjdGlvbnMgbGlzdCBhbmQgZXhlY3V0ZSBhZnRlciA4MDBtcyBkZWJvdW5jZVxuICAgKi9cbiAgbGlzdGVuQWN0aW9uTGlzdCgpOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIExpc3RlbmluZyB0byBhY3Rpb24gbGlzdCcpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5tZWFsekFjdGlvbkxpc3QucGlwZShcbiAgICAgICAgbWFwKChhY3Rpb25zOiBCYXNrZXRBY3Rpb25bXSkgPT4gYWN0aW9ucy5maWx0ZXIoYWN0aW9uID0+IGFjdGlvbi5zdGF0dXMgPT09IEFjdGlvblN0YXR1cy5JTklUSUFMX1NUQVRFKSksXG4gICAgICAgIGZpbHRlcigoYWN0aW9uczogQmFza2V0QWN0aW9uW10pID0+IGFjdGlvbnMubGVuZ3RoID4gMCksXG4gICAgICAgIHN3aXRjaE1hcCgoYWN0aW9uczogQmFza2V0QWN0aW9uW10pID0+IHRoaXMuY3JlYXRlQWN0aW9uc0ZvclJldGFpbGVyKGFjdGlvbnMpKVxuICAgICAgKS5zdWJzY3JpYmUoKGFjdGlvbnNGb3JSZXRhaWxlcjogQ29tcGFyYWJsZVByb2R1Y3RbXSkgPT4ge1xuICAgICAgICBpZiAoYWN0aW9uc0ZvclJldGFpbGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFB1c2hpbmcgcHJvZHVjdHMgdG8gcmV0YWlsZXIgY2FydCcsIGFjdGlvbnNGb3JSZXRhaWxlcik7XG4gICAgICAgICAgdGhpcy5jaGVja0FjdGlvbnNUb1NraXAoYWN0aW9uc0ZvclJldGFpbGVyKTtcbiAgICAgICAgICB0aGlzLnNlbmRBY3Rpb25zVG9SZXRhaWxlckNhcnQoYWN0aW9uc0ZvclJldGFpbGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN5bmNNZWFsekJhc2tldFdpdGhSZXRhaWxlckNhcnQodGhpcy5zdXBwbGllclNlcnZpY2UubGFzdFN1cHBsaWVyQ2FydCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNlbmRBY3Rpb25zVG9SZXRhaWxlckNhcnQoYWN0aW9uc0ZvclJldGFpbGVyOiBDb21wYXJhYmxlUHJvZHVjdFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHVzaFByb2R1Y3RzVG9SZXRhaWxlckNhcnQpIHtcbiAgICAgIHRoaXMucHVzaFByb2R1Y3RzVG9SZXRhaWxlckNhcnQoYWN0aW9uc0ZvclJldGFpbGVyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5hZGRQcm9kdWN0c1RvUmV0YWlsZXJDYXJ0ICYmIHRoaXMucmVtb3ZlUHJvZHVjdHNGcm9tUmV0YWlsZXJDYXJ0KSB7XG4gICAgICBjb25zdCBwcm9kdWN0c1RvQWRkOiBDb21wYXJhYmxlUHJvZHVjdFtdID0gW107XG4gICAgICBjb25zdCBwcm9kdWN0c1RvUmVtb3ZlOiBDb21wYXJhYmxlUHJvZHVjdFtdID0gW107XG4gICAgICBhY3Rpb25zRm9yUmV0YWlsZXIuZm9yRWFjaChhY3Rpb24gPT5cbiAgICAgICAgYWN0aW9uLnF1YW50aXR5IDwgMCA/IHByb2R1Y3RzVG9SZW1vdmUucHVzaChhY3Rpb24pIDogcHJvZHVjdHNUb0FkZC5wdXNoKGFjdGlvbilcbiAgICAgICk7XG4gICAgICBpZiAocHJvZHVjdHNUb0FkZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYWRkUHJvZHVjdHNUb1JldGFpbGVyQ2FydChwcm9kdWN0c1RvQWRkKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9kdWN0c1RvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZW1vdmVQcm9kdWN0c0Zyb21SZXRhaWxlckNhcnQocHJvZHVjdHNUb1JlbW92ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnW01lYWx6XSBpcyBtaXNzaW5nIGEgY2FsbGJhY2sgdG8gYWRkIHRvIGNhcnQ6ICcgKyAnWW91IG5lZWQgdG8gY2FsbCBlaXRoZXIgXFwnd2luZG93Lm1lYWx6LmJhc2tldFN5bmMuZGVmaW5lUHVzaFByb2R1Y3RzVG9DYXJ0XFwnICcgK1xuICAgICAgICAnb3IgYm90aCBcXCd3aW5kb3cubWVhbHouYmFza2V0U3luYy5kZWZpbmVBZGRQcm9kdWN0c1RvQ2FydFxcJyBhbmQgXFwnd2luZG93Lm1lYWx6LmJhc2tldFN5bmMuZGVmaW5lUmVtb3ZlUHJvZHVjdHNUb0NhcnRcXCcnXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIGxpc3Qgb2YgQmFza2V0QWN0aW9ucyBhbmQgZm9yIGVhY2ggYWN0aW9uIHRoYXQgaXMgbm90IGEgZHVwbGljYXRlIChiYXNlZCBvbiB0aGUgYWN0aW9uJ3MgaWQpXG4gICAqIGl0IGNhbGxzIHRoZSBjcmVhdGVBY3Rpb25Gb3JSZXRhaWxlcigpIG1ldGhvZCBhbmQgYWRkcyB0aGUgb2JzZXJ2YWJsZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZFxuICAgKiB0byB0aGUgYWN0aW9uc1RvUHJvY2VzcyBhcnJheS5cbiAgICogVGhlbiBpdCB1c2VzIGZvcmtKb2luIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGUgYWN0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgcmVzb2x2aW5nIHRoZSBvYnNlcnZhYmxlLlxuICAgKiBUaGUgcmVzb2x2ZWQgdmFsdWUgaXMgYW4gYXJyYXkgb2YgQ29tcGFyYWJsZVByb2R1Y3RzIHRoYXQgcmVwcmVzZW50IHRoZSBwcm9kdWN0cyBhbmQgcXVhbnRpdGllc1xuICAgKiB0byBiZSBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIHJldGFpbGVyJ3MgY2FydC5cbiAgICogQHBhcmFtIGFjdGlvbnMgdGhlIGxpc3Qgb2YgQmFza2V0QWN0aW9ucyB0byBwcm9jZXNzXG4gICAqIEByZXR1cm5zIGFuIG9ic2VydmFibGUgdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIENvbXBhcmFibGVQcm9kdWN0c1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBY3Rpb25zRm9yUmV0YWlsZXIoYWN0aW9uczogQmFza2V0QWN0aW9uW10pOiBPYnNlcnZhYmxlPENvbXBhcmFibGVQcm9kdWN0W10+IHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFByb2Nlc3NpbmcgYWN0aW9ucyBpbiBsaXN0OicsIGFjdGlvbnMubWFwKGEgPT4gYS5sb2dnYWJsZSkpO1xuICAgIGNvbnN0IHNlZW5JZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IGFjdGlvbnNUb1Byb2Nlc3M6IE9ic2VydmFibGU8Q29tcGFyYWJsZVByb2R1Y3Q+W10gPSBbXTtcblxuICAgIGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgaWYgKCFzZWVuSWRzLmhhcyhhY3Rpb24uaWQpKSB7XG4gICAgICAgIHNlZW5JZHMuYWRkKGFjdGlvbi5pZCk7XG4gICAgICAgIGFjdGlvbi5pbml0UHJvY2Vzcyh0aGlzLm1lYWx6QWN0aW9uTGlzdCk7XG4gICAgICAgIGNvbnN0IHJldGFpbGVyQWN0aW9uT2JzZXJ2YWJsZSA9IGFjdGlvbi5jcmVhdGVBY3Rpb25Gb3JSZXRhaWxlcigpO1xuICAgICAgICBhY3Rpb25zVG9Qcm9jZXNzLnB1c2gocmV0YWlsZXJBY3Rpb25PYnNlcnZhYmxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZm9ya0pvaW4oYWN0aW9uc1RvUHJvY2Vzcyk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25pemVzIHRoZSBNZWFseiBiYXNrZXQgd2l0aCB0aGUgcmV0YWlsZXIncyBjYXJ0LlxuICAgKiBUaGlzIGludm9sdmVzIGNoZWNraW5nIHdoaWNoIHByb2R1Y3RzIGFyZSBpbiBib3RoIHRoZSBNZWFseiBiYXNrZXQgYW5kIHRoZSByZXRhaWxlcidzIGNhcnQsXG4gICAqIGFuZCB1cGRhdGluZyB0aGUgcXVhbnRpdGllcyBpbiB0aGUgTWVhbHogYmFza2V0IHRvIG1hdGNoIHRoZSBxdWFudGl0aWVzIGluIHRoZSByZXRhaWxlcidzIGNhcnQuXG4gICAqIEBwYXJhbSByZXRhaWxlckJhc2tldFByb2R1Y3RzIHRoZSBsaXN0IG9mIHByb2R1Y3RzIGluIHRoZSByZXRhaWxlcidzIGNhcnRcbiAgICovXG4gIHN5bmNNZWFsekJhc2tldFdpdGhSZXRhaWxlckNhcnQocmV0YWlsZXJCYXNrZXRQcm9kdWN0czogQ29tcGFyYWJsZVByb2R1Y3RbXSk6IHZvaWQge1xuICAgIHRoaXMubG9ja1doaWxlU3luY2hyb25pemluZy5uZXh0KHRydWUpO1xuXG4gICAgdGhpcy5iYXNrZXRzU2VydmljZS53YWl0Rm9yQmFza2V0RW50cmllcy5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHN3aXRjaE1hcChiYXNrZXRFbnRyaWVzID0+IHtcbiAgICAgICAgY29uc3QgYWN0aXZlQmFza2V0RW50cmllcyA9IGJhc2tldEVudHJpZXMuZmlsdGVyKGUgPT4gZS5zdGF0dXMgPT09ICdhY3RpdmUnKTtcbiAgICAgICAgY29uc3QgcmV0YWlsZXJDYXJ0UHJvZHVjdE1hcCA9IHRoaXMubWFwUmV0YWlsZXJDYXJ0UHJvZHVjdHMocmV0YWlsZXJCYXNrZXRQcm9kdWN0cyk7XG5cbiAgICAgICAgY29uc3Qgc3luY09wZXJhdGlvbnMgPSBhY3RpdmVCYXNrZXRFbnRyaWVzLm1hcChiYXNrZXRFbnRyeSA9PiB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZFJldGFpbGVyQ2FydFByb2R1Y3QgPSByZXRhaWxlckNhcnRQcm9kdWN0TWFwW2Jhc2tldEVudHJ5LnNlbGVjdGVkSXRlbS5leHRJZF07XG4gICAgICAgICAgaWYgKG1hdGNoZWRSZXRhaWxlckNhcnRQcm9kdWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVNYXRjaGluZ1Byb2R1Y3QobWF0Y2hlZFJldGFpbGVyQ2FydFByb2R1Y3QsIGJhc2tldEVudHJ5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlTm9uTWF0Y2hpbmdQcm9kdWN0KGJhc2tldEVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGZvcmtKb2luIG5lZWRzIGFuIGFycmF5IG9mIGF0IGxlYXN0IDEgb2JzZXJ2YWJsZSBvdGhlcndpc2UgdGhlIGZvbGxvd2luZyBzdWJzY3JpYmUgbmV2ZXIgY29tcGxldGVzXG4gICAgICAgIGlmIChzeW5jT3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBzeW5jT3BlcmF0aW9ucy5wdXNoKG9mKG51bGwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihzeW5jT3BlcmF0aW9ucyk7XG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmxvY2tXaGlsZVN5bmNocm9uaXppbmcubmV4dChmYWxzZSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwUmV0YWlsZXJDYXJ0UHJvZHVjdHMocmV0YWlsZXJCYXNrZXRQcm9kdWN0czogQ29tcGFyYWJsZVByb2R1Y3RbXSk6IHsgW2tleTogc3RyaW5nXTogQ29tcGFyYWJsZVByb2R1Y3QgfSB7XG4gICAgcmV0dXJuIHJldGFpbGVyQmFza2V0UHJvZHVjdHMucmVkdWNlKChwcm9kdWN0c01hcCwgcHJvZHVjdCkgPT4ge1xuICAgICAgcHJvZHVjdHNNYXBbcHJvZHVjdC5pZF0gPSBwcm9kdWN0O1xuICAgICAgcmV0dXJuIHByb2R1Y3RzTWFwO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBwcm9kdWN0IHRoYXQgaXMgYm90aCBpbiB0aGUgTWVhbHogYmFza2V0IGFuZCBpbiB0aGUgcmV0YWlsZXIncyBjYXJ0LlxuICAgKiBUaGlzIGZ1bmN0aW9uIGZpcnN0IHVwZGF0ZXMgdGhlIE1lYWx6IGJhc2tldCBlbnRyeSB3aXRoIHRoZSBxdWFudGl0eSBmcm9tIHRoZSByZXRhaWxlcidzIGNhcnQuXG4gICAqIFRoZW4gaXQgd2FpdHMgdW50aWwgdGhlIE1lYWx6IGJhc2tldCBlbnRyeSBpcyBub3QgYmVpbmcgdXBkYXRlZCBhbnltb3JlIGFuZCBlbWl0cyBhIHZvaWQgdmFsdWUuXG4gICAqIFRoaXMgaXMgZG9uZSB0byBhdm9pZCBjb25jdXJyZW50IHVwZGF0ZXMgb2YgdGhlIE1lYWx6IGJhc2tldCBlbnRyeS5cbiAgICogQHBhcmFtIHByb2R1Y3QgLSBUaGUgcHJvZHVjdCBpbiB0aGUgcmV0YWlsZXIncyBjYXJ0IHRvIGJlIG1hdGNoZWQgd2l0aCB0aGUgTWVhbHogYmFza2V0IGVudHJ5XG4gICAqIEBwYXJhbSBiYXNrZXRFbnRyeSAtIFRoZSBNZWFseiBiYXNrZXQgZW50cnkgdGhhdCBpcyB0byBiZSB1cGRhdGVkXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhIHZvaWQgdmFsdWUgd2hlbiB0aGUgTWVhbHogYmFza2V0IGVudHJ5IGlzIHVwZGF0ZWRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlTWF0Y2hpbmdQcm9kdWN0KHByb2R1Y3Q6IENvbXBhcmFibGVQcm9kdWN0LCBiYXNrZXRFbnRyeTogQmFza2V0RW50cnkpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8dm9pZD4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgdGhpcy51cGRhdGVNZWFsekJhc2tldEZyb21SZXRhaWxlckJhc2tldChwcm9kdWN0LCBiYXNrZXRFbnRyeSk7XG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5iYXNrZXRzU2VydmljZS5lbnRyeUlzQmVpbmdVcGRhdGVkKGJhc2tldEVudHJ5LmlkKSxcbiAgICAgICAgdGhpcy5iYXNrZXRzU2VydmljZS5lbnRyeVdpbGxCZVVwZGF0ZWQoYmFza2V0RW50cnkuaWQpXG4gICAgICBdKS5waXBlKFxuICAgICAgICBza2lwV2hpbGUoKFtpc0JlaW5nVXBkYXRlZCwgd2lsbEJlVXBkYXRlZF0pID0+IGlzQmVpbmdVcGRhdGVkIHx8IHdpbGxCZVVwZGF0ZWQpLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBwcm9kdWN0IHRoYXQgaXMgaW4gdGhlIE1lYWx6IGJhc2tldCBidXQgbm90IGluIHRoZSByZXRhaWxlcidzIGNhcnQuXG4gICAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgcmVtb3ZlcyB0aGUgTWVhbHogYmFza2V0IGVudHJ5LlxuICAgKiBUaGVuIGl0IHdhaXRzIHVudGlsIHRoZSBNZWFseiBiYXNrZXQgZW50cnkgaXMgbm90IGJlaW5nIHJlbW92ZWQgYW55bW9yZSBhbmQgZW1pdHMgYSB2b2lkIHZhbHVlLlxuICAgKiBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgY29uY3VycmVudCB1cGRhdGVzIG9mIHRoZSBNZWFseiBiYXNrZXQgZW50cnkuXG4gICAqIEBwYXJhbSBiYXNrZXRFbnRyeSAtIFRoZSBNZWFseiBiYXNrZXQgZW50cnkgdGhhdCBpcyB0byBiZSByZW1vdmVkXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhIHZvaWQgdmFsdWUgd2hlbiB0aGUgTWVhbHogYmFza2V0IGVudHJ5IGlzIHJlbW92ZWRcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlTm9uTWF0Y2hpbmdQcm9kdWN0KGJhc2tldEVudHJ5OiBCYXNrZXRFbnRyeSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTx2b2lkPihvYnNlcnZlciA9PiB7XG4gICAgICB0aGlzLmJhc2tldHNTZXJ2aWNlLnJlbW92ZVByb2R1Y3QoYmFza2V0RW50cnksIG5ldyBFdmVudFRyYWNlKCkpO1xuICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuYmFza2V0c1NlcnZpY2UuZW50cnlJc0JlaW5nUmVtb3ZlZChiYXNrZXRFbnRyeS5pZCksXG4gICAgICAgIHRoaXMuYmFza2V0c1NlcnZpY2UuZW50cnlXaWxsQmVSZW1vdmVkKGJhc2tldEVudHJ5LmlkKVxuICAgICAgXSkucGlwZShcbiAgICAgICAgc2tpcFdoaWxlKChbaXNCZWluZ1JlbW92ZWQsIHdpbGxCZVJlbW92ZWRdKSA9PiBpc0JlaW5nUmVtb3ZlZCB8fCB3aWxsQmVSZW1vdmVkKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBvYnNlcnZlci5uZXh0KCk7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBSRVRBSUxFUiBCQVNLRVQgUFJPQ0VTU0lORyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqKi9cblxuICAvKipcbiAgICogVXBkYXRlcyBNZWFseiBiYXNrZXQgYmFzZWQgb24gY2hhbmdlcyBpbiB0aGUgcmV0YWlsZXIncyBjYXJ0XG4gICAqIEBwYXJhbSByZXRhaWxlckJhc2tldFByb2R1Y3RzIC0gQXJyYXkgb2YgcHJvZHVjdHMgZnJvbSB0aGUgcmV0YWlsZXIncyBjYXJ0XG4gICAqL1xuICByZXRhaWxlckNhcnRDaGFuZ2VkKHJldGFpbGVyQmFza2V0UHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10pOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFJldGFpbGVyIGNhcnQgY2hhbmdlZCcsIHJldGFpbGVyQmFza2V0UHJvZHVjdHMpO1xuICAgIGNvbnN0IGxhc3RTdXBwbGllckNhcnQgPSBbLi4udGhpcy5zdXBwbGllclNlcnZpY2UubGFzdFN1cHBsaWVyQ2FydF07XG4gICAgaWYgKHRoaXMuZmlyc3RSZXRhaWxlckNhcnRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnN5bmNNZWFsekJhc2tldFdpdGhSZXRhaWxlckNhcnQocmV0YWlsZXJCYXNrZXRQcm9kdWN0cyk7XG4gICAgICB0aGlzLmZpcnN0UmV0YWlsZXJDYXJ0Q2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmxvY2tXaGlsZUNvbmZpcm1pbmcsIHRoaXMubG9ja1doaWxlU3luY2hyb25pemluZ10pLnBpcGUoXG4gICAgICBza2lwV2hpbGUoKFtjb25maXJtaW5nTG9ja2VkLCBzeW5jaHJvbml6aW5nTG9ja2VkXSkgPT4gY29uZmlybWluZ0xvY2tlZCB8fCBzeW5jaHJvbml6aW5nTG9ja2VkKSxcbiAgICAgIHRha2UoMSlcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCB7IGFkZGVkUHJvZHVjdHMsIHVwZGF0ZWRQcm9kdWN0cywgcmVtb3ZlZFByb2R1Y3RzIH0gPSB0aGlzLmNvbXBhcmVQcm9kdWN0cyhcbiAgICAgICAgbGFzdFN1cHBsaWVyQ2FydCwgcmV0YWlsZXJCYXNrZXRQcm9kdWN0c1xuICAgICAgKTtcblxuICAgICAgaWYgKGFkZGVkUHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNoZWNrQWRkQWN0aW9ucyhhZGRlZFByb2R1Y3RzLCB0aGlzLm1lYWx6QWN0aW9uTGlzdC52YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVtb3ZlZFByb2R1Y3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jaGVja1JlbW92ZUFjdGlvbnMocmVtb3ZlZFByb2R1Y3RzLCB0aGlzLm1lYWx6QWN0aW9uTGlzdC52YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlZFByb2R1Y3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jaGVja1VwZGF0ZUFjdGlvbnModXBkYXRlZFByb2R1Y3RzLCB0aGlzLm1lYWx6QWN0aW9uTGlzdC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZXMgb3ZlciB0aGUgcHJvZHVjdHMgYWRkZWQgdG8gdGhlIHJldGFpbGVyJ3MgY2FydCBhbmQgY2hlY2tzIGlmIHRoZXJlIGFyZSBjb3JyZXNwb25kaW5nIGFjdGlvbnMgaW4gdGhlIGxpc3RcbiAgICogb2YgY3VycmVudCBhY3Rpb25zLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCBjaGVjayBpZiB0aGUgYWN0aW9uIHN0YXR1cyBpcyAnU0VOVF9UT19SRVRBSUxFUicsIGlmIHNvLCB1cGRhdGUgdGhlIGFjdGlvbidzXG4gICAqIHN0YXR1cyB0byAnUkVUQUlMRVJfUFJPRFVDVF9NQVRDSCcsIHN5bmMgdGhlIGFjdGlvbiB3aXRoIHRoZSByZXRhaWxlciBwcm9kdWN0LCB1cGRhdGUgdGhlIE1lYWx6IGJhc2tldCBhbmQgcmVtb3ZlXG4gICAqIHRoZSBhY3Rpb24gZnJvbSB0aGUgbGlzdC5cbiAgICogQHBhcmFtIGFkZGVkUHJvZHVjdHMgLSBBcnJheSBvZiBwcm9kdWN0cyBhZGRlZCB0byB0aGUgcmV0YWlsZXIncyBjYXJ0XG4gICAqIEBwYXJhbSBjdXJyZW50QWN0aW9ucyAtIEFycmF5IG9mIGN1cnJlbnQgYWN0aW9uc1xuICAgKi9cbiAgY2hlY2tBZGRBY3Rpb25zKFxuICAgIGFkZGVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10sXG4gICAgY3VycmVudEFjdGlvbnM6IEJhc2tldEFjdGlvbltdKTogdm9pZCB7XG4gICAgbWVhbHpEZWJ1ZygnW01lYWx6XSBXZXJlIGFkZGVkIGJ5IHJldGFpbGVyOicsIGFkZGVkUHJvZHVjdHMpO1xuICAgIGFkZGVkUHJvZHVjdHMuZm9yRWFjaChhZGRlZFByb2R1Y3QgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdBY3Rpb24gPSBjdXJyZW50QWN0aW9ucy5maW5kKGFjdGlvbiA9PiBhY3Rpb24uaWQgPT09IGFkZGVkUHJvZHVjdC5pZCk7XG4gICAgICBpZiAobWF0Y2hpbmdBY3Rpb24gJiYgbWF0Y2hpbmdBY3Rpb24uc3RhdHVzID09PSBBY3Rpb25TdGF0dXMuU0VOVF9UT19SRVRBSUxFUikge1xuICAgICAgICBtYXRjaGluZ0FjdGlvbi5zdGF0dXMgPSBBY3Rpb25TdGF0dXMuUkVUQUlMRVJfUFJPRFVDVF9NQVRDSDtcbiAgICAgICAgbWF0Y2hpbmdBY3Rpb24uc3luY1dpdGhVcGRhdGVGcm9tUmV0YWlsZXIoYWRkZWRQcm9kdWN0KTtcbiAgICAgICAgbWF0Y2hpbmdBY3Rpb24udXBkYXRlTWVhbHpCYXNrZXQoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVGaW5pc2hlZEFjdGlvbnNGcm9tTGlzdChhZGRlZFByb2R1Y3QuaWQsIG1hdGNoaW5nQWN0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBwcm9kdWN0cyByZW1vdmVkIGZyb20gdGhlIHJldGFpbGVyJ3MgY2FydCBhbmQgY2hlY2tzIGlmIHRoZXJlIGFyZSBjb3JyZXNwb25kaW5nIGFjdGlvbnMgaW4gdGhlIGxpc3RcbiAgICogb2YgY3VycmVudCBhY3Rpb25zLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCBjaGVjayBpZiB0aGUgYWN0aW9uIHN0YXR1cyBpcyAnU0VOVF9UT19SRVRBSUxFUicsIGlmIHNvLCB1cGRhdGUgdGhlIGFjdGlvbidzXG4gICAqIHN0YXR1cyB0byAnUkVUQUlMRVJfUFJPRFVDVF9NQVRDSCcsIHVwZGF0ZSB0aGUgTWVhbHogYmFza2V0IGFuZCByZW1vdmVcbiAgICogdGhlIGFjdGlvbiBmcm9tIHRoZSBsaXN0LiBJZiBubyBtYXRjaCBpcyBmb3VuZCwgcmVtb3ZlIHRoZSBleGNlc3MgcHJvZHVjdHMgZnJvbSB0aGUgTWVhbHogYmFza2V0LlxuICAgKiBAcGFyYW0gcmVtb3ZlZFByb2R1Y3RzIC0gQXJyYXkgb2YgcHJvZHVjdHMgcmVtb3ZlZCBmcm9tIHRoZSByZXRhaWxlcidzIGNhcnRcbiAgICogQHBhcmFtIGN1cnJlbnRBY3Rpb25zIC0gQXJyYXkgb2YgY3VycmVudCBhY3Rpb25zXG4gICAqL1xuICBjaGVja1JlbW92ZUFjdGlvbnMocmVtb3ZlZFByb2R1Y3RzOiBDb21wYXJhYmxlUHJvZHVjdFtdLCBjdXJyZW50QWN0aW9uczogQmFza2V0QWN0aW9uW10pOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFdlcmUgcmVtb3ZlZCBieSByZXRhaWxlcjonLCByZW1vdmVkUHJvZHVjdHMpO1xuICAgIHJlbW92ZWRQcm9kdWN0cy5mb3JFYWNoKHJlbW92ZWRQcm9kdWN0ID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQWN0aW9uID0gY3VycmVudEFjdGlvbnMuZmluZChhY3Rpb24gPT4gYWN0aW9uLmlkID09PSByZW1vdmVkUHJvZHVjdC5pZCk7XG4gICAgICBpZiAobWF0Y2hpbmdBY3Rpb24gJiYgbWF0Y2hpbmdBY3Rpb24uc3RhdHVzID09PSBBY3Rpb25TdGF0dXMuU0VOVF9UT19SRVRBSUxFUikge1xuICAgICAgICBtYXRjaGluZ0FjdGlvbi5zdGF0dXMgPSBBY3Rpb25TdGF0dXMuUkVUQUlMRVJfUFJPRFVDVF9NQVRDSDtcbiAgICAgICAgbWF0Y2hpbmdBY3Rpb24udXBkYXRlTWVhbHpCYXNrZXQoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVGaW5pc2hlZEFjdGlvbnNGcm9tTGlzdChyZW1vdmVkUHJvZHVjdC5pZCwgbWF0Y2hpbmdBY3Rpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maW5kUHJvZHVjdEluQmFza2V0RW50cmllcyhyZW1vdmVkUHJvZHVjdC5pZCkuc3Vic2NyaWJlKChmb3VuZDogQmFza2V0RW50cnkgfCBudWxsKSA9PiB7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLmJhc2tldHNTZXJ2aWNlLnJlbW92ZVByb2R1Y3QoZm91bmQsIG5ldyBFdmVudFRyYWNlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIHRoZSB1cGRhdGVkIHByb2R1Y3RzIGFuZCBjaGVjayBpZiBhbnkgb2YgdGhlIGN1cnJlbnQgYWN0aW9ucyBtYXRjaCB0aGVtLlxuICAgKiBJZiBhIG1hdGNoIGlzIGZvdW5kLCBjaGVjayBpZiB0aGUgYWN0aW9uIHN0YXR1cyBpcyAnU0VOVF9UT19SRVRBSUxFUicsIGlmIHNvLCB1cGRhdGUgdGhlXG4gICAqIGFjdGlvbidzIHN0YXR1cyB0byAnUkVUQUlMRVJfUFJPRFVDVF9NQVRDSCcsIHN5bmMgdGhlIGFjdGlvbiB3aXRoIHRoZSByZXRhaWxlciBwcm9kdWN0LFxuICAgKiB1cGRhdGUgdGhlIE1lYWx6IGJhc2tldCBhbmQgcmVtb3ZlIHRoZSBhY3Rpb24gZnJvbSB0aGUgbGlzdC5cbiAgICogSWYgbm8gbWF0Y2ggaXMgZm91bmQsIHJlbW92ZSB0aGUgZXhjZXNzIHByb2R1Y3RzIGZyb20gdGhlIE1lYWx6IGJhc2tldC5cbiAgICogQHBhcmFtIHVwZGF0ZWRQcm9kdWN0cyAtIEFycmF5IG9mIHByb2R1Y3RzIHdpdGggdXBkYXRlZCBxdWFudGl0aWVzXG4gICAqIEBwYXJhbSBjdXJyZW50QWN0aW9ucyAtIEFycmF5IG9mIGN1cnJlbnQgYWN0aW9uc1xuICAgKi9cbiAgY2hlY2tVcGRhdGVBY3Rpb25zKHVwZGF0ZWRQcm9kdWN0czogQ29tcGFyYWJsZVByb2R1Y3RbXSwgY3VycmVudEFjdGlvbnM6IEJhc2tldEFjdGlvbltdKTogdm9pZCB7XG4gICAgbWVhbHpEZWJ1ZygnW01lYWx6XSBXZXJlIHVwZGF0ZWQgYnkgcmV0YWlsZXI6JywgdXBkYXRlZFByb2R1Y3RzKTtcbiAgICB1cGRhdGVkUHJvZHVjdHMuZm9yRWFjaCh1cGRhdGVkUHJvZHVjdCA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZ0FjdGlvbiA9IGN1cnJlbnRBY3Rpb25zLmZpbmQoYWN0aW9uID0+IGFjdGlvbi5pZCA9PT0gdXBkYXRlZFByb2R1Y3QuaWQpO1xuICAgICAgaWYgKG1hdGNoaW5nQWN0aW9uICYmIG1hdGNoaW5nQWN0aW9uLnN0YXR1cyA9PT0gQWN0aW9uU3RhdHVzLlNFTlRfVE9fUkVUQUlMRVIpIHtcbiAgICAgICAgbWF0Y2hpbmdBY3Rpb24uc3RhdHVzID0gQWN0aW9uU3RhdHVzLlJFVEFJTEVSX1BST0RVQ1RfTUFUQ0g7XG4gICAgICAgIG1hdGNoaW5nQWN0aW9uLnN5bmNXaXRoVXBkYXRlRnJvbVJldGFpbGVyKHVwZGF0ZWRQcm9kdWN0KTtcbiAgICAgICAgbWF0Y2hpbmdBY3Rpb24udXBkYXRlTWVhbHpCYXNrZXQoKTtcbiAgICAgICAgdGhpcy5yZW1vdmVGaW5pc2hlZEFjdGlvbnNGcm9tTGlzdCh1cGRhdGVkUHJvZHVjdC5pZCwgbWF0Y2hpbmdBY3Rpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maW5kQW5kUmVtb3ZlRXhjZXNzUHJvZHVjdHNJbk1lYWx6QmFza2V0KHVwZGF0ZWRQcm9kdWN0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNoZWNrQWN0aW9uc1RvU2tpcChyZXRhaWxlckFjdGlvbnM6IENvbXBhcmFibGVQcm9kdWN0W10pOiB2b2lkIHtcbiAgICByZXRhaWxlckFjdGlvbnMuZm9yRWFjaCgocmV0YWlsZXJBY3Rpb246IENvbXBhcmFibGVQcm9kdWN0KSA9PiB7XG4gICAgICAvLyBJZiB0aGUgcXVhbnRpdHkgaXMgMCwgc2tpcCB0aGUgdXBkYXRlIGZyb20gcmV0YWlsZXJcbiAgICAgIGlmIChyZXRhaWxlckFjdGlvbi5xdWFudGl0eSA9PT0gMCkge1xuICAgICAgICB0aGlzLnNraXBSZXRhaWxlclVwZGF0ZUZvckFjdGlvbih0aGlzLm1lYWx6QWN0aW9uTGlzdC52YWx1ZS5maW5kKGFjdGlvbiA9PiBhY3Rpb24uaWQgPT09IHJldGFpbGVyQWN0aW9uLmlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBza2lwUmV0YWlsZXJVcGRhdGVGb3JBY3Rpb24oYWN0aW9uOiBCYXNrZXRBY3Rpb24pOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFNraXBwaW5nIHJldGFpbGVyIHVwZGF0ZSBmb3IgYWN0aW9uJywgYWN0aW9uLmxvZ2dhYmxlKTtcbiAgICB0aGlzLmZpbmRQcm9kdWN0SW5CYXNrZXRFbnRyaWVzKGFjdGlvbi5pZCkuc3Vic2NyaWJlKChiYXNrZXRFbnRyeUZyb21BY3Rpb246IEJhc2tldEVudHJ5IHwgbnVsbCkgPT4ge1xuICAgICAgYWN0aW9uLnN0YXR1cyA9IEFjdGlvblN0YXR1cy5SRVRBSUxFUl9QUk9EVUNUX01BVENIO1xuICAgICAgYWN0aW9uLnF1YW50aXR5ID0gYmFza2V0RW50cnlGcm9tQWN0aW9uPy5xdWFudGl0eSB8fCAwO1xuICAgICAgYWN0aW9uLmJhc2tldEVudHJ5LnF1YW50aXR5ID0gYmFza2V0RW50cnlGcm9tQWN0aW9uPy5xdWFudGl0eSB8fCAwO1xuICAgICAgYWN0aW9uLnVwZGF0ZU1lYWx6QmFza2V0KCk7XG4gICAgICB0aGlzLmJhc2tldHNTZXJ2aWNlLnByb2R1Y3RzV2lsbEJlQWRkZWQoKS5waXBlKHNraXBXaGlsZShwcm9kdWN0cyA9PiBwcm9kdWN0cyA+IDApLCB0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUZpbmlzaGVkQWN0aW9uc0Zyb21MaXN0KGFjdGlvbi5pZCwgYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBmaW5pc2hlZCBhY3Rpb25zIGZyb20gdGhlIGFjdGlvbiBsaXN0IGJhc2VkIG9uIHRoZSBnaXZlbiBwcm9kdWN0IElEXG4gICAqIEBwYXJhbSBwcm9kdWN0SWQgLSBJRCBvZiB0aGUgcHJvZHVjdCB0byBjaGVja1xuICAgKiBAcGFyYW0gYmFza2V0QWN0aW9uIC0gQWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvZHVjdFxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVGaW5pc2hlZEFjdGlvbnNGcm9tTGlzdChwcm9kdWN0SWQ6IHN0cmluZywgYmFza2V0QWN0aW9uOiBCYXNrZXRBY3Rpb24pOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFJlbW92aW5nIGZpbmlzaGVkIGFjdGlvbnMgZnJvbSBsaXN0JywgYmFza2V0QWN0aW9uLmxvZ2dhYmxlKTtcbiAgICBjb25zdCB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgdGhpcy5iYXNrZXRzU2VydmljZS5iYXNrZXRFbnRyaWVzKCkucGlwZShcbiAgICAgIHRha2VVbnRpbCh1bnN1YnNjcmliZSQpLFxuICAgICAgc3dpdGNoTWFwKChlbnRyaWVzOiBCYXNrZXRFbnRyeVtdKSA9PiB7XG4gICAgICAgIGlmIChiYXNrZXRBY3Rpb24uc3RhdHVzICE9PSBBY3Rpb25TdGF0dXMuUkVUQUlMRVJfUFJPRFVDVF9NQVRDSCkge1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2tldEVudHJ5Rm91bmQ6IEJhc2tldEVudHJ5ID0gZW50cmllcy5maW5kKGJlID0+IGJlLnNlbGVjdGVkSXRlbS5leHRJZCA9PT0gcHJvZHVjdElkKTtcbiAgICAgICAgaWYgKGJhc2tldEFjdGlvbi5zaG91bGRSZW1vdmVBY3Rpb24oYmFza2V0RW50cnlGb3VuZCkpIHtcbiAgICAgICAgICB0aGlzLmZpbmlzaEFjdGlvbihiYXNrZXRBY3Rpb24pO1xuICAgICAgICAgIHVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgICAgICAgdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mKGJhc2tldEVudHJ5Rm91bmQpO1xuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5pc2hBY3Rpb24oYmFza2V0QWN0aW9uOiBCYXNrZXRBY3Rpb24pOiB2b2lkIHtcbiAgICBiYXNrZXRBY3Rpb24ub25TdWNjZXNzLm5leHQoKTtcbiAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC52YWx1ZS5zcGxpY2UodGhpcy5tZWFsekFjdGlvbkxpc3QudmFsdWUuaW5kZXhPZihiYXNrZXRBY3Rpb24pLCAxKTtcbiAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC5uZXh0KHRoaXMubWVhbHpBY3Rpb25MaXN0LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgcHJvZHVjdCBpbiB0aGUgTWVhbHogYmFza2V0IGFuZCB1cGRhdGUgaXQgYmFzZWQgb24gdGhlIHJldGFpbGVyJ3MgY2FydFxuICAgKiBAcGFyYW0gcHJvZHVjdCAtIFByb2R1Y3QgZnJvbSB0aGUgcmV0YWlsZXIncyBjYXJ0IHRvIGZpbmRcbiAgICovXG4gIHByaXZhdGUgZmluZEFuZFJlbW92ZUV4Y2Vzc1Byb2R1Y3RzSW5NZWFsekJhc2tldChwcm9kdWN0OiBDb21wYXJhYmxlUHJvZHVjdCk6IHZvaWQge1xuICAgIG1lYWx6RGVidWcoJ1tNZWFsel0gRmluZGluZyBhbmQgcmVtb3ZpbmcgZXhjZXNzIHByb2R1Y3RzIGluIE1lYWx6IGJhc2tldCcsIHByb2R1Y3QpO1xuICAgIHRoaXMuZmluZFByb2R1Y3RJbkJhc2tldEVudHJpZXMocHJvZHVjdC5pZCkuc3Vic2NyaWJlKChmb3VuZDogQmFza2V0RW50cnkgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVNZWFsekJhc2tldEZyb21SZXRhaWxlckJhc2tldChwcm9kdWN0LCBmb3VuZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQcm9kdWN0SW5CYXNrZXRFbnRyaWVzKHByb2R1Y3RJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxCYXNrZXRFbnRyeSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRzU2VydmljZS53YWl0Rm9yQmFza2V0RW50cmllcy5waXBlKFxuICAgICAgc3dpdGNoTWFwKChtZWFsekJhc2tldDogQmFza2V0RW50cnlbXSkgPT4gb2YobWVhbHpCYXNrZXQuZmluZChiZSA9PiBiZS5zZWxlY3RlZEl0ZW0uZXh0SWQgPT09IHByb2R1Y3RJZCkpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIE1lYWx6IGJhc2tldCBiYXNlZCBvbiB0aGUgcmV0YWlsZXIncyBjYXJ0IGZvciB0aGUgZ2l2ZW4gcHJvZHVjdFxuICAgKiBAcGFyYW0gcHJvZHVjdCAtIFByb2R1Y3QgZnJvbSB0aGUgcmV0YWlsZXIncyBjYXJ0XG4gICAqIEBwYXJhbSBmb3VuZCAtIENvcnJlc3BvbmRpbmcgYmFza2V0IGVudHJ5IGluIHRoZSBNZWFseiBiYXNrZXRcbiAgICogQHBhcmFtIGxvY2tXaGVuU3luY2hyb25pemluZyAtIFdoZXRoZXIgdG8gbG9jayBhY3Rpb25zIHByb2Nlc3Mgd2hpbGUgc3luY2hyb25pemluZ1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVNZWFsekJhc2tldEZyb21SZXRhaWxlckJhc2tldChwcm9kdWN0OiBDb21wYXJhYmxlUHJvZHVjdCwgZm91bmQ6IEJhc2tldEVudHJ5KTogdm9pZCB7XG4gICAgaWYgKGZvdW5kLnF1YW50aXR5ID09PSBwcm9kdWN0LnF1YW50aXR5IHx8IHByb2R1Y3QucXVhbnRpdHkgPiBmb3VuZC5xdWFudGl0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3VuZC5xdWFudGl0eSA9IHByb2R1Y3QucXVhbnRpdHk7XG4gICAgdGhpcy5iYXNrZXRzU2VydmljZS5jaGFuZ2VQcm9kdWN0UXVhbnRpdHkoZm91bmQsIHByb2R1Y3QucXVhbnRpdHksIG5ldyBFdmVudFRyYWNlKCkpO1xuICB9XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExJU1QgVVRJTFMgVE8gRElTUExBWSBMT0FERVJTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIHByaXZhdGUgc3ViamVjdENvbnRhaW5zRW50cnlJZChcbiAgICBzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QmFza2V0QWN0aW9uW10+LCBlbnRyeUlkOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHN1YmplY3QucGlwZShcbiAgICAgIG1hcCh2YWx1ZSA9PiB2YWx1ZS5zb21lKGEgPT4gYS5pZCA9PT0gZW50cnlJZCkpKTtcbiAgfVxuXG4gIGhhc1BlbmRpbmdBY3Rpb25zKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLm1lYWx6QWN0aW9uTGlzdC5waXBlKG1hcCh2YWx1ZSA9PiB2YWx1ZS5sZW5ndGggPiAwKSk7XG4gIH1cblxuICBlbnRyeVdpbGxCZUFkZGVkKGVudHJ5SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc0VudHJ5SWQodGhpcy5tZWFsekFjdGlvbkxpc3QsIGVudHJ5SWQpO1xuICB9XG5cbiAgZW50cnlXaWxsQmVVcGRhdGVkKGVudHJ5SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc0VudHJ5SWQodGhpcy5tZWFsekFjdGlvbkxpc3QsIGVudHJ5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmVzIHR3byBhcnJheXMgb2YgY29tcGFyYWJsZSBwcm9kdWN0cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aHJlZSBhcnJheXM6XG4gICAqIC0gYGFkZGVkUHJvZHVjdHNgOiBwcm9kdWN0cyB0aGF0IGFyZSBwcmVzZW50IGluIGB0MGAgYnV0IG5vdCBpbiBgdE1pbnVzMWBcbiAgICogLSBgcmVtb3ZlZFByb2R1Y3RzYDogcHJvZHVjdHMgdGhhdCBhcmUgcHJlc2VudCBpbiBgdE1pbnVzMWAgYnV0IG5vdCBpbiBgdDBgXG4gICAqIC0gYHVwZGF0ZWRQcm9kdWN0c2A6IHByb2R1Y3RzIHRoYXQgYXJlIHByZXNlbnQgaW4gYm90aCBgdE1pbnVzMWAgYW5kIGB0MGAgYnV0IGhhdmUgYSBkaWZmZXJlbnQgcXVhbnRpdHkgaW4gYHQwYFxuICAgKiAgIGNvbXBhcmVkIHRvIGB0TWludXMxYC4gVGhlIGBhZGRpdGlvbmFsSW5mb3NgIHByb3BlcnR5IG9mIGVhY2ggcHJvZHVjdCBpbiB0aGlzIGFycmF5IHdpbGwgY29udGFpbiB0aGUga2V5XG4gICAqICAgYHF1YW50aXR5RGlmZmVyZW5jZWAgd2l0aCB0aGUgdmFsdWUgb2YgYHByb2R1Y3QucXVhbnRpdHkgLSBwcmV2aW91c1Byb2R1Y3QucXVhbnRpdHlgXG4gICAqXG4gICAqIEBwYXJhbSB0TWludXMxIHRoZSBhcnJheSBvZiBwcm9kdWN0cyBhdCB0aW1lIGB0LTFgXG4gICAqIEBwYXJhbSB0MCB0aGUgYXJyYXkgb2YgcHJvZHVjdHMgYXQgdGltZSBgdGBcbiAgICovXG4gIHByaXZhdGUgY29tcGFyZVByb2R1Y3RzKHRNaW51czE6IENvbXBhcmFibGVQcm9kdWN0W10sIHQwOiBDb21wYXJhYmxlUHJvZHVjdFtdKTpcbiAgICB7IGFkZGVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W107IHJlbW92ZWRQcm9kdWN0czogQ29tcGFyYWJsZVByb2R1Y3RbXTsgdXBkYXRlZFByb2R1Y3RzOiBDb21wYXJhYmxlUHJvZHVjdFtdIH0ge1xuICAgIGNvbnN0IGFkZGVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10gPSBbXTtcbiAgICBjb25zdCByZW1vdmVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10gPSBbXTtcbiAgICBjb25zdCB1cGRhdGVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10gPSBbXTtcblxuICAgIGNvbnN0IHRNaW51czFNYXAgPSBuZXcgTWFwPHN0cmluZywgQ29tcGFyYWJsZVByb2R1Y3Q+KCk7XG4gICAgdE1pbnVzMS5mb3JFYWNoKHByb2R1Y3QgPT4gdE1pbnVzMU1hcC5zZXQocHJvZHVjdC5pZCwgcHJvZHVjdCkpO1xuXG4gICAgY29uc3QgdDBNYXAgPSBuZXcgTWFwPHN0cmluZywgQ29tcGFyYWJsZVByb2R1Y3Q+KCk7XG4gICAgdDAuZm9yRWFjaChwcm9kdWN0ID0+IHQwTWFwLnNldChwcm9kdWN0LmlkLCBwcm9kdWN0KSk7XG5cbiAgICB0MC5mb3JFYWNoKHByb2R1Y3QgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXNQcm9kdWN0ID0gdE1pbnVzMU1hcC5nZXQocHJvZHVjdC5pZCk7XG4gICAgICBpZiAoIXByZXZpb3VzUHJvZHVjdCkge1xuICAgICAgICBhZGRlZFByb2R1Y3RzLnB1c2gocHJvZHVjdCk7XG4gICAgICB9IGVsc2UgaWYgKHByb2R1Y3QucXVhbnRpdHkgIT09IHByZXZpb3VzUHJvZHVjdC5xdWFudGl0eSkge1xuICAgICAgICB1cGRhdGVkUHJvZHVjdHMucHVzaCh7XG4gICAgICAgICAgLi4ucHJvZHVjdCxcbiAgICAgICAgICBhZGRpdGlvbmFsSW5mb3M6IHsgcXVhbnRpdHlEaWZmZXJlbmNlOiBwcm9kdWN0LnF1YW50aXR5IC0gcHJldmlvdXNQcm9kdWN0LnF1YW50aXR5IH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0TWludXMxLmZvckVhY2gocHJvZHVjdCA9PiB7XG4gICAgICBpZiAoIXQwTWFwLmhhcyhwcm9kdWN0LmlkKSkge1xuICAgICAgICByZW1vdmVkUHJvZHVjdHMucHVzaChwcm9kdWN0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZGRlZFByb2R1Y3RzLFxuICAgICAgcmVtb3ZlZFByb2R1Y3RzLFxuICAgICAgdXBkYXRlZFByb2R1Y3RzXG4gICAgfTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFWFRFUk5BTCBNRVRIT0RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIGhhbmRsZVBheW1lbnQodG90YWw6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0b3RhbCkge1xuICAgICAgdGhpcy5iYXNrZXRzU2VydmljZS5jb25maXJtUGF5bWVudEFuZEJhc2tldCh0b3RhbCkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gYmFza2V0c1NlcnZpY2UuY29uZmlybWluZydzIGxhc3QgZW1pdHRlZCB2YWx1ZSB3YXMgdHJ1ZSBhbmQgY3VycmVudCBlbWl0dGVkIHZhbHVlIGlzIGZhbHNlLFxuICAgKiBSZXNldCBiYXNrZXQtc3luY1xuICAgKi9cbiAgbGlzdGVuVG9Db25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMuYmFza2V0c1NlcnZpY2UuY29uZmlybWluZy5waXBlKFxuICAgICAgc2tpcFdoaWxlKGNvbmZpcm1pbmcgPT4gY29uZmlybWluZyA9PT0gdGhpcy5sb2NrV2hpbGVDb25maXJtaW5nLnZhbHVlKVxuICAgICkuc3Vic2NyaWJlKGNvbmZpcm1pbmcgPT4ge1xuICAgICAgaWYgKCFjb25maXJtaW5nICYmIHRoaXMubG9ja1doaWxlQ29uZmlybWluZy52YWx1ZSkge1xuICAgICAgICB0aGlzLnJlc2V0TWVhbHooKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9ja1doaWxlQ29uZmlybWluZy5uZXh0KGNvbmZpcm1pbmcpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRNZWFseigpOiB2b2lkIHtcbiAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC5uZXh0KFtdKTtcbiAgfVxufVxuIl19
|
|
442
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0cy1zeW5jaHJvbml6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1pYW0vc3JjL2xpYi9fc2VydmljZXMvYmFza2V0cy1zeW5jaHJvbml6aW5nL2Jhc2tldHMtc3luY2hyb25pemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM5RyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekYsT0FBTyxFQUFFLFlBQVksRUFBZ0IsTUFBTSw0Q0FBNEMsQ0FBQztBQUV4RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQU14RCxNQUFNLE9BQU8sMEJBQTBCO0lBd0JyQyxZQUNVLGNBQThCLEVBQzlCLGVBQWlDO1FBRGpDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUF6QjNDLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxvQkFBZSxHQUFvQyxJQUFJLGVBQWUsQ0FBQyxFQUFvQixDQUFDLENBQUM7UUFDN0YsNkJBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ2hD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RkFHUCwwQkFBMEI7Y0FKdEMsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmb3JrSm9pbiwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBza2lwV2hpbGUsIHN3aXRjaE1hcCwgdGFrZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCYXNrZXRFbnRyeSB9IGZyb20gJy4uLy4uL19tb2RlbHMnO1xuaW1wb3J0IHsgQWN0aW9uU3RhdHVzLCBCYXNrZXRBY3Rpb24gfSBmcm9tICcuLi8uLi9fbW9kZWxzL2Jhc2tldC1hY3Rpb25zL2Jhc2tldC1hY3Rpb24nO1xuaW1wb3J0IHsgQ29tcGFyYWJsZVByb2R1Y3QgfSBmcm9tICcuLi8uLi9fdHlwZXMvYnVpbGRlZC9jb21wYXJhYmxlLXByb2R1Y3QnO1xuaW1wb3J0IHsgRXZlbnRUcmFjZSB9IGZyb20gJy4uLy4uL190eXBlcy9ldmVudC10cmFjZSc7XG5pbXBvcnQgeyBtZWFsekRlYnVnIH0gZnJvbSAnLi4vLi4vX3V0aWxzL21ldGhvZHMvbG9nZ2luZyc7XG5pbXBvcnQgeyBCYXNrZXRzU2VydmljZSB9IGZyb20gJy4uL2Jhc2tldHMuc2VydmljZSc7XG5pbXBvcnQgeyBTdXBwbGllcnNTZXJ2aWNlIH0gZnJvbSAnLi4vc3VwcGxpZXJzLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcblxuZXhwb3J0IGNsYXNzIEJhc2tldHNTeW5jaHJvbml6ZXJTZXJ2aWNlIHtcbiAgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgbWVhbHpBY3Rpb25MaXN0OiBCZWhhdmlvclN1YmplY3Q8QmFza2V0QWN0aW9uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSBhcyBCYXNrZXRBY3Rpb25bXSk7XG4gIGZpcnN0UmV0YWlsZXJDYXJ0Q2hhbmdlZCA9IHRydWU7XG4gIG5vU3VwcGxpZXIkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSBsb2NrV2hpbGVDb25maXJtaW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgbG9ja1doaWxlU3luY2hyb25pemluZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gYmUgZGVmaW5lZCB0aHJvdWdoIGNvbnRleHQgLSBTZW5kcyBib3RoIGFkZCBhbmQgcmVtb3ZlIGFjdGlvbnMgdG8gcmV0YWlsZXJcbiAgICogQ2xpZW50IG5lZWRzIHRvIGVpdGhlciBkZWZpbmUgcHVzaFByb2R1Y3RzIG9yIGJvdGggYWRkUHJvZHVjdHMgYW5kIHJlbW92ZVByb2R1Y3RzXG4gICAqL1xuICBwdXNoUHJvZHVjdHNUb1JldGFpbGVyQ2FydDogKGNvbXBhcmFibGVQcm9kdWN0czogQ29tcGFyYWJsZVByb2R1Y3RbXSkgPT4gdm9pZDtcblxuICAvKipcbiAgICogTWV0aG9kIHRvIGJlIGRlZmluZWQgdGhyb3VnaCBjb250ZXh0IC0gU2VuZHMgYWRkIGFjdGlvbnMgdG8gcmV0YWlsZXJcbiAgICovXG4gIGFkZFByb2R1Y3RzVG9SZXRhaWxlckNhcnQ6IChjb21wYXJhYmxlUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBiZSBkZWZpbmVkIHRocm91Z2ggY29udGV4dCAtIFNlbmRzIHJlbW92ZSBhY3Rpb25zIHRvIHJldGFpbGVyXG4gICAqL1xuICByZW1vdmVQcm9kdWN0c0Zyb21SZXRhaWxlckNhcnQ6IChjb21wYXJhYmxlUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10pID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYXNrZXRzU2VydmljZTogQmFza2V0c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdXBwbGllclNlcnZpY2U6IFN1cHBsaWVyc1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XG4gICAgLy8gQmVnaW4gbGlzdGVuaW5nIGZvciBtaWFtJ3MgYmFza2V0ICh3aWxsIG5vdCBmZXRjaCBiYXNrZXQgYXV0b21hdGljYWxseSlcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIEluaXRpYWxpemluZyBCYXNrZXRzU3luY2hyb25pemVyU2VydmljZScpO1xuICAgIG1lcmdlKHRoaXMuc3VwcGxpZXJTZXJ2aWNlLnN1cHBsaWVyJCwgdGhpcy5ub1N1cHBsaWVyJCkucGlwZShcbiAgICAgIHNraXBXaGlsZSgoc3VwcGxpZXIsIG5vU3VwcGxpZXIpID0+ICFzdXBwbGllciAmJiAhbm9TdXBwbGllciksXG4gICAgICB0YWtlKDEpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5saXN0ZW5BY3Rpb25MaXN0KCk7XG4gICAgICAgIHRoaXMubGlzdGVuVG9Db25maXJtKCk7XG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdXNoQmFza2V0RW50cmllc1RvQmFza2V0OiAoZW50cmllczogYW55W10pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBtZXRob2Qgd2FzIHBhc3NlZCB0byBcXCd3aW5kb3cubWVhbHouYmFza2V0U3luYy5kZWZpbmVQdXNoQmFza2V0RW50cmllc1RvQmFza2V0XFwnJyk7XG4gIH07XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFDVElPTiBMSVNUIE1BTkFHRU1FTlQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKiovXG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3Qgb2YgYmFza2V0IGVudHJpZXMgdG8gdGhlIGFjdGlvbiBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBhY3Rpb24gdHlwZVxuICAgKiBAcGFyYW0gYWN0aW9uc1xuICAgKi9cbiAgYWRkVG9BY3Rpb25MaXN0KFxuICAgIGFjdGlvbnM6IEJhc2tldEFjdGlvbltdXG4gICk6IHZvaWQge1xuICAgIGFjdGlvbnMuZm9yRWFjaCgoYWN0aW9uOiBCYXNrZXRBY3Rpb24pID0+IHtcbiAgICAgIGFjdGlvbi51cGRhdGVCYXNrZXRFbnRyeVF1YW50aXR5KCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUodXBkYXRlZEJFID0+IHtcbiAgICAgICAgYWN0aW9uLmJhc2tldEVudHJ5ID0gdXBkYXRlZEJFO1xuICAgICAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC52YWx1ZS5wdXNoKGFjdGlvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC5uZXh0KHRoaXMubWVhbHpBY3Rpb25MaXN0LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGFjdGlvbnMgbGlzdCBhbmQgZXhlY3V0ZSBhZnRlciA4MDBtcyBkZWJvdW5jZVxuICAgKi9cbiAgbGlzdGVuQWN0aW9uTGlzdCgpOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIExpc3RlbmluZyB0byBhY3Rpb24gbGlzdCcpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5tZWFsekFjdGlvbkxpc3QucGlwZShcbiAgICAgICAgbWFwKChhY3Rpb25zOiBCYXNrZXRBY3Rpb25bXSkgPT4gYWN0aW9ucy5maWx0ZXIoYWN0aW9uID0+IGFjdGlvbi5zdGF0dXMgPT09IEFjdGlvblN0YXR1cy5JTklUSUFMX1NUQVRFKSksXG4gICAgICAgIGZpbHRlcigoYWN0aW9uczogQmFza2V0QWN0aW9uW10pID0+IGFjdGlvbnMubGVuZ3RoID4gMCksXG4gICAgICAgIHN3aXRjaE1hcCgoYWN0aW9uczogQmFza2V0QWN0aW9uW10pID0+IHRoaXMuY3JlYXRlQWN0aW9uc0ZvclJldGFpbGVyKGFjdGlvbnMpKVxuICAgICAgKS5zdWJzY3JpYmUoKGFjdGlvbnNGb3JSZXRhaWxlcjogQ29tcGFyYWJsZVByb2R1Y3RbXSkgPT4ge1xuICAgICAgICBpZiAoYWN0aW9uc0ZvclJldGFpbGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFB1c2hpbmcgcHJvZHVjdHMgdG8gcmV0YWlsZXIgY2FydCcsIGFjdGlvbnNGb3JSZXRhaWxlcik7XG4gICAgICAgICAgY29uc3Qgc2tpcHBlZCA9IHRoaXMuY2hlY2tBY3Rpb25zVG9Ta2lwKGFjdGlvbnNGb3JSZXRhaWxlcik7XG4gICAgICAgICAgY29uc3QgYWN0aW9uc1RvQ29tbXVuaWNhdGUgPSBhY3Rpb25zRm9yUmV0YWlsZXIuZmlsdGVyKGFjdGlvbiA9PiAhc2tpcHBlZC5zb21lKGEgPT4gYS5pZCA9PT0gYWN0aW9uLmlkKSk7XG4gICAgICAgICAgaWYgKGFjdGlvbnNUb0NvbW11bmljYXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEFjdGlvbnNUb1JldGFpbGVyQ2FydChhY3Rpb25zRm9yUmV0YWlsZXIuZmlsdGVyKGFjdGlvbiA9PiBhY3Rpb25zVG9Db21tdW5pY2F0ZS5pbmNsdWRlcyhhY3Rpb24pKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3luY01lYWx6QmFza2V0V2l0aFJldGFpbGVyQ2FydCh0aGlzLnN1cHBsaWVyU2VydmljZS5sYXN0U3VwcGxpZXJDYXJ0KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2VuZEFjdGlvbnNUb1JldGFpbGVyQ2FydChhY3Rpb25zRm9yUmV0YWlsZXI6IENvbXBhcmFibGVQcm9kdWN0W10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wdXNoUHJvZHVjdHNUb1JldGFpbGVyQ2FydCkge1xuICAgICAgdGhpcy5wdXNoUHJvZHVjdHNUb1JldGFpbGVyQ2FydChhY3Rpb25zRm9yUmV0YWlsZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLmFkZFByb2R1Y3RzVG9SZXRhaWxlckNhcnQgJiYgdGhpcy5yZW1vdmVQcm9kdWN0c0Zyb21SZXRhaWxlckNhcnQpIHtcbiAgICAgIGNvbnN0IHByb2R1Y3RzVG9BZGQ6IENvbXBhcmFibGVQcm9kdWN0W10gPSBbXTtcbiAgICAgIGNvbnN0IHByb2R1Y3RzVG9SZW1vdmU6IENvbXBhcmFibGVQcm9kdWN0W10gPSBbXTtcbiAgICAgIGFjdGlvbnNGb3JSZXRhaWxlci5mb3JFYWNoKGFjdGlvbiA9PlxuICAgICAgICBhY3Rpb24ucXVhbnRpdHkgPCAwID8gcHJvZHVjdHNUb1JlbW92ZS5wdXNoKGFjdGlvbikgOiBwcm9kdWN0c1RvQWRkLnB1c2goYWN0aW9uKVxuICAgICAgKTtcbiAgICAgIGlmIChwcm9kdWN0c1RvQWRkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5hZGRQcm9kdWN0c1RvUmV0YWlsZXJDYXJ0KHByb2R1Y3RzVG9BZGQpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2R1Y3RzVG9SZW1vdmUubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJlbW92ZVByb2R1Y3RzRnJvbVJldGFpbGVyQ2FydChwcm9kdWN0c1RvUmVtb3ZlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbTWVhbHpdIGlzIG1pc3NpbmcgYSBjYWxsYmFjayB0byBhZGQgdG8gY2FydDogJyArICdZb3UgbmVlZCB0byBjYWxsIGVpdGhlciBcXCd3aW5kb3cubWVhbHouYmFza2V0U3luYy5kZWZpbmVQdXNoUHJvZHVjdHNUb0NhcnRcXCcgJyArXG4gICAgICAgICdvciBib3RoIFxcJ3dpbmRvdy5tZWFsei5iYXNrZXRTeW5jLmRlZmluZUFkZFByb2R1Y3RzVG9DYXJ0XFwnIGFuZCBcXCd3aW5kb3cubWVhbHouYmFza2V0U3luYy5kZWZpbmVSZW1vdmVQcm9kdWN0c1RvQ2FydFxcJydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgbGlzdCBvZiBCYXNrZXRBY3Rpb25zIGFuZCBmb3IgZWFjaCBhY3Rpb24gdGhhdCBpcyBub3QgYSBkdXBsaWNhdGUgKGJhc2VkIG9uIHRoZSBhY3Rpb24ncyBpZClcbiAgICogaXQgY2FsbHMgdGhlIGNyZWF0ZUFjdGlvbkZvclJldGFpbGVyKCkgbWV0aG9kIGFuZCBhZGRzIHRoZSBvYnNlcnZhYmxlIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kXG4gICAqIHRvIHRoZSBhY3Rpb25zVG9Qcm9jZXNzIGFycmF5LlxuICAgKiBUaGVuIGl0IHVzZXMgZm9ya0pvaW4gdG8gd2FpdCBmb3IgYWxsIG9mIHRoZSBhY3Rpb25zIHRvIGNvbXBsZXRlIGJlZm9yZSByZXNvbHZpbmcgdGhlIG9ic2VydmFibGUuXG4gICAqIFRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhbiBhcnJheSBvZiBDb21wYXJhYmxlUHJvZHVjdHMgdGhhdCByZXByZXNlbnQgdGhlIHByb2R1Y3RzIGFuZCBxdWFudGl0aWVzXG4gICAqIHRvIGJlIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgcmV0YWlsZXIncyBjYXJ0LlxuICAgKiBAcGFyYW0gYWN0aW9ucyB0aGUgbGlzdCBvZiBCYXNrZXRBY3Rpb25zIHRvIHByb2Nlc3NcbiAgICogQHJldHVybnMgYW4gb2JzZXJ2YWJsZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgQ29tcGFyYWJsZVByb2R1Y3RzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFjdGlvbnNGb3JSZXRhaWxlcihhY3Rpb25zOiBCYXNrZXRBY3Rpb25bXSk6IE9ic2VydmFibGU8Q29tcGFyYWJsZVByb2R1Y3RbXT4ge1xuICAgIG1lYWx6RGVidWcoJ1tNZWFsel0gUHJvY2Vzc2luZyBhY3Rpb25zIGluIGxpc3Q6JywgYWN0aW9ucy5tYXAoYSA9PiBhLmxvZ2dhYmxlKSk7XG4gICAgY29uc3Qgc2VlbklkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgYWN0aW9uc1RvUHJvY2VzczogT2JzZXJ2YWJsZTxDb21wYXJhYmxlUHJvZHVjdD5bXSA9IFtdO1xuXG4gICAgYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICBpZiAoIXNlZW5JZHMuaGFzKGFjdGlvbi5pZCkpIHtcbiAgICAgICAgc2Vlbklkcy5hZGQoYWN0aW9uLmlkKTtcbiAgICAgICAgYWN0aW9uLmluaXRQcm9jZXNzKHRoaXMubWVhbHpBY3Rpb25MaXN0KTtcbiAgICAgICAgY29uc3QgcmV0YWlsZXJBY3Rpb25PYnNlcnZhYmxlID0gYWN0aW9uLmNyZWF0ZUFjdGlvbkZvclJldGFpbGVyKCk7XG4gICAgICAgIGFjdGlvbnNUb1Byb2Nlc3MucHVzaChyZXRhaWxlckFjdGlvbk9ic2VydmFibGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmb3JrSm9pbihhY3Rpb25zVG9Qcm9jZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgdGhlIE1lYWx6IGJhc2tldCB3aXRoIHRoZSByZXRhaWxlcidzIGNhcnQuXG4gICAqIFRoaXMgaW52b2x2ZXMgY2hlY2tpbmcgd2hpY2ggcHJvZHVjdHMgYXJlIGluIGJvdGggdGhlIE1lYWx6IGJhc2tldCBhbmQgdGhlIHJldGFpbGVyJ3MgY2FydCxcbiAgICogYW5kIHVwZGF0aW5nIHRoZSBxdWFudGl0aWVzIGluIHRoZSBNZWFseiBiYXNrZXQgdG8gbWF0Y2ggdGhlIHF1YW50aXRpZXMgaW4gdGhlIHJldGFpbGVyJ3MgY2FydC5cbiAgICogQHBhcmFtIHJldGFpbGVyQmFza2V0UHJvZHVjdHMgdGhlIGxpc3Qgb2YgcHJvZHVjdHMgaW4gdGhlIHJldGFpbGVyJ3MgY2FydFxuICAgKi9cbiAgc3luY01lYWx6QmFza2V0V2l0aFJldGFpbGVyQ2FydChyZXRhaWxlckJhc2tldFByb2R1Y3RzOiBDb21wYXJhYmxlUHJvZHVjdFtdKTogdm9pZCB7XG4gICAgdGhpcy5sb2NrV2hpbGVTeW5jaHJvbml6aW5nLm5leHQodHJ1ZSk7XG5cbiAgICB0aGlzLmJhc2tldHNTZXJ2aWNlLndhaXRGb3JCYXNrZXRFbnRyaWVzLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKGJhc2tldEVudHJpZXMgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmVCYXNrZXRFbnRyaWVzID0gYmFza2V0RW50cmllcy5maWx0ZXIoZSA9PiBlLnN0YXR1cyA9PT0gJ2FjdGl2ZScpO1xuICAgICAgICBjb25zdCByZXRhaWxlckNhcnRQcm9kdWN0TWFwID0gdGhpcy5tYXBSZXRhaWxlckNhcnRQcm9kdWN0cyhyZXRhaWxlckJhc2tldFByb2R1Y3RzKTtcblxuICAgICAgICBjb25zdCBzeW5jT3BlcmF0aW9ucyA9IGFjdGl2ZUJhc2tldEVudHJpZXMubWFwKGJhc2tldEVudHJ5ID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaGVkUmV0YWlsZXJDYXJ0UHJvZHVjdCA9IHJldGFpbGVyQ2FydFByb2R1Y3RNYXBbYmFza2V0RW50cnkuc2VsZWN0ZWRJdGVtLmV4dElkXTtcbiAgICAgICAgICBpZiAobWF0Y2hlZFJldGFpbGVyQ2FydFByb2R1Y3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZU1hdGNoaW5nUHJvZHVjdChtYXRjaGVkUmV0YWlsZXJDYXJ0UHJvZHVjdCwgYmFza2V0RW50cnkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVOb25NYXRjaGluZ1Byb2R1Y3QoYmFza2V0RW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZm9ya0pvaW4gbmVlZHMgYW4gYXJyYXkgb2YgYXQgbGVhc3QgMSBvYnNlcnZhYmxlIG90aGVyd2lzZSB0aGUgZm9sbG93aW5nIHN1YnNjcmliZSBuZXZlciBjb21wbGV0ZXNcbiAgICAgICAgaWYgKHN5bmNPcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHN5bmNPcGVyYXRpb25zLnB1c2gob2YobnVsbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKHN5bmNPcGVyYXRpb25zKTtcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9ja1doaWxlU3luY2hyb25pemluZy5uZXh0KGZhbHNlKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBSZXRhaWxlckNhcnRQcm9kdWN0cyhyZXRhaWxlckJhc2tldFByb2R1Y3RzOiBDb21wYXJhYmxlUHJvZHVjdFtdKTogeyBba2V5OiBzdHJpbmddOiBDb21wYXJhYmxlUHJvZHVjdCB9IHtcbiAgICByZXR1cm4gcmV0YWlsZXJCYXNrZXRQcm9kdWN0cy5yZWR1Y2UoKHByb2R1Y3RzTWFwLCBwcm9kdWN0KSA9PiB7XG4gICAgICBwcm9kdWN0c01hcFtwcm9kdWN0LmlkXSA9IHByb2R1Y3Q7XG4gICAgICByZXR1cm4gcHJvZHVjdHNNYXA7XG4gICAgfSwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIHByb2R1Y3QgdGhhdCBpcyBib3RoIGluIHRoZSBNZWFseiBiYXNrZXQgYW5kIGluIHRoZSByZXRhaWxlcidzIGNhcnQuXG4gICAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgdXBkYXRlcyB0aGUgTWVhbHogYmFza2V0IGVudHJ5IHdpdGggdGhlIHF1YW50aXR5IGZyb20gdGhlIHJldGFpbGVyJ3MgY2FydC5cbiAgICogVGhlbiBpdCB3YWl0cyB1bnRpbCB0aGUgTWVhbHogYmFza2V0IGVudHJ5IGlzIG5vdCBiZWluZyB1cGRhdGVkIGFueW1vcmUgYW5kIGVtaXRzIGEgdm9pZCB2YWx1ZS5cbiAgICogVGhpcyBpcyBkb25lIHRvIGF2b2lkIGNvbmN1cnJlbnQgdXBkYXRlcyBvZiB0aGUgTWVhbHogYmFza2V0IGVudHJ5LlxuICAgKiBAcGFyYW0gcHJvZHVjdCAtIFRoZSBwcm9kdWN0IGluIHRoZSByZXRhaWxlcidzIGNhcnQgdG8gYmUgbWF0Y2hlZCB3aXRoIHRoZSBNZWFseiBiYXNrZXQgZW50cnlcbiAgICogQHBhcmFtIGJhc2tldEVudHJ5IC0gVGhlIE1lYWx6IGJhc2tldCBlbnRyeSB0aGF0IGlzIHRvIGJlIHVwZGF0ZWRcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGEgdm9pZCB2YWx1ZSB3aGVuIHRoZSBNZWFseiBiYXNrZXQgZW50cnkgaXMgdXBkYXRlZFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVNYXRjaGluZ1Byb2R1Y3QocHJvZHVjdDogQ29tcGFyYWJsZVByb2R1Y3QsIGJhc2tldEVudHJ5OiBCYXNrZXRFbnRyeSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTx2b2lkPihvYnNlcnZlciA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZU1lYWx6QmFza2V0RnJvbVJldGFpbGVyQmFza2V0KHByb2R1Y3QsIGJhc2tldEVudHJ5KTtcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLmJhc2tldHNTZXJ2aWNlLmVudHJ5SXNCZWluZ1VwZGF0ZWQoYmFza2V0RW50cnkuaWQpLFxuICAgICAgICB0aGlzLmJhc2tldHNTZXJ2aWNlLmVudHJ5V2lsbEJlVXBkYXRlZChiYXNrZXRFbnRyeS5pZClcbiAgICAgIF0pLnBpcGUoXG4gICAgICAgIHNraXBXaGlsZSgoW2lzQmVpbmdVcGRhdGVkLCB3aWxsQmVVcGRhdGVkXSkgPT4gaXNCZWluZ1VwZGF0ZWQgfHwgd2lsbEJlVXBkYXRlZCksXG4gICAgICAgIHRha2UoMSlcbiAgICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCgpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIHByb2R1Y3QgdGhhdCBpcyBpbiB0aGUgTWVhbHogYmFza2V0IGJ1dCBub3QgaW4gdGhlIHJldGFpbGVyJ3MgY2FydC5cbiAgICogVGhpcyBmdW5jdGlvbiBmaXJzdCByZW1vdmVzIHRoZSBNZWFseiBiYXNrZXQgZW50cnkuXG4gICAqIFRoZW4gaXQgd2FpdHMgdW50aWwgdGhlIE1lYWx6IGJhc2tldCBlbnRyeSBpcyBub3QgYmVpbmcgcmVtb3ZlZCBhbnltb3JlIGFuZCBlbWl0cyBhIHZvaWQgdmFsdWUuXG4gICAqIFRoaXMgaXMgZG9uZSB0byBhdm9pZCBjb25jdXJyZW50IHVwZGF0ZXMgb2YgdGhlIE1lYWx6IGJhc2tldCBlbnRyeS5cbiAgICogQHBhcmFtIGJhc2tldEVudHJ5IC0gVGhlIE1lYWx6IGJhc2tldCBlbnRyeSB0aGF0IGlzIHRvIGJlIHJlbW92ZWRcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGEgdm9pZCB2YWx1ZSB3aGVuIHRoZSBNZWFseiBiYXNrZXQgZW50cnkgaXMgcmVtb3ZlZFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVOb25NYXRjaGluZ1Byb2R1Y3QoYmFza2V0RW50cnk6IEJhc2tldEVudHJ5KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHZvaWQ+KG9ic2VydmVyID0+IHtcbiAgICAgIHRoaXMuYmFza2V0c1NlcnZpY2UucmVtb3ZlUHJvZHVjdChiYXNrZXRFbnRyeSwgbmV3IEV2ZW50VHJhY2UoKSk7XG4gICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5iYXNrZXRzU2VydmljZS5lbnRyeUlzQmVpbmdSZW1vdmVkKGJhc2tldEVudHJ5LmlkKSxcbiAgICAgICAgdGhpcy5iYXNrZXRzU2VydmljZS5lbnRyeVdpbGxCZVJlbW92ZWQoYmFza2V0RW50cnkuaWQpXG4gICAgICBdKS5waXBlKFxuICAgICAgICBza2lwV2hpbGUoKFtpc0JlaW5nUmVtb3ZlZCwgd2lsbEJlUmVtb3ZlZF0pID0+IGlzQmVpbmdSZW1vdmVkIHx8IHdpbGxCZVJlbW92ZWQpLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFJFVEFJTEVSIEJBU0tFVCBQUk9DRVNTSU5HICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIE1lYWx6IGJhc2tldCBiYXNlZCBvbiBjaGFuZ2VzIGluIHRoZSByZXRhaWxlcidzIGNhcnRcbiAgICogQHBhcmFtIHJldGFpbGVyQmFza2V0UHJvZHVjdHMgLSBBcnJheSBvZiBwcm9kdWN0cyBmcm9tIHRoZSByZXRhaWxlcidzIGNhcnRcbiAgICovXG4gIHJldGFpbGVyQ2FydENoYW5nZWQocmV0YWlsZXJCYXNrZXRQcm9kdWN0czogQ29tcGFyYWJsZVByb2R1Y3RbXSk6IHZvaWQge1xuICAgIG1lYWx6RGVidWcoJ1tNZWFsel0gUmV0YWlsZXIgY2FydCBjaGFuZ2VkJywgcmV0YWlsZXJCYXNrZXRQcm9kdWN0cyk7XG4gICAgY29uc3QgbGFzdFN1cHBsaWVyQ2FydCA9IFsuLi50aGlzLnN1cHBsaWVyU2VydmljZS5sYXN0U3VwcGxpZXJDYXJ0XTtcbiAgICBpZiAodGhpcy5maXJzdFJldGFpbGVyQ2FydENoYW5nZWQpIHtcbiAgICAgIHRoaXMuc3luY01lYWx6QmFza2V0V2l0aFJldGFpbGVyQ2FydChyZXRhaWxlckJhc2tldFByb2R1Y3RzKTtcbiAgICAgIHRoaXMuZmlyc3RSZXRhaWxlckNhcnRDaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMubG9ja1doaWxlQ29uZmlybWluZywgdGhpcy5sb2NrV2hpbGVTeW5jaHJvbml6aW5nXSkucGlwZShcbiAgICAgIHNraXBXaGlsZSgoW2NvbmZpcm1pbmdMb2NrZWQsIHN5bmNocm9uaXppbmdMb2NrZWRdKSA9PiBjb25maXJtaW5nTG9ja2VkIHx8IHN5bmNocm9uaXppbmdMb2NrZWQpLFxuICAgICAgdGFrZSgxKVxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IHsgYWRkZWRQcm9kdWN0cywgdXBkYXRlZFByb2R1Y3RzLCByZW1vdmVkUHJvZHVjdHMgfSA9IHRoaXMuY29tcGFyZVByb2R1Y3RzKFxuICAgICAgICBsYXN0U3VwcGxpZXJDYXJ0LCByZXRhaWxlckJhc2tldFByb2R1Y3RzXG4gICAgICApO1xuXG4gICAgICBpZiAoYWRkZWRQcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBZGRBY3Rpb25zKGFkZGVkUHJvZHVjdHMsIHRoaXMubWVhbHpBY3Rpb25MaXN0LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW1vdmVkUHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNoZWNrUmVtb3ZlQWN0aW9ucyhyZW1vdmVkUHJvZHVjdHMsIHRoaXMubWVhbHpBY3Rpb25MaXN0LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVkUHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNoZWNrVXBkYXRlQWN0aW9ucyh1cGRhdGVkUHJvZHVjdHMsIHRoaXMubWVhbHpBY3Rpb25MaXN0LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyBvdmVyIHRoZSBwcm9kdWN0cyBhZGRlZCB0byB0aGUgcmV0YWlsZXIncyBjYXJ0IGFuZCBjaGVja3MgaWYgdGhlcmUgYXJlIGNvcnJlc3BvbmRpbmcgYWN0aW9ucyBpbiB0aGUgbGlzdFxuICAgKiBvZiBjdXJyZW50IGFjdGlvbnMuIElmIGEgbWF0Y2ggaXMgZm91bmQsIGNoZWNrIGlmIHRoZSBhY3Rpb24gc3RhdHVzIGlzICdTRU5UX1RPX1JFVEFJTEVSJywgaWYgc28sIHVwZGF0ZSB0aGUgYWN0aW9uJ3NcbiAgICogc3RhdHVzIHRvICdSRVRBSUxFUl9QUk9EVUNUX01BVENIJywgc3luYyB0aGUgYWN0aW9uIHdpdGggdGhlIHJldGFpbGVyIHByb2R1Y3QsIHVwZGF0ZSB0aGUgTWVhbHogYmFza2V0IGFuZCByZW1vdmVcbiAgICogdGhlIGFjdGlvbiBmcm9tIHRoZSBsaXN0LlxuICAgKiBAcGFyYW0gYWRkZWRQcm9kdWN0cyAtIEFycmF5IG9mIHByb2R1Y3RzIGFkZGVkIHRvIHRoZSByZXRhaWxlcidzIGNhcnRcbiAgICogQHBhcmFtIGN1cnJlbnRBY3Rpb25zIC0gQXJyYXkgb2YgY3VycmVudCBhY3Rpb25zXG4gICAqL1xuICBjaGVja0FkZEFjdGlvbnMoXG4gICAgYWRkZWRQcm9kdWN0czogQ29tcGFyYWJsZVByb2R1Y3RbXSxcbiAgICBjdXJyZW50QWN0aW9uczogQmFza2V0QWN0aW9uW10pOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFdlcmUgYWRkZWQgYnkgcmV0YWlsZXI6JywgYWRkZWRQcm9kdWN0cyk7XG4gICAgYWRkZWRQcm9kdWN0cy5mb3JFYWNoKGFkZGVkUHJvZHVjdCA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZ0FjdGlvbiA9IGN1cnJlbnRBY3Rpb25zLmZpbmQoYWN0aW9uID0+IGFjdGlvbi5pZCA9PT0gYWRkZWRQcm9kdWN0LmlkKTtcbiAgICAgIGlmIChtYXRjaGluZ0FjdGlvbiAmJiBtYXRjaGluZ0FjdGlvbi5zdGF0dXMgPT09IEFjdGlvblN0YXR1cy5TRU5UX1RPX1JFVEFJTEVSKSB7XG4gICAgICAgIG1hdGNoaW5nQWN0aW9uLnN0YXR1cyA9IEFjdGlvblN0YXR1cy5SRVRBSUxFUl9QUk9EVUNUX01BVENIO1xuICAgICAgICBtYXRjaGluZ0FjdGlvbi5zeW5jV2l0aFVwZGF0ZUZyb21SZXRhaWxlcihhZGRlZFByb2R1Y3QpO1xuICAgICAgICBtYXRjaGluZ0FjdGlvbi51cGRhdGVNZWFsekJhc2tldCgpO1xuICAgICAgICB0aGlzLnJlbW92ZUZpbmlzaGVkQWN0aW9uc0Zyb21MaXN0KGFkZGVkUHJvZHVjdC5pZCwgbWF0Y2hpbmdBY3Rpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgdGhlIHByb2R1Y3RzIHJlbW92ZWQgZnJvbSB0aGUgcmV0YWlsZXIncyBjYXJ0IGFuZCBjaGVja3MgaWYgdGhlcmUgYXJlIGNvcnJlc3BvbmRpbmcgYWN0aW9ucyBpbiB0aGUgbGlzdFxuICAgKiBvZiBjdXJyZW50IGFjdGlvbnMuIElmIGEgbWF0Y2ggaXMgZm91bmQsIGNoZWNrIGlmIHRoZSBhY3Rpb24gc3RhdHVzIGlzICdTRU5UX1RPX1JFVEFJTEVSJywgaWYgc28sIHVwZGF0ZSB0aGUgYWN0aW9uJ3NcbiAgICogc3RhdHVzIHRvICdSRVRBSUxFUl9QUk9EVUNUX01BVENIJywgdXBkYXRlIHRoZSBNZWFseiBiYXNrZXQgYW5kIHJlbW92ZVxuICAgKiB0aGUgYWN0aW9uIGZyb20gdGhlIGxpc3QuIElmIG5vIG1hdGNoIGlzIGZvdW5kLCByZW1vdmUgdGhlIGV4Y2VzcyBwcm9kdWN0cyBmcm9tIHRoZSBNZWFseiBiYXNrZXQuXG4gICAqIEBwYXJhbSByZW1vdmVkUHJvZHVjdHMgLSBBcnJheSBvZiBwcm9kdWN0cyByZW1vdmVkIGZyb20gdGhlIHJldGFpbGVyJ3MgY2FydFxuICAgKiBAcGFyYW0gY3VycmVudEFjdGlvbnMgLSBBcnJheSBvZiBjdXJyZW50IGFjdGlvbnNcbiAgICovXG4gIGNoZWNrUmVtb3ZlQWN0aW9ucyhyZW1vdmVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10sIGN1cnJlbnRBY3Rpb25zOiBCYXNrZXRBY3Rpb25bXSk6IHZvaWQge1xuICAgIG1lYWx6RGVidWcoJ1tNZWFsel0gV2VyZSByZW1vdmVkIGJ5IHJldGFpbGVyOicsIHJlbW92ZWRQcm9kdWN0cyk7XG4gICAgcmVtb3ZlZFByb2R1Y3RzLmZvckVhY2gocmVtb3ZlZFByb2R1Y3QgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hpbmdBY3Rpb24gPSBjdXJyZW50QWN0aW9ucy5maW5kKGFjdGlvbiA9PiBhY3Rpb24uaWQgPT09IHJlbW92ZWRQcm9kdWN0LmlkKTtcbiAgICAgIGlmIChtYXRjaGluZ0FjdGlvbiAmJiBtYXRjaGluZ0FjdGlvbi5zdGF0dXMgPT09IEFjdGlvblN0YXR1cy5TRU5UX1RPX1JFVEFJTEVSKSB7XG4gICAgICAgIG1hdGNoaW5nQWN0aW9uLnN0YXR1cyA9IEFjdGlvblN0YXR1cy5SRVRBSUxFUl9QUk9EVUNUX01BVENIO1xuICAgICAgICBtYXRjaGluZ0FjdGlvbi51cGRhdGVNZWFsekJhc2tldCgpO1xuICAgICAgICB0aGlzLnJlbW92ZUZpbmlzaGVkQWN0aW9uc0Zyb21MaXN0KHJlbW92ZWRQcm9kdWN0LmlkLCBtYXRjaGluZ0FjdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbmRQcm9kdWN0SW5CYXNrZXRFbnRyaWVzKHJlbW92ZWRQcm9kdWN0LmlkKS5zdWJzY3JpYmUoKGZvdW5kOiBCYXNrZXRFbnRyeSB8IG51bGwpID0+IHtcbiAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMuYmFza2V0c1NlcnZpY2UucmVtb3ZlUHJvZHVjdChmb3VuZCwgbmV3IEV2ZW50VHJhY2UoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgdGhlIHVwZGF0ZWQgcHJvZHVjdHMgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGUgY3VycmVudCBhY3Rpb25zIG1hdGNoIHRoZW0uXG4gICAqIElmIGEgbWF0Y2ggaXMgZm91bmQsIGNoZWNrIGlmIHRoZSBhY3Rpb24gc3RhdHVzIGlzICdTRU5UX1RPX1JFVEFJTEVSJywgaWYgc28sIHVwZGF0ZSB0aGVcbiAgICogYWN0aW9uJ3Mgc3RhdHVzIHRvICdSRVRBSUxFUl9QUk9EVUNUX01BVENIJywgc3luYyB0aGUgYWN0aW9uIHdpdGggdGhlIHJldGFpbGVyIHByb2R1Y3QsXG4gICAqIHVwZGF0ZSB0aGUgTWVhbHogYmFza2V0IGFuZCByZW1vdmUgdGhlIGFjdGlvbiBmcm9tIHRoZSBsaXN0LlxuICAgKiBJZiBubyBtYXRjaCBpcyBmb3VuZCwgcmVtb3ZlIHRoZSBleGNlc3MgcHJvZHVjdHMgZnJvbSB0aGUgTWVhbHogYmFza2V0LlxuICAgKiBAcGFyYW0gdXBkYXRlZFByb2R1Y3RzIC0gQXJyYXkgb2YgcHJvZHVjdHMgd2l0aCB1cGRhdGVkIHF1YW50aXRpZXNcbiAgICogQHBhcmFtIGN1cnJlbnRBY3Rpb25zIC0gQXJyYXkgb2YgY3VycmVudCBhY3Rpb25zXG4gICAqL1xuICBjaGVja1VwZGF0ZUFjdGlvbnModXBkYXRlZFByb2R1Y3RzOiBDb21wYXJhYmxlUHJvZHVjdFtdLCBjdXJyZW50QWN0aW9uczogQmFza2V0QWN0aW9uW10pOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFdlcmUgdXBkYXRlZCBieSByZXRhaWxlcjonLCB1cGRhdGVkUHJvZHVjdHMpO1xuICAgIHVwZGF0ZWRQcm9kdWN0cy5mb3JFYWNoKHVwZGF0ZWRQcm9kdWN0ID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nQWN0aW9uID0gY3VycmVudEFjdGlvbnMuZmluZChhY3Rpb24gPT4gYWN0aW9uLmlkID09PSB1cGRhdGVkUHJvZHVjdC5pZCk7XG4gICAgICBpZiAobWF0Y2hpbmdBY3Rpb24gJiYgbWF0Y2hpbmdBY3Rpb24uc3RhdHVzID09PSBBY3Rpb25TdGF0dXMuU0VOVF9UT19SRVRBSUxFUikge1xuICAgICAgICBtYXRjaGluZ0FjdGlvbi5zdGF0dXMgPSBBY3Rpb25TdGF0dXMuUkVUQUlMRVJfUFJPRFVDVF9NQVRDSDtcbiAgICAgICAgbWF0Y2hpbmdBY3Rpb24uc3luY1dpdGhVcGRhdGVGcm9tUmV0YWlsZXIodXBkYXRlZFByb2R1Y3QpO1xuICAgICAgICBtYXRjaGluZ0FjdGlvbi51cGRhdGVNZWFsekJhc2tldCgpO1xuICAgICAgICB0aGlzLnJlbW92ZUZpbmlzaGVkQWN0aW9uc0Zyb21MaXN0KHVwZGF0ZWRQcm9kdWN0LmlkLCBtYXRjaGluZ0FjdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbmRBbmRSZW1vdmVFeGNlc3NQcm9kdWN0c0luTWVhbHpCYXNrZXQodXBkYXRlZFByb2R1Y3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2hlY2tBY3Rpb25zVG9Ta2lwKHJldGFpbGVyQWN0aW9uczogQ29tcGFyYWJsZVByb2R1Y3RbXSk6IENvbXBhcmFibGVQcm9kdWN0W10ge1xuICAgIGNvbnN0IGFjdGlvbnNUb1NraXA6IENvbXBhcmFibGVQcm9kdWN0W10gPSBbXTtcbiAgICByZXRhaWxlckFjdGlvbnMuZm9yRWFjaCgocmV0YWlsZXJBY3Rpb246IENvbXBhcmFibGVQcm9kdWN0KSA9PiB7XG4gICAgICAvLyBJZiB0aGUgcXVhbnRpdHkgaXMgMCwgc2tpcCB0aGUgdXBkYXRlIGZyb20gcmV0YWlsZXJcbiAgICAgIGlmIChyZXRhaWxlckFjdGlvbi5xdWFudGl0eSA9PT0gMCkge1xuICAgICAgICBhY3Rpb25zVG9Ta2lwLnB1c2gocmV0YWlsZXJBY3Rpb24pO1xuICAgICAgICB0aGlzLnNraXBSZXRhaWxlclVwZGF0ZUZvckFjdGlvbih0aGlzLm1lYWx6QWN0aW9uTGlzdC52YWx1ZS5maW5kKGFjdGlvbiA9PiBhY3Rpb24uaWQgPT09IHJldGFpbGVyQWN0aW9uLmlkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjdGlvbnNUb1NraXA7XG4gIH1cblxuICBza2lwUmV0YWlsZXJVcGRhdGVGb3JBY3Rpb24oYWN0aW9uOiBCYXNrZXRBY3Rpb24pOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFNraXBwaW5nIHJldGFpbGVyIHVwZGF0ZSBmb3IgYWN0aW9uJywgYWN0aW9uLmxvZ2dhYmxlKTtcbiAgICB0aGlzLmZpbmRQcm9kdWN0SW5CYXNrZXRFbnRyaWVzKGFjdGlvbi5pZCkuc3Vic2NyaWJlKChiYXNrZXRFbnRyeUZyb21BY3Rpb246IEJhc2tldEVudHJ5IHwgbnVsbCkgPT4ge1xuICAgICAgYWN0aW9uLnN0YXR1cyA9IEFjdGlvblN0YXR1cy5SRVRBSUxFUl9QUk9EVUNUX01BVENIO1xuICAgICAgYWN0aW9uLnF1YW50aXR5ID0gYmFza2V0RW50cnlGcm9tQWN0aW9uPy5xdWFudGl0eSB8fCAwO1xuICAgICAgYWN0aW9uLmJhc2tldEVudHJ5LnF1YW50aXR5ID0gYmFza2V0RW50cnlGcm9tQWN0aW9uPy5xdWFudGl0eSB8fCAwO1xuICAgICAgYWN0aW9uLnVwZGF0ZU1lYWx6QmFza2V0KCk7XG4gICAgICB0aGlzLmJhc2tldHNTZXJ2aWNlLnByb2R1Y3RzV2lsbEJlQWRkZWQoKS5waXBlKHNraXBXaGlsZShwcm9kdWN0cyA9PiBwcm9kdWN0cyA+IDApLCB0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUZpbmlzaGVkQWN0aW9uc0Zyb21MaXN0KGFjdGlvbi5pZCwgYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBmaW5pc2hlZCBhY3Rpb25zIGZyb20gdGhlIGFjdGlvbiBsaXN0IGJhc2VkIG9uIHRoZSBnaXZlbiBwcm9kdWN0IElEXG4gICAqIEBwYXJhbSBwcm9kdWN0SWQgLSBJRCBvZiB0aGUgcHJvZHVjdCB0byBjaGVja1xuICAgKiBAcGFyYW0gYmFza2V0QWN0aW9uIC0gQWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvZHVjdFxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVGaW5pc2hlZEFjdGlvbnNGcm9tTGlzdChwcm9kdWN0SWQ6IHN0cmluZywgYmFza2V0QWN0aW9uOiBCYXNrZXRBY3Rpb24pOiB2b2lkIHtcbiAgICBtZWFsekRlYnVnKCdbTWVhbHpdIFJlbW92aW5nIGZpbmlzaGVkIGFjdGlvbnMgZnJvbSBsaXN0JywgYmFza2V0QWN0aW9uLmxvZ2dhYmxlKTtcbiAgICBjb25zdCB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgdGhpcy5iYXNrZXRzU2VydmljZS5iYXNrZXRFbnRyaWVzKCkucGlwZShcbiAgICAgIHRha2VVbnRpbCh1bnN1YnNjcmliZSQpLFxuICAgICAgc3dpdGNoTWFwKChlbnRyaWVzOiBCYXNrZXRFbnRyeVtdKSA9PiB7XG4gICAgICAgIGlmIChiYXNrZXRBY3Rpb24uc3RhdHVzICE9PSBBY3Rpb25TdGF0dXMuUkVUQUlMRVJfUFJPRFVDVF9NQVRDSCkge1xuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2tldEVudHJ5Rm91bmQ6IEJhc2tldEVudHJ5ID0gZW50cmllcy5maW5kKGJlID0+IGJlLnNlbGVjdGVkSXRlbS5leHRJZCA9PT0gcHJvZHVjdElkKTtcbiAgICAgICAgaWYgKGJhc2tldEFjdGlvbi5zaG91bGRSZW1vdmVBY3Rpb24oYmFza2V0RW50cnlGb3VuZCkpIHtcbiAgICAgICAgICB0aGlzLmZpbmlzaEFjdGlvbihiYXNrZXRBY3Rpb24pO1xuICAgICAgICAgIHVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgICAgICAgdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mKGJhc2tldEVudHJ5Rm91bmQpO1xuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5pc2hBY3Rpb24oYmFza2V0QWN0aW9uOiBCYXNrZXRBY3Rpb24pOiB2b2lkIHtcbiAgICBiYXNrZXRBY3Rpb24ub25TdWNjZXNzLm5leHQoKTtcbiAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC52YWx1ZS5zcGxpY2UodGhpcy5tZWFsekFjdGlvbkxpc3QudmFsdWUuaW5kZXhPZihiYXNrZXRBY3Rpb24pLCAxKTtcbiAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC5uZXh0KHRoaXMubWVhbHpBY3Rpb25MaXN0LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgcHJvZHVjdCBpbiB0aGUgTWVhbHogYmFza2V0IGFuZCB1cGRhdGUgaXQgYmFzZWQgb24gdGhlIHJldGFpbGVyJ3MgY2FydFxuICAgKiBAcGFyYW0gcHJvZHVjdCAtIFByb2R1Y3QgZnJvbSB0aGUgcmV0YWlsZXIncyBjYXJ0IHRvIGZpbmRcbiAgICovXG4gIHByaXZhdGUgZmluZEFuZFJlbW92ZUV4Y2Vzc1Byb2R1Y3RzSW5NZWFsekJhc2tldChwcm9kdWN0OiBDb21wYXJhYmxlUHJvZHVjdCk6IHZvaWQge1xuICAgIG1lYWx6RGVidWcoJ1tNZWFsel0gRmluZGluZyBhbmQgcmVtb3ZpbmcgZXhjZXNzIHByb2R1Y3RzIGluIE1lYWx6IGJhc2tldCcsIHByb2R1Y3QpO1xuICAgIHRoaXMuZmluZFByb2R1Y3RJbkJhc2tldEVudHJpZXMocHJvZHVjdC5pZCkuc3Vic2NyaWJlKChmb3VuZDogQmFza2V0RW50cnkgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVNZWFsekJhc2tldEZyb21SZXRhaWxlckJhc2tldChwcm9kdWN0LCBmb3VuZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQcm9kdWN0SW5CYXNrZXRFbnRyaWVzKHByb2R1Y3RJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxCYXNrZXRFbnRyeSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRzU2VydmljZS53YWl0Rm9yQmFza2V0RW50cmllcy5waXBlKFxuICAgICAgc3dpdGNoTWFwKChtZWFsekJhc2tldDogQmFza2V0RW50cnlbXSkgPT4gb2YobWVhbHpCYXNrZXQuZmluZChiZSA9PiBiZS5zZWxlY3RlZEl0ZW0uZXh0SWQgPT09IHByb2R1Y3RJZCkpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIE1lYWx6IGJhc2tldCBiYXNlZCBvbiB0aGUgcmV0YWlsZXIncyBjYXJ0IGZvciB0aGUgZ2l2ZW4gcHJvZHVjdFxuICAgKiBAcGFyYW0gcHJvZHVjdCAtIFByb2R1Y3QgZnJvbSB0aGUgcmV0YWlsZXIncyBjYXJ0XG4gICAqIEBwYXJhbSBmb3VuZCAtIENvcnJlc3BvbmRpbmcgYmFza2V0IGVudHJ5IGluIHRoZSBNZWFseiBiYXNrZXRcbiAgICogQHBhcmFtIGxvY2tXaGVuU3luY2hyb25pemluZyAtIFdoZXRoZXIgdG8gbG9jayBhY3Rpb25zIHByb2Nlc3Mgd2hpbGUgc3luY2hyb25pemluZ1xuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVNZWFsekJhc2tldEZyb21SZXRhaWxlckJhc2tldChwcm9kdWN0OiBDb21wYXJhYmxlUHJvZHVjdCwgZm91bmQ6IEJhc2tldEVudHJ5KTogdm9pZCB7XG4gICAgaWYgKGZvdW5kLnF1YW50aXR5ID09PSBwcm9kdWN0LnF1YW50aXR5IHx8IHByb2R1Y3QucXVhbnRpdHkgPiBmb3VuZC5xdWFudGl0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3VuZC5xdWFudGl0eSA9IHByb2R1Y3QucXVhbnRpdHk7XG4gICAgdGhpcy5iYXNrZXRzU2VydmljZS5jaGFuZ2VQcm9kdWN0UXVhbnRpdHkoZm91bmQsIHByb2R1Y3QucXVhbnRpdHksIG5ldyBFdmVudFRyYWNlKCkpO1xuICB9XG5cbiAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIExJU1QgVVRJTFMgVE8gRElTUExBWSBMT0FERVJTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIHByaXZhdGUgc3ViamVjdENvbnRhaW5zRW50cnlJZChcbiAgICBzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QmFza2V0QWN0aW9uW10+LCBlbnRyeUlkOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHN1YmplY3QucGlwZShcbiAgICAgIG1hcCh2YWx1ZSA9PiB2YWx1ZS5zb21lKGEgPT4gYS5pZCA9PT0gZW50cnlJZCkpKTtcbiAgfVxuXG4gIGhhc1BlbmRpbmdBY3Rpb25zKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLm1lYWx6QWN0aW9uTGlzdC5waXBlKG1hcCh2YWx1ZSA9PiB2YWx1ZS5sZW5ndGggPiAwKSk7XG4gIH1cblxuICBlbnRyeVdpbGxCZUFkZGVkKGVudHJ5SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc0VudHJ5SWQodGhpcy5tZWFsekFjdGlvbkxpc3QsIGVudHJ5SWQpO1xuICB9XG5cbiAgZW50cnlXaWxsQmVVcGRhdGVkKGVudHJ5SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RDb250YWluc0VudHJ5SWQodGhpcy5tZWFsekFjdGlvbkxpc3QsIGVudHJ5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmVzIHR3byBhcnJheXMgb2YgY29tcGFyYWJsZSBwcm9kdWN0cyBhbmQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aHJlZSBhcnJheXM6XG4gICAqIC0gYGFkZGVkUHJvZHVjdHNgOiBwcm9kdWN0cyB0aGF0IGFyZSBwcmVzZW50IGluIGB0MGAgYnV0IG5vdCBpbiBgdE1pbnVzMWBcbiAgICogLSBgcmVtb3ZlZFByb2R1Y3RzYDogcHJvZHVjdHMgdGhhdCBhcmUgcHJlc2VudCBpbiBgdE1pbnVzMWAgYnV0IG5vdCBpbiBgdDBgXG4gICAqIC0gYHVwZGF0ZWRQcm9kdWN0c2A6IHByb2R1Y3RzIHRoYXQgYXJlIHByZXNlbnQgaW4gYm90aCBgdE1pbnVzMWAgYW5kIGB0MGAgYnV0IGhhdmUgYSBkaWZmZXJlbnQgcXVhbnRpdHkgaW4gYHQwYFxuICAgKiAgIGNvbXBhcmVkIHRvIGB0TWludXMxYC4gVGhlIGBhZGRpdGlvbmFsSW5mb3NgIHByb3BlcnR5IG9mIGVhY2ggcHJvZHVjdCBpbiB0aGlzIGFycmF5IHdpbGwgY29udGFpbiB0aGUga2V5XG4gICAqICAgYHF1YW50aXR5RGlmZmVyZW5jZWAgd2l0aCB0aGUgdmFsdWUgb2YgYHByb2R1Y3QucXVhbnRpdHkgLSBwcmV2aW91c1Byb2R1Y3QucXVhbnRpdHlgXG4gICAqXG4gICAqIEBwYXJhbSB0TWludXMxIHRoZSBhcnJheSBvZiBwcm9kdWN0cyBhdCB0aW1lIGB0LTFgXG4gICAqIEBwYXJhbSB0MCB0aGUgYXJyYXkgb2YgcHJvZHVjdHMgYXQgdGltZSBgdGBcbiAgICovXG4gIHByaXZhdGUgY29tcGFyZVByb2R1Y3RzKHRNaW51czE6IENvbXBhcmFibGVQcm9kdWN0W10sIHQwOiBDb21wYXJhYmxlUHJvZHVjdFtdKTpcbiAgICB7IGFkZGVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W107IHJlbW92ZWRQcm9kdWN0czogQ29tcGFyYWJsZVByb2R1Y3RbXTsgdXBkYXRlZFByb2R1Y3RzOiBDb21wYXJhYmxlUHJvZHVjdFtdIH0ge1xuICAgIGNvbnN0IGFkZGVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10gPSBbXTtcbiAgICBjb25zdCByZW1vdmVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10gPSBbXTtcbiAgICBjb25zdCB1cGRhdGVkUHJvZHVjdHM6IENvbXBhcmFibGVQcm9kdWN0W10gPSBbXTtcblxuICAgIGNvbnN0IHRNaW51czFNYXAgPSBuZXcgTWFwPHN0cmluZywgQ29tcGFyYWJsZVByb2R1Y3Q+KCk7XG4gICAgdE1pbnVzMS5mb3JFYWNoKHByb2R1Y3QgPT4gdE1pbnVzMU1hcC5zZXQocHJvZHVjdC5pZCwgcHJvZHVjdCkpO1xuXG4gICAgY29uc3QgdDBNYXAgPSBuZXcgTWFwPHN0cmluZywgQ29tcGFyYWJsZVByb2R1Y3Q+KCk7XG4gICAgdDAuZm9yRWFjaChwcm9kdWN0ID0+IHQwTWFwLnNldChwcm9kdWN0LmlkLCBwcm9kdWN0KSk7XG5cbiAgICB0MC5mb3JFYWNoKHByb2R1Y3QgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXNQcm9kdWN0ID0gdE1pbnVzMU1hcC5nZXQocHJvZHVjdC5pZCk7XG4gICAgICBpZiAoIXByZXZpb3VzUHJvZHVjdCkge1xuICAgICAgICBhZGRlZFByb2R1Y3RzLnB1c2gocHJvZHVjdCk7XG4gICAgICB9IGVsc2UgaWYgKHByb2R1Y3QucXVhbnRpdHkgIT09IHByZXZpb3VzUHJvZHVjdC5xdWFudGl0eSkge1xuICAgICAgICB1cGRhdGVkUHJvZHVjdHMucHVzaCh7XG4gICAgICAgICAgLi4ucHJvZHVjdCxcbiAgICAgICAgICBhZGRpdGlvbmFsSW5mb3M6IHsgcXVhbnRpdHlEaWZmZXJlbmNlOiBwcm9kdWN0LnF1YW50aXR5IC0gcHJldmlvdXNQcm9kdWN0LnF1YW50aXR5IH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0TWludXMxLmZvckVhY2gocHJvZHVjdCA9PiB7XG4gICAgICBpZiAoIXQwTWFwLmhhcyhwcm9kdWN0LmlkKSkge1xuICAgICAgICByZW1vdmVkUHJvZHVjdHMucHVzaChwcm9kdWN0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBhZGRlZFByb2R1Y3RzLFxuICAgICAgcmVtb3ZlZFByb2R1Y3RzLFxuICAgICAgdXBkYXRlZFByb2R1Y3RzXG4gICAgfTtcbiAgfVxuXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFWFRFUk5BTCBNRVRIT0RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoqL1xuXG4gIGhhbmRsZVBheW1lbnQodG90YWw6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0b3RhbCkge1xuICAgICAgdGhpcy5iYXNrZXRzU2VydmljZS5jb25maXJtUGF5bWVudEFuZEJhc2tldCh0b3RhbCkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gYmFza2V0c1NlcnZpY2UuY29uZmlybWluZydzIGxhc3QgZW1pdHRlZCB2YWx1ZSB3YXMgdHJ1ZSBhbmQgY3VycmVudCBlbWl0dGVkIHZhbHVlIGlzIGZhbHNlLFxuICAgKiBSZXNldCBiYXNrZXQtc3luY1xuICAgKi9cbiAgbGlzdGVuVG9Db25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMuYmFza2V0c1NlcnZpY2UuY29uZmlybWluZy5waXBlKFxuICAgICAgc2tpcFdoaWxlKGNvbmZpcm1pbmcgPT4gY29uZmlybWluZyA9PT0gdGhpcy5sb2NrV2hpbGVDb25maXJtaW5nLnZhbHVlKVxuICAgICkuc3Vic2NyaWJlKGNvbmZpcm1pbmcgPT4ge1xuICAgICAgaWYgKCFjb25maXJtaW5nICYmIHRoaXMubG9ja1doaWxlQ29uZmlybWluZy52YWx1ZSkge1xuICAgICAgICB0aGlzLnJlc2V0TWVhbHooKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9ja1doaWxlQ29uZmlybWluZy5uZXh0KGNvbmZpcm1pbmcpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRNZWFseigpOiB2b2lkIHtcbiAgICB0aGlzLm1lYWx6QWN0aW9uTGlzdC5uZXh0KFtdKTtcbiAgfVxufVxuIl19
|