@infrab4a/connect-angular 4.14.0 → 4.14.1-beta.0

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.
Files changed (121) hide show
  1. package/angular-connect.module.d.ts +29 -29
  2. package/angular-elastic-search.module.d.ts +9 -9
  3. package/angular-firebase-auth.module.d.ts +11 -11
  4. package/angular-firestore.module.d.ts +17 -17
  5. package/angular-hasura-graphql.module.d.ts +16 -16
  6. package/angular-vertex-search.module.d.ts +9 -9
  7. package/consts/backend-url.const.d.ts +1 -1
  8. package/consts/category-structure.d.ts +1 -1
  9. package/consts/default-shop.const.d.ts +1 -1
  10. package/consts/es-config.const.d.ts +1 -1
  11. package/consts/firebase-const.d.ts +3 -3
  12. package/consts/hasura-options.const.d.ts +1 -1
  13. package/consts/index.d.ts +8 -8
  14. package/consts/persistence.const.d.ts +1 -1
  15. package/consts/storage-base-url.const.d.ts +1 -1
  16. package/consts/vertex-config.const.d.ts +1 -1
  17. package/esm2022/angular-connect.module.mjs +146 -0
  18. package/esm2022/angular-elastic-search.module.mjs +34 -0
  19. package/esm2022/angular-firebase-auth.module.mjs +115 -0
  20. package/esm2022/angular-firestore.module.mjs +513 -0
  21. package/esm2022/angular-hasura-graphql.module.mjs +287 -0
  22. package/esm2022/angular-vertex-search.module.mjs +34 -0
  23. package/{esm2020 → esm2022}/consts/backend-url.const.mjs +1 -1
  24. package/{esm2020 → esm2022}/consts/category-structure.mjs +2 -2
  25. package/{esm2020 → esm2022}/consts/default-shop.const.mjs +2 -2
  26. package/{esm2020 → esm2022}/consts/es-config.const.mjs +2 -2
  27. package/{esm2020 → esm2022}/consts/firebase-const.mjs +4 -4
  28. package/{esm2020 → esm2022}/consts/hasura-options.const.mjs +2 -2
  29. package/{esm2020 → esm2022}/consts/index.mjs +9 -9
  30. package/{esm2020 → esm2022}/consts/persistence.const.mjs +2 -2
  31. package/{esm2020 → esm2022}/consts/storage-base-url.const.mjs +2 -2
  32. package/{esm2020 → esm2022}/consts/vertex-config.const.mjs +2 -2
  33. package/{esm2020 → esm2022}/helpers/index.mjs +2 -2
  34. package/{esm2020 → esm2022}/helpers/mobile-operation-system-checker.helper.mjs +7 -7
  35. package/{esm2020 → esm2022}/index.mjs +7 -7
  36. package/{esm2020 → esm2022}/infrab4a-connect-angular.mjs +4 -4
  37. package/{esm2020 → esm2022}/persistence/cookie-data-persistence.mjs +22 -22
  38. package/{esm2020 → esm2022}/persistence/data-persistence.mjs +2 -2
  39. package/{esm2020 → esm2022}/persistence/index.mjs +3 -3
  40. package/{esm2020 → esm2022}/services/auth.service.mjs +37 -37
  41. package/esm2022/services/cart.service.mjs +293 -0
  42. package/{esm2020 → esm2022}/services/catalog/adapters/category-structure.adapter.mjs +2 -2
  43. package/{esm2020 → esm2022}/services/catalog/adapters/index.mjs +4 -4
  44. package/{esm2020 → esm2022}/services/catalog/adapters/new-category-structure.adapter.mjs +43 -43
  45. package/{esm2020 → esm2022}/services/catalog/adapters/old-category-structure.adapter.mjs +23 -23
  46. package/{esm2020 → esm2022}/services/catalog/catalog.service.mjs +241 -241
  47. package/{esm2020 → esm2022}/services/catalog/category.service.mjs +51 -51
  48. package/{esm2020 → esm2022}/services/catalog/enums/index.mjs +2 -2
  49. package/{esm2020 → esm2022}/services/catalog/enums/product-sorts.enum.mjs +11 -11
  50. package/{esm2020 → esm2022}/services/catalog/index.mjs +8 -8
  51. package/{esm2020 → esm2022}/services/catalog/models/category-with-tree.model.mjs +10 -10
  52. package/{esm2020 → esm2022}/services/catalog/models/index.mjs +2 -2
  53. package/{esm2020 → esm2022}/services/catalog/types/index.mjs +2 -2
  54. package/{esm2020 → esm2022}/services/catalog/types/product-sort.type.mjs +2 -2
  55. package/{esm2020 → esm2022}/services/catalog/wishlist.service.mjs +237 -237
  56. package/{esm2020 → esm2022}/services/checkout-subscription.service.mjs +50 -50
  57. package/{esm2020 → esm2022}/services/checkout.service.mjs +68 -68
  58. package/{esm2020 → esm2022}/services/coupon.service.mjs +274 -274
  59. package/{esm2020 → esm2022}/services/helpers/index.mjs +2 -2
  60. package/{esm2020 → esm2022}/services/helpers/util.helper.mjs +18 -18
  61. package/{esm2020 → esm2022}/services/home-shop.service.mjs +125 -125
  62. package/{esm2020 → esm2022}/services/index.mjs +11 -11
  63. package/{esm2020 → esm2022}/services/order.service.mjs +30 -30
  64. package/{esm2020 → esm2022}/services/shipping.service.mjs +96 -96
  65. package/{esm2020 → esm2022}/services/types/index.mjs +3 -3
  66. package/{esm2020 → esm2022}/services/types/required-checkout-data.type.mjs +2 -2
  67. package/{esm2020 → esm2022}/services/types/required-checkout-subscription-data.type.mjs +2 -2
  68. package/esm2022/services/types/shipping-methods.type.mjs +2 -0
  69. package/{esm2020 → esm2022}/types/firebase-app-config.type.mjs +2 -2
  70. package/{esm2020 → esm2022}/types/index.mjs +2 -2
  71. package/{fesm2020 → fesm2022}/infrab4a-connect-angular.mjs +2589 -2593
  72. package/fesm2022/infrab4a-connect-angular.mjs.map +1 -0
  73. package/helpers/index.d.ts +1 -1
  74. package/helpers/mobile-operation-system-checker.helper.d.ts +3 -3
  75. package/index.d.ts +6 -6
  76. package/package.json +6 -12
  77. package/persistence/cookie-data-persistence.d.ts +10 -10
  78. package/persistence/data-persistence.d.ts +6 -6
  79. package/persistence/index.d.ts +2 -2
  80. package/services/auth.service.d.ts +18 -18
  81. package/services/cart.service.d.ts +43 -43
  82. package/services/catalog/adapters/category-structure.adapter.d.ts +4 -4
  83. package/services/catalog/adapters/index.d.ts +3 -3
  84. package/services/catalog/adapters/new-category-structure.adapter.d.ts +12 -12
  85. package/services/catalog/adapters/old-category-structure.adapter.d.ts +10 -10
  86. package/services/catalog/catalog.service.d.ts +89 -89
  87. package/services/catalog/category.service.d.ts +20 -20
  88. package/services/catalog/enums/index.d.ts +1 -1
  89. package/services/catalog/enums/product-sorts.enum.d.ts +9 -9
  90. package/services/catalog/index.d.ts +7 -7
  91. package/services/catalog/models/category-with-tree.model.d.ts +4 -4
  92. package/services/catalog/models/index.d.ts +1 -1
  93. package/services/catalog/types/index.d.ts +1 -1
  94. package/services/catalog/types/product-sort.type.d.ts +2 -2
  95. package/services/catalog/wishlist.service.d.ts +50 -50
  96. package/services/checkout-subscription.service.d.ts +19 -19
  97. package/services/checkout.service.d.ts +27 -27
  98. package/services/coupon.service.d.ts +33 -33
  99. package/services/helpers/index.d.ts +1 -1
  100. package/services/helpers/util.helper.d.ts +3 -3
  101. package/services/home-shop.service.d.ts +26 -26
  102. package/services/index.d.ts +10 -10
  103. package/services/order.service.d.ts +13 -13
  104. package/services/shipping.service.d.ts +19 -19
  105. package/services/types/index.d.ts +2 -2
  106. package/services/types/required-checkout-data.type.d.ts +2 -2
  107. package/services/types/required-checkout-subscription-data.type.d.ts +2 -2
  108. package/services/types/shipping-methods.type.d.ts +12 -12
  109. package/types/firebase-app-config.type.d.ts +1 -1
  110. package/types/index.d.ts +1 -1
  111. package/esm2020/angular-connect.module.mjs +0 -146
  112. package/esm2020/angular-elastic-search.module.mjs +0 -34
  113. package/esm2020/angular-firebase-auth.module.mjs +0 -115
  114. package/esm2020/angular-firestore.module.mjs +0 -513
  115. package/esm2020/angular-hasura-graphql.module.mjs +0 -287
  116. package/esm2020/angular-vertex-search.module.mjs +0 -34
  117. package/esm2020/services/cart.service.mjs +0 -297
  118. package/esm2020/services/types/shipping-methods.type.mjs +0 -2
  119. package/fesm2015/infrab4a-connect-angular.mjs +0 -2740
  120. package/fesm2015/infrab4a-connect-angular.mjs.map +0 -1
  121. package/fesm2020/infrab4a-connect-angular.mjs.map +0 -1
