@colijnit/transaction 12.1.89 → 12.1.91
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/colijnit-transaction.umd.js +2963 -2123
- package/bundles/colijnit-transaction.umd.js.map +1 -1
- package/colijnit-transaction.d.ts +356 -351
- package/colijnit-transaction.metadata.json +1 -1
- package/esm2015/colijnit-transaction.js +357 -352
- package/esm2015/lib/component/checkout/checkout-overview-delivery-edit/checkout-overview-delivery-edit.component.js +2 -1
- package/esm2015/lib/component/checkout/checkout-overview-relation-edit/checkout-overview-relation-edit.component.js +32 -19
- package/esm2015/lib/component/confirmation-dialog/confirmation-dialog.component.js +11 -5
- package/esm2015/lib/component/confirmation-dialog/confirmation-dialog.module.js +4 -3
- package/esm2015/lib/component/core/base/components/transaction-header-block/transaction-header-block.component.js +1 -2
- package/esm2015/lib/component/core/base/dialog-base.component.js +2 -2
- package/esm2015/lib/component/core/base/transaction-input-field-base.component.js +5 -3
- package/esm2015/lib/component/core/core.module.js +9 -3
- package/esm2015/lib/component/core/directive/overlay-parent.directive.js +19 -0
- package/esm2015/lib/component/core/directive/overlay.directive.js +67 -0
- package/esm2015/lib/component/delivery-type-tile/delivery-type-tile.component.js +2 -2
- package/esm2015/lib/component/delivery-type-tile/delivery-type-tile.module.js +4 -2
- package/esm2015/lib/component/deposit-payment/deposit-payment.component.js +18 -20
- package/esm2015/lib/component/dialog/catalog/dialog-catalog/dialog-catalog.component.js +2 -2
- package/esm2015/lib/component/dialog/transaction-header/dialog-transaction-header-discount/dialog-transaction-header-discount.component.js +7 -3
- package/esm2015/lib/component/dialog/transaction-header/dialog-transaction-header-discount/dialog-transaction-header-discount.module.js +4 -3
- package/esm2015/lib/component/payment/payment.component.js +5 -7
- package/esm2015/lib/component/relation/relation-address/relation-address.component.js +2 -2
- package/esm2015/lib/component/relation/relation-addresses/relation-addresses.component.js +26 -7
- package/esm2015/lib/component/relation/relation-base.component.js +3 -1
- package/esm2015/lib/component/relation/relation-contact-details/relation-contact-details.component.js +5 -2
- package/esm2015/lib/component/shared/transaction-article-text/transaction-article-text.component.js +2 -2
- package/esm2015/lib/component/shared/transaction-article-text-overview/transaction-article-text-overview.component.js +2 -2
- package/esm2015/lib/component/transaction/transaction.module.js +1 -1
- package/esm2015/lib/component/transaction-card/transaction-card-header/transaction-card-header.component.js +2 -2
- package/esm2015/lib/component/transaction-confirmation-details/transaction-confirmation-details.component.js +1 -1
- package/esm2015/lib/component/transaction-confirmation-history/transaction-confirmation-history.component.js +1 -1
- package/esm2015/lib/component/transaction-create-date-label/transaction-create-date-label.component.js +38 -0
- package/esm2015/lib/component/transaction-create-date-label/transaction-create-date-label.module.js +19 -0
- package/esm2015/lib/component/transaction-grid/transaction-lines-grid/transaction-lines-grid.component.js +5 -5
- package/esm2015/lib/component/transaction-header/transaction-header-order/transaction-header-order.component.js +2 -2
- package/esm2015/lib/component/transaction-header/transaction-header-payment/transaction-header-payment.component.js +11 -8
- package/esm2015/lib/component/transaction-header/transaction-header-payment/transaction-header-payment.module.js +4 -2
- package/esm2015/lib/component/transaction-header/transaction-header-relation/transaction-header-relation.component.js +19 -32
- package/esm2015/lib/component/transaction-header-fields/transaction-header-delivery-method.component.js +6 -3
- package/esm2015/lib/component/transaction-header-fields/transaction-header-delivery-options/transaction-header-delivery-options.component.js +2 -1
- package/esm2015/lib/component/transaction-line/transaction-overview-line/transaction-overview-line.component.js +6 -2
- package/esm2015/lib/component/transaction-line/transaction-overview-line/transaction-overview-line.module.js +4 -2
- package/esm2015/lib/component/transaction-line/transaction-purchase-line/transaction-purchase-line.component.js +4 -4
- package/esm2015/lib/component/transaction-line/transaction-purchase-order-line/transaction-purchase-order-line.component.js +1 -2
- package/esm2015/lib/component/transaction-line/transaction-purchase-overview-line/transaction-purchase-overview-line.component.js +18 -12
- package/esm2015/lib/component/transaction-line/transaction-purchase-overview-line/transaction-purchase-overview-line.module.js +6 -2
- package/esm2015/lib/component/transaction-line-fields/transaction-line-delivery-date.component.js +3 -2
- package/esm2015/lib/component/transaction-line-fields/transaction-line-description.component.js +2 -1
- package/esm2015/lib/component/transaction-line-fields/transaction-line-supplier-button.component.js +14 -1
- package/esm2015/lib/component/transaction-line-image-and-description/transaction-line-image-and-description.component.js +3 -2
- package/esm2015/lib/component/transaction-line-purchase-confirmation/transaction-line-purchase-confirmation.component.js +1 -1
- package/esm2015/lib/component/transaction-line-sales-allocation/transaction-line-sales-allocation.module.js +2 -3
- package/esm2015/lib/component/transaction-line-side-panel/transaction-line-side-panel.component.js +1 -1
- package/esm2015/lib/component/transaction-line-side-panel/transaction-line-side-panel.module.js +4 -2
- package/esm2015/lib/component/transaction-line-side-panel-article-details/transaction-line-side-panel-article-details.component.js +319 -0
- package/esm2015/lib/component/transaction-line-side-panel-article-details/transaction-line-side-panel-article-details.module.js +26 -0
- package/esm2015/lib/component/transaction-line-side-panel-purchase/transaction-line-side-panel-purchase.module.js +1 -1
- package/esm2015/lib/component/transaction-line-side-panel-sales/transaction-line-side-panel-sales.module.js +1 -1
- package/esm2015/lib/component/transaction-navigation-button-list/transaction-navigation-button-list.component.js +69 -0
- package/esm2015/lib/component/transaction-navigation-button-list/transaction-navigation-button-list.module.js +27 -0
- package/esm2015/lib/component/transaction-number-label/transaction-number-label.component.js +38 -0
- package/esm2015/lib/component/transaction-number-label/transaction-number-label.module.js +19 -0
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-invoice/transaction-quick-access-invoice.component.js +1 -1
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-order-delivery/transaction-quick-access-order-delivery.component.js +1 -1
- package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-received-goods/transaction-quick-access-received-goods.component.js +1 -1
- package/esm2015/lib/component/transaction-search/service/transaction-search.service.js +4 -4
- package/esm2015/lib/component/transaction-tags/transaction-tag.component.js +44 -0
- package/esm2015/lib/component/transaction-tags/transaction-tags.component.js +48 -0
- package/esm2015/lib/component/transaction-tags/transaction-tags.module.js +22 -0
- package/esm2015/lib/component/transaction-tile/transaction-tile.component.js +3 -3
- package/esm2015/lib/component/transaction-totals/transaction-totals.component.js +5 -1
- package/esm2015/lib/enum/icon.enum.js +2 -1
- package/esm2015/lib/interface/dialog-response.interface.js +1 -1
- package/esm2015/lib/model/alternate-supplier.viewmodel.js +3 -0
- package/esm2015/lib/model/icon-svg.js +2 -1
- package/esm2015/lib/res/dictionary/dictionaries.js +3 -3
- package/esm2015/lib/service/dialog.service.js +5 -6
- package/esm2015/lib/service/dynamic-component.service.js +3 -3
- package/esm2015/lib/service/payment.service.js +4 -3
- package/esm2015/lib/service/pending-reason.service.js +13 -391
- package/esm2015/lib/service/relation-connector.service.js +32 -1
- package/esm2015/lib/service/relation.service.js +7 -1
- package/esm2015/lib/service/transaction-base.service.js +471 -0
- package/esm2015/lib/service/transaction-connector-adapter.service.js +44 -20
- package/esm2015/lib/service/transaction-connector.service.js +16 -8
- package/esm2015/lib/service/transaction-event.service.js +5 -1
- package/esm2015/lib/service/transaction-mapping.service.js +2 -3
- package/esm2015/lib/service/transaction.service.js +101 -93
- package/esm2015/public_api.js +11 -2
- package/fesm2015/colijnit-transaction.js +2019 -1048
- package/fesm2015/colijnit-transaction.js.map +1 -1
- package/lib/component/checkout/checkout-overview-relation-edit/checkout-overview-relation-edit.component.d.ts +4 -3
- package/lib/component/confirmation-dialog/confirmation-dialog.component.d.ts +2 -0
- package/lib/component/core/base/components/transaction-header-block/style/_material-definition.scss +2 -1
- package/lib/component/core/base/components/transaction-header-block/style/_theme.scss +3 -0
- package/lib/component/core/base/dialog-base.component.d.ts +1 -1
- package/lib/component/core/base/transaction-input-field-base.component.d.ts +1 -0
- package/lib/component/core/directive/overlay-parent.directive.d.ts +6 -0
- package/lib/component/core/directive/overlay.directive.d.ts +14 -0
- package/lib/component/deposit-payment/deposit-payment.component.d.ts +2 -2
- package/lib/component/deposit-payment/style/_layout.scss +14 -4
- package/lib/component/deposit-payment/style/_material-definition.scss +2 -1
- package/lib/component/dialog/transaction-header/dialog-transaction-header-discount/dialog-transaction-header-discount.component.d.ts +1 -0
- package/lib/component/dialog/transaction-header/dialog-transaction-header-discount/style/_layout.scss +2 -0
- package/lib/component/dialog/transaction-header/dialog-transaction-header-discount/style/_material-definition.scss +2 -1
- package/lib/component/dialog/transaction-line/dialog-transaction-line-discount/style/_material-definition.scss +1 -1
- package/lib/component/payment/payment.component.d.ts +0 -1
- package/lib/component/quick-send-button/style/_material-definition.scss +1 -1
- package/lib/component/relation/relation-addresses/relation-addresses.component.d.ts +4 -3
- package/lib/component/relation/relation-base.component.d.ts +2 -0
- package/lib/component/relation/relation-contact-details/relation-contact-details.component.d.ts +2 -0
- package/lib/component/toast/style/_material-definition.scss +1 -1
- package/lib/component/transaction-button-bar/style/_material-definition.scss +1 -1
- package/lib/component/transaction-create-date-label/style/_layout.scss +7 -0
- package/lib/component/transaction-create-date-label/style/_material-definition.scss +4 -0
- package/lib/component/transaction-create-date-label/style/_theme.scss +5 -0
- package/lib/component/transaction-create-date-label/style/material.scss +4 -0
- package/lib/component/transaction-create-date-label/transaction-create-date-label.component.d.ts +11 -0
- package/lib/component/transaction-create-date-label/transaction-create-date-label.module.d.ts +2 -0
- package/lib/component/transaction-header/transaction-header-delivery/style/_material-definition.scss +2 -2
- package/lib/component/transaction-header/transaction-header-order/style/_layout.scss +1 -0
- package/lib/component/transaction-header/transaction-header-order/style/_material-definition.scss +1 -1
- package/lib/component/transaction-header/transaction-header-payment/style/_layout.scss +0 -3
- package/lib/component/transaction-header/transaction-header-payment/style/_material-definition.scss +1 -1
- package/lib/component/transaction-header/transaction-header-payment/transaction-header-payment.component.d.ts +6 -1
- package/lib/component/transaction-header/transaction-header-relation/transaction-header-relation.component.d.ts +0 -2
- package/lib/component/transaction-line/transaction-base-line/style/_layout.scss +5 -0
- package/lib/component/transaction-line/transaction-base-line/style/_material-definition.scss +1 -0
- package/lib/component/transaction-line/transaction-line/style/_layout.scss +1 -1
- package/lib/component/transaction-line/transaction-overview-line/style/_layout.scss +10 -0
- package/lib/component/transaction-line/transaction-purchase-overview-line/style/material.scss +1 -0
- package/lib/component/transaction-line/transaction-purchase-overview-line/transaction-purchase-overview-line.component.d.ts +3 -2
- package/lib/component/transaction-line-action-buttons/style/_material-definition.scss +1 -1
- package/lib/component/transaction-line-fields/transaction-line-supplier-button.component.d.ts +1 -0
- package/lib/component/transaction-line-side-panel/style/_layout.scss +1 -1
- package/lib/component/transaction-line-side-panel/style/material.scss +1 -0
- package/lib/component/transaction-line-side-panel-article-details/style/_layout.scss +161 -0
- package/lib/component/transaction-line-side-panel-article-details/style/_material-definition.scss +0 -0
- package/lib/component/transaction-line-side-panel-article-details/style/_theme.scss +6 -0
- package/lib/component/transaction-line-side-panel-article-details/style/material.scss +4 -0
- package/lib/component/transaction-line-side-panel-article-details/transaction-line-side-panel-article-details.component.d.ts +36 -0
- package/lib/component/transaction-line-side-panel-article-details/transaction-line-side-panel-article-details.module.d.ts +2 -0
- package/lib/component/transaction-navigation-button-list/style/_layout.scss +25 -0
- package/lib/component/transaction-navigation-button-list/style/_material-definition.scss +10 -0
- package/lib/component/transaction-navigation-button-list/style/_theme.scss +8 -0
- package/lib/component/transaction-navigation-button-list/style/material.scss +4 -0
- package/lib/component/transaction-navigation-button-list/transaction-navigation-button-list.component.d.ts +11 -0
- package/lib/component/transaction-navigation-button-list/transaction-navigation-button-list.module.d.ts +2 -0
- package/lib/component/transaction-number-label/style/_layout.scss +7 -0
- package/lib/component/transaction-number-label/style/_material-definition.scss +4 -0
- package/lib/component/transaction-number-label/style/_theme.scss +5 -0
- package/lib/component/transaction-number-label/style/material.scss +4 -0
- package/lib/component/transaction-number-label/transaction-number-label.component.d.ts +12 -0
- package/lib/component/transaction-number-label/transaction-number-label.module.d.ts +2 -0
- package/lib/component/transaction-quick-access/transaction-quick-access-goods-allocation/style/_layout.scss +1 -1
- package/lib/component/transaction-quick-access/transaction-quick-access-order-confirmation/style/_layout.scss +1 -1
- package/lib/component/transaction-quick-access/transaction-quick-access-received-goods/style/_layout.scss +1 -1
- package/lib/component/transaction-search/transaction-search-tile/transaction-search-tile/style/_material-definition.scss +1 -1
- package/lib/component/transaction-tags/style/_layout.scss +19 -0
- package/lib/component/transaction-tags/style/_material-definition.scss +11 -0
- package/lib/component/transaction-tags/style/_theme.scss +11 -0
- package/lib/component/transaction-tags/style/material.scss +4 -0
- package/lib/component/transaction-tags/transaction-tag.component.d.ts +12 -0
- package/lib/component/transaction-tags/transaction-tags.component.d.ts +15 -0
- package/lib/component/transaction-tags/transaction-tags.module.d.ts +2 -0
- package/lib/enum/icon.enum.d.ts +1 -0
- package/lib/interface/dialog-response.interface.d.ts +1 -0
- package/lib/model/alternate-supplier.viewmodel.d.ts +5 -0
- package/lib/res/dictionary/dictionaries.d.ts +7 -0
- package/lib/service/dialog.service.d.ts +1 -1
- package/lib/service/pending-reason.service.d.ts +3 -86
- package/lib/service/relation-connector.service.d.ts +3 -0
- package/lib/service/relation.service.d.ts +3 -0
- package/lib/service/transaction-base.service.d.ts +97 -0
- package/lib/service/transaction-connector-adapter.service.d.ts +8 -2
- package/lib/service/transaction-connector.service.d.ts +6 -2
- package/lib/service/transaction-event.service.d.ts +5 -0
- package/lib/service/transaction.service.d.ts +10 -11
- package/lib/style/_variables.scss +8 -3
- package/package.json +4 -4
- package/public_api.d.ts +10 -1
- package/esm2015/lib/component/core/base/dynamic-base-component.js +0 -8
- package/lib/component/core/base/dynamic-base-component.d.ts +0 -3
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { OptionsService } from "./options.service";
|
|
3
|
+
import { DialogService } from "./dialog.service";
|
|
4
|
+
import { TransactionConnectorService } from "./transaction-connector.service";
|
|
5
|
+
import { SharedService } from "@colijnit/sharedcomponents";
|
|
6
|
+
import { ArticleConnectorService } from "./article-connector.service";
|
|
7
|
+
import { DictionaryService } from "./dictionary.service";
|
|
8
|
+
import { TransactionEventService } from "./transaction-event.service";
|
|
9
|
+
import { RelationService } from "./relation.service";
|
|
10
|
+
import { TransactionInfoResponse } from "@colijnit/transactionapi/build/model/transaction-info-response.bo";
|
|
11
|
+
import { TransactionKind } from "@colijnit/transactionapi/build/enum/transaction-kind.enum";
|
|
12
|
+
import { Relation } from "@colijnit/relationapi/build/model/relation.bo";
|
|
13
|
+
import { CustomerFullObject } from "@colijnit/relationapi/build/model/customer-full-object.bo";
|
|
14
|
+
import { SupplierFullObject } from "@colijnit/relationapi/build/model/supplier-full-object.bo";
|
|
15
|
+
import { BehaviorSubject, Subject } from "rxjs";
|
|
16
|
+
import { DocDeliveryBatch } from "@colijnit/transactionapi/build/model/doc-delivery-batch.bo";
|
|
17
|
+
import { TransactionLineType } from "@colijnit/transactionapi/build/enum/transaction-line-type.enum";
|
|
18
|
+
import { TransactionRefTransaction } from "@colijnit/transactionapi/build/model/transaction-line-info.bo";
|
|
19
|
+
import { PurchasePortalFilters } from "@colijnit/transactionapi/build/model/purchase-portal-filters.bo";
|
|
20
|
+
import { GetPurchasePortalLine } from "@colijnit/transactionapi/build/model/get-purchase-portal-line";
|
|
21
|
+
import { TransactionSearchViewRequest } from "@colijnit/transactionapi/build/model/transaction-search-view-request";
|
|
22
|
+
import { RelationKind } from "@colijnit/articleapi/build/enum/relation-kind.enum";
|
|
23
|
+
import { RelationStatus } from "@colijnit/articleapi/build/enum/relation-status.enum";
|
|
24
|
+
import { Injectable } from "@angular/core";
|
|
25
|
+
export class TransactionBaseService {
|
|
26
|
+
constructor(optionsService, dialogService, connector, sharedService, articleConnector, dictionaryService, transactionEventService, relationService) {
|
|
27
|
+
this.optionsService = optionsService;
|
|
28
|
+
this.dialogService = dialogService;
|
|
29
|
+
this.connector = connector;
|
|
30
|
+
this.sharedService = sharedService;
|
|
31
|
+
this.articleConnector = articleConnector;
|
|
32
|
+
this.dictionaryService = dictionaryService;
|
|
33
|
+
this.transactionEventService = transactionEventService;
|
|
34
|
+
this.relationService = relationService;
|
|
35
|
+
this._relationClassFromTransactionKind = new Map([
|
|
36
|
+
[TransactionKind.SalesOrder, CustomerFullObject],
|
|
37
|
+
[TransactionKind.PurchaseOrder, SupplierFullObject]
|
|
38
|
+
]);
|
|
39
|
+
this.logout = new Subject();
|
|
40
|
+
this.transactionUpdated = new BehaviorSubject(undefined);
|
|
41
|
+
this.relationUpdated = new BehaviorSubject(undefined);
|
|
42
|
+
this.autoSave = false;
|
|
43
|
+
this.applicationUser = false;
|
|
44
|
+
this.invoiceAddressSameAsDelivery = true;
|
|
45
|
+
this.transactionKind = TransactionKind.SalesOrder;
|
|
46
|
+
this.currentTransaction = new TransactionInfoResponse();
|
|
47
|
+
this.purchasePortalLine = [];
|
|
48
|
+
this.docDeliveryBatch = new DocDeliveryBatch();
|
|
49
|
+
this.articleAmount = 0;
|
|
50
|
+
this.warehouseLocationPopupShown = false;
|
|
51
|
+
this._relation = new Relation();
|
|
52
|
+
this._purchaseOrdersCompleted = false;
|
|
53
|
+
this._receiveGoodsCompleted = false;
|
|
54
|
+
this._allocateGoodsCompleted = false;
|
|
55
|
+
this._purchaseOrderConfirmationCompleted = false;
|
|
56
|
+
this._deliveryCompleted = false;
|
|
57
|
+
this._invoiceCompleted = false;
|
|
58
|
+
}
|
|
59
|
+
set purchaseOrdersCompleted(value) {
|
|
60
|
+
this._purchaseOrdersCompleted = value;
|
|
61
|
+
this.transactionEventService.salesOrderGeneratePurchaseOrdersCompletedChanged.next(this._purchaseOrdersCompleted);
|
|
62
|
+
}
|
|
63
|
+
get purchaseOrdersCompleted() {
|
|
64
|
+
return this._purchaseOrdersCompleted;
|
|
65
|
+
}
|
|
66
|
+
set receiveGoodsCompleted(value) {
|
|
67
|
+
this._receiveGoodsCompleted = value;
|
|
68
|
+
this.transactionEventService.purchaseOrderReceiveGoodsCompletedChanged.next(this._receiveGoodsCompleted);
|
|
69
|
+
}
|
|
70
|
+
get receiveGoodsCompleted() {
|
|
71
|
+
return this._receiveGoodsCompleted;
|
|
72
|
+
}
|
|
73
|
+
set allocateGoodsCompleted(value) {
|
|
74
|
+
this._allocateGoodsCompleted = value;
|
|
75
|
+
this.transactionEventService.purchaseOrderAllocateGoodsCompletedChanged.next(this._allocateGoodsCompleted);
|
|
76
|
+
}
|
|
77
|
+
get allocateGoodsCompleted() {
|
|
78
|
+
return this._allocateGoodsCompleted;
|
|
79
|
+
}
|
|
80
|
+
set purchaseOrderConfirmationCompleted(value) {
|
|
81
|
+
this._purchaseOrderConfirmationCompleted = value;
|
|
82
|
+
this.transactionEventService.purchaseOrderConfirmationCompletedChanged.next(this._purchaseOrderConfirmationCompleted);
|
|
83
|
+
}
|
|
84
|
+
get purchaseOrderConfirmationCompleted() {
|
|
85
|
+
return this._purchaseOrderConfirmationCompleted;
|
|
86
|
+
}
|
|
87
|
+
set deliveryCompleted(value) {
|
|
88
|
+
this._deliveryCompleted = value;
|
|
89
|
+
this.transactionEventService.salesOrderDeliveryCompletedChanged.next(this._deliveryCompleted);
|
|
90
|
+
}
|
|
91
|
+
get deliveryCompleted() {
|
|
92
|
+
return this._deliveryCompleted;
|
|
93
|
+
}
|
|
94
|
+
set invoiceCompleted(value) {
|
|
95
|
+
this._invoiceCompleted = value;
|
|
96
|
+
this.transactionEventService.salesOrderInvoiceCompletedChanged.next(this._invoiceCompleted);
|
|
97
|
+
}
|
|
98
|
+
get invoiceCompleted() {
|
|
99
|
+
return this._invoiceCompleted;
|
|
100
|
+
}
|
|
101
|
+
set relation(value) {
|
|
102
|
+
if (value) {
|
|
103
|
+
this._relation = value;
|
|
104
|
+
this.relationUpdated.next(this._relation);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
get relation() {
|
|
108
|
+
return this._relation;
|
|
109
|
+
}
|
|
110
|
+
init(options) {
|
|
111
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
yield this.optionsService.initialize(options);
|
|
113
|
+
this.sharedService.init(options);
|
|
114
|
+
this.connector.connect();
|
|
115
|
+
this.transactionEventService.connectionInitialized.next(true);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
createNewRelation() {
|
|
119
|
+
const clazz = this._getRelationClass(this.transactionKind);
|
|
120
|
+
this.relation = new clazz;
|
|
121
|
+
}
|
|
122
|
+
resetCurrentTransaction() {
|
|
123
|
+
this.currentTransaction = new TransactionInfoResponse();
|
|
124
|
+
this._relation = new CustomerFullObject();
|
|
125
|
+
this.articleAmount = 0;
|
|
126
|
+
}
|
|
127
|
+
saveTransaction(rememberTransaction = true) {
|
|
128
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
129
|
+
const response = yield this.connector.saveTransaction(this.currentTransaction.transactionInfo.uuid);
|
|
130
|
+
if (response && response.isSuccess && rememberTransaction) {
|
|
131
|
+
this.rememberCurrentTransaction(response);
|
|
132
|
+
}
|
|
133
|
+
return response;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
commit() {
|
|
137
|
+
return this.connector.commit();
|
|
138
|
+
}
|
|
139
|
+
rollback() {
|
|
140
|
+
return this.connector.rollback();
|
|
141
|
+
}
|
|
142
|
+
searchTransactions(request) {
|
|
143
|
+
return this.connector.searchTransactions(request);
|
|
144
|
+
}
|
|
145
|
+
getTransactionById(transactionId) {
|
|
146
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
147
|
+
const transactionInfoResponse = yield this.connector.getTransactionById(transactionId);
|
|
148
|
+
if (transactionInfoResponse.isSuccess) {
|
|
149
|
+
this.rememberCurrentTransaction(transactionInfoResponse);
|
|
150
|
+
}
|
|
151
|
+
this.warehouseLocationPopupShown = false;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
tryToLockTransaction(id, version, secondAttempt = false) {
|
|
155
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
if (!id) { // it's a new transaction, no need to lock
|
|
157
|
+
return Promise.resolve(true);
|
|
158
|
+
}
|
|
159
|
+
const lockResponse = yield this._lockTransaction(id, version);
|
|
160
|
+
if (lockResponse) {
|
|
161
|
+
if (!lockResponse.isLockSuccess) {
|
|
162
|
+
if (secondAttempt) { // something went wrong
|
|
163
|
+
this.dialogService.showError(this.dictionaryService.get("UNKNOWN_ERROR"));
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
if (!lockResponse.isLatestVersion) {
|
|
167
|
+
this.dialogService.showToast(this.dictionaryService.get("TRANSACTION_VERSION_MISMATCH"));
|
|
168
|
+
yield this.getTransactionById(id);
|
|
169
|
+
this.dialogService.hideToastAfterMs(3000);
|
|
170
|
+
return this.tryToLockTransaction(this.currentTransaction.transactionInfo.id, this.currentTransaction.transactionInfo.version, true);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
const lockDetails = `${this.dictionaryService.get("BY")}: ${lockResponse.lockedBy}
|
|
174
|
+
${this.dictionaryService.get("SINCE", false)} ${lockResponse.lockedSince.toLocaleString()}`;
|
|
175
|
+
this.dialogService.showError(this.dictionaryService.get("TRANSACTION_ALREADY_LOCKED"), lockDetails);
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
getTransactionInfo(transId, lineId) {
|
|
184
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
185
|
+
return yield this.connector.getTransactionInfo(transId, lineId);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
getRefTransactions(transId) {
|
|
189
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
190
|
+
return yield this.connector.getRefTransactions(transId);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
getGoodsReceiptStatus(transId, lineNr) {
|
|
194
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
195
|
+
return yield this.connector.getGoodsReceiptStatus(transId, lineNr);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
getDeliveryOrderStatus(transId, lineId) {
|
|
199
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
200
|
+
return yield this.connector.getDeliveryOrderStatus(transId, lineId);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
getGoodsAllocationStatus(transId, lineNr) {
|
|
204
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
205
|
+
return yield this.connector.getGoodsAllocationStatus(transId, lineNr);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
getPurchasePortalLines(request) {
|
|
209
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
210
|
+
return yield this.connector.getPurchasePortalLines(request);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
rememberCurrentTransaction(value) {
|
|
214
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
215
|
+
this.currentTransaction = value;
|
|
216
|
+
this._setAmount();
|
|
217
|
+
this._checkPurchaseOrders();
|
|
218
|
+
this._checkReceivedGoods();
|
|
219
|
+
this._checkGoodsAllocation();
|
|
220
|
+
this._checkPurchaseOrderConfirmation();
|
|
221
|
+
this._checkDelivery();
|
|
222
|
+
this._checkRefTransaction();
|
|
223
|
+
if (this.currentTransaction.transactionInfo.relation && this.currentTransaction.transactionInfo.relation.relationId && !this.relation.relationId) {
|
|
224
|
+
this._getRelation(this.currentTransaction.transactionInfo.relation);
|
|
225
|
+
}
|
|
226
|
+
this.transactionUpdated.next(this.currentTransaction);
|
|
227
|
+
this.transactionEventService.transactionSet.next(this.currentTransaction);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
_checkPurchaseOrders() {
|
|
231
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
232
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.SalesOrder && this.currentTransaction.transactionLines) {
|
|
233
|
+
const promises = [];
|
|
234
|
+
const amountTransLineCommCodeZero = this.currentTransaction.transactionLines.filter(l => l.commissionCode === "0").length;
|
|
235
|
+
let amountPurchaseOrders = 0;
|
|
236
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
237
|
+
if (!transId) { // new transaction, get out
|
|
238
|
+
return Promise.resolve();
|
|
239
|
+
}
|
|
240
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
241
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
242
|
+
const transLine = articleTransLines[i];
|
|
243
|
+
promises.push(this.getTransactionInfo(transId, transLine.lineNr).then((transactions) => {
|
|
244
|
+
if (transactions && transactions.length > 0) {
|
|
245
|
+
transLine.purchaseOrderId = transactions[0].transId;
|
|
246
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
247
|
+
amountPurchaseOrders++;
|
|
248
|
+
}
|
|
249
|
+
}));
|
|
250
|
+
}
|
|
251
|
+
Promise.all(promises).then(() => {
|
|
252
|
+
this.purchaseOrdersCompleted = this.currentTransaction.transactionLines.length > 0 && (amountTransLineCommCodeZero === amountPurchaseOrders);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
_checkReceivedGoods() {
|
|
258
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
259
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.PurchaseOrder && this.currentTransaction.transactionLines) {
|
|
260
|
+
const promises = [];
|
|
261
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
262
|
+
if (!transId) { // new transaction, get out
|
|
263
|
+
return Promise.resolve();
|
|
264
|
+
}
|
|
265
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
266
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
267
|
+
const transLine = articleTransLines[i];
|
|
268
|
+
promises.push(this.getGoodsReceiptStatus(transId, transLine.lineNr).then((goodsReceiptStatus) => {
|
|
269
|
+
transLine.quantityToReceive = goodsReceiptStatus.quantityToReceive;
|
|
270
|
+
transLine.quantityReceived = goodsReceiptStatus.quantityReceived;
|
|
271
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
Promise.all(promises).then(() => {
|
|
275
|
+
this.receiveGoodsCompleted = this.currentTransaction.transactionLines.find(l => l.quantityToReceive !== 0) === undefined;
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
_checkDelivery() {
|
|
281
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
282
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.SalesOrder && this.currentTransaction.transactionLines) {
|
|
283
|
+
const promises = [];
|
|
284
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
285
|
+
if (!transId) { // new transaction, get out
|
|
286
|
+
return Promise.resolve();
|
|
287
|
+
}
|
|
288
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
289
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
290
|
+
const transLine = articleTransLines[i];
|
|
291
|
+
promises.push(this.getDeliveryOrderStatus(transId, transLine.lineNr).then((result) => {
|
|
292
|
+
transLine.quantityToDeliver = result.quantityToDeliver;
|
|
293
|
+
transLine.quantityToInvoice = result.quantityToInvoice;
|
|
294
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
295
|
+
}));
|
|
296
|
+
}
|
|
297
|
+
Promise.all(promises).then(() => {
|
|
298
|
+
this.deliveryCompleted = this.currentTransaction.transactionLines.find(l => l.quantityDelivered !== l.amount) === undefined;
|
|
299
|
+
this.invoiceCompleted = this.currentTransaction.transactionLines.find(l => l.quantityInvoiced !== l.amount) === undefined;
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
_checkGoodsAllocation() {
|
|
305
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
306
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.SalesOrder && this.currentTransaction.transactionLines) {
|
|
307
|
+
const promises = [];
|
|
308
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
309
|
+
if (!transId) { // new transaction, get out
|
|
310
|
+
return Promise.resolve();
|
|
311
|
+
}
|
|
312
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
313
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
314
|
+
const transLine = articleTransLines[i];
|
|
315
|
+
promises.push(this.getGoodsAllocationStatus(transId, transLine.lineNr).then((goodsAllocationStatus) => {
|
|
316
|
+
transLine.quantityToAllocate = goodsAllocationStatus.quantityToAllocate;
|
|
317
|
+
transLine.quantityAllocated = goodsAllocationStatus.quantityAllocated;
|
|
318
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
319
|
+
}));
|
|
320
|
+
}
|
|
321
|
+
Promise.all(promises).then(() => {
|
|
322
|
+
this.allocateGoodsCompleted = this.currentTransaction.transactionLines.find(l => /*l.commissionCode === "1" &&*/ l.quantityToAllocate !== 0) === undefined;
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
_checkPurchaseOrderConfirmation() {
|
|
328
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
329
|
+
let completed = true;
|
|
330
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.PurchaseOrder && this.currentTransaction.transactionLines) {
|
|
331
|
+
const promises = [];
|
|
332
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
333
|
+
if (!transId) { // new transaction, get out
|
|
334
|
+
return Promise.resolve();
|
|
335
|
+
}
|
|
336
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
337
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
338
|
+
const transLine = articleTransLines[i];
|
|
339
|
+
const purchasePortalFilter = new PurchasePortalFilters();
|
|
340
|
+
const getPurchasePortalLine = new GetPurchasePortalLine();
|
|
341
|
+
purchasePortalFilter.purchaseOrderNo = this.currentTransaction.transactionInfo.transactionNr.toString();
|
|
342
|
+
purchasePortalFilter.lineId = transLine.lineNr.toString();
|
|
343
|
+
getPurchasePortalLine.transIdPurchase = transId;
|
|
344
|
+
getPurchasePortalLine.filterObject = purchasePortalFilter;
|
|
345
|
+
promises.push(this.getPurchasePortalLines(getPurchasePortalLine).then((lines) => {
|
|
346
|
+
if (lines && lines.length > 0) {
|
|
347
|
+
transLine.purchasePortalLine = lines[0];
|
|
348
|
+
if (transLine.purchasePortalLine.amountOrdered !== transLine.purchasePortalLine.amountConfirmed) {
|
|
349
|
+
completed = false;
|
|
350
|
+
}
|
|
351
|
+
this.transactionEventService.transactionLineChanged.next(transLine);
|
|
352
|
+
}
|
|
353
|
+
}));
|
|
354
|
+
}
|
|
355
|
+
Promise.all(promises).then(() => {
|
|
356
|
+
this.purchaseOrderConfirmationCompleted = completed;
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
_checkRefTransaction() {
|
|
362
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
363
|
+
if (this.currentTransaction && this.currentTransaction.transactionInfo.transactionKind === TransactionKind.PurchaseOrder && this.currentTransaction.transactionLines) {
|
|
364
|
+
const transId = this.currentTransaction.transactionInfo.id;
|
|
365
|
+
if (!transId) { // new transaction, get out
|
|
366
|
+
return Promise.resolve();
|
|
367
|
+
}
|
|
368
|
+
const articleTransLines = this.currentTransaction.transactionLines.filter(t => t.isArticle);
|
|
369
|
+
for (let i = 0; i < articleTransLines.length; i++) {
|
|
370
|
+
const transLine = articleTransLines[i];
|
|
371
|
+
transLine.refTransactions.length = 0;
|
|
372
|
+
this.getRefTransactions(transId).then((refs) => __awaiter(this, void 0, void 0, function* () {
|
|
373
|
+
if (refs && refs.length > 0) {
|
|
374
|
+
const salesOrders = refs.filter(r => r.refTransactionType === TransactionKind.SalesOrder);
|
|
375
|
+
for (let j = 0; j < salesOrders.length; j++) {
|
|
376
|
+
const request = new TransactionSearchViewRequest();
|
|
377
|
+
request.transactionKind = salesOrders[j].refTransactionType;
|
|
378
|
+
request.transNr = parseInt(salesOrders[j].refTransactionNr);
|
|
379
|
+
const transSearchResult = yield this.searchTransactions(request);
|
|
380
|
+
if (transSearchResult.transactions && transSearchResult.transactions.length > 0) {
|
|
381
|
+
transLine.refTransactions.push(new TransactionRefTransaction(transSearchResult.transactions[0].transNr.toString(), transSearchResult.transactions[0].transactionKind, transSearchResult.transactions[0].relationNr, transSearchResult.transactions[0].relationName));
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}));
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
_handleAfterRememberCurrentTransaction(transactionInfoResponse) {
|
|
391
|
+
return Promise.resolve();
|
|
392
|
+
}
|
|
393
|
+
initializeTransaction() {
|
|
394
|
+
if (!this.relation) {
|
|
395
|
+
this.relation = new CustomerFullObject();
|
|
396
|
+
}
|
|
397
|
+
if (!this.relation.relationId) {
|
|
398
|
+
if (this.relation.relationType === RelationKind.Customer) {
|
|
399
|
+
this.relation.relationStatus = RelationStatus.RegularCustomer;
|
|
400
|
+
}
|
|
401
|
+
this.relation.startDate = new Date();
|
|
402
|
+
}
|
|
403
|
+
if (this.currentTransaction.transactionInfo.preferredDeliveryDate2 === undefined) {
|
|
404
|
+
this.currentTransaction.transactionInfo.preferredDeliveryDate2 = "=";
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
_saveTransactionAndCommit(response) {
|
|
408
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
409
|
+
// we can safely save/commit the changes
|
|
410
|
+
const saveTransactionResponse = yield this.saveTransaction(false);
|
|
411
|
+
if (saveTransactionResponse && saveTransactionResponse.isSuccess) {
|
|
412
|
+
this.rememberCurrentTransaction(saveTransactionResponse);
|
|
413
|
+
if (response) {
|
|
414
|
+
yield this._handleAfterRememberCurrentTransaction(response);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
// we need to do an extra commit to release the lock
|
|
418
|
+
const commitSuccess = yield this.commit();
|
|
419
|
+
return saveTransactionResponse && saveTransactionResponse.isSuccess && commitSuccess;
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
_isValidTransaction() {
|
|
423
|
+
return !!(this.currentTransaction && this.currentTransaction.transactionInfo && this.currentTransaction.transactionInfo.id);
|
|
424
|
+
}
|
|
425
|
+
_lockTransaction(transId, version) {
|
|
426
|
+
return this.connector.lockTransactionById(transId, version);
|
|
427
|
+
}
|
|
428
|
+
_getRelationClass(transactionKind) {
|
|
429
|
+
if (this._relationClassFromTransactionKind.has(transactionKind)) {
|
|
430
|
+
return this._relationClassFromTransactionKind.get(transactionKind);
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
return Relation;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
_getRelation(relation) {
|
|
437
|
+
if (relation) {
|
|
438
|
+
this.relationService.getRelationNumber(relation.relationId).then((relationNr) => {
|
|
439
|
+
if (relation.relationType === RelationKind.Customer) {
|
|
440
|
+
this.relationService.getCustomerFullObject(parseInt(relationNr, 0)).then((customer) => {
|
|
441
|
+
this.relation = customer;
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
else if (relation.relationType === RelationKind.Supplier) {
|
|
445
|
+
this.relationService.getSupplierFullObject(parseInt(relationNr, 0)).then((supplier) => {
|
|
446
|
+
this.relation = supplier;
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
_setAmount() {
|
|
453
|
+
if (this.currentTransaction && this.currentTransaction.transactionLines) {
|
|
454
|
+
this.articleAmount = this.currentTransaction.transactionLines.filter(t => t.lineType === TransactionLineType.ArticleLine).length;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
TransactionBaseService.decorators = [
|
|
459
|
+
{ type: Injectable }
|
|
460
|
+
];
|
|
461
|
+
TransactionBaseService.ctorParameters = () => [
|
|
462
|
+
{ type: OptionsService },
|
|
463
|
+
{ type: DialogService },
|
|
464
|
+
{ type: TransactionConnectorService },
|
|
465
|
+
{ type: SharedService },
|
|
466
|
+
{ type: ArticleConnectorService },
|
|
467
|
+
{ type: DictionaryService },
|
|
468
|
+
{ type: TransactionEventService },
|
|
469
|
+
{ type: RelationService }
|
|
470
|
+
];
|
|
471
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24tYmFzZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJhbnNhY3Rpb24vc3JjL2xpYi9zZXJ2aWNlL3RyYW5zYWN0aW9uLWJhc2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG1FQUFtRSxDQUFDO0FBQzFHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyREFBMkQsQ0FBQztBQUMxRixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdkUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkRBQTJELENBQUM7QUFDN0YsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkRBQTJELENBQUM7QUFDN0YsT0FBTyxFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFOUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNERBQTRELENBQUM7QUFDNUYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0VBQWdFLENBQUM7QUFD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QGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWxvY2stcmVzdWx0LmJvXCI7XHJcbmltcG9ydCB7T3B0aW9uc1NlcnZpY2V9IGZyb20gXCIuL29wdGlvbnMuc2VydmljZVwiO1xyXG5pbXBvcnQge0RpYWxvZ1NlcnZpY2V9IGZyb20gXCIuL2RpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25Db25uZWN0b3JTZXJ2aWNlfSBmcm9tIFwiLi90cmFuc2FjdGlvbi1jb25uZWN0b3Iuc2VydmljZVwiO1xyXG5pbXBvcnQge1NoYXJlZFNlcnZpY2V9IGZyb20gXCJAY29saWpuaXQvc2hhcmVkY29tcG9uZW50c1wiO1xyXG5pbXBvcnQge0FydGljbGVDb25uZWN0b3JTZXJ2aWNlfSBmcm9tIFwiLi9hcnRpY2xlLWNvbm5lY3Rvci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7RGljdGlvbmFyeVNlcnZpY2V9IGZyb20gXCIuL2RpY3Rpb25hcnkuc2VydmljZVwiO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uRXZlbnRTZXJ2aWNlfSBmcm9tIFwiLi90cmFuc2FjdGlvbi1ldmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7UmVsYXRpb25TZXJ2aWNlfSBmcm9tIFwiLi9yZWxhdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2V9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24taW5mby1yZXNwb25zZS5ib1wiO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uS2luZH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3RyYW5zYWN0aW9uLWtpbmQuZW51bVwiO1xyXG5pbXBvcnQge1JlbGF0aW9ufSBmcm9tIFwiQGNvbGlqbml0L3JlbGF0aW9uYXBpL2J1aWxkL21vZGVsL3JlbGF0aW9uLmJvXCI7XHJcbmltcG9ydCB7Q3VzdG9tZXJGdWxsT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3JlbGF0aW9uYXBpL2J1aWxkL21vZGVsL2N1c3RvbWVyLWZ1bGwtb2JqZWN0LmJvXCI7XHJcbmltcG9ydCB7U3VwcGxpZXJGdWxsT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3JlbGF0aW9uYXBpL2J1aWxkL21vZGVsL3N1cHBsaWVyLWZ1bGwtb2JqZWN0LmJvXCI7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0fSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1B1cmNoYXNlUG9ydGFsTGluZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9wdXJjaGFzZS1wb3J0YWwtbGluZS5ib1wiO1xyXG5pbXBvcnQge0RvY0RlbGl2ZXJ5QmF0Y2h9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZG9jLWRlbGl2ZXJ5LWJhdGNoLmJvXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25MaW5lVHlwZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9lbnVtL3RyYW5zYWN0aW9uLWxpbmUtdHlwZS5lbnVtXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25MaW5lSW5mbywgVHJhbnNhY3Rpb25SZWZUcmFuc2FjdGlvbn0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC90cmFuc2FjdGlvbi1saW5lLWluZm8uYm9cIjtcclxuaW1wb3J0IHtUcmFuc2FjdGlvbkluZm9IaXN0b3J5fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3RyYW5zYWN0aW9uLWluZm8taGlzdG9yeS5ib1wiO1xyXG5pbXBvcnQge0dvb2RzUmVjZWlwdFN0YXR1c30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9nb29kcy1yZWNlaXB0LXN0YXR1cy5ib1wiO1xyXG5pbXBvcnQge0RlbGl2ZXJ5T3JkZXJTdGF0dXN9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZGVsaXZlcnktb3JkZXItc3RhdHVzLmJvXCI7XHJcbmltcG9ydCB7R29vZHNBbGxvY2F0aW9uU3RhdHVzfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2dvb2RzLWFsbG9jYXRpb24tc3RhdHVzLmJvXCI7XHJcbmltcG9ydCB7UHVyY2hhc2VQb3J0YWxGaWx0ZXJzfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3B1cmNoYXNlLXBvcnRhbC1maWx0ZXJzLmJvXCI7XHJcbmltcG9ydCB7R2V0UHVyY2hhc2VQb3J0YWxMaW5lfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL2dldC1wdXJjaGFzZS1wb3J0YWwtbGluZVwiO1xyXG5pbXBvcnQge1JlZlRyYW5zYWN0aW9ufSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3JlZi10cmFuc2FjdGlvbi5ib1wiO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uU2VhcmNoVmlld1JlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvdHJhbnNhY3Rpb24tc2VhcmNoLXZpZXctcmVxdWVzdFwiO1xyXG5pbXBvcnQge1RyYW5zYWN0aW9uU2VhcmNoUmVzdWx0fSBmcm9tIFwiLi4vbW9kZWwvdHJhbnNhY3Rpb24tc2VhcmNoLXJlc3VsdFwiO1xyXG5pbXBvcnQge1JlbGF0aW9uU21hbGxPYmplY3R9IGZyb20gXCJAY29saWpuaXQvcmVsYXRpb25hcGkvYnVpbGQvbW9kZWwvcmVsYXRpb24tc21hbGwtb2JqZWN0LmJvXCI7XHJcbmltcG9ydCB7UmVsYXRpb25LaW5kfSBmcm9tIFwiQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvZW51bS9yZWxhdGlvbi1raW5kLmVudW1cIjtcclxuaW1wb3J0IHtHb29kc1JlY2VpcHRTdGF0dXNXaXRoSGlzdG9yeX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9nb29kcy1yZWNlaXB0LXN0YXR1cy13aXRoLWhpc3RvcnkuYm9cIjtcclxuaW1wb3J0IHtSZWxhdGlvblN0YXR1c30gZnJvbSBcIkBjb2xpam5pdC9hcnRpY2xlYXBpL2J1aWxkL2VudW0vcmVsYXRpb24tc3RhdHVzLmVudW1cIjtcclxuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CYXNlU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVsYXRpb25DbGFzc0Zyb21UcmFuc2FjdGlvbktpbmQ6IE1hcDxUcmFuc2FjdGlvbktpbmQsIHR5cGVvZiBSZWxhdGlvbj4gPSBuZXcgTWFwPFRyYW5zYWN0aW9uS2luZCwgdHlwZW9mIFJlbGF0aW9uPihbXHJcbiAgICBbVHJhbnNhY3Rpb25LaW5kLlNhbGVzT3JkZXIsIEN1c3RvbWVyRnVsbE9iamVjdF0sXHJcbiAgICBbVHJhbnNhY3Rpb25LaW5kLlB1cmNoYXNlT3JkZXIsIFN1cHBsaWVyRnVsbE9iamVjdF1cclxuICBdKTtcclxuXHJcbiAgcHVibGljIGxvZ291dDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHVibGljIHRyYW5zYWN0aW9uVXBkYXRlZDogQmVoYXZpb3JTdWJqZWN0PFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+KHVuZGVmaW5lZCk7XHJcbiAgcHVibGljIHJlbGF0aW9uVXBkYXRlZDogQmVoYXZpb3JTdWJqZWN0PFJlbGF0aW9uPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVsYXRpb24+KHVuZGVmaW5lZCk7XHJcblxyXG4gIHB1YmxpYyBhdXRvU2F2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBhcHBsaWNhdGlvblVzZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaW52b2ljZUFkZHJlc3NTYW1lQXNEZWxpdmVyeTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHB1YmxpYyB0cmFuc2FjdGlvbktpbmQ6IFRyYW5zYWN0aW9uS2luZCA9IFRyYW5zYWN0aW9uS2luZC5TYWxlc09yZGVyO1xyXG5cclxuICBwdWJsaWMgY3VycmVudFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSA9IG5ldyBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSgpO1xyXG5cclxuICBwdWJsaWMgc2V0IHB1cmNoYXNlT3JkZXJzQ29tcGxldGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9wdXJjaGFzZU9yZGVyc0NvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5zYWxlc09yZGVyR2VuZXJhdGVQdXJjaGFzZU9yZGVyc0NvbXBsZXRlZENoYW5nZWQubmV4dCh0aGlzLl9wdXJjaGFzZU9yZGVyc0NvbXBsZXRlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHB1cmNoYXNlT3JkZXJzQ29tcGxldGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3B1cmNoYXNlT3JkZXJzQ29tcGxldGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCByZWNlaXZlR29vZHNDb21wbGV0ZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3JlY2VpdmVHb29kc0NvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5wdXJjaGFzZU9yZGVyUmVjZWl2ZUdvb2RzQ29tcGxldGVkQ2hhbmdlZC5uZXh0KHRoaXMuX3JlY2VpdmVHb29kc0NvbXBsZXRlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHJlY2VpdmVHb29kc0NvbXBsZXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNlaXZlR29vZHNDb21wbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGFsbG9jYXRlR29vZHNDb21wbGV0ZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2FsbG9jYXRlR29vZHNDb21wbGV0ZWQgPSB2YWx1ZTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25FdmVudFNlcnZpY2UucHVyY2hhc2VPcmRlckFsbG9jYXRlR29vZHNDb21wbGV0ZWRDaGFuZ2VkLm5leHQodGhpcy5fYWxsb2NhdGVHb29kc0NvbXBsZXRlZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFsbG9jYXRlR29vZHNDb21wbGV0ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb2NhdGVHb29kc0NvbXBsZXRlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgcHVyY2hhc2VPcmRlckNvbmZpcm1hdGlvbkNvbXBsZXRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fcHVyY2hhc2VPcmRlckNvbmZpcm1hdGlvbkNvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5wdXJjaGFzZU9yZGVyQ29uZmlybWF0aW9uQ29tcGxldGVkQ2hhbmdlZC5uZXh0KHRoaXMuX3B1cmNoYXNlT3JkZXJDb25maXJtYXRpb25Db21wbGV0ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBwdXJjaGFzZU9yZGVyQ29uZmlybWF0aW9uQ29tcGxldGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3B1cmNoYXNlT3JkZXJDb25maXJtYXRpb25Db21wbGV0ZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRlbGl2ZXJ5Q29tcGxldGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kZWxpdmVyeUNvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5zYWxlc09yZGVyRGVsaXZlcnlDb21wbGV0ZWRDaGFuZ2VkLm5leHQodGhpcy5fZGVsaXZlcnlDb21wbGV0ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkZWxpdmVyeUNvbXBsZXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWxpdmVyeUNvbXBsZXRlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaW52b2ljZUNvbXBsZXRlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faW52b2ljZUNvbXBsZXRlZCA9IHZhbHVlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5zYWxlc09yZGVySW52b2ljZUNvbXBsZXRlZENoYW5nZWQubmV4dCh0aGlzLl9pbnZvaWNlQ29tcGxldGVkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaW52b2ljZUNvbXBsZXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnZvaWNlQ29tcGxldGVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCByZWxhdGlvbih2YWx1ZTogUmVsYXRpb24pIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLl9yZWxhdGlvbiA9IHZhbHVlO1xyXG4gICAgICB0aGlzLnJlbGF0aW9uVXBkYXRlZC5uZXh0KHRoaXMuX3JlbGF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGdldCByZWxhdGlvbigpOiBSZWxhdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpb247XHJcbiAgfVxyXG4gIHB1YmxpYyBwdXJjaGFzZVBvcnRhbExpbmU6IFB1cmNoYXNlUG9ydGFsTGluZVtdID0gW107XHJcbiAgcHVibGljIGRvY0RlbGl2ZXJ5QmF0Y2g6IERvY0RlbGl2ZXJ5QmF0Y2ggPSBuZXcgRG9jRGVsaXZlcnlCYXRjaCgpXHJcblxyXG4gIHB1YmxpYyBhcnRpY2xlQW1vdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICBwcm90ZWN0ZWQgd2FyZWhvdXNlTG9jYXRpb25Qb3B1cFNob3duOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3JlbGF0aW9uOiBSZWxhdGlvbiA9IG5ldyBSZWxhdGlvbigpO1xyXG4gIHByaXZhdGUgX3B1cmNoYXNlT3JkZXJzQ29tcGxldGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcmVjZWl2ZUdvb2RzQ29tcGxldGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfYWxsb2NhdGVHb29kc0NvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3B1cmNoYXNlT3JkZXJDb25maXJtYXRpb25Db21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9kZWxpdmVyeUNvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2ludm9pY2VDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgb3B0aW9uc1NlcnZpY2U6IE9wdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgY29ubmVjdG9yOiBUcmFuc2FjdGlvbkNvbm5lY3RvclNlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcclxuICAgIHByb3RlY3RlZCBhcnRpY2xlQ29ubmVjdG9yOiBBcnRpY2xlQ29ubmVjdG9yU2VydmljZSxcclxuICAgIHByb3RlY3RlZCBkaWN0aW9uYXJ5U2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXHJcbiAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25FdmVudFNlcnZpY2U6IFRyYW5zYWN0aW9uRXZlbnRTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHJlbGF0aW9uU2VydmljZTogUmVsYXRpb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdChvcHRpb25zOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMub3B0aW9uc1NlcnZpY2UuaW5pdGlhbGl6ZShvcHRpb25zKTtcclxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5pbml0KG9wdGlvbnMpO1xyXG4gICAgdGhpcy5jb25uZWN0b3IuY29ubmVjdCgpO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS5jb25uZWN0aW9uSW5pdGlhbGl6ZWQubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGVOZXdSZWxhdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsYXp6OiB0eXBlb2YgUmVsYXRpb24gPSB0aGlzLl9nZXRSZWxhdGlvbkNsYXNzKHRoaXMudHJhbnNhY3Rpb25LaW5kKTtcclxuICAgIHRoaXMucmVsYXRpb24gPSBuZXcgY2xheno7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRDdXJyZW50VHJhbnNhY3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSgpO1xyXG4gICAgdGhpcy5fcmVsYXRpb24gPSBuZXcgQ3VzdG9tZXJGdWxsT2JqZWN0KCk7XHJcbiAgICB0aGlzLmFydGljbGVBbW91bnQgPSAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNhdmVUcmFuc2FjdGlvbihyZW1lbWJlclRyYW5zYWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSA9IGF3YWl0IHRoaXMuY29ubmVjdG9yLnNhdmVUcmFuc2FjdGlvbih0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udXVpZClcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5pc1N1Y2Nlc3MgJiYgcmVtZW1iZXJUcmFuc2FjdGlvbikge1xyXG4gICAgICB0aGlzLnJlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHJlc3BvbnNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb21taXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3IuY29tbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm9sbGJhY2soKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0b3Iucm9sbGJhY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWFyY2hUcmFuc2FjdGlvbnMocmVxdWVzdDogVHJhbnNhY3Rpb25TZWFyY2hWaWV3UmVxdWVzdCk6IFByb21pc2U8VHJhbnNhY3Rpb25TZWFyY2hSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5zZWFyY2hUcmFuc2FjdGlvbnMocmVxdWVzdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNhY3Rpb25CeUlkKHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0VHJhbnNhY3Rpb25CeUlkKHRyYW5zYWN0aW9uSWQpO1xyXG4gICAgaWYgKHRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlLmlzU3VjY2Vzcykge1xyXG4gICAgICB0aGlzLnJlbWVtYmVyQ3VycmVudFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTtcclxuICAgIH1cclxuICAgIHRoaXMud2FyZWhvdXNlTG9jYXRpb25Qb3B1cFNob3duID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdHJ5VG9Mb2NrVHJhbnNhY3Rpb24oaWQ6IG51bWJlciwgdmVyc2lvbjogbnVtYmVyLCBzZWNvbmRBdHRlbXB0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHsgLy8gaXQncyBhIG5ldyB0cmFuc2FjdGlvbiwgbm8gbmVlZCB0byBsb2NrXHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2NrUmVzcG9uc2U6IFRyYW5zYWN0aW9uTG9ja1Jlc3VsdCA9IGF3YWl0IHRoaXMuX2xvY2tUcmFuc2FjdGlvbihpZCwgdmVyc2lvbik7XHJcbiAgICBpZiAobG9ja1Jlc3BvbnNlKSB7XHJcbiAgICAgIGlmICghbG9ja1Jlc3BvbnNlLmlzTG9ja1N1Y2Nlc3MpIHtcclxuICAgICAgICBpZiAoc2Vjb25kQXR0ZW1wdCkgeyAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xyXG4gICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dFcnJvcih0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldChcIlVOS05PV05fRVJST1JcIikpO1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWxvY2tSZXNwb25zZS5pc0xhdGVzdFZlcnNpb24pIHtcclxuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93VG9hc3QodGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXQoXCJUUkFOU0FDVElPTl9WRVJTSU9OX01JU01BVENIXCIpKTtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25CeUlkKGlkKTtcclxuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5oaWRlVG9hc3RBZnRlck1zKDMwMDApO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMudHJ5VG9Mb2NrVHJhbnNhY3Rpb24odGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLmlkLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udmVyc2lvbiwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGxvY2tEZXRhaWxzOiBzdHJpbmcgPSBgJHt0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldChcIkJZXCIpfTogJHtsb2NrUmVzcG9uc2UubG9ja2VkQnl9XHJcbiAgICAgICAgICAgICAgICAke3RoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0KFwiU0lOQ0VcIiwgZmFsc2UpfSAke2xvY2tSZXNwb25zZS5sb2NrZWRTaW5jZS50b0xvY2FsZVN0cmluZygpfWA7XHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0Vycm9yKHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0KFwiVFJBTlNBQ1RJT05fQUxSRUFEWV9MT0NLRURcIiksIGxvY2tEZXRhaWxzKTtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbkluZm8odHJhbnNJZDogbnVtYmVyLCBsaW5lSWQ6IG51bWJlcik6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvSGlzdG9yeVtdPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0b3IuZ2V0VHJhbnNhY3Rpb25JbmZvKHRyYW5zSWQsIGxpbmVJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0UmVmVHJhbnNhY3Rpb25zKHRyYW5zSWQ6IG51bWJlcik6IFByb21pc2U8UmVmVHJhbnNhY3Rpb25bXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFJlZlRyYW5zYWN0aW9ucyh0cmFuc0lkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRHb29kc1JlY2VpcHRTdGF0dXModHJhbnNJZDogbnVtYmVyLCBsaW5lTnI6IG51bWJlcik6IFByb21pc2U8R29vZHNSZWNlaXB0U3RhdHVzV2l0aEhpc3Rvcnk+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXRHb29kc1JlY2VpcHRTdGF0dXModHJhbnNJZCwgbGluZU5yKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZWxpdmVyeU9yZGVyU3RhdHVzKHRyYW5zSWQ6IG51bWJlciwgbGluZUlkOiBudW1iZXIpOiBQcm9taXNlPERlbGl2ZXJ5T3JkZXJTdGF0dXM+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rvci5nZXREZWxpdmVyeU9yZGVyU3RhdHVzKHRyYW5zSWQsIGxpbmVJZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0R29vZHNBbGxvY2F0aW9uU3RhdHVzKHRyYW5zSWQ6IG51bWJlciwgbGluZU5yOiBudW1iZXIpOiBQcm9taXNlPEdvb2RzQWxsb2NhdGlvblN0YXR1cz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldEdvb2RzQWxsb2NhdGlvblN0YXR1cyh0cmFuc0lkLCBsaW5lTnIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFB1cmNoYXNlUG9ydGFsTGluZXMocmVxdWVzdDogR2V0UHVyY2hhc2VQb3J0YWxMaW5lKTogUHJvbWlzZTxQdXJjaGFzZVBvcnRhbExpbmVbXT4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdG9yLmdldFB1cmNoYXNlUG9ydGFsTGluZXMocmVxdWVzdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24odmFsdWU6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IHZhbHVlO1xyXG4gICAgdGhpcy5fc2V0QW1vdW50KCk7XHJcbiAgICB0aGlzLl9jaGVja1B1cmNoYXNlT3JkZXJzKCk7XHJcbiAgICB0aGlzLl9jaGVja1JlY2VpdmVkR29vZHMoKTtcclxuICAgIHRoaXMuX2NoZWNrR29vZHNBbGxvY2F0aW9uKCk7XHJcbiAgICB0aGlzLl9jaGVja1B1cmNoYXNlT3JkZXJDb25maXJtYXRpb24oKTtcclxuICAgIHRoaXMuX2NoZWNrRGVsaXZlcnkoKTtcclxuICAgIHRoaXMuX2NoZWNrUmVmVHJhbnNhY3Rpb24oKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8ucmVsYXRpb24gJiYgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnJlbGF0aW9uLnJlbGF0aW9uSWQgJiYgIXRoaXMucmVsYXRpb24ucmVsYXRpb25JZCkge1xyXG4gICAgICB0aGlzLl9nZXRSZWxhdGlvbih0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8ucmVsYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudHJhbnNhY3Rpb25VcGRhdGVkLm5leHQodGhpcy5jdXJyZW50VHJhbnNhY3Rpb24pO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS50cmFuc2FjdGlvblNldC5uZXh0KHRoaXMuY3VycmVudFRyYW5zYWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBfY2hlY2tQdXJjaGFzZU9yZGVycygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiAmJiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udHJhbnNhY3Rpb25LaW5kID09PSBUcmFuc2FjdGlvbktpbmQuU2FsZXNPcmRlciAmJiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkxpbmVzKSB7XHJcbiAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xyXG4gICAgICBjb25zdCBhbW91bnRUcmFuc0xpbmVDb21tQ29kZVplcm86IG51bWJlciA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmlsdGVyKGwgPT4gbC5jb21taXNzaW9uQ29kZSA9PT0gXCIwXCIpLmxlbmd0aDtcclxuICAgICAgbGV0IGFtb3VudFB1cmNoYXNlT3JkZXJzOiBudW1iZXIgPSAwO1xyXG4gICAgICBjb25zdCB0cmFuc0lkOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8uaWQ7XHJcbiAgICAgIGlmICghdHJhbnNJZCkgeyAvLyBuZXcgdHJhbnNhY3Rpb24sIGdldCBvdXRcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYXJ0aWNsZVRyYW5zTGluZXM6IFRyYW5zYWN0aW9uTGluZUluZm9bXSA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmlsdGVyKHQgPT4gdC5pc0FydGljbGUpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFydGljbGVUcmFuc0xpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdHJhbnNMaW5lOiBUcmFuc2FjdGlvbkxpbmVJbmZvID0gYXJ0aWNsZVRyYW5zTGluZXNbaV07XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChcclxuICAgICAgICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25JbmZvKHRyYW5zSWQsIHRyYW5zTGluZS5saW5lTnIpLnRoZW4oKHRyYW5zYWN0aW9uczogVHJhbnNhY3Rpb25JbmZvSGlzdG9yeVtdKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbnMgJiYgdHJhbnNhY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICB0cmFuc0xpbmUucHVyY2hhc2VPcmRlcklkID0gdHJhbnNhY3Rpb25zWzBdLnRyYW5zSWQ7XHJcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS50cmFuc2FjdGlvbkxpbmVDaGFuZ2VkLm5leHQodHJhbnNMaW5lKTtcclxuICAgICAgICAgICAgICBhbW91bnRQdXJjaGFzZU9yZGVycysrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucHVyY2hhc2VPcmRlcnNDb21wbGV0ZWQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkxpbmVzLmxlbmd0aCA+IDAgJiYgKGFtb3VudFRyYW5zTGluZUNvbW1Db2RlWmVybyA9PT0gYW1vdW50UHVyY2hhc2VPcmRlcnMpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBfY2hlY2tSZWNlaXZlZEdvb2RzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby50cmFuc2FjdGlvbktpbmQgPT09IFRyYW5zYWN0aW9uS2luZC5QdXJjaGFzZU9yZGVyICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMpIHtcclxuICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICAgIGNvbnN0IHRyYW5zSWQ6IG51bWJlciA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5pZDtcclxuICAgICAgaWYgKCF0cmFuc0lkKSB7IC8vIG5ldyB0cmFuc2FjdGlvbiwgZ2V0IG91dFxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhcnRpY2xlVHJhbnNMaW5lczogVHJhbnNhY3Rpb25MaW5lSW5mb1tdID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maWx0ZXIodCA9PiB0LmlzQXJ0aWNsZSk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJ0aWNsZVRyYW5zTGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0cmFuc0xpbmU6IFRyYW5zYWN0aW9uTGluZUluZm8gPSBhcnRpY2xlVHJhbnNMaW5lc1tpXTtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5nZXRHb29kc1JlY2VpcHRTdGF0dXModHJhbnNJZCwgdHJhbnNMaW5lLmxpbmVOcikudGhlbigoZ29vZHNSZWNlaXB0U3RhdHVzOiBHb29kc1JlY2VpcHRTdGF0dXMpID0+IHtcclxuICAgICAgICAgICAgdHJhbnNMaW5lLnF1YW50aXR5VG9SZWNlaXZlID0gZ29vZHNSZWNlaXB0U3RhdHVzLnF1YW50aXR5VG9SZWNlaXZlO1xyXG4gICAgICAgICAgICB0cmFuc0xpbmUucXVhbnRpdHlSZWNlaXZlZCA9IGdvb2RzUmVjZWlwdFN0YXR1cy5xdWFudGl0eVJlY2VpdmVkO1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRXZlbnRTZXJ2aWNlLnRyYW5zYWN0aW9uTGluZUNoYW5nZWQubmV4dCh0cmFuc0xpbmUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLnJlY2VpdmVHb29kc0NvbXBsZXRlZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmluZChsID0+IGwucXVhbnRpdHlUb1JlY2VpdmUgIT09IDApID09PSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIF9jaGVja0RlbGl2ZXJ5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby50cmFuc2FjdGlvbktpbmQgPT09IFRyYW5zYWN0aW9uS2luZC5TYWxlc09yZGVyICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMpIHtcclxuICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICAgIGNvbnN0IHRyYW5zSWQ6IG51bWJlciA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5pZDtcclxuICAgICAgaWYgKCF0cmFuc0lkKSB7IC8vIG5ldyB0cmFuc2FjdGlvbiwgZ2V0IG91dFxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhcnRpY2xlVHJhbnNMaW5lczogVHJhbnNhY3Rpb25MaW5lSW5mb1tdID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maWx0ZXIodCA9PiB0LmlzQXJ0aWNsZSk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJ0aWNsZVRyYW5zTGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0cmFuc0xpbmU6IFRyYW5zYWN0aW9uTGluZUluZm8gPSBhcnRpY2xlVHJhbnNMaW5lc1tpXTtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5nZXREZWxpdmVyeU9yZGVyU3RhdHVzKHRyYW5zSWQsIHRyYW5zTGluZS5saW5lTnIpLnRoZW4oKHJlc3VsdDogRGVsaXZlcnlPcmRlclN0YXR1cykgPT4ge1xyXG4gICAgICAgICAgICB0cmFuc0xpbmUucXVhbnRpdHlUb0RlbGl2ZXIgPSByZXN1bHQucXVhbnRpdHlUb0RlbGl2ZXI7XHJcbiAgICAgICAgICAgIHRyYW5zTGluZS5xdWFudGl0eVRvSW52b2ljZSA9IHJlc3VsdC5xdWFudGl0eVRvSW52b2ljZTtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS50cmFuc2FjdGlvbkxpbmVDaGFuZ2VkLm5leHQodHJhbnNMaW5lKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kZWxpdmVyeUNvbXBsZXRlZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmluZChsID0+IGwucXVhbnRpdHlEZWxpdmVyZWQgIT09IGwuYW1vdW50KSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuaW52b2ljZUNvbXBsZXRlZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmluZChsID0+IGwucXVhbnRpdHlJbnZvaWNlZCAhPT0gbC5hbW91bnQpID09PSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIF9jaGVja0dvb2RzQWxsb2NhdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiAmJiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8udHJhbnNhY3Rpb25LaW5kID09PSBUcmFuc2FjdGlvbktpbmQuU2FsZXNPcmRlciAmJiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkxpbmVzKSB7XHJcbiAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xyXG4gICAgICBjb25zdCB0cmFuc0lkOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8uaWQ7XHJcbiAgICAgIGlmICghdHJhbnNJZCkgeyAvLyBuZXcgdHJhbnNhY3Rpb24sIGdldCBvdXRcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYXJ0aWNsZVRyYW5zTGluZXM6IFRyYW5zYWN0aW9uTGluZUluZm9bXSA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmlsdGVyKHQgPT4gdC5pc0FydGljbGUpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFydGljbGVUcmFuc0xpbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgdHJhbnNMaW5lOiBUcmFuc2FjdGlvbkxpbmVJbmZvID0gYXJ0aWNsZVRyYW5zTGluZXNbaV07XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChcclxuICAgICAgICAgIHRoaXMuZ2V0R29vZHNBbGxvY2F0aW9uU3RhdHVzKHRyYW5zSWQsIHRyYW5zTGluZS5saW5lTnIpLnRoZW4oKGdvb2RzQWxsb2NhdGlvblN0YXR1czogR29vZHNBbGxvY2F0aW9uU3RhdHVzKSA9PiB7XHJcbiAgICAgICAgICAgIHRyYW5zTGluZS5xdWFudGl0eVRvQWxsb2NhdGUgPSBnb29kc0FsbG9jYXRpb25TdGF0dXMucXVhbnRpdHlUb0FsbG9jYXRlO1xyXG4gICAgICAgICAgICB0cmFuc0xpbmUucXVhbnRpdHlBbGxvY2F0ZWQgPSBnb29kc0FsbG9jYXRpb25TdGF0dXMucXVhbnRpdHlBbGxvY2F0ZWQ7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25FdmVudFNlcnZpY2UudHJhbnNhY3Rpb25MaW5lQ2hhbmdlZC5uZXh0KHRyYW5zTGluZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYWxsb2NhdGVHb29kc0NvbXBsZXRlZCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmluZChsID0+IC8qbC5jb21taXNzaW9uQ29kZSA9PT0gXCIxXCIgJiYqLyBsLnF1YW50aXR5VG9BbGxvY2F0ZSAhPT0gMCkgPT09IHVuZGVmaW5lZDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgX2NoZWNrUHVyY2hhc2VPcmRlckNvbmZpcm1hdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBjb21wbGV0ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby50cmFuc2FjdGlvbktpbmQgPT09IFRyYW5zYWN0aW9uS2luZC5QdXJjaGFzZU9yZGVyICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMpIHtcclxuICAgICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICAgIGNvbnN0IHRyYW5zSWQ6IG51bWJlciA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5pZDtcclxuICAgICAgaWYgKCF0cmFuc0lkKSB7IC8vIG5ldyB0cmFuc2FjdGlvbiwgZ2V0IG91dFxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhcnRpY2xlVHJhbnNMaW5lczogVHJhbnNhY3Rpb25MaW5lSW5mb1tdID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maWx0ZXIodCA9PiB0LmlzQXJ0aWNsZSk7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJ0aWNsZVRyYW5zTGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0cmFuc0xpbmU6IFRyYW5zYWN0aW9uTGluZUluZm8gPSBhcnRpY2xlVHJhbnNMaW5lc1tpXTtcclxuICAgICAgICBjb25zdCBwdXJjaGFzZVBvcnRhbEZpbHRlcjogUHVyY2hhc2VQb3J0YWxGaWx0ZXJzID0gbmV3IFB1cmNoYXNlUG9ydGFsRmlsdGVycygpO1xyXG4gICAgICAgIGNvbnN0IGdldFB1cmNoYXNlUG9ydGFsTGluZTogR2V0UHVyY2hhc2VQb3J0YWxMaW5lID0gbmV3IEdldFB1cmNoYXNlUG9ydGFsTGluZSgpO1xyXG4gICAgICAgIHB1cmNoYXNlUG9ydGFsRmlsdGVyLnB1cmNoYXNlT3JkZXJObyA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby50cmFuc2FjdGlvbk5yLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgcHVyY2hhc2VQb3J0YWxGaWx0ZXIubGluZUlkID0gdHJhbnNMaW5lLmxpbmVOci50b1N0cmluZygpO1xyXG4gICAgICAgIGdldFB1cmNoYXNlUG9ydGFsTGluZS50cmFuc0lkUHVyY2hhc2UgPSB0cmFuc0lkO1xyXG4gICAgICAgIGdldFB1cmNoYXNlUG9ydGFsTGluZS5maWx0ZXJPYmplY3QgPSBwdXJjaGFzZVBvcnRhbEZpbHRlcjtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKFxyXG4gICAgICAgICAgdGhpcy5nZXRQdXJjaGFzZVBvcnRhbExpbmVzKGdldFB1cmNoYXNlUG9ydGFsTGluZSkudGhlbigobGluZXM6IFB1cmNoYXNlUG9ydGFsTGluZVtdKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChsaW5lcyAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgdHJhbnNMaW5lLnB1cmNoYXNlUG9ydGFsTGluZSA9IGxpbmVzWzBdO1xyXG4gICAgICAgICAgICAgIGlmICh0cmFuc0xpbmUucHVyY2hhc2VQb3J0YWxMaW5lLmFtb3VudE9yZGVyZWQgIT09IHRyYW5zTGluZS5wdXJjaGFzZVBvcnRhbExpbmUuYW1vdW50Q29uZmlybWVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkV2ZW50U2VydmljZS50cmFuc2FjdGlvbkxpbmVDaGFuZ2VkLm5leHQodHJhbnNMaW5lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLnB1cmNoYXNlT3JkZXJDb25maXJtYXRpb25Db21wbGV0ZWQgPSBjb21wbGV0ZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIF9jaGVja1JlZlRyYW5zYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby50cmFuc2FjdGlvbktpbmQgPT09IFRyYW5zYWN0aW9uS2luZC5QdXJjaGFzZU9yZGVyICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMpIHtcclxuICAgICAgY29uc3QgdHJhbnNJZDogbnVtYmVyID0gdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLmlkO1xyXG4gICAgICBpZiAoIXRyYW5zSWQpIHsgLy8gbmV3IHRyYW5zYWN0aW9uLCBnZXQgb3V0XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGFydGljbGVUcmFuc0xpbmVzOiBUcmFuc2FjdGlvbkxpbmVJbmZvW10gPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkxpbmVzLmZpbHRlcih0ID0+IHQuaXNBcnRpY2xlKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnRpY2xlVHJhbnNMaW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHRyYW5zTGluZTogVHJhbnNhY3Rpb25MaW5lSW5mbyA9IGFydGljbGVUcmFuc0xpbmVzW2ldO1xyXG4gICAgICAgIHRyYW5zTGluZS5yZWZUcmFuc2FjdGlvbnMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLmdldFJlZlRyYW5zYWN0aW9ucyh0cmFuc0lkKS50aGVuKGFzeW5jIChyZWZzOiBSZWZUcmFuc2FjdGlvbltdKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVmcyAmJiByZWZzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3Qgc2FsZXNPcmRlcnM6IFJlZlRyYW5zYWN0aW9uW10gPSByZWZzLmZpbHRlcihyID0+IHIucmVmVHJhbnNhY3Rpb25UeXBlID09PSBUcmFuc2FjdGlvbktpbmQuU2FsZXNPcmRlcik7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2FsZXNPcmRlcnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0OiBUcmFuc2FjdGlvblNlYXJjaFZpZXdSZXF1ZXN0ID0gbmV3IFRyYW5zYWN0aW9uU2VhcmNoVmlld1JlcXVlc3QoKTtcclxuICAgICAgICAgICAgICByZXF1ZXN0LnRyYW5zYWN0aW9uS2luZCA9IHNhbGVzT3JkZXJzW2pdLnJlZlRyYW5zYWN0aW9uVHlwZTtcclxuICAgICAgICAgICAgICByZXF1ZXN0LnRyYW5zTnIgPSBwYXJzZUludChzYWxlc09yZGVyc1tqXS5yZWZUcmFuc2FjdGlvbk5yKTtcclxuICAgICAgICAgICAgICBjb25zdCB0cmFuc1NlYXJjaFJlc3VsdDogVHJhbnNhY3Rpb25TZWFyY2hSZXN1bHQgPSBhd2FpdCB0aGlzLnNlYXJjaFRyYW5zYWN0aW9ucyhyZXF1ZXN0KTtcclxuICAgICAgICAgICAgICBpZiAodHJhbnNTZWFyY2hSZXN1bHQudHJhbnNhY3Rpb25zICYmIHRyYW5zU2VhcmNoUmVzdWx0LnRyYW5zYWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc0xpbmUucmVmVHJhbnNhY3Rpb25zLnB1c2gobmV3IFRyYW5zYWN0aW9uUmVmVHJhbnNhY3Rpb24oXHJcbiAgICAgICAgICAgICAgICAgIHRyYW5zU2VhcmNoUmVzdWx0LnRyYW5zYWN0aW9uc1swXS50cmFuc05yLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICAgIHRyYW5zU2VhcmNoUmVzdWx0LnRyYW5zYWN0aW9uc1swXS50cmFuc2FjdGlvbktpbmQsXHJcbiAgICAgICAgICAgICAgICAgIHRyYW5zU2VhcmNoUmVzdWx0LnRyYW5zYWN0aW9uc1swXS5yZWxhdGlvbk5yLFxyXG4gICAgICAgICAgICAgICAgICB0cmFuc1NlYXJjaFJlc3VsdC50cmFuc2FjdGlvbnNbMF0ucmVsYXRpb25OYW1lKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgX2hhbmRsZUFmdGVyUmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24odHJhbnNhY3Rpb25JbmZvUmVzcG9uc2U6IFRyYW5zYWN0aW9uSW5mb1Jlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbGF0aW9uKSB7XHJcbiAgICAgIHRoaXMucmVsYXRpb24gPSBuZXcgQ3VzdG9tZXJGdWxsT2JqZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucmVsYXRpb24ucmVsYXRpb25JZCkge1xyXG4gICAgICBpZiAodGhpcy5yZWxhdGlvbi5yZWxhdGlvblR5cGUgPT09IFJlbGF0aW9uS2luZC5DdXN0b21lcikge1xyXG4gICAgICAgICh0aGlzLnJlbGF0aW9uIGFzIEN1c3RvbWVyRnVsbE9iamVjdCkucmVsYXRpb25TdGF0dXMgPSBSZWxhdGlvblN0YXR1cy5SZWd1bGFyQ3VzdG9tZXI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZWxhdGlvbi5zdGFydERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5wcmVmZXJyZWREZWxpdmVyeURhdGUyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JbmZvLnByZWZlcnJlZERlbGl2ZXJ5RGF0ZTIgPSBcIj1cIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBfc2F2ZVRyYW5zYWN0aW9uQW5kQ29tbWl0KHJlc3BvbnNlPzogVHJhbnNhY3Rpb25JbmZvUmVzcG9uc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIHdlIGNhbiBzYWZlbHkgc2F2ZS9jb21taXQgdGhlIGNoYW5nZXNcclxuICAgIGNvbnN0IHNhdmVUcmFuc2FjdGlvblJlc3BvbnNlOiBUcmFuc2FjdGlvbkluZm9SZXNwb25zZSA9IGF3YWl0IHRoaXMuc2F2ZVRyYW5zYWN0aW9uKGZhbHNlKTtcclxuICAgIGlmIChzYXZlVHJhbnNhY3Rpb25SZXNwb25zZSAmJiBzYXZlVHJhbnNhY3Rpb25SZXNwb25zZS5pc1N1Y2Nlc3MpIHtcclxuICAgICAgdGhpcy5yZW1lbWJlckN1cnJlbnRUcmFuc2FjdGlvbihzYXZlVHJhbnNhY3Rpb25SZXNwb25zZSk7XHJcbiAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZUFmdGVyUmVtZW1iZXJDdXJyZW50VHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB3ZSBuZWVkIHRvIGRvIGFuIGV4dHJhIGNvbW1pdCB0byByZWxlYXNlIHRoZSBsb2NrXHJcbiAgICBjb25zdCBjb21taXRTdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5jb21taXQoKTtcclxuICAgIHJldHVybiBzYXZlVHJhbnNhY3Rpb25SZXNwb25zZSAmJiBzYXZlVHJhbnNhY3Rpb25SZXNwb25zZS5pc1N1Y2Nlc3MgJiYgY29tbWl0U3VjY2VzcztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBfaXNWYWxpZFRyYW5zYWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uICYmIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mbyAmJiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8uaWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbG9ja1RyYW5zYWN0aW9uKHRyYW5zSWQ6IG51bWJlciwgdmVyc2lvbjogbnVtYmVyKTogUHJvbWlzZTxUcmFuc2FjdGlvbkxvY2tSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rvci5sb2NrVHJhbnNhY3Rpb25CeUlkKHRyYW5zSWQsIHZlcnNpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UmVsYXRpb25DbGFzcyh0cmFuc2FjdGlvbktpbmQ6IFRyYW5zYWN0aW9uS2luZCk6IHR5cGVvZiBSZWxhdGlvbiB7XHJcbiAgICBpZiAodGhpcy5fcmVsYXRpb25DbGFzc0Zyb21UcmFuc2FjdGlvbktpbmQuaGFzKHRyYW5zYWN0aW9uS2luZCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3JlbGF0aW9uQ2xhc3NGcm9tVHJhbnNhY3Rpb25LaW5kLmdldCh0cmFuc2FjdGlvbktpbmQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFJlbGF0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UmVsYXRpb24ocmVsYXRpb246IFJlbGF0aW9uU21hbGxPYmplY3QpOiB2b2lkIHtcclxuICAgIGlmIChyZWxhdGlvbikge1xyXG4gICAgICB0aGlzLnJlbGF0aW9uU2VydmljZS5nZXRSZWxhdGlvbk51bWJlcihyZWxhdGlvbi5yZWxhdGlvbklkKS50aGVuKChyZWxhdGlvbk5yOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAocmVsYXRpb24ucmVsYXRpb25UeXBlID09PSBSZWxhdGlvbktpbmQuQ3VzdG9tZXIpIHtcclxuICAgICAgICAgIHRoaXMucmVsYXRpb25TZXJ2aWNlLmdldEN1c3RvbWVyRnVsbE9iamVjdChwYXJzZUludChyZWxhdGlvbk5yLCAwKSkudGhlbigoY3VzdG9tZXI6IEN1c3RvbWVyRnVsbE9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbGF0aW9uID0gY3VzdG9tZXI7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uLnJlbGF0aW9uVHlwZSA9PT0gUmVsYXRpb25LaW5kLlN1cHBsaWVyKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbGF0aW9uU2VydmljZS5nZXRTdXBwbGllckZ1bGxPYmplY3QocGFyc2VJbnQocmVsYXRpb25OciwgMCkpLnRoZW4oKHN1cHBsaWVyOiBTdXBwbGllckZ1bGxPYmplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZWxhdGlvbiA9IHN1cHBsaWVyO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NldEFtb3VudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiAmJiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkxpbmVzKSB7XHJcbiAgICAgIHRoaXMuYXJ0aWNsZUFtb3VudCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmlsdGVyKHQgPT4gdC5saW5lVHlwZSA9PT0gVHJhbnNhY3Rpb25MaW5lVHlwZS5BcnRpY2xlTGluZSkubGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|