@snabcentr/client-core 3.8.1 → 3.10.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.
@@ -9,7 +9,32 @@ export interface ScICompanyBaseInfo {
9
9
  /**
10
10
  * Адрес компании.
11
11
  */
12
- readonly address: string;
12
+ readonly address: {
13
+ /**
14
+ * Страна.
15
+ */
16
+ readonly country: string;
17
+ /**
18
+ * Регион.
19
+ */
20
+ readonly region: string;
21
+ /**
22
+ * Населенный пункт.
23
+ */
24
+ readonly locality: string;
25
+ /**
26
+ * Улица, дом, корпус, строение и т. п. (то есть адрес с точностью до здания).
27
+ */
28
+ readonly streetAddress: string;
29
+ /**
30
+ * Подъезд, этаж, офис и т. п. (то есть сведения о местонахождении внутри здания), название торгового или бизнес-центра, а также любое описание, не являющееся точным адресом.
31
+ */
32
+ readonly extendedAddress?: string;
33
+ /**
34
+ * Почтовый индекс.
35
+ */
36
+ readonly postalCode: string;
37
+ };
13
38
  /**
14
39
  * Юридический адрес компании.
15
40
  */
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtaS1jb21wYW55LWJhc2UtaW5mby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvY29uZmlnL3NjLWktY29tcGFueS1iYXNlLWluZm8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog0JHQsNC30L7QstCw0Y8g0LjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0LrQvtC80L/QsNC90LjQuC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY0lDb21wYW55QmFzZUluZm8ge1xuICAgIC8qKlxuICAgICAqINCd0LDQt9Cy0LDQvdC40LUg0LrQvtC80L/QsNC90LjQuC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDQkNC00YDQtdGBINC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWRkcmVzczogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICog0K7RgNC40LTQuNGH0LXRgdC60LjQuSDQsNC00YDQtdGBINC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgcmVhZG9ubHkgbGVnYWxBZGRyZXNzOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDQkNC00YDQtdGB0LAg0YHQutC70LDQtNC+0LIg0YHQsNC80L7QstGL0LLQvtC30LAg0LrQvtC80L/QsNC90LjQuC5cbiAgICAgKi9cbiAgICByZWFkb25seSB3YXJlaG91c2VBZGRyZXNzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqINCQ0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLINC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWFpbDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICog0KLQtdC70LXRhNC+0L0g0LrQvtC80L/QsNC90LjQuC5cbiAgICAgKi9cbiAgICByZWFkb25seSBwaG9uZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICog0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQuSDRgtC10LvQtdGE0L7QvS5cbiAgICAgKi9cbiAgICByZWFkb25seSBzZWNvbmRhcnlQaG9uZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqINCe0JPQoNCdICjQntGB0L3QvtCy0L3QvtC5INCz0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC90YvQuSDRgNC10LPQuNGB0YLRgNCw0YbQuNC+0L3QvdGL0Lkg0L3QvtC80LXRgCkuXG4gICAgICovXG4gICAgcmVhZG9ubHkgb2dybjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICog0JjQndCdICjQmNC00LXQvdGC0LjRhNC40LrQsNGG0LjQvtC90L3Ri9C5INC90L7QvNC10YAg0L3QsNC70L7Qs9C+0L/Qu9Cw0YLQtdC70YzRidC40LrQsCkuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaW5uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDQlNCw0L3QvdGL0LUgSFIt0L7RgtC00LXQu9CwINC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgcmVhZG9ubHkgaHI/OiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQkNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRiyBIUi3QvtGC0LTQtdC70LAg0LrQvtC80L/QsNC90LjQuC5cbiAgICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IG1haWw6IHN0cmluZztcblxuICAgICAgICAvKipcbiAgICAgICAgICog0KLQtdC70LXRhNC+0L0gSFIt0L7RgtC00LXQu9CwINC60L7QvNC/0LDQvdC40LguXG4gICAgICAgICAqL1xuICAgICAgICByZWFkb25seSBwaG9uZTogc3RyaW5nO1xuICAgIH07XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtaS1jb21wYW55LWJhc2UtaW5mby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvY29uZmlnL3NjLWktY29tcGFueS1iYXNlLWluZm8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog0JHQsNC30L7QstCw0Y8g0LjQvdGE0L7RgNC80LDRhtC40Y8g0L4g0LrQvtC80L/QsNC90LjQuC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY0lDb21wYW55QmFzZUluZm8ge1xuICAgIC8qKlxuICAgICAqINCd0LDQt9Cy0LDQvdC40LUg0LrQvtC80L/QsNC90LjQuC5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDQkNC00YDQtdGBINC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWRkcmVzczoge1xuICAgICAgICAvKipcbiAgICAgICAgICog0KHRgtGA0LDQvdCwLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgY291bnRyeTogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQoNC10LPQuNC+0L0uXG4gICAgICAgICAqL1xuICAgICAgICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAgICAgICAvKipcbiAgICAgICAgICog0J3QsNGB0LXQu9C10L3QvdGL0Lkg0L/Rg9C90LrRgi5cbiAgICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGxvY2FsaXR5OiBzdHJpbmc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCj0LvQuNGG0LAsINC00L7QvCwg0LrQvtGA0L/Rg9GBLCDRgdGC0YDQvtC10L3QuNC1INC4INGCLiDQvy4gKNGC0L4g0LXRgdGC0Ywg0LDQtNGA0LXRgSDRgSDRgtC+0YfQvdC+0YHRgtGM0Y4g0LTQviDQt9C00LDQvdC40Y8pLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgc3RyZWV0QWRkcmVzczogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQn9C+0LTRitC10LfQtCwg0Y3RgtCw0LYsINC+0YTQuNGBINC4INGCLiDQvy4gKNGC0L4g0LXRgdGC0Ywg0YHQstC10LTQtdC90LjRjyDQviDQvNC10YHRgtC+0L3QsNGF0L7QttC00LXQvdC40Lgg0LLQvdGD0YLRgNC4INC30LTQsNC90LjRjyksINC90LDQt9Cy0LDQvdC40LUg0YLQvtGA0LPQvtCy0L7Qs9C+INC40LvQuCDQsdC40LfQvdC10YEt0YbQtdC90YLRgNCwLCDQsCDRgtCw0LrQttC1INC70Y7QsdC+0LUg0L7Qv9C40YHQsNC90LjQtSwg0L3QtSDRj9Cy0LvRj9GO0YnQtdC10YHRjyDRgtC+0YfQvdGL0Lwg0LDQtNGA0LXRgdC+0LwuXG4gICAgICAgICAqL1xuICAgICAgICByZWFkb25seSBleHRlbmRlZEFkZHJlc3M/OiBzdHJpbmc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqINCf0L7Rh9GC0L7QstGL0Lkg0LjQvdC00LXQutGBLlxuICAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgcG9zdGFsQ29kZTogc3RyaW5nO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiDQrtGA0LjQtNC40YfQtdGB0LrQuNC5INCw0LTRgNC10YEg0LrQvtC80L/QsNC90LjQuC5cbiAgICAgKi9cbiAgICByZWFkb25seSBsZWdhbEFkZHJlc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqINCQ0LTRgNC10YHQsCDRgdC60LvQsNC00L7QsiDRgdCw0LzQvtCy0YvQstC+0LfQsCDQutC+0LzQv9Cw0L3QuNC4LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHdhcmVob3VzZUFkZHJlc3M6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICog0JDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0Ysg0LrQvtC80L/QsNC90LjQuC5cbiAgICAgKi9cbiAgICByZWFkb25seSBtYWlsOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDQotC10LvQtdGE0L7QvSDQutC+0LzQv9Cw0L3QuNC4LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHBob25lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C5INGC0LXQu9C10YTQvtC9LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlY29uZGFyeVBob25lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICog0J7Qk9Cg0J0gKNCe0YHQvdC+0LLQvdC+0Lkg0LPQvtGB0YPQtNCw0YDRgdGC0LLQtdC90L3Ri9C5INGA0LXQs9C40YHRgtGA0LDRhtC40L7QvdC90YvQuSDQvdC+0LzQtdGAKS5cbiAgICAgKi9cbiAgICByZWFkb25seSBvZ3JuOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiDQmNCd0J0gKNCY0LTQtdC90YLQuNGE0LjQutCw0YbQuNC+0L3QvdGL0Lkg0L3QvtC80LXRgCDQvdCw0LvQvtCz0L7Qv9C70LDRgtC10LvRjNGJ0LjQutCwKS5cbiAgICAgKi9cbiAgICByZWFkb25seSBpbm46IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqINCU0LDQvdC90YvQtSBIUi3QvtGC0LTQtdC70LAg0LrQvtC80L/QsNC90LjQuC5cbiAgICAgKi9cbiAgICByZWFkb25seSBocj86IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqINCQ0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLIEhSLdC+0YLQtNC10LvQsCDQutC+0LzQv9Cw0L3QuNC4LlxuICAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgbWFpbDogc3RyaW5nO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiDQotC10LvQtdGE0L7QvSBIUi3QvtGC0LTQtdC70LAg0LrQvtC80L/QsNC90LjQuC5cbiAgICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IHBob25lOiBzdHJpbmc7XG4gICAgfTtcbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import { inject, Injectable } from '@angular/core';
2
- import { isArray } from 'lodash-es';
2
+ import { isArray, omit } from 'lodash-es';
3
3
  import { ScIdOrSlugPipe } from '../../pipes/sc-id-or-slug.pipe';
4
4
  import { ScMediaImageTransformerPipe } from '../../pipes/sc-media-image-transformer.pipe';
5
5
  import { SC_COMPANY_INFO } from '../../tokens/sc-company-info';
@@ -32,36 +32,36 @@ export class SchemaOrgFactory {
32
32
  *
33
33
  * @param product Данные о продукте.
34
34
  * @param productPath Url путь к товару. В пути должен присутствовать шаблон ':id', обозначающий идентификатор товара для подстановки.
35
+ * @param id Необязательный идентификатор сущности для поля `@id` в JSON-LD.
35
36
  */
36
- generateForProductItem(product, productPath) {
37
+ generateForProductItem(product, productPath, id) {
37
38
  const productUrl = `${this.urls.siteUrl}${productPath.replace(':id', this.idOrSlugPipe.transform(product).toString())}`;
38
39
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
39
- const image = this.mediaImageTransformerPipe.transform(product?.getImagePreview() ?? product.image, true);
40
+ const image = this.mediaImageTransformerPipe.transform(product?.getImagePreview?.() ?? product.image, true);
40
41
  const description = product.properties?.description;
41
42
  const priceValidUntil = this.normalizePriceValidUntil(product.discount?.expiredAt);
42
43
  return {
43
44
  '@context': 'https://schema.org',
44
45
  '@type': 'Product',
46
+ ...(id && { '@id': id }),
45
47
  name: product.name,
46
48
  ...(image && { image }),
47
49
  ...(description && { description }),
48
50
  mpn: product.code,
49
51
  url: productUrl,
50
- offers: [
51
- {
52
- '@type': 'Offer',
53
- priceCurrency: 'RUB',
54
- ...(priceValidUntil && { priceValidUntil }),
55
- price: product.costRub,
56
- availability: this.getAvailability(product),
57
- itemCondition: 'https://schema.org/NewCondition',
58
- seller: {
59
- '@type': 'Organization',
60
- name: this.companyInfo.name,
61
- },
62
- url: productUrl,
52
+ offers: {
53
+ '@type': 'Offer',
54
+ priceCurrency: 'RUB',
55
+ ...(priceValidUntil && { priceValidUntil }),
56
+ price: product.costRub,
57
+ availability: this.getAvailability(product),
58
+ itemCondition: 'https://schema.org/NewCondition',
59
+ seller: {
60
+ '@type': 'Organization',
61
+ name: this.companyInfo.name,
63
62
  },
64
- ],
63
+ url: productUrl,
64
+ },
65
65
  };
66
66
  }
67
67
  /**
@@ -72,13 +72,15 @@ export class SchemaOrgFactory {
72
72
  * @param categoryPath Url путь к категориям товаров. В пути должен присутствовать шаблон ':id', обозначающий идентификатор категории для подстановки.
73
73
  * @param productPath Url путь к товару. В пути должен присутствовать шаблон ':id', обозначающий идентификатор товара для подстановки.
74
74
  * @param breadcrumbs Данные о хлебных крошках для категории.
75
+ * @param id Необязательный идентификатор сущности для поля `@id` в JSON-LD.
75
76
  */
76
- generateForCategoryItem(category, products, categoryPath, productPath, breadcrumbs) {
77
+ generateForCategoryItem(category, products, categoryPath, productPath, breadcrumbs, id) {
77
78
  const description = category.seo?.description ?? category.properties?.description;
78
79
  const image = this.mediaImageTransformerPipe.transform(category.image, true);
79
80
  return {
80
81
  '@context': 'https://schema.org',
81
82
  '@type': 'CollectionPage',
83
+ ...(id && { '@id': id }),
82
84
  name: category.seo?.title ?? category.name,
83
85
  ...(description && { description }),
84
86
  url: this.getCategoryCanonicalUrl(category, categoryPath),
@@ -142,6 +144,110 @@ export class SchemaOrgFactory {
142
144
  ],
143
145
  };
144
146
  }
147
+ /**
148
+ * Генерирует и возвращает схему данных OnlineStore на основе данных компании из окружения.
149
+ */
150
+ // eslint-disable-next-line sonarjs/function-return-type
151
+ generateForOrganization() {
152
+ const postalAddress = this.createPostalAddress(this.companyInfo.address);
153
+ return {
154
+ '@context': 'https://schema.org',
155
+ '@type': 'OnlineStore',
156
+ '@id': `${this.urls.siteUrl}#organization`,
157
+ name: this.companyInfo.name,
158
+ legalName: this.companyInfo.name,
159
+ url: this.urls.siteUrl,
160
+ logo: this.urls.logoUrl,
161
+ image: this.urls.logoUrl,
162
+ email: this.companyInfo.mail,
163
+ telephone: this.companyInfo.phone,
164
+ ...(postalAddress && { address: postalAddress }),
165
+ legalAddress: this.createPostalAddress({ streetAddress: this.companyInfo.legalAddress }),
166
+ // TODO: Перечислить все розничные магазины.
167
+ // hasPOS: [],
168
+ taxID: this.companyInfo.inn,
169
+ identifier: {
170
+ '@type': 'PropertyValue',
171
+ propertyID: 'OGRN',
172
+ value: this.companyInfo.ogrn,
173
+ },
174
+ contactPoint: this.createOrganizationContactPoints(),
175
+ ...(this.companyInfo.warehouseAddress.length > 0 && {
176
+ location: this.companyInfo.warehouseAddress.map((warehouseAddress) => ({
177
+ '@type': 'Place',
178
+ name: `${this.companyInfo.name} — склад самовывоза`,
179
+ address: warehouseAddress,
180
+ })),
181
+ }),
182
+ };
183
+ }
184
+ /**
185
+ * Объединяет несколько JSON-LD сущностей в один документ с `@graph`.
186
+ *
187
+ * @param data Массив JSON-LD сущностей для объединения.
188
+ */
189
+ // eslint-disable-next-line class-methods-use-this,sonarjs/function-return-type
190
+ merge(data) {
191
+ return {
192
+ '@context': 'https://schema.org',
193
+ '@graph': data.map((item) => omit(item, '@context')),
194
+ };
195
+ }
196
+ /**
197
+ * Формирует PostalAddress из структурированного адреса компании.
198
+ *
199
+ * @param address Структурированный адрес компании.
200
+ */
201
+ // eslint-disable-next-line class-methods-use-this
202
+ createPostalAddress(address) {
203
+ const streetAddress = [address.streetAddress, address.extendedAddress].filter(Boolean).join(', ');
204
+ if (!streetAddress && !address.locality && !address.region && !address.postalCode && !address.country) {
205
+ return undefined;
206
+ }
207
+ return {
208
+ '@type': 'PostalAddress',
209
+ ...(streetAddress && { streetAddress }),
210
+ ...(address.locality && { addressLocality: address.locality }),
211
+ ...(address.region && { addressRegion: address.region }),
212
+ ...(address.postalCode && { postalCode: address.postalCode }),
213
+ ...(address.country && { addressCountry: address.country }),
214
+ };
215
+ }
216
+ /**
217
+ * Формирует список ContactPoint для Organization.
218
+ */
219
+ createOrganizationContactPoints() {
220
+ const contactPoints = [
221
+ {
222
+ '@type': 'ContactPoint',
223
+ contactType: 'customer service',
224
+ telephone: this.companyInfo.phone,
225
+ email: this.companyInfo.mail,
226
+ areaServed: 'RU',
227
+ availableLanguage: 'Russian',
228
+ },
229
+ ];
230
+ if (this.companyInfo.secondaryPhone) {
231
+ contactPoints.push({
232
+ '@type': 'ContactPoint',
233
+ contactType: 'customer service',
234
+ telephone: this.companyInfo.secondaryPhone,
235
+ areaServed: 'RU',
236
+ availableLanguage: 'Russian',
237
+ });
238
+ }
239
+ if (this.companyInfo.hr) {
240
+ contactPoints.push({
241
+ '@type': 'ContactPoint',
242
+ contactType: 'HR',
243
+ telephone: this.companyInfo.hr.phone,
244
+ email: this.companyInfo.hr.mail,
245
+ areaServed: 'RU',
246
+ availableLanguage: 'Russian',
247
+ });
248
+ }
249
+ return contactPoints;
250
+ }
145
251
  /**
146
252
  * Нормализует дату окончания цены в формат Schema.org (YYYY-MM-DD).
147
253
  *
@@ -163,9 +269,9 @@ export class SchemaOrgFactory {
163
269
  // eslint-disable-next-line class-methods-use-this
164
270
  getAvailability(product) {
165
271
  if (product.onOrder) {
166
- return 'PreOrder';
272
+ return 'https://schema.org/PreOrder';
167
273
  }
168
- return product.stockCount?.length ? 'InStock' : 'OutOfStock';
274
+ return product.stockCount?.length ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock';
169
275
  }
170
276
  /**
171
277
  * Проверяет, является ли категория виртуальной.
@@ -209,21 +315,19 @@ export class SchemaOrgFactory {
209
315
  url: productUrl,
210
316
  ...(image && { image }),
211
317
  ...(description && { description }),
212
- offers: [
213
- {
214
- '@type': 'Offer',
215
- priceCurrency: 'RUB',
216
- ...(priceValidUntil && { priceValidUntil }),
217
- price: product.costRub,
218
- availability: this.getAvailability(product),
219
- itemCondition: 'https://schema.org/NewCondition',
220
- seller: {
221
- '@type': 'Organization',
222
- name: this.companyInfo.name,
223
- },
224
- url: productUrl,
318
+ offers: {
319
+ '@type': 'Offer',
320
+ priceCurrency: 'RUB',
321
+ ...(priceValidUntil && { priceValidUntil }),
322
+ price: product.costRub,
323
+ availability: this.getAvailability(product),
324
+ itemCondition: 'https://schema.org/NewCondition',
325
+ seller: {
326
+ '@type': 'Organization',
327
+ name: this.companyInfo.name,
225
328
  },
226
- ],
329
+ url: productUrl,
330
+ },
227
331
  },
228
332
  };
229
333
  }
@@ -245,14 +349,21 @@ export class SchemaOrgFactory {
245
349
  itemListOrder: 'https://schema.org/ItemListUnordered',
246
350
  itemListElement: [
247
351
  // Добавляем подкатегории в начало списка.
248
- ...childCategories.slice(0, 5).map((subCategory, index) => ({
249
- '@type': 'ListItem',
250
- position: index + 1,
251
- name: subCategory.name,
252
- url: this.getCategoryCanonicalUrl(subCategory, categoryPath),
253
- image: this.mediaImageTransformerPipe.transform(subCategory.image, true),
254
- description: subCategory.seo?.description ?? subCategory.properties?.description,
255
- })),
352
+ ...childCategories.slice(0, 5).map((subCategory, index) => {
353
+ const image = this.mediaImageTransformerPipe.transform(subCategory.image, true);
354
+ const description = subCategory.seo?.description ?? subCategory.properties?.description;
355
+ return {
356
+ '@type': 'ListItem',
357
+ position: index + 1,
358
+ item: {
359
+ '@type': 'CollectionPage',
360
+ name: subCategory.name,
361
+ url: this.getCategoryCanonicalUrl(subCategory, categoryPath),
362
+ ...(image && { image }),
363
+ ...(description && { description }),
364
+ },
365
+ };
366
+ }),
256
367
  // Добавляем товары после подкатегорий.
257
368
  ...products.slice(0, 10).map((product, index) => this.createProductsListItem(product, childCategories.length + index + 1, productPath)),
258
369
  ],
@@ -265,37 +376,46 @@ export class SchemaOrgFactory {
265
376
  * @param categoryPath Url путь к категориям товаров. В пути должен присутствовать шаблон ':id', обозначающий идентификатор категории для подстановки.
266
377
  */
267
378
  createCatalogBreadcrumbsList(breadcrumbs, categoryPath) {
379
+ const catalogUrl = `${this.urls.siteUrl}${categoryPath.replace(':id', '')}`;
268
380
  const breadcrumbItems = [
269
381
  // Всегда добавляем главную страницу.
270
- {
271
- '@type': 'ListItem',
272
- position: 1,
273
- name: 'Главная',
274
- item: this.urls.siteUrl,
275
- },
382
+ this.createBreadcrumbListItem(1, 'Главная', this.urls.siteUrl),
276
383
  // Добавляем каталог.
277
- {
278
- '@type': 'ListItem',
279
- position: 2,
280
- name: 'Каталог',
281
- item: `${this.urls.siteUrl}/${categoryPath}`,
282
- },
384
+ this.createBreadcrumbListItem(2, 'Каталог', catalogUrl),
283
385
  ];
284
386
  // Добавляем существующие breadcrumbs с корректировкой позиций.
285
387
  breadcrumbs.forEach((item, index) => {
286
388
  const link = isArray(item.routerLink) ? item.routerLink.join('/') : item.routerLink;
287
- breadcrumbItems.push({
288
- '@type': 'ListItem',
289
- position: index + 3, // Начинаем с позиции 3 (после Главная и Каталог).
290
- name: item.label,
291
- item: link ? `${this.urls.siteUrl}/${link}` : undefined,
292
- });
389
+ breadcrumbItems.push(this.createBreadcrumbListItem(index + 3, item.label, link ? `${this.urls.siteUrl}/${link}` : undefined));
293
390
  });
294
391
  return {
295
392
  '@type': 'BreadcrumbList',
393
+ itemListOrder: 'https://schema.org/ItemListOrderAscending',
296
394
  itemListElement: breadcrumbItems,
297
395
  };
298
396
  }
397
+ /**
398
+ * Создаёт элемент BreadcrumbList в формате, рекомендованном Schema.org.
399
+ *
400
+ * @param position Позиция элемента в цепочке.
401
+ * @param name Название элемента.
402
+ * @param url URL элемента.
403
+ */
404
+ // eslint-disable-next-line class-methods-use-this
405
+ createBreadcrumbListItem(position, name, url) {
406
+ return {
407
+ '@type': 'ListItem',
408
+ position,
409
+ ...(url
410
+ ? {
411
+ item: {
412
+ '@id': url,
413
+ name,
414
+ },
415
+ }
416
+ : { name }),
417
+ };
418
+ }
299
419
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SchemaOrgFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
300
420
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SchemaOrgFactory, providedIn: 'root' }); }
301
421
  }
@@ -305,4 +425,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
305
425
  providedIn: 'root',
306
426
  }]