@@ -1,237 +1,237 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { PersonTypes, Shops, Wishlist, WishlistLogType, } from '@infrab4a/connect';
3
- import { DEFAULT_SHOP } from '../../consts';
4
- import { NewCategoryStructureAdapter } from './adapters';
5
- import { CatalogService } from './catalog.service';
6
- import { CategoryService } from './category.service';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@infrab4a/connect";
9
- export class WishlistService {
10
- constructor(wishlistRepository, shop, productRepository, categoryFilterRepository, categoryRepository, productStockNotificationRepository, productSearch, logRepository) {
11
- this.wishlistRepository = wishlistRepository;
12
- this.shop = shop;
13
- this.productRepository = productRepository;
14
- this.productSearch = productSearch;
15
- this.logRepository = logRepository;
16
- const categoryStructureAdapter = new NewCategoryStructureAdapter(wishlistRepository);
17
- this.catalogService = new CatalogService(productRepository, productStockNotificationRepository, categoryRepository, categoryStructureAdapter, shop, productSearch);
18
- this.categoryService = new CategoryService(productRepository, categoryRepository, categoryFilterRepository, categoryStructureAdapter, shop);
19
- }
20
- getCatalogService() {
21
- return this.catalogService;
22
- }
23
- getCategoryService() {
24
- return this.categoryService;
25
- }
26
- async create({ personId, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
27
- const data = {
28
- slug: '',
29
- name: title,
30
- description,
31
- metadatas: [
32
- {
33
- shop: this.shop,
34
- title: `${userFullName} - ${title}`,
35
- description: `${userFullName} - ${description}`,
36
- },
37
- ],
38
- shop: this.shop,
39
- shops: [this.shop],
40
- personId,
41
- personName: userFullName,
42
- personPhoto: userPhoto,
43
- brandCategory: false,
44
- published,
45
- theme,
46
- bannerUrl,
47
- personType: personType ?? PersonTypes.NONE,
48
- personIsSubscriber: personIsSubscriber ?? false,
49
- };
50
- const hasWishlist = await this.wishlistRepository
51
- .find({
52
- filters: {
53
- personId,
54
- },
55
- options: {
56
- enableCount: false,
57
- },
58
- orderBy: {
59
- id: 'asc',
60
- },
61
- })
62
- .then((res) => res.data);
63
- await this.createWishlistLog(WishlistLogType.CREATE, data);
64
- if (hasWishlist.length)
65
- return hasWishlist.at(0);
66
- const newWishlist = await this.wishlistRepository.create(data);
67
- await this.wishlistRepository.update({ id: newWishlist.id, slug: newWishlist.id });
68
- return Wishlist.toInstance({ ...newWishlist.toPlain(), slug: newWishlist.id });
69
- }
70
- async update({ id, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
71
- const data = {
72
- id,
73
- name: title,
74
- description,
75
- published,
76
- metadatas: [
77
- {
78
- shop: this.shop,
79
- title: `${userFullName} - ${title}`,
80
- description: `${userFullName} - ${description}`,
81
- },
82
- ],
83
- personName: userFullName,
84
- personPhoto: userPhoto,
85
- theme,
86
- bannerUrl,
87
- personType: personType ?? PersonTypes.NONE,
88
- personIsSubscriber: personIsSubscriber ?? false,
89
- };
90
- await this.createWishlistLog(WishlistLogType.UPDATE, data);
91
- return this.wishlistRepository.update(data);
92
- }
93
- async delete(wishlistId) {
94
- const wishlist = await this.findById(wishlistId);
95
- await this.createWishlistLog(WishlistLogType.DELETE, wishlist);
96
- return this.wishlistRepository.delete({ id: wishlistId });
97
- }
98
- getWishlistBySlug(slug) {
99
- const [id] = slug.split('-');
100
- if (+id)
101
- return this.wishlistRepository.get({ id });
102
- return this.wishlistRepository.getWishlistBySlug(slug);
103
- }
104
- getWishlistsByPerson(personId) {
105
- return this.wishlistRepository.getWishlistByPerson(personId);
106
- }
107
- async addProduct(wishlistId, productId) {
108
- const wishlist = await this.wishlistRepository.get({ id: wishlistId });
109
- const hasProduct = wishlist.products.some((p) => p == productId);
110
- const wishlistData = await this.findById(wishlistId);
111
- const productData = await this.findProductById(productId);
112
- await this.createWishlistLog(WishlistLogType.ADD_PRODUCT, wishlistData, productData);
113
- if (!hasProduct) {
114
- wishlist.products = [...wishlist.products, productId];
115
- return this.wishlistRepository.update({ id: wishlistId, products: wishlist.products });
116
- }
117
- return wishlist;
118
- }
119
- async removeProduct(wishlistId, productId) {
120
- const wishlist = await this.wishlistRepository.get({ id: wishlistId });
121
- const productIndex = wishlist.products.findIndex((p) => p == productId);
122
- if (productIndex != -1) {
123
- wishlist.products.splice(productIndex, 1);
124
- const wishlistData = await this.findById(wishlistId);
125
- const productData = await this.findProductById(productId);
126
- await this.createWishlistLog(WishlistLogType.REMOVE_PRODUCT, wishlistData, productData);
127
- if (!wishlist.products.length)
128
- return this.wishlistRepository.update({ id: wishlistId, products: { action: 'remove' } });
129
- return this.wishlistRepository.update({ id: wishlistId, products: wishlist.products });
130
- }
131
- return wishlist;
132
- }
133
- async findById(id) {
134
- return this.wishlistRepository
135
- .find({
136
- fields: ['id', 'name', 'description', 'personId', 'personIsSubscriber', 'personType', 'personName'],
137
- filters: {
138
- id,
139
- },
140
- })
141
- .then((res) => res.data.at(0));
142
- }
143
- async findProductById(id) {
144
- return this.productRepository
145
- .find({
146
- fields: ['id', 'sku', 'EAN', 'name', 'brand'],
147
- filters: {
148
- id,
149
- },
150
- })
151
- .then((res) => res.data.at(0));
152
- }
153
- async createWishlistLog(type, wishlist, product) {
154
- switch (type) {
155
- case WishlistLogType.CREATE:
156
- case WishlistLogType.UPDATE:
157
- case WishlistLogType.DELETE:
158
- await this.logRepository.create({
159
- collection: 'wishlist',
160
- date: new Date(),
161
- operation: WishlistLogType.CREATE ? 'CREATE' : WishlistLogType.UPDATE ? 'UPDATE' : 'DELETE',
162
- documentId: wishlist.id,
163
- document: {
164
- id: wishlist.id,
165
- shop: this.shop,
166
- name: wishlist.name,
167
- description: wishlist.description,
168
- published: wishlist.published,
169
- type: type,
170
- personType: wishlist.personType,
171
- personId: wishlist.personId,
172
- personName: wishlist.personName,
173
- personIsSubscriber: wishlist.personIsSubscriber,
174
- },
175
- });
176
- break;
177
- case WishlistLogType.ADD_PRODUCT:
178
- case WishlistLogType.REMOVE_PRODUCT:
179
- await this.logRepository.create({
180
- collection: 'wishlist',
181
- date: new Date(),
182
- operation: 'UPDATE',
183
- documentId: wishlist.id,
184
- document: {
185
- id: wishlist.id,
186
- shop: this.shop,
187
- name: wishlist.name,
188
- description: wishlist.description,
189
- published: wishlist.published,
190
- type: type,
191
- personType: wishlist.personType,
192
- personId: wishlist.personId,
193
- personName: wishlist.personName,
194
- personIsSubscriber: wishlist.personIsSubscriber,
195
- productId: product.id,
196
- productEAN: product.EAN,
197
- productSKU: product.sku,
198
- productName: product.name,
199
- productBrand: product.brand,
200
- },
201
- });
202
- break;
203
- default:
204
- break;
205
- }
206
- }
207
- }
208
- WishlistServicefac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: WishlistService, deps: [{ token: 'WishlistRepository' }, { token: DEFAULT_SHOP }, { token: 'ProductRepository' }, { token: 'CategoryFilterRepository' }, { token: 'CategoryRepository' }, { token: 'ProductStockNotificationRepository' }, { token: 'ProductSearch' }, { token: 'LogRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
209
- WishlistService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: WishlistService });
210
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: WishlistService, decorators: [{
211
- type: Injectable
212
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
213
- type: Inject,
214
- args: ['WishlistRepository']
215
- }] }, { type: i1.Shops, decorators: [{
216
- type: Inject,
217
- args: [DEFAULT_SHOP]
218
- }] }, { type: undefined, decorators: [{
219
- type: Inject,
220
- args: ['ProductRepository']
221
- }] }, { type: undefined, decorators: [{
222
- type: Inject,
223
- args: ['CategoryFilterRepository']
224
- }] }, { type: undefined, decorators: [{
225
- type: Inject,
226
- args: ['CategoryRepository']
227
- }] }, { type: undefined, decorators: [{
228
- type: Inject,
229
- args: ['ProductStockNotificationRepository']
230
- }] }, { type: undefined, decorators: [{
231
- type: Inject,
232
- args: ['ProductSearch']
233
- }] }, { type: undefined, decorators: [{
234
- type: Inject,
235
- args: ['LogRepository']
236
- }] }]; } });
237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lzaGxpc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvY2F0YWxvZy93aXNobGlzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFLTCxXQUFXLEVBS1gsS0FBSyxFQUNMLFFBQVEsRUFDUixlQUFlLEdBRWhCLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTs7O0FBR3BELE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ2lELGtCQUFzQyxFQUM5QyxJQUFXLEVBQ2QsaUJBQW9DLEVBQ3BDLHdCQUFrRCxFQUN4RCxrQkFBc0MsRUFFcEUsa0NBQXNFLEVBQzVCLGFBQWlDLEVBQ2pDLGFBQTRCO1FBUnZCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDOUMsU0FBSSxHQUFKLElBQUksQ0FBTztRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFLOUIsa0JBQWEsR0FBYixhQUFhLENBQW9CO1FBQ2pDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRXRFLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBRXBGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQ3RDLGlCQUFpQixFQUNqQixrQ0FBa0MsRUFDbEMsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixJQUFJLEVB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QUFFLE9BQU8sQ0FBQyxJQUFJO3dCQUN6QixZQUFZLEVBQUUsT0FBTyxDQUFDLEtBQUs7cUJBQzVCO2lCQUNGLENBQUMsQ0FBQTtnQkFDRixNQUFLO1lBRVA7Z0JBQ0UsTUFBSztTQUNSO0lBQ0gsQ0FBQzs7NEdBclNVLGVBQWUsa0JBS2hCLG9CQUFvQixhQUNwQixZQUFZLGFBQ1osbUJBQW1CLGFBQ25CLDBCQUEwQixhQUMxQixvQkFBb0IsYUFDcEIsb0NBQW9DLGFBRXBDLGVBQWUsYUFDZixlQUFlO2dIQWJkLGVBQWU7MkZBQWYsZUFBZTtrQkFEM0IsVUFBVTs7MEJBTU4sTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixNQUFNOzJCQUFDLFlBQVk7OzBCQUNuQixNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsMEJBQTBCOzswQkFDakMsTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixNQUFNOzJCQUFDLG9DQUFvQzs7MEJBRTNDLE1BQU07MkJBQUMsZUFBZTs7MEJBQ3RCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7XHJcbiAgQ2F0ZWdvcnlGaWx0ZXJSZXBvc2l0b3J5LFxyXG4gIENhdGVnb3J5UmVwb3NpdG9yeSxcclxuICBMb2dSZXBvc2l0b3J5LFxyXG4gIFBlcnNvblR5cGUsXHJcbiAgUGVyc29uVHlwZXMsXHJcbiAgUHJvZHVjdCxcclxuICBQcm9kdWN0UmVwb3NpdG9yeSxcclxuICBQcm9kdWN0U2VhcmNoSW5kZXgsXHJcbiAgUHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeSxcclxuICBTaG9wcyxcclxuICBXaXNobGlzdCxcclxuICBXaXNobGlzdExvZ1R5cGUsXHJcbiAgV2lzaGxpc3RSZXBvc2l0b3J5LFxyXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xyXG5pbXBvcnQgeyBERUZBVUxUX1NIT1AgfSBmcm9tICcuLi8uLi9jb25zdHMnXHJcbmltcG9ydCB7IE5ld0NhdGVnb3J5U3RydWN0dXJlQWRhcHRlciB9IGZyb20gJy4vYWRhcHRlcnMnXHJcbmltcG9ydCB7IENhdGFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9jYXRhbG9nLnNlcnZpY2UnXHJcbmltcG9ydCB7IENhdGVnb3J5U2VydmljZSB9IGZyb20gJy4vY2F0ZWdvcnkuc2VydmljZSdcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFdpc2hsaXN0U2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjYXRhbG9nU2VydmljZTogQ2F0YWxvZ1NlcnZpY2VcclxuICBwcml2YXRlIGNhdGVnb3J5U2VydmljZTogQ2F0ZWdvcnlTZXJ2aWNlXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnV2lzaGxpc3RSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSB3aXNobGlzdFJlcG9zaXRvcnk6IFdpc2hsaXN0UmVwb3NpdG9yeSxcclxuICAgIEBJbmplY3QoREVGQVVMVF9TSE9QKSBwcml2YXRlIHJlYWRvbmx5IHNob3A6IFNob3BzLFxyXG4gICAgQEluamVjdCgnUHJvZHVjdFJlcG9zaXRvcnknKSBwdWJsaWMgcHJvZHVjdFJlcG9zaXRvcnk6IFByb2R1Y3RSZXBvc2l0b3J5LFxyXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlGaWx0ZXJSZXBvc2l0b3J5JykgY2F0ZWdvcnlGaWx0ZXJSZXBvc2l0b3J5OiBDYXRlZ29yeUZpbHRlclJlcG9zaXRvcnksXHJcbiAgICBASW5qZWN0KCdDYXRlZ29yeVJlcG9zaXRvcnknKSBjYXRlZ29yeVJlcG9zaXRvcnk6IENhdGVnb3J5UmVwb3NpdG9yeSxcclxuICAgIEBJbmplY3QoJ1Byb2R1Y3RTdG9ja05vdGlmaWNhdGlvblJlcG9zaXRvcnknKVxyXG4gICAgcHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeTogUHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeSxcclxuICAgIEBJbmplY3QoJ1Byb2R1Y3RTZWFyY2gnKSBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RTZWFyY2g6IFByb2R1Y3RTZWFyY2hJbmRleCxcclxuICAgIEBJbmplY3QoJ0xvZ1JlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IGxvZ1JlcG9zaXRvcnk6IExvZ1JlcG9zaXRvcnksXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjYXRlZ29yeVN0cnVjdHVyZUFkYXB0ZXIgPSBuZXcgTmV3Q2F0ZWdvcnlTdHJ1Y3R1cmVBZGFwdGVyKHdpc2hsaXN0UmVwb3NpdG9yeSlcclxuXHJcbiAgICB0aGlzLmNhdGFsb2dTZXJ2aWNlID0gbmV3IENhdGFsb2dTZXJ2aWNlPFdpc2hsaXN0PihcclxuICAgICAgcHJvZHVjdFJlcG9zaXRvcnksXHJcbiAgICAgIHByb2R1Y3RTdG9ja05vdGlmaWNhdGlvblJlcG9zaXRvcnksXHJcbiAgICAgIGNhdGVnb3J5UmVwb3NpdG9yeSxcclxuICAgICAgY2F0ZWdvcnlTdHJ1Y3R1cmVBZGFwdGVyLFxyXG4gICAgICBzaG9wLFxyXG4gICAgICBwcm9kdWN0U2VhcmNoLFxyXG4gICAgKVxyXG4gICAgdGhpcy5jYXRlZ29yeVNlcnZpY2UgPSBuZXcgQ2F0ZWdvcnlTZXJ2aWNlKFxyXG4gICAgICBwcm9kdWN0UmVwb3NpdG9yeSxcclxuICAgICAgY2F0ZWdvcnlSZXBvc2l0b3J5LFxyXG4gICAgICBjYXRlZ29yeUZpbHRlclJlcG9zaXRvcnksXHJcbiAgICAgIGNhdGVnb3J5U3RydWN0dXJlQWRhcHRlcixcclxuICAgICAgc2hvcCxcclxuICAgIClcclxuICB9XHJcblxyXG4gIGdldENhdGFsb2dTZXJ2aWNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2VcclxuICB9XHJcblxyXG4gIGdldENhdGVnb3J5U2VydmljZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmNhdGVnb3J5U2VydmljZVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlKHtcclxuICAgIHBlcnNvbklkLFxyXG4gICAgdGl0bGUsXHJcbiAgICBkZXNjcmlwdGlvbixcclxuICAgIHB1Ymxpc2hlZCxcclxuICAgIHVzZXJGdWxsTmFtZSxcclxuICAgIHVzZXJQaG90byxcclxuICAgIHRoZW1lLFxyXG4gICAgYmFubmVyVXJsLFxyXG4gICAgcGVyc29uVHlwZSxcclxuICAgIHBlcnNvbklzU3Vic2NyaWJlcixcclxuICB9OiB7XHJcbiAgICBwZXJzb25JZDogc3RyaW5nXHJcbiAgICB0aXRsZTogc3RyaW5nXHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXHJcbiAgICBwdWJsaXNoZWQ6IGJvb2xlYW5cclxuICAgIHVzZXJGdWxsTmFtZTogc3RyaW5nXHJcbiAgICB1c2VyUGhvdG8/OiBzdHJpbmdcclxuICAgIHRoZW1lPzogc3RyaW5nXHJcbiAgICBiYW5uZXJVcmw/OiBzdHJpbmdcclxuICAgIHBlcnNvblR5cGU/OiBQZXJzb25UeXBlXHJcbiAgICBwZXJzb25Jc1N1YnNjcmliZXI/OiBib29sZWFuXHJcbiAgfSk6IFByb21pc2U8V2lzaGxpc3Q+IHtcclxuICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgIHNsdWc6ICcnLFxyXG4gICAgICBuYW1lOiB0aXRsZSxcclxuICAgICAgZGVzY3JpcHRpb24sXHJcbiAgICAgIG1ldGFkYXRhczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHNob3A6IHRoaXMuc2hvcCxcclxuICAgICAgICAgIHRpdGxlOiBgJHt1c2VyRnVsbE5hbWV9IC0gJHt0aXRsZX1gLFxyXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke3VzZXJGdWxsTmFtZX0gLSAke2Rlc2NyaXB0aW9ufWAsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgICAgc2hvcDogdGhpcy5zaG9wLFxyXG4gICAgICBzaG9wczogW3RoaXMuc2hvcF0sXHJcbiAgICAgIHBlcnNvbklkLFxyXG4gICAgICBwZXJzb25OYW1lOiB1c2VyRnVsbE5hbWUsXHJcbiAgICAgIHBlcnNvblBob3RvOiB1c2VyUGhvdG8sXHJcbiAgICAgIGJyYW5kQ2F0ZWdvcnk6IGZhbHNlLFxyXG4gICAgICBwdWJsaXNoZWQsXHJcbiAgICAgIHRoZW1lLFxyXG4gICAgICBiYW5uZXJVcmwsXHJcbiAgICAgIHBlcnNvblR5cGU6IHBlcnNvblR5cGUgPz8gUGVyc29uVHlwZXMuTk9ORSxcclxuICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiBwZXJzb25Jc1N1YnNjcmliZXIgPz8gZmFsc2UsXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaGFzV2lzaGxpc3QgPSBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeVxyXG4gICAgICAuZmluZCh7XHJcbiAgICAgICAgZmlsdGVyczoge1xyXG4gICAgICAgICAgcGVyc29uSWQsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICBlbmFibGVDb3VudDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvcmRlckJ5OiB7XHJcbiAgICAgICAgICBpZDogJ2FzYycsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmRhdGEpXHJcblxyXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuQ1JFQVRFLCBkYXRhIGFzIFdpc2hsaXN0KVxyXG5cclxuICAgIGlmIChoYXNXaXNobGlzdC5sZW5ndGgpIHJldHVybiBoYXNXaXNobGlzdC5hdCgwKVxyXG5cclxuICAgIGNvbnN0IG5ld1dpc2hsaXN0ID0gYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuY3JlYXRlKGRhdGEpXHJcbiAgICBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS51cGRhdGUoeyBpZDogbmV3V2lzaGxpc3QuaWQsIHNsdWc6IG5ld1dpc2hsaXN0LmlkIH0pXHJcblxyXG4gICAgcmV0dXJuIFdpc2hsaXN0LnRvSW5zdGFuY2UoeyAuLi5uZXdXaXNobGlzdC50b1BsYWluKCksIHNsdWc6IG5ld1dpc2hsaXN0LmlkIH0pXHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGUoe1xyXG4gICAgaWQsXHJcbiAgICB0aXRsZSxcclxuICAgIGRlc2NyaXB0aW9uLFxyXG4gICAgcHVibGlzaGVkLFxyXG4gICAgdXNlckZ1bGxOYW1lLFxyXG4gICAgdXNlclBob3RvLFxyXG4gICAgdGhlbWUsXHJcbiAgICBiYW5uZXJVcmwsXHJcbiAgICBwZXJzb25UeXBlLFxyXG4gICAgcGVyc29uSXNTdWJzY3JpYmVyLFxyXG4gIH06IHtcclxuICAgIGlkOiBzdHJpbmdcclxuICAgIHRpdGxlOiBzdHJpbmdcclxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcclxuICAgIHB1Ymxpc2hlZDogYm9vbGVhblxyXG4gICAgdXNlckZ1bGxOYW1lOiBzdHJpbmdcclxuICAgIHVzZXJQaG90bz86IHN0cmluZ1xyXG4gICAgdGhlbWU/OiBzdHJpbmdcclxuICAgIGJhbm5lclVybD86IHN0cmluZ1xyXG4gICAgcGVyc29uVHlwZT86IFBlcnNvblR5cGVcclxuICAgIHBlcnNvbklzU3Vic2NyaWJlcj86IGJvb2xlYW5cclxuICB9KTogUHJvbWlzZTxXaXNobGlzdD4ge1xyXG4gICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgaWQsXHJcbiAgICAgIG5hbWU6IHRpdGxlLFxyXG4gICAgICBkZXNjcmlwdGlvbixcclxuICAgICAgcHVibGlzaGVkLFxyXG4gICAgICBtZXRhZGF0YXM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBzaG9wOiB0aGlzLnNob3AsXHJcbiAgICAgICAgICB0aXRsZTogYCR7dXNlckZ1bGxOYW1lfSAtICR7dGl0bGV9YCxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHt1c2VyRnVsbE5hbWV9IC0gJHtkZXNjcmlwdGlvbn1gLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0sXHJcbiAgICAgIHBlcnNvbk5hbWU6IHVzZXJGdWxsTmFtZSxcclxuICAgICAgcGVyc29uUGhvdG86IHVzZXJQaG90byxcclxuICAgICAgdGhlbWUsXHJcbiAgICAgIGJhbm5lclVybCxcclxuICAgICAgcGVyc29uVHlwZTogcGVyc29uVHlwZSA/PyBQZXJzb25UeXBlcy5OT05FLFxyXG4gICAgICBwZXJzb25Jc1N1YnNjcmliZXI6IHBlcnNvbklzU3Vic2NyaWJlciA/PyBmYWxzZSxcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVdpc2hsaXN0TG9nKFdpc2hsaXN0TG9nVHlwZS5VUERBVEUsIGRhdGEgYXMgV2lzaGxpc3QpXHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LnVwZGF0ZShkYXRhKVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGVsZXRlKHdpc2hsaXN0SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgd2lzaGxpc3QgPSBhd2FpdCB0aGlzLmZpbmRCeUlkKHdpc2hsaXN0SWQpXHJcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVdpc2hsaXN0TG9nKFdpc2hsaXN0TG9nVHlwZS5ERUxFVEUsIHdpc2hsaXN0KVxyXG5cclxuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5kZWxldGUoeyBpZDogd2lzaGxpc3RJZCB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0V2lzaGxpc3RCeVNsdWcoc2x1Zzogc3RyaW5nKTogUHJvbWlzZTxXaXNobGlzdD4ge1xyXG4gICAgY29uc3QgW2lkXSA9IHNsdWcuc3BsaXQoJy0nKVxyXG5cclxuICAgIGlmICgraWQpIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXQoeyBpZCB9KVxyXG5cclxuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXRXaXNobGlzdEJ5U2x1ZyhzbHVnKVxyXG4gIH1cclxuXHJcbiAgZ2V0V2lzaGxpc3RzQnlQZXJzb24ocGVyc29uSWQ6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3RbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmdldFdpc2hsaXN0QnlQZXJzb24ocGVyc29uSWQpXHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRQcm9kdWN0KHdpc2hsaXN0SWQ6IHN0cmluZywgcHJvZHVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFdpc2hsaXN0PiB7XHJcbiAgICBjb25zdCB3aXNobGlzdCA9IGF3YWl0IHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LmdldCh7IGlkOiB3aXNobGlzdElkIH0pXHJcbiAgICBjb25zdCBoYXNQcm9kdWN0ID0gd2lzaGxpc3QucHJvZHVjdHMuc29tZSgocCkgPT4gcCA9PSBwcm9kdWN0SWQpXHJcblxyXG4gICAgY29uc3Qgd2lzaGxpc3REYXRhID0gYXdhaXQgdGhpcy5maW5kQnlJZCh3aXNobGlzdElkKVxyXG4gICAgY29uc3QgcHJvZHVjdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRQcm9kdWN0QnlJZChwcm9kdWN0SWQpXHJcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVdpc2hsaXN0TG9nKFdpc2hsaXN0TG9nVHlwZS5BRERfUFJPRFVDVCwgd2lzaGxpc3REYXRhLCBwcm9kdWN0RGF0YSlcclxuXHJcbiAgICBpZiAoIWhhc1Byb2R1Y3QpIHtcclxuICAgICAgd2lzaGxpc3QucHJvZHVjdHMgPSBbLi4ud2lzaGxpc3QucHJvZHVjdHMsIHByb2R1Y3RJZF1cclxuICAgICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LnVwZGF0ZSh7IGlkOiB3aXNobGlzdElkLCBwcm9kdWN0czogd2lzaGxpc3QucHJvZHVjdHMgfSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gd2lzaGxpc3RcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZVByb2R1Y3Qod2lzaGxpc3RJZDogc3RyaW5nLCBwcm9kdWN0SWQ6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3Q+IHtcclxuICAgIGNvbnN0IHdpc2hsaXN0ID0gYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuZ2V0KHsgaWQ6IHdpc2hsaXN0SWQgfSlcclxuICAgIGNvbnN0IHByb2R1Y3RJbmRleCA9IHdpc2hsaXN0LnByb2R1Y3RzLmZpbmRJbmRleCgocCkgPT4gcCA9PSBwcm9kdWN0SWQpXHJcblxyXG4gICAgaWYgKHByb2R1Y3RJbmRleCAhPSAtMSkge1xyXG4gICAgICB3aXNobGlzdC5wcm9kdWN0cy5zcGxpY2UocHJvZHVjdEluZGV4LCAxKVxyXG5cclxuICAgICAgY29uc3Qgd2lzaGxpc3REYXRhID0gYXdhaXQgdGhpcy5maW5kQnlJZCh3aXNobGlzdElkKVxyXG4gICAgICBjb25zdCBwcm9kdWN0RGF0YSA9IGF3YWl0IHRoaXMuZmluZFByb2R1Y3RCeUlkKHByb2R1Y3RJZClcclxuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuUkVNT1ZFX1BST0RVQ1QsIHdpc2hsaXN0RGF0YSwgcHJvZHVjdERhdGEpXHJcblxyXG4gICAgICBpZiAoIXdpc2hsaXN0LnByb2R1Y3RzLmxlbmd0aClcclxuICAgICAgICByZXR1cm4gdGhpcy53aXNobGlzdFJlcG9zaXRvcnkudXBkYXRlKHsgaWQ6IHdpc2hsaXN0SWQsIHByb2R1Y3RzOiB7IGFjdGlvbjogJ3JlbW92ZScgfSB9KVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LnVwZGF0ZSh7IGlkOiB3aXNobGlzdElkLCBwcm9kdWN0czogd2lzaGxpc3QucHJvZHVjdHMgfSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gd2lzaGxpc3RcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZmluZEJ5SWQoaWQ6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3Q+IHtcclxuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeVxyXG4gICAgICAuZmluZCh7XHJcbiAgICAgICAgZmllbGRzOiBbJ2lkJywgJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAncGVyc29uSWQnLCAncGVyc29uSXNTdWJzY3JpYmVyJywgJ3BlcnNvblR5cGUnLCAncGVyc29uTmFtZSddLFxyXG4gICAgICAgIGZpbHRlcnM6IHtcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5kYXRhLmF0KDApKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmaW5kUHJvZHVjdEJ5SWQoaWQ6IHN0cmluZyk6IFByb21pc2U8UHJvZHVjdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvZHVjdFJlcG9zaXRvcnlcclxuICAgICAgLmZpbmQoe1xyXG4gICAgICAgIGZpZWxkczogWydpZCcsICdza3UnLCAnRUFOJywgJ25hbWUnLCAnYnJhbmQnXSxcclxuICAgICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gICAgICAudGhlbigocmVzKSA9PiByZXMuZGF0YS5hdCgwKSlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlV2lzaGxpc3RMb2codHlwZTogV2lzaGxpc3RMb2dUeXBlLCB3aXNobGlzdDogV2lzaGxpc3QsIHByb2R1Y3Q/OiBQcm9kdWN0KSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSBXaXNobGlzdExvZ1R5cGUuQ1JFQVRFOlxyXG4gICAgICBjYXNlIFdpc2hsaXN0TG9nVHlwZS5VUERBVEU6XHJcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkRFTEVURTpcclxuICAgICAgICBhd2FpdCB0aGlzLmxvZ1JlcG9zaXRvcnkuY3JlYXRlKHtcclxuICAgICAgICAgIGNvbGxlY3Rpb246ICd3aXNobGlzdCcsXHJcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgb3BlcmF0aW9uOiBXaXNobGlzdExvZ1R5cGUuQ1JFQVRFID8gJ0NSRUFURScgOiBXaXNobGlzdExvZ1R5cGUuVVBEQVRFID8gJ1VQREFURScgOiAnREVMRVRFJyxcclxuICAgICAgICAgIGRvY3VtZW50SWQ6IHdpc2hsaXN0LmlkLFxyXG4gICAgICAgICAgZG9jdW1lbnQ6IHtcclxuICAgICAgICAgICAgaWQ6IHdpc2hsaXN0LmlkLFxyXG4gICAgICAgICAgICBzaG9wOiB0aGlzLnNob3AsXHJcbiAgICAgICAgICAgIG5hbWU6IHdpc2hsaXN0Lm5hbWUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB3aXNobGlzdC5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgcHVibGlzaGVkOiB3aXNobGlzdC5wdWJsaXNoZWQsXHJcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXHJcbiAgICAgICAgICAgIHBlcnNvblR5cGU6IHdpc2hsaXN0LnBlcnNvblR5cGUsXHJcbiAgICAgICAgICAgIHBlcnNvbklkOiB3aXNobGlzdC5wZXJzb25JZCxcclxuICAgICAgICAgICAgcGVyc29uTmFtZTogd2lzaGxpc3QucGVyc29uTmFtZSxcclxuICAgICAgICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiB3aXNobGlzdC5wZXJzb25Jc1N1YnNjcmliZXIsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkFERF9QUk9EVUNUOlxyXG4gICAgICBjYXNlIFdpc2hsaXN0TG9nVHlwZS5SRU1PVkVfUFJPRFVDVDpcclxuICAgICAgICBhd2FpdCB0aGlzLmxvZ1JlcG9zaXRvcnkuY3JlYXRlKHtcclxuICAgICAgICAgIGNvbGxlY3Rpb246ICd3aXNobGlzdCcsXHJcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxyXG4gICAgICAgICAgb3BlcmF0aW9uOiAnVVBEQVRFJyxcclxuICAgICAgICAgIGRvY3VtZW50SWQ6IHdpc2hsaXN0LmlkLFxyXG4gICAgICAgICAgZG9jdW1lbnQ6IHtcclxuICAgICAgICAgICAgaWQ6IHdpc2hsaXN0LmlkLFxyXG4gICAgICAgICAgICBzaG9wOiB0aGlzLnNob3AsXHJcbiAgICAgICAgICAgIG5hbWU6IHdpc2hsaXN0Lm5hbWUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB3aXNobGlzdC5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgcHVibGlzaGVkOiB3aXNobGlzdC5wdWJsaXNoZWQsXHJcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXHJcbiAgICAgICAgICAgIHBlcnNvblR5cGU6IHdpc2hsaXN0LnBlcnNvblR5cGUsXHJcbiAgICAgICAgICAgIHBlcnNvbklkOiB3aXNobGlzdC5wZXJzb25JZCxcclxuICAgICAgICAgICAgcGVyc29uTmFtZTogd2lzaGxpc3QucGVyc29uTmFtZSxcclxuICAgICAgICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiB3aXNobGlzdC5wZXJzb25Jc1N1YnNjcmliZXIsXHJcbiAgICAgICAgICAgIHByb2R1Y3RJZDogcHJvZHVjdC5pZCxcclxuICAgICAgICAgICAgcHJvZHVjdEVBTjogcHJvZHVjdC5FQU4sXHJcbiAgICAgICAgICAgIHByb2R1Y3RTS1U6IHByb2R1Y3Quc2t1LFxyXG4gICAgICAgICAgICBwcm9kdWN0TmFtZTogcHJvZHVjdC5uYW1lLFxyXG4gICAgICAgICAgICBwcm9kdWN0QnJhbmQ6IHByb2R1Y3QuYnJhbmQsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { PersonTypes, Shops, Wishlist, WishlistLogType, } from '@infrab4a/connect';
3
+ import { DEFAULT_SHOP } from '../../consts';
4
+ import { NewCategoryStructureAdapter } from './adapters';
5
+ import { CatalogService } from './catalog.service';
6
+ import { CategoryService } from './category.service';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@infrab4a/connect";
9
+ export class WishlistService {
10
+ constructor(wishlistRepository, shop, productRepository, categoryFilterRepository, categoryRepository, productStockNotificationRepository, productSearch, logRepository) {
11
+ this.wishlistRepository = wishlistRepository;
12
+ this.shop = shop;
13
+ this.productRepository = productRepository;
14
+ this.productSearch = productSearch;
15
+ this.logRepository = logRepository;
16
+ const categoryStructureAdapter = new NewCategoryStructureAdapter(wishlistRepository);
17
+ this.catalogService = new CatalogService(productRepository, productStockNotificationRepository, categoryRepository, categoryStructureAdapter, shop, productSearch);
18
+ this.categoryService = new CategoryService(productRepository, categoryRepository, categoryFilterRepository, categoryStructureAdapter, shop);
19
+ }
20
+ getCatalogService() {
21
+ return this.catalogService;
22
+ }
23
+ getCategoryService() {
24
+ return this.categoryService;
25
+ }
26
+ async create({ personId, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
27
+ const data = {
28
+ slug: '',
29
+ name: title,
30
+ description,
31
+ metadatas: [
32
+ {
33
+ shop: this.shop,
34
+ title: `${userFullName} - ${title}`,
35
+ description: `${userFullName} - ${description}`,
36
+ },
37
+ ],
38
+ shop: this.shop,
39
+ shops: [this.shop],
40
+ personId,
41
+ personName: userFullName,
42
+ personPhoto: userPhoto,
43
+ brandCategory: false,
44
+ published,
45
+ theme,
46
+ bannerUrl,
47
+ personType: personType ?? PersonTypes.NONE,
48
+ personIsSubscriber: personIsSubscriber ?? false,
49
+ };
50
+ const hasWishlist = await this.wishlistRepository
51
+ .find({
52
+ filters: {
53
+ personId,
54
+ },
55
+ options: {
56
+ enableCount: false,
57
+ },
58
+ orderBy: {
59
+ id: 'asc',
60
+ },
61
+ })
62
+ .then((res) => res.data);
63
+ await this.createWishlistLog(WishlistLogType.CREATE, data);
64
+ if (hasWishlist.length)
65
+ return hasWishlist.at(0);
66
+ const newWishlist = await this.wishlistRepository.create(data);
67
+ await this.wishlistRepository.update({ id: newWishlist.id, slug: newWishlist.id });
68
+ return Wishlist.toInstance({ ...newWishlist.toPlain(), slug: newWishlist.id });
69
+ }
70
+ async update({ id, title, description, published, userFullName, userPhoto, theme, bannerUrl, personType, personIsSubscriber, }) {
71
+ const data = {
72
+ id,
73
+ name: title,
74
+ description,
75
+ published,
76
+ metadatas: [
77
+ {
78
+ shop: this.shop,
79
+ title: `${userFullName} - ${title}`,
80
+ description: `${userFullName} - ${description}`,
81
+ },
82
+ ],
83
+ personName: userFullName,
84
+ personPhoto: userPhoto,
85
+ theme,
86
+ bannerUrl,
87
+ personType: personType ?? PersonTypes.NONE,
88
+ personIsSubscriber: personIsSubscriber ?? false,
89
+ };
90
+ await this.createWishlistLog(WishlistLogType.UPDATE, data);
91
+ return this.wishlistRepository.update(data);
92
+ }
93
+ async delete(wishlistId) {
94
+ const wishlist = await this.findById(wishlistId);
95
+ await this.createWishlistLog(WishlistLogType.DELETE, wishlist);
96
+ return this.wishlistRepository.delete({ id: wishlistId });
97
+ }
98
+ getWishlistBySlug(slug) {
99
+ const [id] = slug.split('-');
100
+ if (+id)
101
+ return this.wishlistRepository.get({ id });
102
+ return this.wishlistRepository.getWishlistBySlug(slug);
103
+ }
104
+ getWishlistsByPerson(personId) {
105
+ return this.wishlistRepository.getWishlistByPerson(personId);
106
+ }
107
+ async addProduct(wishlistId, productId) {
108
+ const wishlist = await this.wishlistRepository.get({ id: wishlistId });
109
+ const hasProduct = wishlist.products.some((p) => p == productId);
110
+ const wishlistData = await this.findById(wishlistId);
111
+ const productData = await this.findProductById(productId);
112
+ await this.createWishlistLog(WishlistLogType.ADD_PRODUCT, wishlistData, productData);
113
+ if (!hasProduct) {
114
+ wishlist.products = [...wishlist.products, productId];
115
+ return this.wishlistRepository.update({ id: wishlistId, products: wishlist.products });
116
+ }
117
+ return wishlist;
118
+ }
119
+ async removeProduct(wishlistId, productId) {
120
+ const wishlist = await this.wishlistRepository.get({ id: wishlistId });
121
+ const productIndex = wishlist.products.findIndex((p) => p == productId);
122
+ if (productIndex != -1) {
123
+ wishlist.products.splice(productIndex, 1);
124
+ const wishlistData = await this.findById(wishlistId);
125
+ const productData = await this.findProductById(productId);
126
+ await this.createWishlistLog(WishlistLogType.REMOVE_PRODUCT, wishlistData, productData);
127
+ if (!wishlist.products.length)
128
+ return this.wishlistRepository.update({ id: wishlistId, products: { action: 'remove' } });
129
+ return this.wishlistRepository.update({ id: wishlistId, products: wishlist.products });
130
+ }
131
+ return wishlist;
132
+ }
133
+ async findById(id) {
134
+ return this.wishlistRepository
135
+ .find({
136
+ fields: ['id', 'name', 'description', 'personId', 'personIsSubscriber', 'personType', 'personName'],
137
+ filters: {
138
+ id,
139
+ },
140
+ })
141
+ .then((res) => res.data.at(0));
142
+ }
143
+ async findProductById(id) {
144
+ return this.productRepository
145
+ .find({
146
+ fields: ['id', 'sku', 'EAN', 'name', 'brand'],
147
+ filters: {
148
+ id,
149
+ },
150
+ })
151
+ .then((res) => res.data.at(0));
152
+ }
153
+ async createWishlistLog(type, wishlist, product) {
154
+ switch (type) {
155
+ case WishlistLogType.CREATE:
156
+ case WishlistLogType.UPDATE:
157
+ case WishlistLogType.DELETE:
158
+ await this.logRepository.create({
159
+ collection: 'wishlist',
160
+ date: new Date(),
161
+ operation: WishlistLogType.CREATE ? 'CREATE' : WishlistLogType.UPDATE ? 'UPDATE' : 'DELETE',
162
+ documentId: wishlist.id,
163
+ document: {
164
+ id: wishlist.id,
165
+ shop: this.shop,
166
+ name: wishlist.name,
167
+ description: wishlist.description,
168
+ published: wishlist.published,
169
+ type: type,
170
+ personType: wishlist.personType,
171
+ personId: wishlist.personId,
172
+ personName: wishlist.personName,
173
+ personIsSubscriber: wishlist.personIsSubscriber,
174
+ },
175
+ });
176
+ break;
177
+ case WishlistLogType.ADD_PRODUCT:
178
+ case WishlistLogType.REMOVE_PRODUCT:
179
+ await this.logRepository.create({
180
+ collection: 'wishlist',
181
+ date: new Date(),
182
+ operation: 'UPDATE',
183
+ documentId: wishlist.id,
184
+ document: {
185
+ id: wishlist.id,
186
+ shop: this.shop,
187
+ name: wishlist.name,
188
+ description: wishlist.description,
189
+ published: wishlist.published,
190
+ type: type,
191
+ personType: wishlist.personType,
192
+ personId: wishlist.personId,
193
+ personName: wishlist.personName,
194
+ personIsSubscriber: wishlist.personIsSubscriber,
195
+ productId: product.id,
196
+ productEAN: product.EAN,
197
+ productSKU: product.sku,
198
+ productName: product.name,
199
+ productBrand: product.brand,
200
+ },
201
+ });
202
+ break;
203
+ default:
204
+ break;
205
+ }
206
+ }
207
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WishlistService, deps: [{ token: 'WishlistRepository' }, { token: DEFAULT_SHOP }, { token: 'ProductRepository' }, { token: 'CategoryFilterRepository' }, { token: 'CategoryRepository' }, { token: 'ProductStockNotificationRepository' }, { token: 'ProductSearch' }, { token: 'LogRepository' }], target: i0.ɵɵFactoryTarget.Injectable }); }
208
+ static { thisprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WishlistService }); }
209
+ }
210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WishlistService, decorators: [{
211
+ type: Injectable
212
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
213
+ type: Inject,
214
+ args: ['WishlistRepository']
215
+ }] }, { type: i1.Shops, decorators: [{
216
+ type: Inject,
217
+ args: [DEFAULT_SHOP]
218
+ }] }, { type: undefined, decorators: [{
219
+ type: Inject,
220
+ args: ['ProductRepository']
221
+ }] }, { type: undefined, decorators: [{
222
+ type: Inject,
223
+ args: ['CategoryFilterRepository']
224
+ }] }, { type: undefined, decorators: [{
225
+ type: Inject,
226
+ args: ['CategoryRepository']
227
+ }] }, { type: undefined, decorators: [{
228
+ type: Inject,
229
+ args: ['ProductStockNotificationRepository']
230
+ }] }, { type: undefined, decorators: [{
231
+ type: Inject,
232
+ args: ['ProductSearch']
233
+ }] }, { type: undefined, decorators: [{
234
+ type: Inject,
235
+ args: ['LogRepository']
236
+ }] }] });
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lzaGxpc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvY2F0YWxvZy93aXNobGlzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFLTCxXQUFXLEVBS1gsS0FBSyxFQUNMLFFBQVEsRUFDUixlQUFlLEdBRWhCLE1BQU0sbUJBQW1CLENBQUE7QUFDMUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTs7O0FBR3BELE1BQU0sT0FBTyxlQUFlO0lBSTFCLFlBQ2lELGtCQUFzQyxFQUM5QyxJQUFXLEVBQ2QsaUJBQW9DLEVBQ3BDLHdCQUFrRCxFQUN4RCxrQkFBc0MsRUFFcEUsa0NBQXNFLEVBQzVCLGFBQWlDLEVBQ2pDLGFBQTRCO1FBUnZCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDOUMsU0FBSSxHQUFKLElBQUksQ0FBTztRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFLOUIsa0JBQWEsR0FBYixhQUFhLENBQW9CO1FBQ2pDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRXRFLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBRXBGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQ3RDLGlCQUFpQixFQUNqQixrQ0FBa0MsRUFDbEMsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixJQUFJLEVB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QUFFLE9BQU8sQ0FBQyxJQUFJO3dCQUN6QixZQUFZLEVBQUUsT0FBTyxDQUFDLEtBQUs7cUJBQzVCO2lCQUNGLENBQUMsQ0FBQTtnQkFDRixNQUFLO1lBRVA7Z0JBQ0UsTUFBSztTQUNSO0lBQ0gsQ0FBQzs4R0FyU1UsZUFBZSxrQkFLaEIsb0JBQW9CLGFBQ3BCLFlBQVksYUFDWixtQkFBbUIsYUFDbkIsMEJBQTBCLGFBQzFCLG9CQUFvQixhQUNwQixvQ0FBb0MsYUFFcEMsZUFBZSxhQUNmLGVBQWU7a0hBYmQsZUFBZTs7MkZBQWYsZUFBZTtrQkFEM0IsVUFBVTs7MEJBTU4sTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixNQUFNOzJCQUFDLFlBQVk7OzBCQUNuQixNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsMEJBQTBCOzswQkFDakMsTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixNQUFNOzJCQUFDLG9DQUFvQzs7MEJBRTNDLE1BQU07MkJBQUMsZUFBZTs7MEJBQ3RCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBDYXRlZ29yeUZpbHRlclJlcG9zaXRvcnksXG4gIENhdGVnb3J5UmVwb3NpdG9yeSxcbiAgTG9nUmVwb3NpdG9yeSxcbiAgUGVyc29uVHlwZSxcbiAgUGVyc29uVHlwZXMsXG4gIFByb2R1Y3QsXG4gIFByb2R1Y3RSZXBvc2l0b3J5LFxuICBQcm9kdWN0U2VhcmNoSW5kZXgsXG4gIFByb2R1Y3RTdG9ja05vdGlmaWNhdGlvblJlcG9zaXRvcnksXG4gIFNob3BzLFxuICBXaXNobGlzdCxcbiAgV2lzaGxpc3RMb2dUeXBlLFxuICBXaXNobGlzdFJlcG9zaXRvcnksXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xuaW1wb3J0IHsgREVGQVVMVF9TSE9QIH0gZnJvbSAnLi4vLi4vY29uc3RzJ1xuaW1wb3J0IHsgTmV3Q2F0ZWdvcnlTdHJ1Y3R1cmVBZGFwdGVyIH0gZnJvbSAnLi9hZGFwdGVycydcbmltcG9ydCB7IENhdGFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9jYXRhbG9nLnNlcnZpY2UnXG5pbXBvcnQgeyBDYXRlZ29yeVNlcnZpY2UgfSBmcm9tICcuL2NhdGVnb3J5LnNlcnZpY2UnXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBXaXNobGlzdFNlcnZpY2Uge1xuICBwcml2YXRlIGNhdGFsb2dTZXJ2aWNlOiBDYXRhbG9nU2VydmljZVxuICBwcml2YXRlIGNhdGVnb3J5U2VydmljZTogQ2F0ZWdvcnlTZXJ2aWNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnV2lzaGxpc3RSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSB3aXNobGlzdFJlcG9zaXRvcnk6IFdpc2hsaXN0UmVwb3NpdG9yeSxcbiAgICBASW5qZWN0KERFRkFVTFRfU0hPUCkgcHJpdmF0ZSByZWFkb25seSBzaG9wOiBTaG9wcyxcbiAgICBASW5qZWN0KCdQcm9kdWN0UmVwb3NpdG9yeScpIHB1YmxpYyBwcm9kdWN0UmVwb3NpdG9yeTogUHJvZHVjdFJlcG9zaXRvcnksXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlGaWx0ZXJSZXBvc2l0b3J5JykgY2F0ZWdvcnlGaWx0ZXJSZXBvc2l0b3J5OiBDYXRlZ29yeUZpbHRlclJlcG9zaXRvcnksXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlSZXBvc2l0b3J5JykgY2F0ZWdvcnlSZXBvc2l0b3J5OiBDYXRlZ29yeVJlcG9zaXRvcnksXG4gICAgQEluamVjdCgnUHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeScpXG4gICAgcHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeTogUHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeSxcbiAgICBASW5qZWN0KCdQcm9kdWN0U2VhcmNoJykgcHJpdmF0ZSByZWFkb25seSBwcm9kdWN0U2VhcmNoOiBQcm9kdWN0U2VhcmNoSW5kZXgsXG4gICAgQEluamVjdCgnTG9nUmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgbG9nUmVwb3NpdG9yeTogTG9nUmVwb3NpdG9yeSxcbiAgKSB7XG4gICAgY29uc3QgY2F0ZWdvcnlTdHJ1Y3R1cmVBZGFwdGVyID0gbmV3IE5ld0NhdGVnb3J5U3RydWN0dXJlQWRhcHRlcih3aXNobGlzdFJlcG9zaXRvcnkpXG5cbiAgICB0aGlzLmNhdGFsb2dTZXJ2aWNlID0gbmV3IENhdGFsb2dTZXJ2aWNlPFdpc2hsaXN0PihcbiAgICAgIHByb2R1Y3RSZXBvc2l0b3J5LFxuICAgICAgcHJvZHVjdFN0b2NrTm90aWZpY2F0aW9uUmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5UmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5U3RydWN0dXJlQWRhcHRlcixcbiAgICAgIHNob3AsXG4gICAgICBwcm9kdWN0U2VhcmNoLFxuICAgIClcbiAgICB0aGlzLmNhdGVnb3J5U2VydmljZSA9IG5ldyBDYXRlZ29yeVNlcnZpY2UoXG4gICAgICBwcm9kdWN0UmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5UmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5RmlsdGVyUmVwb3NpdG9yeSxcbiAgICAgIGNhdGVnb3J5U3RydWN0dXJlQWRhcHRlcixcbiAgICAgIHNob3AsXG4gICAgKVxuICB9XG5cbiAgZ2V0Q2F0YWxvZ1NlcnZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2VcbiAgfVxuXG4gIGdldENhdGVnb3J5U2VydmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYXRlZ29yeVNlcnZpY2VcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZSh7XG4gICAgcGVyc29uSWQsXG4gICAgdGl0bGUsXG4gICAgZGVzY3JpcHRpb24sXG4gICAgcHVibGlzaGVkLFxuICAgIHVzZXJGdWxsTmFtZSxcbiAgICB1c2VyUGhvdG8sXG4gICAgdGhlbWUsXG4gICAgYmFubmVyVXJsLFxuICAgIHBlcnNvblR5cGUsXG4gICAgcGVyc29uSXNTdWJzY3JpYmVyLFxuICB9OiB7XG4gICAgcGVyc29uSWQ6IHN0cmluZ1xuICAgIHRpdGxlOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgcHVibGlzaGVkOiBib29sZWFuXG4gICAgdXNlckZ1bGxOYW1lOiBzdHJpbmdcbiAgICB1c2VyUGhvdG8/OiBzdHJpbmdcbiAgICB0aGVtZT86IHN0cmluZ1xuICAgIGJhbm5lclVybD86IHN0cmluZ1xuICAgIHBlcnNvblR5cGU/OiBQZXJzb25UeXBlXG4gICAgcGVyc29uSXNTdWJzY3JpYmVyPzogYm9vbGVhblxuICB9KTogUHJvbWlzZTxXaXNobGlzdD4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBzbHVnOiAnJyxcbiAgICAgIG5hbWU6IHRpdGxlLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBtZXRhZGF0YXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNob3A6IHRoaXMuc2hvcCxcbiAgICAgICAgICB0aXRsZTogYCR7dXNlckZ1bGxOYW1lfSAtICR7dGl0bGV9YCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7dXNlckZ1bGxOYW1lfSAtICR7ZGVzY3JpcHRpb259YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBzaG9wOiB0aGlzLnNob3AsXG4gICAgICBzaG9wczogW3RoaXMuc2hvcF0sXG4gICAgICBwZXJzb25JZCxcbiAgICAgIHBlcnNvbk5hbWU6IHVzZXJGdWxsTmFtZSxcbiAgICAgIHBlcnNvblBob3RvOiB1c2VyUGhvdG8sXG4gICAgICBicmFuZENhdGVnb3J5OiBmYWxzZSxcbiAgICAgIHB1Ymxpc2hlZCxcbiAgICAgIHRoZW1lLFxuICAgICAgYmFubmVyVXJsLFxuICAgICAgcGVyc29uVHlwZTogcGVyc29uVHlwZSA/PyBQZXJzb25UeXBlcy5OT05FLFxuICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiBwZXJzb25Jc1N1YnNjcmliZXIgPz8gZmFsc2UsXG4gICAgfVxuXG4gICAgY29uc3QgaGFzV2lzaGxpc3QgPSBhd2FpdCB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeVxuICAgICAgLmZpbmQoe1xuICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgcGVyc29uSWQsXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBlbmFibGVDb3VudDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIG9yZGVyQnk6IHtcbiAgICAgICAgICBpZDogJ2FzYycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmRhdGEpXG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVdpc2hsaXN0TG9nKFdpc2hsaXN0TG9nVHlwZS5DUkVBVEUsIGRhdGEgYXMgV2lzaGxpc3QpXG5cbiAgICBpZiAoaGFzV2lzaGxpc3QubGVuZ3RoKSByZXR1cm4gaGFzV2lzaGxpc3QuYXQoMClcblxuICAgIGNvbnN0IG5ld1dpc2hsaXN0ID0gYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuY3JlYXRlKGRhdGEpXG4gICAgYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkudXBkYXRlKHsgaWQ6IG5ld1dpc2hsaXN0LmlkLCBzbHVnOiBuZXdXaXNobGlzdC5pZCB9KVxuXG4gICAgcmV0dXJuIFdpc2hsaXN0LnRvSW5zdGFuY2UoeyAuLi5uZXdXaXNobGlzdC50b1BsYWluKCksIHNsdWc6IG5ld1dpc2hsaXN0LmlkIH0pXG4gIH1cblxuICBhc3luYyB1cGRhdGUoe1xuICAgIGlkLFxuICAgIHRpdGxlLFxuICAgIGRlc2NyaXB0aW9uLFxuICAgIHB1Ymxpc2hlZCxcbiAgICB1c2VyRnVsbE5hbWUsXG4gICAgdXNlclBob3RvLFxuICAgIHRoZW1lLFxuICAgIGJhbm5lclVybCxcbiAgICBwZXJzb25UeXBlLFxuICAgIHBlcnNvbklzU3Vic2NyaWJlcixcbiAgfToge1xuICAgIGlkOiBzdHJpbmdcbiAgICB0aXRsZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHB1Ymxpc2hlZDogYm9vbGVhblxuICAgIHVzZXJGdWxsTmFtZTogc3RyaW5nXG4gICAgdXNlclBob3RvPzogc3RyaW5nXG4gICAgdGhlbWU/OiBzdHJpbmdcbiAgICBiYW5uZXJVcmw/OiBzdHJpbmdcbiAgICBwZXJzb25UeXBlPzogUGVyc29uVHlwZVxuICAgIHBlcnNvbklzU3Vic2NyaWJlcj86IGJvb2xlYW5cbiAgfSk6IFByb21pc2U8V2lzaGxpc3Q+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiB0aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgcHVibGlzaGVkLFxuICAgICAgbWV0YWRhdGFzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzaG9wOiB0aGlzLnNob3AsXG4gICAgICAgICAgdGl0bGU6IGAke3VzZXJGdWxsTmFtZX0gLSAke3RpdGxlfWAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke3VzZXJGdWxsTmFtZX0gLSAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcGVyc29uTmFtZTogdXNlckZ1bGxOYW1lLFxuICAgICAgcGVyc29uUGhvdG86IHVzZXJQaG90byxcbiAgICAgIHRoZW1lLFxuICAgICAgYmFubmVyVXJsLFxuICAgICAgcGVyc29uVHlwZTogcGVyc29uVHlwZSA/PyBQZXJzb25UeXBlcy5OT05FLFxuICAgICAgcGVyc29uSXNTdWJzY3JpYmVyOiBwZXJzb25Jc1N1YnNjcmliZXIgPz8gZmFsc2UsXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuVVBEQVRFLCBkYXRhIGFzIFdpc2hsaXN0KVxuXG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5LnVwZGF0ZShkYXRhKVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlKHdpc2hsaXN0SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdpc2hsaXN0ID0gYXdhaXQgdGhpcy5maW5kQnlJZCh3aXNobGlzdElkKVxuICAgIGF3YWl0IHRoaXMuY3JlYXRlV2lzaGxpc3RMb2coV2lzaGxpc3RMb2dUeXBlLkRFTEVURSwgd2lzaGxpc3QpXG5cbiAgICByZXR1cm4gdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuZGVsZXRlKHsgaWQ6IHdpc2hsaXN0SWQgfSlcbiAgfVxuXG4gIGdldFdpc2hsaXN0QnlTbHVnKHNsdWc6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3Q+IHtcbiAgICBjb25zdCBbaWRdID0gc2x1Zy5zcGxpdCgnLScpXG5cbiAgICBpZiAoK2lkKSByZXR1cm4gdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuZ2V0KHsgaWQgfSlcblxuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXRXaXNobGlzdEJ5U2x1ZyhzbHVnKVxuICB9XG5cbiAgZ2V0V2lzaGxpc3RzQnlQZXJzb24ocGVyc29uSWQ6IHN0cmluZyk6IFByb21pc2U8V2lzaGxpc3RbXT4ge1xuICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS5nZXRXaXNobGlzdEJ5UGVyc29uKHBlcnNvbklkKVxuICB9XG5cbiAgYXN5bmMgYWRkUHJvZHVjdCh3aXNobGlzdElkOiBzdHJpbmcsIHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTxXaXNobGlzdD4ge1xuICAgIGNvbnN0IHdpc2hsaXN0ID0gYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuZ2V0KHsgaWQ6IHdpc2hsaXN0SWQgfSlcbiAgICBjb25zdCBoYXNQcm9kdWN0ID0gd2lzaGxpc3QucHJvZHVjdHMuc29tZSgocCkgPT4gcCA9PSBwcm9kdWN0SWQpXG5cbiAgICBjb25zdCB3aXNobGlzdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRCeUlkKHdpc2hsaXN0SWQpXG4gICAgY29uc3QgcHJvZHVjdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRQcm9kdWN0QnlJZChwcm9kdWN0SWQpXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVXaXNobGlzdExvZyhXaXNobGlzdExvZ1R5cGUuQUREX1BST0RVQ1QsIHdpc2hsaXN0RGF0YSwgcHJvZHVjdERhdGEpXG5cbiAgICBpZiAoIWhhc1Byb2R1Y3QpIHtcbiAgICAgIHdpc2hsaXN0LnByb2R1Y3RzID0gWy4uLndpc2hsaXN0LnByb2R1Y3RzLCBwcm9kdWN0SWRdXG4gICAgICByZXR1cm4gdGhpcy53aXNobGlzdFJlcG9zaXRvcnkudXBkYXRlKHsgaWQ6IHdpc2hsaXN0SWQsIHByb2R1Y3RzOiB3aXNobGlzdC5wcm9kdWN0cyB9KVxuICAgIH1cblxuICAgIHJldHVybiB3aXNobGlzdFxuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUHJvZHVjdCh3aXNobGlzdElkOiBzdHJpbmcsIHByb2R1Y3RJZDogc3RyaW5nKTogUHJvbWlzZTxXaXNobGlzdD4ge1xuICAgIGNvbnN0IHdpc2hsaXN0ID0gYXdhaXQgdGhpcy53aXNobGlzdFJlcG9zaXRvcnkuZ2V0KHsgaWQ6IHdpc2hsaXN0SWQgfSlcbiAgICBjb25zdCBwcm9kdWN0SW5kZXggPSB3aXNobGlzdC5wcm9kdWN0cy5maW5kSW5kZXgoKHApID0+IHAgPT0gcHJvZHVjdElkKVxuXG4gICAgaWYgKHByb2R1Y3RJbmRleCAhPSAtMSkge1xuICAgICAgd2lzaGxpc3QucHJvZHVjdHMuc3BsaWNlKHByb2R1Y3RJbmRleCwgMSlcblxuICAgICAgY29uc3Qgd2lzaGxpc3REYXRhID0gYXdhaXQgdGhpcy5maW5kQnlJZCh3aXNobGlzdElkKVxuICAgICAgY29uc3QgcHJvZHVjdERhdGEgPSBhd2FpdCB0aGlzLmZpbmRQcm9kdWN0QnlJZChwcm9kdWN0SWQpXG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVdpc2hsaXN0TG9nKFdpc2hsaXN0TG9nVHlwZS5SRU1PVkVfUFJPRFVDVCwgd2lzaGxpc3REYXRhLCBwcm9kdWN0RGF0YSlcblxuICAgICAgaWYgKCF3aXNobGlzdC5wcm9kdWN0cy5sZW5ndGgpXG4gICAgICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS51cGRhdGUoeyBpZDogd2lzaGxpc3RJZCwgcHJvZHVjdHM6IHsgYWN0aW9uOiAncmVtb3ZlJyB9IH0pXG5cbiAgICAgIHJldHVybiB0aGlzLndpc2hsaXN0UmVwb3NpdG9yeS51cGRhdGUoeyBpZDogd2lzaGxpc3RJZCwgcHJvZHVjdHM6IHdpc2hsaXN0LnByb2R1Y3RzIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHdpc2hsaXN0XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFdpc2hsaXN0PiB7XG4gICAgcmV0dXJuIHRoaXMud2lzaGxpc3RSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpZWxkczogWydpZCcsICduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ3BlcnNvbklkJywgJ3BlcnNvbklzU3Vic2NyaWJlcicsICdwZXJzb25UeXBlJywgJ3BlcnNvbk5hbWUnXSxcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5kYXRhLmF0KDApKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kUHJvZHVjdEJ5SWQoaWQ6IHN0cmluZyk6IFByb21pc2U8UHJvZHVjdD4ge1xuICAgIHJldHVybiB0aGlzLnByb2R1Y3RSZXBvc2l0b3J5XG4gICAgICAuZmluZCh7XG4gICAgICAgIGZpZWxkczogWydpZCcsICdza3UnLCAnRUFOJywgJ25hbWUnLCAnYnJhbmQnXSxcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXMpID0+IHJlcy5kYXRhLmF0KDApKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVXaXNobGlzdExvZyh0eXBlOiBXaXNobGlzdExvZ1R5cGUsIHdpc2hsaXN0OiBXaXNobGlzdCwgcHJvZHVjdD86IFByb2R1Y3QpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkNSRUFURTpcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLlVQREFURTpcbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkRFTEVURTpcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dSZXBvc2l0b3J5LmNyZWF0ZSh7XG4gICAgICAgICAgY29sbGVjdGlvbjogJ3dpc2hsaXN0JyxcbiAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG9wZXJhdGlvbjogV2lzaGxpc3RMb2dUeXBlLkNSRUFURSA/ICdDUkVBVEUnIDogV2lzaGxpc3RMb2dUeXBlLlVQREFURSA/ICdVUERBVEUnIDogJ0RFTEVURScsXG4gICAgICAgICAgZG9jdW1lbnRJZDogd2lzaGxpc3QuaWQsXG4gICAgICAgICAgZG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIGlkOiB3aXNobGlzdC5pZCxcbiAgICAgICAgICAgIHNob3A6IHRoaXMuc2hvcCxcbiAgICAgICAgICAgIG5hbWU6IHdpc2hsaXN0Lm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogd2lzaGxpc3QuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwdWJsaXNoZWQ6IHdpc2hsaXN0LnB1Ymxpc2hlZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBwZXJzb25UeXBlOiB3aXNobGlzdC5wZXJzb25UeXBlLFxuICAgICAgICAgICAgcGVyc29uSWQ6IHdpc2hsaXN0LnBlcnNvbklkLFxuICAgICAgICAgICAgcGVyc29uTmFtZTogd2lzaGxpc3QucGVyc29uTmFtZSxcbiAgICAgICAgICAgIHBlcnNvbklzU3Vic2NyaWJlcjogd2lzaGxpc3QucGVyc29uSXNTdWJzY3JpYmVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgV2lzaGxpc3RMb2dUeXBlLkFERF9QUk9EVUNUOlxuICAgICAgY2FzZSBXaXNobGlzdExvZ1R5cGUuUkVNT1ZFX1BST0RVQ1Q6XG4gICAgICAgIGF3YWl0IHRoaXMubG9nUmVwb3NpdG9yeS5jcmVhdGUoe1xuICAgICAgICAgIGNvbGxlY3Rpb246ICd3aXNobGlzdCcsXG4gICAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBvcGVyYXRpb246ICdVUERBVEUnLFxuICAgICAgICAgIGRvY3VtZW50SWQ6IHdpc2hsaXN0LmlkLFxuICAgICAgICAgIGRvY3VtZW50OiB7XG4gICAgICAgICAgICBpZDogd2lzaGxpc3QuaWQsXG4gICAgICAgICAgICBzaG9wOiB0aGlzLnNob3AsXG4gICAgICAgICAgICBuYW1lOiB3aXNobGlzdC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHdpc2hsaXN0LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHVibGlzaGVkOiB3aXNobGlzdC5wdWJsaXNoZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgcGVyc29uVHlwZTogd2lzaGxpc3QucGVyc29uVHlwZSxcbiAgICAgICAgICAgIHBlcnNvbklkOiB3aXNobGlzdC5wZXJzb25JZCxcbiAgICAgICAgICAgIHBlcnNvbk5hbWU6IHdpc2hsaXN0LnBlcnNvbk5hbWUsXG4gICAgICAgICAgICBwZXJzb25Jc1N1YnNjcmliZXI6IHdpc2hsaXN0LnBlcnNvbklzU3Vic2NyaWJlcixcbiAgICAgICAgICAgIHByb2R1Y3RJZDogcHJvZHVjdC5pZCxcbiAgICAgICAgICAgIHByb2R1Y3RFQU46IHByb2R1Y3QuRUFOLFxuICAgICAgICAgICAgcHJvZHVjdFNLVTogcHJvZHVjdC5za3UsXG4gICAgICAgICAgICBwcm9kdWN0TmFtZTogcHJvZHVjdC5uYW1lLFxuICAgICAgICAgICAgcHJvZHVjdEJyYW5kOiBwcm9kdWN0LmJyYW5kLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG59XG4iXX0=