307
427
  }] });
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLW9yZy1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zZW8vY2xhc3Nlcy9zY2hlbWEtb3JnLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVNwQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHL0M7O0dBRUc7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSDdCO1FBSUk7O1dBRUc7UUFDYyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV2RDs7V0FFRztRQUNjLFNBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEM7O1dBRUc7UUFDSyxpQkFBWSxHQUFtQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFOUQ7O1dBRUc7UUFDYyw4QkFBeUIsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztLQXdTcEY7SUF0U0c7Ozs7O09BS0c7SUFDSSxzQkFBc0IsQ0FBQyxPQUFtQixFQUFFLFdBQW1CO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hILHVF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QkFDZixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxZQUFZLEVBQUU7YUFDL0M7U0FDSixDQUFDO1FBRUYsK0RBQStEO1FBQy9ELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFFcEYsZUFBZSxDQUFDLElBQUksQ0FBQztnQkFDakIsT0FBTyxFQUFFLFVBQVU7Z0JBQ25CLFFBQVEsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLGtEQUFrRDtnQkFDdkUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQzFELENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNILE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsZUFBZSxFQUFFLGVBQWU7U0FDakIsQ0FBQztJQUN4QixDQUFDOytHQTFUUSxnQkFBZ0I7bUhBQWhCLGdCQUFnQixjQUZiLE1BQU07OzRGQUVULGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYkxpc3QsIENvbGxlY3Rpb25QYWdlLCBMaXN0SXRlbSwgUHJvZHVjdCwgV2l0aENvbnRleHQgfSBmcm9tICdzY2hlbWEtZHRzJztcblxuaW1wb3J0IHsgU2NDYXRlZ29yeSB9IGZyb20gJy4uLy4uL2NhdGFsb2cvZHRvL3NjLWNhdGVnb3J5JztcbmltcG9ydCB7IFNjUHJvZHVjdCB9IGZyb20gJy4uLy4uL2NhdGFsb2cvZHRvL3NjLXByb2R1Y3QnO1xuaW1wb3J0IHsgU2NWaXJ0dWFsQ2F0ZWdvcnkgfSBmcm9tICcuLi8uLi9jYXRhbG9nL2R0by9zYy12aXJ0dWFsLWNhdGVnb3J5JztcbmltcG9ydCB7IFNjSUNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vY2F0YWxvZy9pbnRlcmZhY2VzL3NjLWktY2F0ZWdvcnknO1xuaW1wb3J0IHsgU2NJUHJvZHVjdCB9IGZyb20gJy4uLy4uL2NhdGFsb2cvaW50ZXJmYWNlcy9zYy1pLXByb2R1Y3QnO1xuaW1wb3J0IHsgU2NJVmlydHVhbENhdGVnb3J5IH0gZnJvbSAnLi4vLi4vY2F0YWxvZy9pbnRlcmZhY2VzL3NjLWktdmlydHVhbC1jYXRlZ29yeSc7XG5pbXBvcnQgeyBTY0lkT3JTbHVnUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3NjLWlkLW9yLXNsdWcucGlwZSc7XG5pbXBvcnQgeyBTY01lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9zYy1tZWRpYS1pbWFnZS10cmFuc2Zvcm1lci5waXBlJztcbmltcG9ydCB7IFNDX0NPTVBBTllfSU5GTyB9IGZyb20gJy4uLy4uL3Rva2Vucy9zYy1jb21wYW55LWluZm8nO1xuaW1wb3J0IHsgU0NfVVJMUyB9IGZyb20gJy4uLy4uL3Rva2Vucy9zYy11cmxzJztcbmltcG9ydCB7IFNjSUJyZWFkY3J1bWJJdGVtIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbi8qKlxuICog0JzQtdGF0LDQvdC40LfQvNGLINCz0LXQvdC10YDQsNGG0LjQuCDRgdGF0LXQvCDQtNCw0L3QvdGL0YUgU2NoZW1hLm9yZy5cbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NoZW1hT3JnRmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICog0JTQsNC90L3Ri9C1INC+INC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21wYW55SW5mbyA9IGluamVjdChTQ19DT01QQU5ZX0lORk8pO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INGB0YHRi9C70L7QuiDQv9GA0LjQu9C+0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybHMgPSBpbmplY3QoU0NfVVJMUyk7XG5cbiAgICAvKipcbiAgICAgKiDQn9Cw0LnQvywg0LLQvtC30LLRgNCw0YnQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCDRgdC40LzQstC+0LvRjNC90L7QtSDQvtCx0L7Qt9C90LDRh9C10L3QuNC1IChzbHVnKSDQuNGB0YXQvtC00Y8g0LjQtyDQvdCw0YHRgtGA0L7QtdC6INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlkT3JTbHVnUGlwZTogU2NJZE9yU2x1Z1BpcGUgPSBpbmplY3QoU2NJZE9yU2x1Z1BpcGUpO1xuXG4gICAgLyoqXG4gICAgICog0J/QsNC50L8g0LTQu9GPINGE0L7RgNC80LjRgNC+0LLQsNC90LjRjyDQv9C+0LvQvdC+0LPQviBVUkkg0LjQt9C+0LHRgNCw0LbQtdC90LjRjyDQvdCwIG1lZGlhINGB0LXRgNCy0LXRgNC1LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZSA9IGluamVjdChTY01lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUpO1xuXG4gICAgLyoqXG4gICAgICog0JPQtdC90LXRgNC40YDRg9C10YIg0Lgg0LLQvtC30LLRgNCw0YnQsNC10YIg0YHRhdC10LzRgyDQtNCw0L3QvdGL0YUg0LTQu9GPINGD0LrQsNC30LDQvdC90L7Qs9C+INC/0YDQvtC00YPQutGC0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQtS5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFBhdGggVXJsINC/0YPRgtGMINC6INGC0L7QstCw0YDRgy4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YLQvtCy0LDRgNCwINC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZUZvclByb2R1Y3RJdGVtKHByb2R1Y3Q6IFNjSVByb2R1Y3QsIHByb2R1Y3RQYXRoOiBzdHJpbmcpOiBXaXRoQ29udGV4dDxQcm9kdWN0PiB7XG4gICAgICAgIGNvbnN0IHByb2R1Y3RVcmwgPSBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke3Byb2R1Y3RQYXRoLnJlcGxhY2UoJzppZCcsIHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShwcm9kdWN0KS50b1N0cmluZygpKX1gO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMubWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZS50cmFuc2Zvcm0oKHByb2R1Y3QgYXMgU2NQcm9kdWN0KT8uZ2V0SW1hZ2VQcmV2aWV3KCkgPz8gcHJvZHVjdC5pbWFnZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcHJvZHVjdC5wcm9wZXJ0aWVzPy5kZXNjcmlwdGlvbjtcbiAgICAgICAgY29uc3QgcHJpY2VWYWxpZFVudGlsID0gdGhpcy5ub3JtYWxpemVQcmljZVZhbGlkVW50aWwocHJvZHVjdC5kaXNjb3VudD8uZXhwaXJlZEF0KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0Bjb250ZXh0JzogJ2h0dHBzOi8vc2NoZW1hLm9yZycsXG4gICAgICAgICAgICAnQHR5cGUnOiAnUHJvZHVjdCcsXG4gICAgICAgICAgICBuYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgICAgICAgICAuLi4oaW1hZ2UgJiYgeyBpbWFnZSB9KSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgbXBuOiBwcm9kdWN0LmNvZGUsXG4gICAgICAgICAgICB1cmw6IHByb2R1Y3RVcmwsXG4gICAgICAgICAgICBvZmZlcnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICdAdHlwZSc6ICdPZmZlcicsXG4gICAgICAgICAgICAgICAgICAgIHByaWNlQ3VycmVuY3k6ICdSVUInLFxuICAgICAgICAgICAgICAgICAgICAuLi4ocHJpY2VWYWxpZFVudGlsICYmIHsgcHJpY2VWYWxpZFVudGlsIH0pLFxuICAgICAgICAgICAgICAgICAgICBwcmljZTogcHJvZHVjdC5jb3N0UnViLFxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHk6IHRoaXMuZ2V0QXZhaWxhYmlsaXR5KHByb2R1Y3QpLFxuICAgICAgICAgICAgICAgICAgICBpdGVtQ29uZGl0aW9uOiAnaHR0cHM6Ly9zY2hlbWEub3JnL05ld0NvbmRpdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHNlbGxlcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ09yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmNvbXBhbnlJbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHVybDogcHJvZHVjdFVybCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSBhcyBXaXRoQ29udGV4dDxQcm9kdWN0PjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQk9C10L3QtdGA0LjRgNGD0LXRgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDRgdGF0LXQvNGDINC00LDQvdC90YvRhSDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtCz0L4g0L/RgNC+0LTRg9C60YLQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeSDQlNCw0L3QvdGL0LUg0L4g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0cyDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQsNGFINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnlQYXRoIFVybCDQv9GD0YLRjCDQuiDQutCw0YLQtdCz0L7RgNC40Y/QvCDRgtC+0LLQsNGA0L7Qsi4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LrQsNGC0LXQs9C+0YDQuNC4INC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0YLQvtCy0LDRgNGDLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRgtC+0LLQsNGA0LAg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICogQHBhcmFtIGJyZWFkY3J1bWJzINCU0LDQvdC90YvQtSDQviDRhdC70LXQsdC90YvRhSDQutGA0L7RiNC60LDRhSDQtNC70Y8g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZUZvckNhdGVnb3J5SXRlbShcbiAgICAgICAgY2F0ZWdvcnk6IFNjSUNhdGVnb3J5IHwgU2NJVmlydHVhbENhdGVnb3J5LFxuICAgICAgICBwcm9kdWN0czogU2NJUHJvZHVjdFtdLFxuICAgICAgICBjYXRlZ29yeVBhdGg6IHN0cmluZyxcbiAgICAgICAgcHJvZHVjdFBhdGg6IHN0cmluZyxcbiAgICAgICAgYnJlYWRjcnVtYnM6IFNjSUJyZWFkY3J1bWJJdGVtW11cbiAgICApOiBXaXRoQ29udGV4dDxDb2xsZWN0aW9uUGFnZT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGNhdGVnb3J5LnNlbz8uZGVzY3JpcHRpb24gPz8gY2F0ZWdvcnkucHJvcGVydGllcz8uZGVzY3JpcHRpb247XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5tZWRpYUltYWdlVHJhbnNmb3JtZXJQaXBlLnRyYW5zZm9ybShjYXRlZ29yeS5pbWFnZSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdAY29udGV4dCc6ICdodHRwczovL3NjaGVtYS5vcmcnLFxuICAgICAgICAgICAgJ0B0eXBlJzogJ0NvbGxlY3Rpb25QYWdlJyxcbiAgICAgICAgICAgIG5hbWU6IGNhdGVnb3J5LnNlbz8udGl0bGUgPz8gY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5LCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgLi4uKGltYWdlICYmIHsgaW1hZ2UgfSksXG4gICAgICAgICAgICAvLyBTRU8g0LTQsNC90L3Ri9C1LlxuICAgICAgICAgICAgLi4uKGNhdGVnb3J5LnNlbz8ua2V5d29yZHMgJiYgeyBrZXl3b3JkczogY2F0ZWdvcnkuc2VvLmtleXdvcmRzIH0pLFxuICAgICAgICAgICAgLy8g0J7RgdC90L7QstC90L7QuSDQutC+0L3RgtC10L3RgiDRgdGC0YDQsNC90LjRhtGLIC0g0YHQv9C40YHQvtC6INGC0L7QstCw0YDQvtCyINC4INC/0L7QtNC60LDRgtC10LPQvtGA0LjQuS5cbiAgICAgICAgICAgIG1haW5FbnRpdHk6IHRoaXMuY3JlYXRlQ2F0ZWdvcnlNYWluRW50aXR5KGNhdGVnb3J5LCBwcm9kdWN0cywgY2F0ZWdvcnlQYXRoLCBwcm9kdWN0UGF0aCksXG4gICAgICAgICAgICAvLyDQndCw0LLQuNCz0LDRhtC40L7QvdC90YvQtSDRhdC70LXQsdC90YvQtSDQutGA0L7RiNC60LggKFNjaGVtYS5vcmc6IGJyZWFkY3J1bWIpLlxuICAgICAgICAgICAgYnJlYWRjcnVtYjogdGhpcy5jcmVhdGVDYXRhbG9nQnJlYWRjcnVtYnNMaXN0KGJyZWFkY3J1bWJzLCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgLy8g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDQvNC10YLQsNC00LDQvdC90YvQtSDQtNC70Y8gU0VPLlxuICAgICAgICAgICAgYWJvdXQ6IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnQ2F0ZWdvcnlDb2RlJyxcbiAgICAgICAgICAgICAgICBjb2RlVmFsdWU6IGNhdGVnb3J5LnNsdWcsXG4gICAgICAgICAgICAgICAgbmFtZTogY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDRgdCw0LnRgtC1LlxuICAgICAgICAgICAgaXNQYXJ0T2Y6IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnV2ViU2l0ZScsXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogdGhpcy51cmxzLnNpdGVVcmwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g0KHQstGP0LfQsNC90L3Ri9C1INGB0YLRgNCw0L3QuNGG0YsuXG4gICAgICAgICAgICByZWxhdGVkTGluazogW1xuICAgICAgICAgICAgICAgIGAke3RoaXMudXJscy5zaXRlVXJsfSR7Y2F0ZWdvcnlQYXRoLnJlcGxhY2UoJzppZCcsICcnKX1gLFxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5KSB8fCAhY2F0ZWdvcnkucGFyZW50Q2F0ZWdvcnkgPyBbXSA6IFt0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5LnBhcmVudENhdGVnb3J5LCBjYXRlZ29yeVBhdGgpXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgLy8g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDRgdCy0L7QudGB0YLQstCwINC60LDRgtC10LPQvtGA0LjQuCAo0L3QtSDQuNC30L7QsdGA0LDQttC10L3QuNGPKS5cbiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAn0JrQvtC70LjRh9C10YHRgtCy0L4g0YLQvtCy0LDRgNC+0LInLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKHByb2R1Y3RzPy5sZW5ndGggPz8gMCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU2x1ZyDQutCw0YLQtdCz0L7RgNC40LgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0ZWdvcnkuc2x1ZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCBTRU8g0LTQsNC90L3Ri9C1INC10YHQu9C4INC10YHRgtGMLlxuICAgICAgICAgICAgICAgIC4uLihjYXRlZ29yeS5zZW8/LmtleXdvcmRzXG4gICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnUHJvcGVydHlWYWx1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU0VPIEtleXdvcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYXRlZ29yeS5zZW8ua2V5d29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgICAuLi4oY2F0ZWdvcnkuc2VvPy50aXRsZVxuICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NFTyBUaXRsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0ZWdvcnkuc2VvLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9IGFzIFdpdGhDb250ZXh0PENvbGxlY3Rpb25QYWdlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQndC+0YDQvNCw0LvQuNC30YPQtdGCINC00LDRgtGDINC+0LrQvtC90YfQsNC90LjRjyDRhtC10L3RiyDQsiDRhNC+0YDQvNCw0YIgU2NoZW1hLm9yZyAoWVlZWS1NTS1ERCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwaXJlZEF0INCU0LDRgtCwINC00LvRjyDQvdC+0YDQvNCw0LvQuNC30LDRhtC40LhcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIHByaXZhdGUgbm9ybWFsaXplUHJpY2VWYWxpZFVudGlsKGV4cGlyZWRBdD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghZXhwaXJlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZSA9IGV4cGlyZWRBdC5zbGljZSgwLCAxMCk7XG5cbiAgICAgICAgcmV0dXJuIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KGRhdGUpID8gZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntC/0YDQtdC00LXQu9GP0LXRgiDQtNC+0YHRgtGD0L/QvdC+0YHRgtGMINGC0L7QstCw0YDQsCDQv9C+INC00LDQvdC90YvQvCDQv9GA0L7QtNGD0LrRgtCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3Qg0JTQsNC90L3Ri9C1INC+INC/0YDQvtC00YPQutGC0LUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIGdldEF2YWlsYWJpbGl0eShwcm9kdWN0OiBTY0lQcm9kdWN0KTogJ0luU3RvY2snIHwgJ091dE9mU3RvY2snIHwgJ1ByZU9yZGVyJyB7XG4gICAgICAgIGlmIChwcm9kdWN0Lm9uT3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAnUHJlT3JkZXInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2R1Y3Quc3RvY2tDb3VudD8ubGVuZ3RoID8gJ0luU3RvY2snIDogJ091dE9mU3RvY2snO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQvtCy0LXRgNGP0LXRgiwg0Y/QstC70Y/QtdGC0YHRjyDQu9C4INC60LDRgtC10LPQvtGA0LjRjyDQstC40YDRgtGD0LDQu9GM0L3QvtC5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhdGVnb3J5INCU0LDQvdC90YvQtSDQviDQutCw0YLQtdCz0L7RgNC40Lgg0LTQu9GPINC/0YDQvtCy0LXRgNC60LguXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIGlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5OiBTY0lDYXRlZ29yeSB8IFNjSVZpcnR1YWxDYXRlZ29yeSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gJ2NoaWxkQ2F0ZWdvcmllcycgaW4gY2F0ZWdvcnkgJiYgJ3Byb2R1Y3RDYXRlZ29yaWVzJyBpbiBjYXRlZ29yeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiBVUkwg0LTQu9GPINGD0LrQsNC30LDQvdC90L7QuSDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnkg0JTQsNC90L3Ri9C1INC+INC60LDRgtC10LPQvtGA0LjQuFxuICAgICAqIEBwYXJhbSBjYXRlZ29yeVBhdGggVXJsINC/0YPRgtGMINC6INC60LDRgtC10LPQvtGA0LjRj9C8INGC0L7QstCw0YDQvtCyLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQutCw0YLQtdCz0L7RgNC40Lgg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRDYXRlZ29yeUNhbm9uaWNhbFVybChjYXRlZ29yeTogU2NJQ2F0ZWdvcnkgfCBTY0lWaXJ0dWFsQ2F0ZWdvcnksIGNhdGVnb3J5UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5KSA/IGNhdGVnb3J5LnNsdWcgOiB0aGlzLmlkT3JTbHVnUGlwZS50cmFuc2Zvcm0oY2F0ZWdvcnkpLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBjYXRlZ29yeVBhdGgucmVwbGFjZSgnOmlkJywgaWQpO1xuXG4gICAgICAgIHJldHVybiBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke3BhdGh9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0ZHRgiDRjdC70LXQvNC10L3RgiDRgdC/0LjRgdC60LAgSXRlbUxpc3Qg0YEg0LrRgNCw0YLQutC40LwgUHJvZHVjdCDQtNC70Y8g0YHRgtGA0LDQvdC40YbRiyDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQtS5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24g0J/QvtC30LjRhtC40Y8g0LIg0YHQv9C40YHQutC1LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0YLQvtCy0LDRgNGDLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRgtC+0LLQsNGA0LAg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVQcm9kdWN0c0xpc3RJdGVtKHByb2R1Y3Q6IFNjSVByb2R1Y3QsIHBvc2l0aW9uOiBudW1iZXIsIHByb2R1Y3RQYXRoOiBzdHJpbmcpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCBwcm9kdWN0VXJsID0gYCR7dGhpcy51cmxzLnNpdGVVcmx9JHtwcm9kdWN0UGF0aC5yZXBsYWNlKCc6aWQnLCB0aGlzLmlkT3JTbHVnUGlwZS50cmFuc2Zvcm0ocHJvZHVjdCkudG9TdHJpbmcoKSl9YDtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLm1lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUudHJhbnNmb3JtKChwcm9kdWN0IGFzIFNjUHJvZHVjdCk/LmdldEltYWdlUHJldmlldz8uKCkgPz8gcHJvZHVjdC5pbWFnZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcHJvZHVjdC5zZW8/LmRlc2NyaXB0aW9uID8/IHByb2R1Y3QucHJvcGVydGllcz8uZGVzY3JpcHRpb247XG4gICAgICAgIGNvbnN0IHByaWNlVmFsaWRVbnRpbCA9IHRoaXMubm9ybWFsaXplUHJpY2VWYWxpZFVudGlsKHByb2R1Y3QuZGlzY291bnQ/LmV4cGlyZWRBdCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdAdHlwZSc6ICdMaXN0SXRlbScsXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnUHJvZHVjdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogcHJvZHVjdC5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogcHJvZHVjdFVybCxcbiAgICAgICAgICAgICAgICAuLi4oaW1hZ2UgJiYgeyBpbWFnZSB9KSxcbiAgICAgICAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgICAgICBvZmZlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ09mZmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlQ3VycmVuY3k6ICdSVUInLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHByaWNlVmFsaWRVbnRpbCAmJiB7IHByaWNlVmFsaWRVbnRpbCB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBwcm9kdWN0LmNvc3RSdWIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHk6IHRoaXMuZ2V0QXZhaWxhYmlsaXR5KHByb2R1Y3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNvbmRpdGlvbjogJ2h0dHBzOi8vc2NoZW1hLm9yZy9OZXdDb25kaXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsbGVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ09yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogcHJvZHVjdFVybCxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiBtYWluRW50aXR5INC00LvRjyDRg9C60LDQt9Cw0L3QvdC+0Lkg0LrQsNGC0LXQs9C+0YDQuNC4INGC0L7QstCw0YDQvtCyLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhdGVnb3J5INCU0LDQvdC90YvQtSDQviDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICogQHBhcmFtIHByb2R1Y3RzINCU0LDQvdC90YvQtSDQviDRgtC+0LLQsNGA0LDRhSDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICogQHBhcmFtIGNhdGVnb3J5UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0LrQsNGC0LXQs9C+0YDQuNGP0Lwg0YLQvtCy0LDRgNC+0LIuINCSINC/0YPRgtC4INC00L7Qu9C20LXQvSDQv9GA0LjRgdGD0YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvSAnOmlkJywg0L7QsdC+0LfQvdCw0YfQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC60LDRgtC10LPQvtGA0LjQuCDQtNC70Y8g0L/QvtC00YHRgtCw0L3QvtCy0LrQuC5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFBhdGggVXJsINC/0YPRgtGMINC6INGC0L7QstCw0YDRgy4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YLQvtCy0LDRgNCwINC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2F0ZWdvcnlNYWluRW50aXR5KGNhdGVnb3J5OiBTY0lDYXRlZ29yeSB8IFNjSVZpcnR1YWxDYXRlZ29yeSwgcHJvZHVjdHM6IFNjSVByb2R1Y3RbXSwgY2F0ZWdvcnlQYXRoOiBzdHJpbmcsIHByb2R1Y3RQYXRoOiBzdHJpbmcpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCBjaGlsZENhdGVnb3JpZXMgPSB0aGlzLmlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5KVxuICAgICAgICAgICAgPyBbLi4uKChjYXRlZ29yeSBhcyBTY1ZpcnR1YWxDYXRlZ29yeSkuY2hpbGRDYXRlZ29yaWVzID8/IFtdKSwgLi4uKChjYXRlZ29yeSBhcyBTY1ZpcnR1YWxDYXRlZ29yeSkucHJvZHVjdENhdGVnb3JpZXMgPz8gW10pXVxuICAgICAgICAgICAgOiAoKGNhdGVnb3J5IGFzIFNjQ2F0ZWdvcnkpLmNhdGVnb3JpZXMgPz8gW10pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQHR5cGUnOiAnSXRlbUxpc3QnLFxuICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogcHJvZHVjdHMubGVuZ3RoICsgY2hpbGRDYXRlZ29yaWVzLmxlbmd0aCxcbiAgICAgICAgICAgIGl0ZW1MaXN0T3JkZXI6ICdodHRwczovL3NjaGVtYS5vcmcvSXRlbUxpc3RVbm9yZGVyZWQnLFxuICAgICAgICAgICAgaXRlbUxpc3RFbGVtZW50OiBbXG4gICAgICAgICAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INC/0L7QtNC60LDRgtC10LPQvtGA0LjQuCDQsiDQvdCw0YfQsNC70L4g0YHQv9C40YHQutCwLlxuICAgICAgICAgICAgICAgIC4uLmNoaWxkQ2F0ZWdvcmllcy5zbGljZSgwLCA1KS5tYXAoKHN1YkNhdGVnb3J5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ0xpc3RJdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc3ViQ2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKHN1YkNhdGVnb3J5LCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogdGhpcy5tZWRpYUltYWdlVHJhbnNmb3JtZXJQaXBlLnRyYW5zZm9ybShzdWJDYXRlZ29yeS5pbWFnZSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBzdWJDYXRlZ29yeS5zZW8/LmRlc2NyaXB0aW9uID8/IHN1YkNhdGVnb3J5LnByb3BlcnRpZXM/LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAvLyDQlNC+0LHQsNCy0LvRj9C10Lwg0YLQvtCy0LDRgNGLINC/0L7RgdC70LUg0L/QvtC00LrQsNGC0LXQs9C+0YDQuNC5LlxuICAgICAgICAgICAgICAgIC4uLnByb2R1Y3RzLnNsaWNlKDAsIDEwKS5tYXAoKHByb2R1Y3QsIGluZGV4KSA9PiB0aGlzLmNyZWF0ZVByb2R1Y3RzTGlzdEl0ZW0ocHJvZHVjdCwgY2hpbGRDYXRlZ29yaWVzLmxlbmd0aCArIGluZGV4ICsgMSwgcHJvZHVjdFBhdGgpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQvNCw0YHRgdC40LIgTGlua0RhdGEg0LIgQnJlYWRjcnVtYkxpc3Qg0LTQu9GPINC60LDRgtCw0LvQvtCz0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnJlYWRjcnVtYnMg0JzQsNGB0YHQuNCyINGF0LvQtdCx0L3Ri9GFINC60YDQvtGI0LXQui5cbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnlQYXRoIFVybCDQv9GD0YLRjCDQuiDQutCw0YLQtdCz0L7RgNC40Y/QvCDRgtC+0LLQsNGA0L7Qsi4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LrQsNGC0LXQs9C+0YDQuNC4INC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2F0YWxvZ0JyZWFkY3J1bWJzTGlzdChicmVhZGNydW1iczogU2NJQnJlYWRjcnVtYkl0ZW1bXSwgY2F0ZWdvcnlQYXRoOiBzdHJpbmcpOiBCcmVhZGNydW1iTGlzdCB7XG4gICAgICAgIGNvbnN0IGJyZWFkY3J1bWJJdGVtczogTGlzdEl0ZW1bXSA9IFtcbiAgICAgICAgICAgIC8vINCS0YHQtdCz0LTQsCDQtNC+0LHQsNCy0LvRj9C10Lwg0LPQu9Cw0LLQvdGD0Y4g0YHRgtGA0LDQvdC40YbRgy5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnTGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAxLFxuICAgICAgICAgICAgICAgIG5hbWU6ICfQk9C70LDQstC90LDRjycsXG4gICAgICAgICAgICAgICAgaXRlbTogdGhpcy51cmxzLnNpdGVVcmwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INC60LDRgtCw0LvQvtCzLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdMaXN0SXRlbScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IDIsXG4gICAgICAgICAgICAgICAgbmFtZTogJ9Ca0LDRgtCw0LvQvtCzJyxcbiAgICAgICAgICAgICAgICBpdGVtOiBgJHt0aGlzLnVybHMuc2l0ZVVybH0vJHtjYXRlZ29yeVBhdGh9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INGB0YPRidC10YHRgtCy0YPRjtGJ0LjQtSBicmVhZGNydW1icyDRgSDQutC+0YDRgNC10LrRgtC40YDQvtCy0LrQvtC5INC/0L7Qt9C40YbQuNC5LlxuICAgICAgICBicmVhZGNydW1icy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGlzQXJyYXkoaXRlbS5yb3V0ZXJMaW5rKSA/IGl0ZW0ucm91dGVyTGluay5qb2luKCcvJykgOiBpdGVtLnJvdXRlckxpbms7XG5cbiAgICAgICAgICAgIGJyZWFkY3J1bWJJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnTGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBpbmRleCArIDMsIC8vINCd0LDRh9C40L3QsNC10Lwg0YEg0L/QvtC30LjRhtC40LggMyAo0L/QvtGB0LvQtSDQk9C70LDQstC90LDRjyDQuCDQmtCw0YLQsNC70L7QsykuXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgICBpdGVtOiBsaW5rID8gYCR7dGhpcy51cmxzLnNpdGVVcmx9LyR7bGlua31gIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQHR5cGUnOiAnQnJlYWRjcnVtYkxpc3QnLFxuICAgICAgICAgICAgaXRlbUxpc3RFbGVtZW50OiBicmVhZGNydW1iSXRlbXMsXG4gICAgICAgIH0gYXMgQnJlYWRjcnVtYkxpc3Q7XG4gICAgfVxufVxuIl19
428
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLW9yZy1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zZW8vY2xhc3Nlcy9zY2hlbWEtb3JnLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFVMUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBRy9DOztHQUVHO0FBSUgsTUFBTSxPQUFPLGdCQUFnQjtJQUg3QjtRQUlJOztXQUVHO1FBQ2MsZ0JBQVcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFdkQ7O1dBRUc7UUFDYyxTQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXhDOztXQUVHO1FBQ0ssaUJBQVksR0FBbUIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTlEOztXQUVHO1FBQ2MsOEJBQXlCLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7S0E2YXBGO0lBM2FHOzs7Ozs7T0FNRztJQUNJLHNCQUFzQixDQUFDLE9BQW1CLEVBQUUsV0FBbUIsRUFBRSxFQUFXO1FBQy9FLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENB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QUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2xJLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNILE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsYUFBYSxFQUFFLDJDQUEyQztZQUMxRCxlQUFlLEVBQUUsZUFBZTtTQUNqQixDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxrREFBa0Q7SUFDMUMsd0JBQXdCLENBQUMsUUFBZ0IsRUFBRSxJQUFZLEVBQUUsR0FBWTtRQUN6RSxPQUFPO1lBQ0gsT0FBTyxFQUFFLFVBQVU7WUFDbkIsUUFBUTtZQUNSLEdBQUcsQ0FBQyxHQUFHO2dCQUNILENBQUMsQ0FBQztvQkFDSSxJQUFJLEVBQUU7d0JBQ0YsS0FBSyxFQUFFLEdBQUc7d0JBQ1YsSUFBSTtxQkFDUDtpQkFDSjtnQkFDSCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUNOLENBQUM7SUFDbEIsQ0FBQzsrR0EvYlEsZ0JBQWdCO21IQUFoQixnQkFBZ0IsY0FGYixNQUFNOzs0RkFFVCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc0FycmF5LCBvbWl0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJyZWFkY3J1bWJMaXN0LCBDb2xsZWN0aW9uUGFnZSwgQ29udGFjdFBvaW50LCBMaXN0SXRlbSwgT3JnYW5pemF0aW9uLCBQb3N0YWxBZGRyZXNzLCBQcm9kdWN0LCBUaGluZywgV2l0aENvbnRleHQgfSBmcm9tICdzY2hlbWEtZHRzJztcblxuaW1wb3J0IHsgU2NDYXRlZ29yeSB9IGZyb20gJy4uLy4uL2NhdGFsb2cvZHRvL3NjLWNhdGVnb3J5JztcbmltcG9ydCB7IFNjUHJvZHVjdCB9IGZyb20gJy4uLy4uL2NhdGFsb2cvZHRvL3NjLXByb2R1Y3QnO1xuaW1wb3J0IHsgU2NWaXJ0dWFsQ2F0ZWdvcnkgfSBmcm9tICcuLi8uLi9jYXRhbG9nL2R0by9zYy12aXJ0dWFsLWNhdGVnb3J5JztcbmltcG9ydCB7IFNjSUNhdGVnb3J5IH0gZnJvbSAnLi4vLi4vY2F0YWxvZy9pbnRlcmZhY2VzL3NjLWktY2F0ZWdvcnknO1xuaW1wb3J0IHsgU2NJUHJvZHVjdCB9IGZyb20gJy4uLy4uL2NhdGFsb2cvaW50ZXJmYWNlcy9zYy1pLXByb2R1Y3QnO1xuaW1wb3J0IHsgU2NJVmlydHVhbENhdGVnb3J5IH0gZnJvbSAnLi4vLi4vY2F0YWxvZy9pbnRlcmZhY2VzL3NjLWktdmlydHVhbC1jYXRlZ29yeSc7XG5pbXBvcnQgeyBTY0lDb21wYW55QmFzZUluZm8gfSBmcm9tICcuLi8uLi9jb25maWcvc2MtaS1jb21wYW55LWJhc2UtaW5mbyc7XG5pbXBvcnQgeyBTY0lkT3JTbHVnUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3NjLWlkLW9yLXNsdWcucGlwZSc7XG5pbXBvcnQgeyBTY01lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9zYy1tZWRpYS1pbWFnZS10cmFuc2Zvcm1lci5waXBlJztcbmltcG9ydCB7IFNDX0NPTVBBTllfSU5GTyB9IGZyb20gJy4uLy4uL3Rva2Vucy9zYy1jb21wYW55LWluZm8nO1xuaW1wb3J0IHsgU0NfVVJMUyB9IGZyb20gJy4uLy4uL3Rva2Vucy9zYy11cmxzJztcbmltcG9ydCB7IFNjSUJyZWFkY3J1bWJJdGVtIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zYy1pLWJyZWFkY3J1bWItaXRlbSc7XG5cbi8qKlxuICog0JzQtdGF0LDQvdC40LfQvNGLINCz0LXQvdC10YDQsNGG0LjQuCDRgdGF0LXQvCDQtNCw0L3QvdGL0YUgU2NoZW1hLm9yZy5cbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NoZW1hT3JnRmFjdG9yeSB7XG4gICAgLyoqXG4gICAgICog0JTQsNC90L3Ri9C1INC+INC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21wYW55SW5mbyA9IGluamVjdChTQ19DT01QQU5ZX0lORk8pO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INGB0YHRi9C70L7QuiDQv9GA0LjQu9C+0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybHMgPSBpbmplY3QoU0NfVVJMUyk7XG5cbiAgICAvKipcbiAgICAgKiDQn9Cw0LnQvywg0LLQvtC30LLRgNCw0YnQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCDRgdC40LzQstC+0LvRjNC90L7QtSDQvtCx0L7Qt9C90LDRh9C10L3QuNC1IChzbHVnKSDQuNGB0YXQvtC00Y8g0LjQtyDQvdCw0YHRgtGA0L7QtdC6INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlkT3JTbHVnUGlwZTogU2NJZE9yU2x1Z1BpcGUgPSBpbmplY3QoU2NJZE9yU2x1Z1BpcGUpO1xuXG4gICAgLyoqXG4gICAgICog0J/QsNC50L8g0LTQu9GPINGE0L7RgNC80LjRgNC+0LLQsNC90LjRjyDQv9C+0LvQvdC+0LPQviBVUkkg0LjQt9C+0LHRgNCw0LbQtdC90LjRjyDQvdCwIG1lZGlhINGB0LXRgNCy0LXRgNC1LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZSA9IGluamVjdChTY01lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUpO1xuXG4gICAgLyoqXG4gICAgICog0JPQtdC90LXRgNC40YDRg9C10YIg0Lgg0LLQvtC30LLRgNCw0YnQsNC10YIg0YHRhdC10LzRgyDQtNCw0L3QvdGL0YUg0LTQu9GPINGD0LrQsNC30LDQvdC90L7Qs9C+INC/0YDQvtC00YPQutGC0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQtS5cbiAgICAgKiBAcGFyYW0gcHJvZHVjdFBhdGggVXJsINC/0YPRgtGMINC6INGC0L7QstCw0YDRgy4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YLQvtCy0LDRgNCwINC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqIEBwYXJhbSBpZCDQndC10L7QsdGP0LfQsNGC0LXQu9GM0L3Ri9C5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGB0YPRidC90L7RgdGC0Lgg0LTQu9GPINC/0L7Qu9GPIGBAaWRgINCyIEpTT04tTEQuXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlRm9yUHJvZHVjdEl0ZW0ocHJvZHVjdDogU2NJUHJvZHVjdCwgcHJvZHVjdFBhdGg6IHN0cmluZywgaWQ/OiBzdHJpbmcpOiBXaXRoQ29udGV4dDxQcm9kdWN0PiB7XG4gICAgICAgIGNvbnN0IHByb2R1Y3RVcmwgPSBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke3Byb2R1Y3RQYXRoLnJlcGxhY2UoJzppZCcsIHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShwcm9kdWN0KS50b1N0cmluZygpKX1gO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMubWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZS50cmFuc2Zvcm0oKHByb2R1Y3QgYXMgU2NQcm9kdWN0KT8uZ2V0SW1hZ2VQcmV2aWV3Py4oKSA/PyBwcm9kdWN0LmltYWdlLCB0cnVlKTtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBwcm9kdWN0LnByb3BlcnRpZXM/LmRlc2NyaXB0aW9uO1xuICAgICAgICBjb25zdCBwcmljZVZhbGlkVW50aWwgPSB0aGlzLm5vcm1hbGl6ZVByaWNlVmFsaWRVbnRpbChwcm9kdWN0LmRpc2NvdW50Py5leHBpcmVkQXQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQGNvbnRleHQnOiAnaHR0cHM6Ly9zY2hlbWEub3JnJyxcbiAgICAgICAgICAgICdAdHlwZSc6ICdQcm9kdWN0JyxcbiAgICAgICAgICAgIC4uLihpZCAmJiB7ICdAaWQnOiBpZCB9KSxcbiAgICAgICAgICAgIG5hbWU6IHByb2R1Y3QubmFtZSxcbiAgICAgICAgICAgIC4uLihpbWFnZSAmJiB7IGltYWdlIH0pLFxuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgICBtcG46IHByb2R1Y3QuY29kZSxcbiAgICAgICAgICAgIHVybDogcHJvZHVjdFVybCxcbiAgICAgICAgICAgIG9mZmVyczoge1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdPZmZlcicsXG4gICAgICAgICAgICAgICAgcHJpY2VDdXJyZW5jeTogJ1JVQicsXG4gICAgICAgICAgICAgICAgLi4uKHByaWNlVmFsaWRVbnRpbCAmJiB7IHByaWNlVmFsaWRVbnRpbCB9KSxcbiAgICAgICAgICAgICAgICBwcmljZTogcHJvZHVjdC5jb3N0UnViLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eTogdGhpcy5nZXRBdmFpbGFiaWxpdHkocHJvZHVjdCksXG4gICAgICAgICAgICAgICAgaXRlbUNvbmRpdGlvbjogJ2h0dHBzOi8vc2NoZW1hLm9yZy9OZXdDb25kaXRpb24nLFxuICAgICAgICAgICAgICAgIHNlbGxlcjoge1xuICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnT3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXJsOiBwcm9kdWN0VXJsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBXaXRoQ29udGV4dDxQcm9kdWN0PjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQk9C10L3QtdGA0LjRgNGD0LXRgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDRgdGF0LXQvNGDINC00LDQvdC90YvRhSDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtCz0L4g0L/RgNC+0LTRg9C60YLQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeSDQlNCw0L3QvdGL0LUg0L4g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0cyDQlNCw0L3QvdGL0LUg0L4g0L/RgNC+0LTRg9C60YLQsNGFINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnlQYXRoIFVybCDQv9GD0YLRjCDQuiDQutCw0YLQtdCz0L7RgNC40Y/QvCDRgtC+0LLQsNGA0L7Qsi4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LrQsNGC0LXQs9C+0YDQuNC4INC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0YLQvtCy0LDRgNGDLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRgtC+0LLQsNGA0LAg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICogQHBhcmFtIGJyZWFkY3J1bWJzINCU0LDQvdC90YvQtSDQviDRhdC70LXQsdC90YvRhSDQutGA0L7RiNC60LDRhSDQtNC70Y8g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBpZCDQndC10L7QsdGP0LfQsNGC0LXQu9GM0L3Ri9C5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGB0YPRidC90L7RgdGC0Lgg0LTQu9GPINC/0L7Qu9GPIGBAaWRgINCyIEpTT04tTEQuXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlRm9yQ2F0ZWdvcnlJdGVtKFxuICAgICAgICBjYXRlZ29yeTogU2NJQ2F0ZWdvcnkgfCBTY0lWaXJ0dWFsQ2F0ZWdvcnksXG4gICAgICAgIHByb2R1Y3RzOiBTY0lQcm9kdWN0W10sXG4gICAgICAgIGNhdGVnb3J5UGF0aDogc3RyaW5nLFxuICAgICAgICBwcm9kdWN0UGF0aDogc3RyaW5nLFxuICAgICAgICBicmVhZGNydW1iczogU2NJQnJlYWRjcnVtYkl0ZW1bXSxcbiAgICAgICAgaWQ/OiBzdHJpbmdcbiAgICApOiBXaXRoQ29udGV4dDxDb2xsZWN0aW9uUGFnZT4ge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGNhdGVnb3J5LnNlbz8uZGVzY3JpcHRpb24gPz8gY2F0ZWdvcnkucHJvcGVydGllcz8uZGVzY3JpcHRpb247XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5tZWRpYUltYWdlVHJhbnNmb3JtZXJQaXBlLnRyYW5zZm9ybShjYXRlZ29yeS5pbWFnZSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdAY29udGV4dCc6ICdodHRwczovL3NjaGVtYS5vcmcnLFxuICAgICAgICAgICAgJ0B0eXBlJzogJ0NvbGxlY3Rpb25QYWdlJyxcbiAgICAgICAgICAgIC4uLihpZCAmJiB7ICdAaWQnOiBpZCB9KSxcbiAgICAgICAgICAgIG5hbWU6IGNhdGVnb3J5LnNlbz8udGl0bGUgPz8gY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5LCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgLi4uKGltYWdlICYmIHsgaW1hZ2UgfSksXG4gICAgICAgICAgICAvLyBTRU8g0LTQsNC90L3Ri9C1LlxuICAgICAgICAgICAgLi4uKGNhdGVnb3J5LnNlbz8ua2V5d29yZHMgJiYgeyBrZXl3b3JkczogY2F0ZWdvcnkuc2VvLmtleXdvcmRzIH0pLFxuICAgICAgICAgICAgLy8g0J7RgdC90L7QstC90L7QuSDQutC+0L3RgtC10L3RgiDRgdGC0YDQsNC90LjRhtGLIC0g0YHQv9C40YHQvtC6INGC0L7QstCw0YDQvtCyINC4INC/0L7QtNC60LDRgtC10LPQvtGA0LjQuS5cbiAgICAgICAgICAgIG1haW5FbnRpdHk6IHRoaXMuY3JlYXRlQ2F0ZWdvcnlNYWluRW50aXR5KGNhdGVnb3J5LCBwcm9kdWN0cywgY2F0ZWdvcnlQYXRoLCBwcm9kdWN0UGF0aCksXG4gICAgICAgICAgICAvLyDQndCw0LLQuNCz0LDRhtC40L7QvdC90YvQtSDRhdC70LXQsdC90YvQtSDQutGA0L7RiNC60LggKFNjaGVtYS5vcmc6IGJyZWFkY3J1bWIpLlxuICAgICAgICAgICAgYnJlYWRjcnVtYjogdGhpcy5jcmVhdGVDYXRhbG9nQnJlYWRjcnVtYnNMaXN0KGJyZWFkY3J1bWJzLCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgLy8g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDQvNC10YLQsNC00LDQvdC90YvQtSDQtNC70Y8gU0VPLlxuICAgICAgICAgICAgYWJvdXQ6IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnQ2F0ZWdvcnlDb2RlJyxcbiAgICAgICAgICAgICAgICBjb2RlVmFsdWU6IGNhdGVnb3J5LnNsdWcsXG4gICAgICAgICAgICAgICAgbmFtZTogY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgICAgICAuLi4oZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDQmNC90YTQvtGA0LzQsNGG0LjRjyDQviDRgdCw0LnRgtC1LlxuICAgICAgICAgICAgaXNQYXJ0T2Y6IHtcbiAgICAgICAgICAgICAgICAnQHR5cGUnOiAnV2ViU2l0ZScsXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogdGhpcy51cmxzLnNpdGVVcmwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g0KHQstGP0LfQsNC90L3Ri9C1INGB0YLRgNCw0L3QuNGG0YsuXG4gICAgICAgICAgICByZWxhdGVkTGluazogW1xuICAgICAgICAgICAgICAgIGAke3RoaXMudXJscy5zaXRlVXJsfSR7Y2F0ZWdvcnlQYXRoLnJlcGxhY2UoJzppZCcsICcnKX1gLFxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmlzVmlydHVhbENhdGVnb3J5KGNhdGVnb3J5KSB8fCAhY2F0ZWdvcnkucGFyZW50Q2F0ZWdvcnkgPyBbXSA6IFt0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5LnBhcmVudENhdGVnb3J5LCBjYXRlZ29yeVBhdGgpXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgLy8g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSDRgdCy0L7QudGB0YLQstCwINC60LDRgtC10LPQvtGA0LjQuCAo0L3QtSDQuNC30L7QsdGA0LDQttC10L3QuNGPKS5cbiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0eTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAn0JrQvtC70LjRh9C10YHRgtCy0L4g0YLQvtCy0LDRgNC+0LInLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKHByb2R1Y3RzPy5sZW5ndGggPz8gMCkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU2x1ZyDQutCw0YLQtdCz0L7RgNC40LgnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0ZWdvcnkuc2x1ZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCBTRU8g0LTQsNC90L3Ri9C1INC10YHQu9C4INC10YHRgtGMLlxuICAgICAgICAgICAgICAgIC4uLihjYXRlZ29yeS5zZW8/LmtleXdvcmRzXG4gICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnUHJvcGVydHlWYWx1ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU0VPIEtleXdvcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYXRlZ29yeS5zZW8ua2V5d29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICAgICAgICAuLi4oY2F0ZWdvcnkuc2VvPy50aXRsZVxuICAgICAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1Byb3BlcnR5VmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NFTyBUaXRsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0ZWdvcnkuc2VvLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9IGFzIFdpdGhDb250ZXh0PENvbGxlY3Rpb25QYWdlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQk9C10L3QtdGA0LjRgNGD0LXRgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDRgdGF0LXQvNGDINC00LDQvdC90YvRhSBPbmxpbmVTdG9yZSDQvdCwINC+0YHQvdC+0LLQtSDQtNCw0L3QvdGL0YUg0LrQvtC80L/QsNC90LjQuCDQuNC3INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9mdW5jdGlvbi1yZXR1cm4tdHlwZVxuICAgIHB1YmxpYyBnZW5lcmF0ZUZvck9yZ2FuaXphdGlvbigpOiBXaXRoQ29udGV4dDxPcmdhbml6YXRpb24+IHtcbiAgICAgICAgY29uc3QgcG9zdGFsQWRkcmVzcyA9IHRoaXMuY3JlYXRlUG9zdGFsQWRkcmVzcyh0aGlzLmNvbXBhbnlJbmZvLmFkZHJlc3MpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQGNvbnRleHQnOiAnaHR0cHM6Ly9zY2hlbWEub3JnJyxcbiAgICAgICAgICAgICdAdHlwZSc6ICdPbmxpbmVTdG9yZScsXG4gICAgICAgICAgICAnQGlkJzogYCR7dGhpcy51cmxzLnNpdGVVcmx9I29yZ2FuaXphdGlvbmAsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLmNvbXBhbnlJbmZvLm5hbWUsXG4gICAgICAgICAgICBsZWdhbE5hbWU6IHRoaXMuY29tcGFueUluZm8ubmFtZSxcbiAgICAgICAgICAgIHVybDogdGhpcy51cmxzLnNpdGVVcmwsXG4gICAgICAgICAgICBsb2dvOiB0aGlzLnVybHMubG9nb1VybCxcbiAgICAgICAgICAgIGltYWdlOiB0aGlzLnVybHMubG9nb1VybCxcbiAgICAgICAgICAgIGVtYWlsOiB0aGlzLmNvbXBhbnlJbmZvLm1haWwsXG4gICAgICAgICAgICB0ZWxlcGhvbmU6IHRoaXMuY29tcGFueUluZm8ucGhvbmUsXG4gICAgICAgICAgICAuLi4ocG9zdGFsQWRkcmVzcyAmJiB7IGFkZHJlc3M6IHBvc3RhbEFkZHJlc3MgfSksXG4gICAgICAgICAgICBsZWdhbEFkZHJlc3M6IHRoaXMuY3JlYXRlUG9zdGFsQWRkcmVzcyh7IHN0cmVldEFkZHJlc3M6IHRoaXMuY29tcGFueUluZm8ubGVnYWxBZGRyZXNzIH0gYXMgU2NJQ29tcGFueUJhc2VJbmZvWydhZGRyZXNzJ10pLFxuICAgICAgICAgICAgLy8gVE9ETzog0J/QtdGA0LXRh9C40YHQu9C40YLRjCDQstGB0LUg0YDQvtC30L3QuNGH0L3Ri9C1INC80LDQs9Cw0LfQuNC90YsuXG4gICAgICAgICAgICAvLyBoYXNQT1M6IFtdLFxuICAgICAgICAgICAgdGF4SUQ6IHRoaXMuY29tcGFueUluZm8uaW5uLFxuICAgICAgICAgICAgaWRlbnRpZmllcjoge1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdQcm9wZXJ0eVZhbHVlJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUlEOiAnT0dSTicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuY29tcGFueUluZm8ub2dybixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250YWN0UG9pbnQ6IHRoaXMuY3JlYXRlT3JnYW5pemF0aW9uQ29udGFjdFBvaW50cygpLFxuICAgICAgICAgICAgLi4uKHRoaXMuY29tcGFueUluZm8ud2FyZWhvdXNlQWRkcmVzcy5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogdGhpcy5jb21wYW55SW5mby53YXJlaG91c2VBZGRyZXNzLm1hcCgod2FyZWhvdXNlQWRkcmVzcykgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgJ0B0eXBlJzogJ1BsYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogYCR7dGhpcy5jb21wYW55SW5mby5uYW1lfSDigJQg0YHQutC70LDQtCDRgdCw0LzQvtCy0YvQstC+0LfQsGAsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHdhcmVob3VzZUFkZHJlc3MsXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0gYXMgV2l0aENvbnRleHQ8T3JnYW5pemF0aW9uPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YrQtdC00LjQvdGP0LXRgiDQvdC10YHQutC+0LvRjNC60L4gSlNPTi1MRCDRgdGD0YnQvdC+0YHRgtC10Lkg0LIg0L7QtNC40L0g0LTQvtC60YPQvNC10L3RgiDRgSBgQGdyYXBoYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhINCc0LDRgdGB0LjQsiBKU09OLUxEINGB0YPRidC90L7RgdGC0LXQuSDQtNC70Y8g0L7QsdGK0LXQtNC40L3QtdC90LjRjy5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyxzb25hcmpzL2Z1bmN0aW9uLXJldHVybi10eXBlXG4gICAgcHVibGljIG1lcmdlKGRhdGE6IEFycmF5PFdpdGhDb250ZXh0PFRoaW5nPj4pOiBXaXRoQ29udGV4dDxUaGluZz4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0Bjb250ZXh0JzogJ2h0dHBzOi8vc2NoZW1hLm9yZycsXG4gICAgICAgICAgICAnQGdyYXBoJzogZGF0YS5tYXAoKGl0ZW0pID0+IG9taXQoaXRlbSwgJ0Bjb250ZXh0JykpLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgV2l0aENvbnRleHQ8VGhpbmc+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCk0L7RgNC80LjRgNGD0LXRgiBQb3N0YWxBZGRyZXNzINC40Lcg0YHRgtGA0YPQutGC0YPRgNC40YDQvtCy0LDQvdC90L7Qs9C+INCw0LTRgNC10YHQsCDQutC+0LzQv9Cw0L3QuNC4LlxuICAgICAqXG4gICAgICogQHBhcmFtIGFkZHJlc3Mg0KHRgtGA0YPQutGC0YPRgNC40YDQvtCy0LDQvdC90YvQuSDQsNC00YDQtdGBINC60L7QvNC/0LDQvdC40LguXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIGNyZWF0ZVBvc3RhbEFkZHJlc3MoYWRkcmVzczogU2NJQ29tcGFueUJhc2VJbmZvWydhZGRyZXNzJ10pOiBQb3N0YWxBZGRyZXNzIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3Qgc3RyZWV0QWRkcmVzcyA9IFthZGRyZXNzLnN0cmVldEFkZHJlc3MsIGFkZHJlc3MuZXh0ZW5kZWRBZGRyZXNzXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcblxuICAgICAgICBpZiAoIXN0cmVldEFkZHJlc3MgJiYgIWFkZHJlc3MubG9jYWxpdHkgJiYgIWFkZHJlc3MucmVnaW9uICYmICFhZGRyZXNzLnBvc3RhbENvZGUgJiYgIWFkZHJlc3MuY291bnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnQHR5cGUnOiAnUG9zdGFsQWRkcmVzcycsXG4gICAgICAgICAgICAuLi4oc3RyZWV0QWRkcmVzcyAmJiB7IHN0cmVldEFkZHJlc3MgfSksXG4gICAgICAgICAgICAuLi4oYWRkcmVzcy5sb2NhbGl0eSAmJiB7IGFkZHJlc3NMb2NhbGl0eTogYWRkcmVzcy5sb2NhbGl0eSB9KSxcbiAgICAgICAgICAgIC4uLihhZGRyZXNzLnJlZ2lvbiAmJiB7IGFkZHJlc3NSZWdpb246IGFkZHJlc3MucmVnaW9uIH0pLFxuICAgICAgICAgICAgLi4uKGFkZHJlc3MucG9zdGFsQ29kZSAmJiB7IHBvc3RhbENvZGU6IGFkZHJlc3MucG9zdGFsQ29kZSB9KSxcbiAgICAgICAgICAgIC4uLihhZGRyZXNzLmNvdW50cnkgJiYgeyBhZGRyZXNzQ291bnRyeTogYWRkcmVzcy5jb3VudHJ5IH0pLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCk0L7RgNC80LjRgNGD0LXRgiDRgdC/0LjRgdC+0LogQ29udGFjdFBvaW50INC00LvRjyBPcmdhbml6YXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVPcmdhbml6YXRpb25Db250YWN0UG9pbnRzKCk6IENvbnRhY3RQb2ludFtdIHtcbiAgICAgICAgY29uc3QgY29udGFjdFBvaW50czogQ29udGFjdFBvaW50W10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgJ0B0eXBlJzogJ0NvbnRhY3RQb2ludCcsXG4gICAgICAgICAgICAgICAgY29udGFjdFR5cGU6ICdjdXN0b21lciBzZXJ2aWNlJyxcbiAgICAgICAgICAgICAgICB0ZWxlcGhvbmU6IHRoaXMuY29tcGFueUluZm8ucGhvbmUsXG4gICAgICAgICAgICAgICAgZW1haWw6IHRoaXMuY29tcGFueUluZm8ubWFpbCxcbiAgICAgICAgICAgICAgICBhcmVhU2VydmVkOiAnUlUnLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxhbmd1YWdlOiAnUnVzc2lhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbXBhbnlJbmZvLnNlY29uZGFyeVBob25lKSB7XG4gICAgICAgICAgICBjb250YWN0UG9pbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdDb250YWN0UG9pbnQnLFxuICAgICAgICAgICAgICAgIGNvbnRhY3RUeXBlOiAnY3VzdG9tZXIgc2VydmljZScsXG4gICAgICAgICAgICAgICAgdGVsZXBob25lOiB0aGlzLmNvbXBhbnlJbmZvLnNlY29uZGFyeVBob25lLFxuICAgICAgICAgICAgICAgIGFyZWFTZXJ2ZWQ6ICdSVScsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlTGFuZ3VhZ2U6ICdSdXNzaWFuJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGFueUluZm8uaHIpIHtcbiAgICAgICAgICAgIGNvbnRhY3RQb2ludHMucHVzaCh7XG4gICAgICAgICAgICAgICAgJ0B0eXBlJzogJ0NvbnRhY3RQb2ludCcsXG4gICAgICAgICAgICAgICAgY29udGFjdFR5cGU6ICdIUicsXG4gICAgICAgICAgICAgICAgdGVsZXBob25lOiB0aGlzLmNvbXBhbnlJbmZvLmhyLnBob25lLFxuICAgICAgICAgICAgICAgIGVtYWlsOiB0aGlzLmNvbXBhbnlJbmZvLmhyLm1haWwsXG4gICAgICAgICAgICAgICAgYXJlYVNlcnZlZDogJ1JVJyxcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVMYW5ndWFnZTogJ1J1c3NpYW4nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFjdFBvaW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQndC+0YDQvNCw0LvQuNC30YPQtdGCINC00LDRgtGDINC+0LrQvtC90YfQsNC90LjRjyDRhtC10L3RiyDQsiDRhNC+0YDQvNCw0YIgU2NoZW1hLm9yZyAoWVlZWS1NTS1ERCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZXhwaXJlZEF0INCU0LDRgtCwINC00LvRjyDQvdC+0YDQvNCw0LvQuNC30LDRhtC40LhcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIHByaXZhdGUgbm9ybWFsaXplUHJpY2VWYWxpZFVudGlsKGV4cGlyZWRBdD86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghZXhwaXJlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZSA9IGV4cGlyZWRBdC5zbGljZSgwLCAxMCk7XG5cbiAgICAgICAgcmV0dXJuIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLy50ZXN0KGRhdGUpID8gZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntC/0YDQtdC00LXQu9GP0LXRgiDQtNC+0YHRgtGD0L/QvdC+0YHRgtGMINGC0L7QstCw0YDQsCDQv9C+INC00LDQvdC90YvQvCDQv9GA0L7QtNGD0LrRgtCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3Qg0JTQsNC90L3Ri9C1INC+INC/0YDQvtC00YPQutGC0LUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBwcml2YXRlIGdldEF2YWlsYWJpbGl0eShwcm9kdWN0OiBTY0lQcm9kdWN0KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHByb2R1Y3Qub25PcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuICdodHRwczovL3NjaGVtYS5vcmcvUHJlT3JkZXInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2R1Y3Quc3RvY2tDb3VudD8ubGVuZ3RoID8gJ2h0dHBzOi8vc2NoZW1hLm9yZy9JblN0b2NrJyA6ICdodHRwczovL3NjaGVtYS5vcmcvT3V0T2ZTdG9jayc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCLCDRj9Cy0LvRj9C10YLRgdGPINC70Lgg0LrQsNGC0LXQs9C+0YDQuNGPINCy0LjRgNGC0YPQsNC70YzQvdC+0LkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnkg0JTQsNC90L3Ri9C1INC+INC60LDRgtC10LPQvtGA0LjQuCDQtNC70Y8g0L/RgNC+0LLQtdGA0LrQuC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIHByaXZhdGUgaXNWaXJ0dWFsQ2F0ZWdvcnkoY2F0ZWdvcnk6IFNjSUNhdGVnb3J5IHwgU2NJVmlydHVhbENhdGVnb3J5KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAnY2hpbGRDYXRlZ29yaWVzJyBpbiBjYXRlZ29yeSAmJiAncHJvZHVjdENhdGVnb3JpZXMnIGluIGNhdGVnb3J5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCIFVSTCDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtC5INC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeSDQlNCw0L3QvdGL0LUg0L4g0LrQsNGC0LXQs9C+0YDQuNC4XG4gICAgICogQHBhcmFtIGNhdGVnb3J5UGF0aCBVcmwg0L/Rg9GC0Ywg0Log0LrQsNGC0LXQs9C+0YDQuNGP0Lwg0YLQvtCy0LDRgNC+0LIuINCSINC/0YPRgtC4INC00L7Qu9C20LXQvSDQv9GA0LjRgdGD0YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvSAnOmlkJywg0L7QsdC+0LfQvdCw0YfQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC60LDRgtC10LPQvtGA0LjQuCDQtNC70Y8g0L/QvtC00YHRgtCw0L3QvtCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldENhdGVnb3J5Q2Fub25pY2FsVXJsKGNhdGVnb3J5OiBTY0lDYXRlZ29yeSB8IFNjSVZpcnR1YWxDYXRlZ29yeSwgY2F0ZWdvcnlQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuaXNWaXJ0dWFsQ2F0ZWdvcnkoY2F0ZWdvcnkpID8gY2F0ZWdvcnkuc2x1ZyA6IHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShjYXRlZ29yeSkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IGNhdGVnb3J5UGF0aC5yZXBsYWNlKCc6aWQnLCBpZCk7XG5cbiAgICAgICAgcmV0dXJuIGAke3RoaXMudXJscy5zaXRlVXJsfSR7cGF0aH1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDRkdGCINGN0LvQtdC80LXQvdGCINGB0L/QuNGB0LrQsCBJdGVtTGlzdCDRgSDQutGA0LDRgtC60LjQvCBQcm9kdWN0INC00LvRjyDRgdGC0YDQsNC90LjRhtGLINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9kdWN0INCU0LDQvdC90YvQtSDQviDQv9GA0L7QtNGD0LrRgtC1LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiDQn9C+0LfQuNGG0LjRjyDQsiDRgdC/0LjRgdC60LUuXG4gICAgICogQHBhcmFtIHByb2R1Y3RQYXRoIFVybCDQv9GD0YLRjCDQuiDRgtC+0LLQsNGA0YMuINCSINC/0YPRgtC4INC00L7Qu9C20LXQvSDQv9GA0LjRgdGD0YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvSAnOmlkJywg0L7QsdC+0LfQvdCw0YfQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGC0L7QstCw0YDQsCDQtNC70Y8g0L/QvtC00YHRgtCw0L3QvtCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVByb2R1Y3RzTGlzdEl0ZW0ocHJvZHVjdDogU2NJUHJvZHVjdCwgcG9zaXRpb246IG51bWJlciwgcHJvZHVjdFBhdGg6IHN0cmluZyk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHByb2R1Y3RVcmwgPSBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke3Byb2R1Y3RQYXRoLnJlcGxhY2UoJzppZCcsIHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShwcm9kdWN0KS50b1N0cmluZygpKX1gO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMubWVkaWFJbWFnZVRyYW5zZm9ybWVyUGlwZS50cmFuc2Zvcm0oKHByb2R1Y3QgYXMgU2NQcm9kdWN0KT8uZ2V0SW1hZ2VQcmV2aWV3Py4oKSA/PyBwcm9kdWN0LmltYWdlLCB0cnVlKTtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBwcm9kdWN0LnNlbz8uZGVzY3JpcHRpb24gPz8gcHJvZHVjdC5wcm9wZXJ0aWVzPy5kZXNjcmlwdGlvbjtcbiAgICAgICAgY29uc3QgcHJpY2VWYWxpZFVudGlsID0gdGhpcy5ub3JtYWxpemVQcmljZVZhbGlkVW50aWwocHJvZHVjdC5kaXNjb3VudD8uZXhwaXJlZEF0KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0B0eXBlJzogJ0xpc3RJdGVtJyxcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgaXRlbToge1xuICAgICAgICAgICAgICAgICdAdHlwZSc6ICdQcm9kdWN0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiBwcm9kdWN0Lm5hbWUsXG4gICAgICAgICAgICAgICAgdXJsOiBwcm9kdWN0VXJsLFxuICAgICAgICAgICAgICAgIC4uLihpbWFnZSAmJiB7IGltYWdlIH0pLFxuICAgICAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgICAgIG9mZmVyczoge1xuICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnT2ZmZXInLFxuICAgICAgICAgICAgICAgICAgICBwcmljZUN1cnJlbmN5OiAnUlVCJyxcbiAgICAgICAgICAgICAgICAgICAgLi4uKHByaWNlVmFsaWRVbnRpbCAmJiB7IHByaWNlVmFsaWRVbnRpbCB9KSxcbiAgICAgICAgICAgICAgICAgICAgcHJpY2U6IHByb2R1Y3QuY29zdFJ1YixcbiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5OiB0aGlzLmdldEF2YWlsYWJpbGl0eShwcm9kdWN0KSxcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvbmRpdGlvbjogJ2h0dHBzOi8vc2NoZW1hLm9yZy9OZXdDb25kaXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBzZWxsZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdAdHlwZSc6ICdPcmdhbml6YXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb21wYW55SW5mby5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB1cmw6IHByb2R1Y3RVcmwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIgbWFpbkVudGl0eSDQtNC70Y8g0YPQutCw0LfQsNC90L3QvtC5INC60LDRgtC10LPQvtGA0LjQuCDRgtC+0LLQsNGA0L7Qsi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeSDQlNCw0L3QvdGL0LUg0L4g0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBwcm9kdWN0cyDQlNCw0L3QvdGL0LUg0L4g0YLQvtCy0LDRgNCw0YUg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeVBhdGggVXJsINC/0YPRgtGMINC6INC60LDRgtC10LPQvtGA0LjRj9C8INGC0L7QstCw0YDQvtCyLiDQkiDQv9GD0YLQuCDQtNC+0LvQttC10L0g0L/RgNC40YHRg9GC0YHRgtCy0L7QstCw0YLRjCDRiNCw0LHQu9C+0L0gJzppZCcsINC+0LHQvtC30L3QsNGH0LDRjtGJ0LjQuSDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQutCw0YLQtdCz0L7RgNC40Lgg0LTQu9GPINC/0L7QtNGB0YLQsNC90L7QstC60LguXG4gICAgICogQHBhcmFtIHByb2R1Y3RQYXRoIFVybCDQv9GD0YLRjCDQuiDRgtC+0LLQsNGA0YMuINCSINC/0YPRgtC4INC00L7Qu9C20LXQvSDQv9GA0LjRgdGD0YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvSAnOmlkJywg0L7QsdC+0LfQvdCw0YfQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGC0L7QstCw0YDQsCDQtNC70Y8g0L/QvtC00YHRgtCw0L3QvtCy0LrQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNhdGVnb3J5TWFpbkVudGl0eShjYXRlZ29yeTogU2NJQ2F0ZWdvcnkgfCBTY0lWaXJ0dWFsQ2F0ZWdvcnksIHByb2R1Y3RzOiBTY0lQcm9kdWN0W10sIGNhdGVnb3J5UGF0aDogc3RyaW5nLCBwcm9kdWN0UGF0aDogc3RyaW5nKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgY2hpbGRDYXRlZ29yaWVzID0gdGhpcy5pc1ZpcnR1YWxDYXRlZ29yeShjYXRlZ29yeSlcbiAgICAgICAgICAgID8gWy4uLigoY2F0ZWdvcnkgYXMgU2NWaXJ0dWFsQ2F0ZWdvcnkpLmNoaWxkQ2F0ZWdvcmllcyA/PyBbXSksIC4uLigoY2F0ZWdvcnkgYXMgU2NWaXJ0dWFsQ2F0ZWdvcnkpLnByb2R1Y3RDYXRlZ29yaWVzID8/IFtdKV1cbiAgICAgICAgICAgIDogKChjYXRlZ29yeSBhcyBTY0NhdGVnb3J5KS5jYXRlZ29yaWVzID8/IFtdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0B0eXBlJzogJ0l0ZW1MaXN0JyxcbiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IHByb2R1Y3RzLmxlbmd0aCArIGNoaWxkQ2F0ZWdvcmllcy5sZW5ndGgsXG4gICAgICAgICAgICBpdGVtTGlzdE9yZGVyOiAnaHR0cHM6Ly9zY2hlbWEub3JnL0l0ZW1MaXN0VW5vcmRlcmVkJyxcbiAgICAgICAgICAgIGl0ZW1MaXN0RWxlbWVudDogW1xuICAgICAgICAgICAgICAgIC8vINCU0L7QsdCw0LLQu9GP0LXQvCDQv9C+0LTQutCw0YLQtdCz0L7RgNC40Lgg0LIg0L3QsNGH0LDQu9C+INGB0L/QuNGB0LrQsC5cbiAgICAgICAgICAgICAgICAuLi5jaGlsZENhdGVnb3JpZXMuc2xpY2UoMCwgNSkubWFwKChzdWJDYXRlZ29yeSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLm1lZGlhSW1hZ2VUcmFuc2Zvcm1lclBpcGUudHJhbnNmb3JtKHN1YkNhdGVnb3J5LmltYWdlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBzdWJDYXRlZ29yeS5zZW8/LmRlc2NyaXB0aW9uID8/IHN1YkNhdGVnb3J5LnByb3BlcnRpZXM/LmRlc2NyaXB0aW9uO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnTGlzdEl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQHR5cGUnOiAnQ29sbGVjdGlvblBhZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN1YkNhdGVnb3J5Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmdldENhdGVnb3J5Q2Fub25pY2FsVXJsKHN1YkNhdGVnb3J5LCBjYXRlZ29yeVBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihpbWFnZSAmJiB7IGltYWdlIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyDQlNC+0LHQsNCy0LvRj9C10Lwg0YLQvtCy0LDRgNGLINC/0L7RgdC70LUg0L/QvtC00LrQsNGC0LXQs9C+0YDQuNC5LlxuICAgICAgICAgICAgICAgIC4uLnByb2R1Y3RzLnNsaWNlKDAsIDEwKS5tYXAoKHByb2R1Y3QsIGluZGV4KSA9PiB0aGlzLmNyZWF0ZVByb2R1Y3RzTGlzdEl0ZW0ocHJvZHVjdCwgY2hpbGRDYXRlZ29yaWVzLmxlbmd0aCArIGluZGV4ICsgMSwgcHJvZHVjdFBhdGgpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQvNCw0YHRgdC40LIgTGlua0RhdGEg0LIgQnJlYWRjcnVtYkxpc3Qg0LTQu9GPINC60LDRgtCw0LvQvtCz0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnJlYWRjcnVtYnMg0JzQsNGB0YHQuNCyINGF0LvQtdCx0L3Ri9GFINC60YDQvtGI0LXQui5cbiAgICAgKiBAcGFyYW0gY2F0ZWdvcnlQYXRoIFVybCDQv9GD0YLRjCDQuiDQutCw0YLQtdCz0L7RgNC40Y/QvCDRgtC+0LLQsNGA0L7Qsi4g0JIg0L/Rg9GC0Lgg0LTQvtC70LbQtdC9INC/0YDQuNGB0YPRgtGB0YLQstC+0LLQsNGC0Ywg0YjQsNCx0LvQvtC9ICc6aWQnLCDQvtCx0L7Qt9C90LDRh9Cw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LrQsNGC0LXQs9C+0YDQuNC4INC00LvRjyDQv9C+0LTRgdGC0LDQvdC+0LLQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2F0YWxvZ0JyZWFkY3J1bWJzTGlzdChicmVhZGNydW1iczogU2NJQnJlYWRjcnVtYkl0ZW1bXSwgY2F0ZWdvcnlQYXRoOiBzdHJpbmcpOiBCcmVhZGNydW1iTGlzdCB7XG4gICAgICAgIGNvbnN0IGNhdGFsb2dVcmwgPSBgJHt0aGlzLnVybHMuc2l0ZVVybH0ke2NhdGVnb3J5UGF0aC5yZXBsYWNlKCc6aWQnLCAnJyl9YDtcbiAgICAgICAgY29uc3QgYnJlYWRjcnVtYkl0ZW1zOiBMaXN0SXRlbVtdID0gW1xuICAgICAgICAgICAgLy8g0JLRgdC10LPQtNCwINC00L7QsdCw0LLQu9GP0LXQvCDQs9C70LDQstC90YPRjiDRgdGC0YDQsNC90LjRhtGDLlxuICAgICAgICAgICAgdGhpcy5jcmVhdGVCcmVhZGNydW1iTGlzdEl0ZW0oMSwgJ9CT0LvQsNCy0L3QsNGPJywgdGhpcy51cmxzLnNpdGVVcmwpLFxuICAgICAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INC60LDRgtCw0LvQvtCzLlxuICAgICAgICAgICAgdGhpcy5jcmVhdGVCcmVhZGNydW1iTGlzdEl0ZW0oMiwgJ9Ca0LDRgtCw0LvQvtCzJywgY2F0YWxvZ1VybCksXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8g0JTQvtCx0LDQstC70Y/QtdC8INGB0YPRidC10YHRgtCy0YPRjtGJ0LjQtSBicmVhZGNydW1icyDRgSDQutC+0YDRgNC10LrRgtC40YDQvtCy0LrQvtC5INC/0L7Qt9C40YbQuNC5LlxuICAgICAgICBicmVhZGNydW1icy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGlzQXJyYXkoaXRlbS5yb3V0ZXJMaW5rKSA/IGl0ZW0ucm91dGVyTGluay5qb2luKCcvJykgOiBpdGVtLnJvdXRlckxpbms7XG5cbiAgICAgICAgICAgIGJyZWFkY3J1bWJJdGVtcy5wdXNoKHRoaXMuY3JlYXRlQnJlYWRjcnVtYkxpc3RJdGVtKGluZGV4ICsgMywgaXRlbS5sYWJlbCwgbGluayA/IGAke3RoaXMudXJscy5zaXRlVXJsfS8ke2xpbmt9YCA6IHVuZGVmaW5lZCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0B0eXBlJzogJ0JyZWFkY3J1bWJMaXN0JyxcbiAgICAgICAgICAgIGl0ZW1MaXN0T3JkZXI6ICdodHRwczovL3NjaGVtYS5vcmcvSXRlbUxpc3RPcmRlckFzY2VuZGluZycsXG4gICAgICAgICAgICBpdGVtTGlzdEVsZW1lbnQ6IGJyZWFkY3J1bWJJdGVtcyxcbiAgICAgICAgfSBhcyBCcmVhZGNydW1iTGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0ZHRgiDRjdC70LXQvNC10L3RgiBCcmVhZGNydW1iTGlzdCDQsiDRhNC+0YDQvNCw0YLQtSwg0YDQtdC60L7QvNC10L3QtNC+0LLQsNC90L3QvtC8IFNjaGVtYS5vcmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24g0J/QvtC30LjRhtC40Y8g0Y3Qu9C10LzQtdC90YLQsCDQsiDRhtC10L/QvtGH0LrQtS5cbiAgICAgKiBAcGFyYW0gbmFtZSDQndCw0LfQstCw0L3QuNC1INGN0LvQtdC80LXQvdGC0LAuXG4gICAgICogQHBhcmFtIHVybCBVUkwg0Y3Qu9C10LzQtdC90YLQsC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICAgIHByaXZhdGUgY3JlYXRlQnJlYWRjcnVtYkxpc3RJdGVtKHBvc2l0aW9uOiBudW1iZXIsIG5hbWU6IHN0cmluZywgdXJsPzogc3RyaW5nKTogTGlzdEl0ZW0ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ0B0eXBlJzogJ0xpc3RJdGVtJyxcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgLi4uKHVybFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0BpZCc6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogeyBuYW1lIH0pLFxuICAgICAgICB9IGFzIExpc3RJdGVtO1xuICAgIH1cbn1cbiJdfQ==