@revxui/api-clients-ts 1.1.485 → 1.1.486

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 (84) hide show
  1. package/README.md +2 -2
  2. package/api/api.d.ts +1 -3
  3. package/api/appSettingsController.service.d.ts +3 -3
  4. package/api/creativeSetsController.service.d.ts +3 -3
  5. package/api/pixelController.service.d.ts +3 -3
  6. package/esm2020/api/adminController.service.mjs +2 -2
  7. package/esm2020/api/advertiserController.service.mjs +2 -2
  8. package/esm2020/api/api.mjs +2 -4
  9. package/esm2020/api/appSettingsController.service.mjs +2 -2
  10. package/esm2020/api/appsFlyerController.service.mjs +2 -2
  11. package/esm2020/api/audienceController.service.mjs +2 -2
  12. package/esm2020/api/auditController.service.mjs +2 -2
  13. package/esm2020/api/bidFunnelController.service.mjs +2 -2
  14. package/esm2020/api/bulkStrategyController.service.mjs +2 -2
  15. package/esm2020/api/cSSThemeController_.service.mjs +2 -2
  16. package/esm2020/api/campaignController.service.mjs +2 -2
  17. package/esm2020/api/catalogController.service.mjs +2 -2
  18. package/esm2020/api/clickDestinationController.service.mjs +2 -2
  19. package/esm2020/api/creativeController.service.mjs +2 -2
  20. package/esm2020/api/creativeSetsController.service.mjs +5 -5
  21. package/esm2020/api/creativeTemplateThemesController.service.mjs +2 -2
  22. package/esm2020/api/creativeTemplateVariablesController.service.mjs +2 -2
  23. package/esm2020/api/creativeTemplatesController.service.mjs +2 -2
  24. package/esm2020/api/customerReportingController.service.mjs +2 -2
  25. package/esm2020/api/dCOVideoSettingsController.service.mjs +2 -2
  26. package/esm2020/api/dashboardController.service.mjs +2 -2
  27. package/esm2020/api/experimentsController.service.mjs +2 -2
  28. package/esm2020/api/notificationsController.service.mjs +2 -2
  29. package/esm2020/api/pixelController.service.mjs +5 -5
  30. package/esm2020/api/reportController.service.mjs +2 -2
  31. package/esm2020/api/reportingController.service.mjs +2 -2
  32. package/esm2020/api/reportingSchedulerController.service.mjs +2 -2
  33. package/esm2020/api/safeguardController.service.mjs +2 -2
  34. package/esm2020/api/sliceXController.service.mjs +2 -2
  35. package/esm2020/api/strategyController.service.mjs +2 -2
  36. package/esm2020/api/strategyTemplateController.service.mjs +2 -2
  37. package/esm2020/api/uILoggerController.service.mjs +2 -2
  38. package/esm2020/api/userPreferenceController.service.mjs +2 -2
  39. package/esm2020/api.module.mjs +1 -4
  40. package/esm2020/model/advertiserAppSettingsDTO.mjs +2 -3
  41. package/esm2020/model/advertiserSettings.mjs +2 -9
  42. package/esm2020/model/appSettingsDTO.mjs +2 -3
  43. package/esm2020/model/creativeDTO.mjs +1 -6
  44. package/esm2020/model/creativeEntity.mjs +1 -6
  45. package/esm2020/model/creativeSetDetails.mjs +1 -1
  46. package/esm2020/model/creativeSetPerformanceList.mjs +1 -1
  47. package/esm2020/model/models.mjs +1 -10
  48. package/esm2020/model/strategyDTO.mjs +1 -1
  49. package/esm2020/model/videoAttributes.mjs +1 -6
  50. package/fesm2015/revxui-api-clients-ts.mjs +42 -471
  51. package/fesm2015/revxui-api-clients-ts.mjs.map +1 -1
  52. package/fesm2020/revxui-api-clients-ts.mjs +42 -469
  53. package/fesm2020/revxui-api-clients-ts.mjs.map +1 -1
  54. package/model/advertiserAppSettingsDTO.d.ts +1 -2
  55. package/model/advertiserSettings.d.ts +0 -9
  56. package/model/appSettingsDTO.d.ts +1 -2
  57. package/model/creativeDTO.d.ts +0 -7
  58. package/model/creativeEntity.d.ts +0 -7
  59. package/model/creativeSetDetails.d.ts +0 -1
  60. package/model/creativeSetPerformanceList.d.ts +0 -1
  61. package/model/models.d.ts +0 -9
  62. package/model/strategyDTO.d.ts +1 -0
  63. package/model/videoAttributes.d.ts +0 -7
  64. package/package.json +1 -1
  65. package/api/creativeSetsV2Controller.service.d.ts +0 -97
  66. package/esm2020/api/creativeSetsV2Controller.service.mjs +0 -251
  67. package/esm2020/model/apiListResponseCreativeSizeMappingDTO.mjs +0 -2
  68. package/esm2020/model/assetSelectionDTO.mjs +0 -2
  69. package/esm2020/model/creativeAssetOptimizationRequest.mjs +0 -23
  70. package/esm2020/model/creativeAssetUploadResponse.mjs +0 -20
  71. package/esm2020/model/creativeSizeMappingDTO.mjs +0 -38
  72. package/esm2020/model/endCardSelectionDTO.mjs +0 -19
  73. package/esm2020/model/optimizationJobItemStatusDTO.mjs +0 -21
  74. package/esm2020/model/optimizationJobStatusResponse.mjs +0 -11
  75. package/esm2020/model/selectedTargetDTO.mjs +0 -24
  76. package/model/apiListResponseCreativeSizeMappingDTO.d.ts +0 -16
  77. package/model/assetSelectionDTO.d.ts +0 -18
  78. package/model/creativeAssetOptimizationRequest.d.ts +0 -41
  79. package/model/creativeAssetUploadResponse.d.ts +0 -26
  80. package/model/creativeSizeMappingDTO.d.ts +0 -47
  81. package/model/endCardSelectionDTO.d.ts +0 -22
  82. package/model/optimizationJobItemStatusDTO.d.ts +0 -27
  83. package/model/optimizationJobStatusResponse.d.ts +0 -32
  84. package/model/selectedTargetDTO.d.ts +0 -30
@@ -15,7 +15,7 @@ export interface AdvertiserAppSettingsDTO {
15
15
  value?: string;
16
16
  }
17
17
  export declare namespace AdvertiserAppSettingsDTO {
18
- type KeyEnum = 'FEED_KEY' | 'LIFT_TEST_ACTIVE' | 'EVENT_FILTER_ALLOWED' | 'SKU_ALLOWED_CHARS' | 'TRANSACTION_CURRENCY' | 'CREATIVE_NAME_FORMAT' | 'CLICK_SIGNING' | 'SLACK_CHANNEL_ID' | 'ENABLE_AUDIT_LOGS_REPORT' | 'CREATIVE_BORDER_TYPE';
18
+ type KeyEnum = 'FEED_KEY' | 'LIFT_TEST_ACTIVE' | 'EVENT_FILTER_ALLOWED' | 'SKU_ALLOWED_CHARS' | 'TRANSACTION_CURRENCY' | 'CREATIVE_NAME_FORMAT' | 'CLICK_SIGNING' | 'SLACK_CHANNEL_ID' | 'ENABLE_AUDIT_LOGS_REPORT';
19
19
  const KeyEnum: {
20
20
  FEEDKEY: KeyEnum;
21
21
  LIFTTESTACTIVE: KeyEnum;
@@ -26,7 +26,6 @@ export declare namespace AdvertiserAppSettingsDTO {
26
26
  CLICKSIGNING: KeyEnum;
27
27
  SLACKCHANNELID: KeyEnum;
28
28
  ENABLEAUDITLOGSREPORT: KeyEnum;
29
- CREATIVEBORDERTYPE: KeyEnum;
30
29
  };
31
30
  type TypeEnum = 'BOOLEAN' | 'STRING' | 'JSON' | 'INTEGER' | 'DOUBLE' | 'FLOAT';
32
31
  const TypeEnum: {
@@ -12,7 +12,6 @@
12
12
  import { BaseModel } from './baseModel';
13
13
  export interface AdvertiserSettings {
14
14
  advertiserId?: number;
15
- creativeBorderType?: AdvertiserSettings.CreativeBorderTypeEnum;
16
15
  creativeNameFormat?: string;
17
16
  dateFormat?: string;
18
17
  eventFilterAllowed?: boolean;
@@ -26,11 +25,3 @@ export interface AdvertiserSettings {
26
25
  slackChannelId?: string;
27
26
  transactionCurrency?: BaseModel;
28
27
  }
29
- export declare namespace AdvertiserSettings {
30
- type CreativeBorderTypeEnum = 'NONE' | 'BLACK' | 'BLUR';
31
- const CreativeBorderTypeEnum: {
32
- NONE: CreativeBorderTypeEnum;
33
- BLACK: CreativeBorderTypeEnum;
34
- BLUR: CreativeBorderTypeEnum;
35
- };
36
- }
@@ -21,7 +21,7 @@ export interface AppSettingsDTO {
21
21
  settingsValue?: string;
22
22
  }
23
23
  export declare namespace AppSettingsDTO {
24
- type SettingsKeyEnum = 'LOGO_LINK' | 'FALLBACK_IMG_LINK' | 'OVERLAY_IMG_LINK' | 'DEFAULT_LOGO' | 'CREATIVE_NAME_FORMAT' | 'CLICK_SIGNING' | 'SLACK_CHANNEL_ID' | 'ENABLE_AUDIT_LOGS_REPORT' | 'CREATIVE_BORDER_TYPE';
24
+ type SettingsKeyEnum = 'LOGO_LINK' | 'FALLBACK_IMG_LINK' | 'OVERLAY_IMG_LINK' | 'DEFAULT_LOGO' | 'CREATIVE_NAME_FORMAT' | 'CLICK_SIGNING' | 'SLACK_CHANNEL_ID' | 'ENABLE_AUDIT_LOGS_REPORT';
25
25
  const SettingsKeyEnum: {
26
26
  LOGOLINK: SettingsKeyEnum;
27
27
  FALLBACKIMGLINK: SettingsKeyEnum;
@@ -31,7 +31,6 @@ export declare namespace AppSettingsDTO {
31
31
  CLICKSIGNING: SettingsKeyEnum;
32
32
  SLACKCHANNELID: SettingsKeyEnum;
33
33
  ENABLEAUDITLOGSREPORT: SettingsKeyEnum;
34
- CREATIVEBORDERTYPE: SettingsKeyEnum;
35
34
  };
36
35
  type SettingsTypeEnum = 'BOOLEAN' | 'STRING' | 'JSON' | 'INTEGER' | 'DOUBLE' | 'FLOAT';
37
36
  const SettingsTypeEnum: {
@@ -23,7 +23,6 @@ export interface CreativeDTO {
23
23
  advertiserId?: number;
24
24
  archived?: boolean;
25
25
  assetPreviewId?: number;
26
- borderType?: CreativeDTO.BorderTypeEnum;
27
26
  clickDestination?: ClickDestination;
28
27
  content?: string;
29
28
  contentType?: CreativeDTO.ContentTypeEnum;
@@ -73,12 +72,6 @@ export interface CreativeDTO {
73
72
  videoUploadType?: CreativeDTO.VideoUploadTypeEnum;
74
73
  }
75
74
  export declare namespace CreativeDTO {
76
- type BorderTypeEnum = 'NONE' | 'BLACK' | 'BLUR';
77
- const BorderTypeEnum: {
78
- NONE: BorderTypeEnum;
79
- BLACK: BorderTypeEnum;
80
- BLUR: BorderTypeEnum;
81
- };
82
75
  type ContentTypeEnum = 'ZIP' | 'JPG' | 'JPEG' | 'PNG' | 'GIF' | 'FLV' | 'MP4' | 'THREE_GPP' | 'MOV' | 'WEBM' | 'DASH' | 'HLS' | 'GZIP' | 'TEXT' | 'CSV' | 'UNKNOWN' | 'XMPEGURL';
83
76
  const ContentTypeEnum: {
84
77
  ZIP: ContentTypeEnum;
@@ -16,7 +16,6 @@ export interface CreativeEntity {
16
16
  assetPreviewId?: number;
17
17
  attributesId?: number;
18
18
  bidResponseTestEnabled?: boolean;
19
- borderType?: CreativeEntity.BorderTypeEnum;
20
19
  cdnId?: number;
21
20
  clickDestination?: number;
22
21
  content?: string;
@@ -57,12 +56,6 @@ export interface CreativeEntity {
57
56
  width?: number;
58
57
  }
59
58
  export declare namespace CreativeEntity {
60
- type BorderTypeEnum = 'NONE' | 'BLACK' | 'BLUR';
61
- const BorderTypeEnum: {
62
- NONE: BorderTypeEnum;
63
- BLACK: BorderTypeEnum;
64
- BLUR: BorderTypeEnum;
65
- };
66
59
  type HybridAdTypeEnum = 'STATIC' | 'DYNAMIC';
67
60
  const HybridAdTypeEnum: {
68
61
  STATIC: HybridAdTypeEnum;
@@ -46,7 +46,6 @@ export interface CreativeSetDetails {
46
46
  strategyList?: Array<BaseModel>;
47
47
  theme?: BaseModel;
48
48
  type?: CreativeSetDetails.TypeEnum;
49
- version?: number;
50
49
  }
51
50
  export declare namespace CreativeSetDetails {
52
51
  type TypeEnum = 'IMAGE' | 'VIDEO' | 'THIRD_PARTY_AD_TAGS' | 'ZIPPED_HTML' | 'NATIVE_IMAGE' | 'NATIVE_VIDEO' | 'DYNAMIC_IMAGE' | 'DYNAMIC_MACRO' | 'DYNAMIC_HTML' | 'DYNAMIC_VIDEO' | 'HYBRID_STATIC_AD' | 'HYBRID_DYNAMIC_AD' | 'THIRD_PARTY_VIDEO_AD_TAGS' | 'NATIVE_ICON' | 'ICON' | 'CTV_VIDEO' | 'PLAYABLE';
@@ -102,7 +102,6 @@ export interface CreativeSetPerformanceList {
102
102
  totalSkanInstalls?: number;
103
103
  totalUU?: number;
104
104
  userReach?: number;
105
- version?: number;
106
105
  viewConversions?: number;
107
106
  viewReEngagements?: number;
108
107
  viewReInstalls?: number;
package/model/models.d.ts CHANGED
@@ -35,7 +35,6 @@ export * from './apiListResponseCreativeDTO';
35
35
  export * from './apiListResponseCreativePerformanceList';
36
36
  export * from './apiListResponseCreativeSetDashboardMetric';
37
37
  export * from './apiListResponseCreativeSetPerformanceList';
38
- export * from './apiListResponseCreativeSizeMappingDTO';
39
38
  export * from './apiListResponseCreativeTemplateDTO';
40
39
  export * from './apiListResponseHotstarNativeFileRequest';
41
40
  export * from './apiListResponseMacro';
@@ -187,7 +186,6 @@ export * from './apiResponseObjectlong';
187
186
  export * from './apiResponseObjectstring';
188
187
  export * from './appSettingsDTO';
189
188
  export * from './appSettingsPropertyDTO';
190
- export * from './assetSelectionDTO';
191
189
  export * from './auctionTypeEditField';
192
190
  export * from './audienceAccessDTO';
193
191
  export * from './audienceAnalysisRequest';
@@ -244,8 +242,6 @@ export * from './contentGenre';
244
242
  export * from './contentLanguage';
245
243
  export * from './creative';
246
244
  export * from './creativeAssetEntity';
247
- export * from './creativeAssetOptimizationRequest';
248
- export * from './creativeAssetUploadResponse';
249
245
  export * from './creativeCompactDTO';
250
246
  export * from './creativeDTO';
251
247
  export * from './creativeDetails';
@@ -267,7 +263,6 @@ export * from './creativeSetPerformanceList';
267
263
  export * from './creativeSetRequest';
268
264
  export * from './creativeSetRescheduleRequest';
269
265
  export * from './creativeSetResponse';
270
- export * from './creativeSizeMappingDTO';
271
266
  export * from './creativeStrategyAssociationStatus';
272
267
  export * from './creativeTemplateDTO';
273
268
  export * from './creativeTemplatesMetadataDTO';
@@ -330,7 +325,6 @@ export * from './dynamicVideoTemplate';
330
325
  export * from './eResponseobject';
331
326
  export * from './eligibleUsersRequest';
332
327
  export * from './eligibleUsersResponse';
333
- export * from './endCardSelectionDTO';
334
328
  export * from './endCards';
335
329
  export * from './experimentsEntity';
336
330
  export * from './extendedBaseModel';
@@ -380,8 +374,6 @@ export * from './nativeAssetPojo';
380
374
  export * from './notificationListResponseNotificationResponse';
381
375
  export * from './notificationResponse';
382
376
  export * from './onDayCohortData';
383
- export * from './optimizationJobItemStatusDTO';
384
- export * from './optimizationJobStatusResponse';
385
377
  export * from './optimizationRuleAuditLogDTO';
386
378
  export * from './optimizationRuleAuditLogDTOList';
387
379
  export * from './optimizationRuleDTO';
@@ -422,7 +414,6 @@ export * from './safeguardResponseDTO';
422
414
  export * from './safeguardRuleMasterEntity';
423
415
  export * from './schedulerRequest';
424
416
  export * from './searchRequest';
425
- export * from './selectedTargetDTO';
426
417
  export * from './siteListDTO';
427
418
  export * from './siteListRequest';
428
419
  export * from './siteModel';
@@ -69,6 +69,7 @@ export interface StrategyDTO {
69
69
  currency?: BaseModel;
70
70
  currencyCode?: string;
71
71
  dailyAdvSpendBudget?: number;
72
+ dayPartingTimezone?: TimeZoneDTO;
72
73
  daysDuration?: number;
73
74
  daysElapsed?: number;
74
75
  dealDTO?: Array<DealESDTO>;
@@ -11,7 +11,6 @@
11
11
  */
12
12
  export interface VideoAttributes {
13
13
  bitRate?: string;
14
- borderType?: VideoAttributes.BorderTypeEnum;
15
14
  companionContentType?: VideoAttributes.CompanionContentTypeEnum;
16
15
  companionCreativeId?: number;
17
16
  companionHeight?: number;
@@ -31,12 +30,6 @@ export interface VideoAttributes {
31
30
  videoWidth?: number;
32
31
  }
33
32
  export declare namespace VideoAttributes {
34
- type BorderTypeEnum = 'NONE' | 'BLACK' | 'BLUR';
35
- const BorderTypeEnum: {
36
- NONE: BorderTypeEnum;
37
- BLACK: BorderTypeEnum;
38
- BLUR: BorderTypeEnum;
39
- };
40
33
  type CompanionContentTypeEnum = 'ZIP' | 'JPG' | 'JPEG' | 'PNG' | 'GIF' | 'FLV' | 'MP4' | 'THREE_GPP' | 'MOV' | 'WEBM' | 'DASH' | 'HLS' | 'GZIP' | 'TEXT' | 'CSV' | 'UNKNOWN' | 'XMPEGURL';
41
34
  const CompanionContentTypeEnum: {
42
35
  ZIP: CompanionContentTypeEnum;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revxui/api-clients-ts",
3
- "version": "1.1.485",
3
+ "version": "1.1.486",
4
4
  "description": "swagger client for @revxui/api-clients-ts",
5
5
  "author": "Swagger Codegen Contributors",
6
6
  "keywords": [
@@ -1,97 +0,0 @@
1
- import { HttpClient, HttpHeaders, HttpResponse, HttpEvent } from '@angular/common/http';
2
- import { Observable } from 'rxjs';
3
- import { ApiListResponseCreativeSizeMappingDTO } from '../model/apiListResponseCreativeSizeMappingDTO';
4
- import { CreativeAssetOptimizationRequest } from '../model/creativeAssetOptimizationRequest';
5
- import { CreativeAssetUploadResponse } from '../model/creativeAssetUploadResponse';
6
- import { OptimizationJobStatusResponse } from '../model/optimizationJobStatusResponse';
7
- import { Configuration } from '../configuration';
8
- import * as i0 from "@angular/core";
9
- export declare class CreativeSetsV2ControllerService {
10
- protected httpClient: HttpClient;
11
- protected basePath: string;
12
- defaultHeaders: HttpHeaders;
13
- configuration: Configuration;
14
- constructor(httpClient: HttpClient, basePath: string, configuration: Configuration);
15
- /**
16
- * @param consumes string[] mime-types
17
- * @return true: consumes contains 'multipart/form-data', false: otherwise
18
- */
19
- private canConsumeForm;
20
- /**
21
- * Poll job status/progress — drives the loader % and the Generation Results table.
22
- *
23
- * @param jobId jobId
24
- * @param reqId request id
25
- * @param token Auth Token
26
- * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
27
- * @param reportProgress flag to report request and response progress.
28
- */
29
- getJobStatusUsingGET(jobId: number, reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<OptimizationJobStatusResponse>;
30
- getJobStatusUsingGET(jobId: number, reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<OptimizationJobStatusResponse>>;
31
- getJobStatusUsingGET(jobId: number, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<OptimizationJobStatusResponse>>;
32
- /**
33
- * Fetch the full size-mapping config for a creative type (browser caches this for the session).
34
- *
35
- * @param creativeType creativeType
36
- * @param reqId request id
37
- * @param token Auth Token
38
- * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
39
- * @param reportProgress flag to report request and response progress.
40
- */
41
- getSizeMappingConfigUsingGET(creativeType: 'IMAGE' | 'VIDEO' | 'THIRD_PARTY_AD_TAGS' | 'ZIPPED_HTML' | 'NATIVE_IMAGE' | 'NATIVE_VIDEO' | 'DYNAMIC_IMAGE' | 'DYNAMIC_MACRO' | 'DYNAMIC_HTML' | 'DYNAMIC_VIDEO' | 'HYBRID_STATIC_AD' | 'HYBRID_DYNAMIC_AD' | 'THIRD_PARTY_VIDEO_AD_TAGS' | 'NATIVE_ICON' | 'ICON' | 'CTV_VIDEO' | 'PLAYABLE', reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<ApiListResponseCreativeSizeMappingDTO>;
42
- getSizeMappingConfigUsingGET(creativeType: 'IMAGE' | 'VIDEO' | 'THIRD_PARTY_AD_TAGS' | 'ZIPPED_HTML' | 'NATIVE_IMAGE' | 'NATIVE_VIDEO' | 'DYNAMIC_IMAGE' | 'DYNAMIC_MACRO' | 'DYNAMIC_HTML' | 'DYNAMIC_VIDEO' | 'HYBRID_STATIC_AD' | 'HYBRID_DYNAMIC_AD' | 'THIRD_PARTY_VIDEO_AD_TAGS' | 'NATIVE_ICON' | 'ICON' | 'CTV_VIDEO' | 'PLAYABLE', reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<ApiListResponseCreativeSizeMappingDTO>>;
43
- getSizeMappingConfigUsingGET(creativeType: 'IMAGE' | 'VIDEO' | 'THIRD_PARTY_AD_TAGS' | 'ZIPPED_HTML' | 'NATIVE_IMAGE' | 'NATIVE_VIDEO' | 'DYNAMIC_IMAGE' | 'DYNAMIC_MACRO' | 'DYNAMIC_HTML' | 'DYNAMIC_VIDEO' | 'HYBRID_STATIC_AD' | 'HYBRID_DYNAMIC_AD' | 'THIRD_PARTY_VIDEO_AD_TAGS' | 'NATIVE_ICON' | 'ICON' | 'CTV_VIDEO' | 'PLAYABLE', reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<ApiListResponseCreativeSizeMappingDTO>>;
44
- /**
45
- * Create a new CreativeSet from the previously-uploaded asset&#39;s mediaId + selected target sizes. Pure JSON — the file itself already traveled in the earlier /upload call. Returns immediately with a jobId.
46
- *
47
- * @param request request
48
- * @param reqId request id
49
- * @param token Auth Token
50
- * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
51
- * @param reportProgress flag to report request and response progress.
52
- */
53
- saveUsingPOST(request: CreativeAssetOptimizationRequest, reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<{
54
- [key: string]: number;
55
- }>;
56
- saveUsingPOST(request: CreativeAssetOptimizationRequest, reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<{
57
- [key: string]: number;
58
- }>>;
59
- saveUsingPOST(request: CreativeAssetOptimizationRequest, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<{
60
- [key: string]: number;
61
- }>>;
62
- /**
63
- * Edit an existing CreativeSet — replaces every one of its creatives with freshly-generated ones from the submitted assets/target sizes. Mirrors the legacy flow&#39;s POST /creativesets/{id}, but goes through the same async upload -&gt; save -&gt; poll job pipeline as create. Returns immediately with a jobId.
64
- *
65
- * @param id id
66
- * @param request request
67
- * @param reqId request id
68
- * @param token Auth Token
69
- * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
70
- * @param reportProgress flag to report request and response progress.
71
- */
72
- updateUsingPOST(id: number, request: CreativeAssetOptimizationRequest, reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<{
73
- [key: string]: number;
74
- }>;
75
- updateUsingPOST(id: number, request: CreativeAssetOptimizationRequest, reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<{
76
- [key: string]: number;
77
- }>>;
78
- updateUsingPOST(id: number, request: CreativeAssetOptimizationRequest, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<{
79
- [key: string]: number;
80
- }>>;
81
- /**
82
- * Upload the original asset only — persists it, detects its dimensions, and returns a mediaId. Called silently in the background while the user fills out the rest of the creative form; does not create a job or touch the database&#39;s Creative/CreativeSets tables.
83
- *
84
- * @param advertiserId advertiserId
85
- * @param creativeSetType creativeSetType
86
- * @param file file
87
- * @param reqId request id
88
- * @param token Auth Token
89
- * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
90
- * @param reportProgress flag to report request and response progress.
91
- */
92
- uploadUsingPOST(advertiserId: any, creativeSetType: any, file: Blob, reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<CreativeAssetUploadResponse>;
93
- uploadUsingPOST(advertiserId: any, creativeSetType: any, file: Blob, reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<CreativeAssetUploadResponse>>;
94
- uploadUsingPOST(advertiserId: any, creativeSetType: any, file: Blob, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<CreativeAssetUploadResponse>>;
95
- static ɵfac: i0.ɵɵFactoryDeclaration<CreativeSetsV2ControllerService, [null, { optional: true; }, { optional: true; }]>;
96
- static ɵprov: i0.ɵɵInjectableDeclaration<CreativeSetsV2ControllerService>;
97
- }
@@ -1,251 +0,0 @@
1
- /**
2
- * Api Documentation
3
- * Api Documentation
4
- *
5
- * OpenAPI spec version: 1.0
6
- *
7
- *
8
- * NOTE: This class is auto generated by the swagger code generator program.
9
- * https://github.com/swagger-api/swagger-codegen.git
10
- * Do not edit the class manually.
11
- */
12
- /* tslint:disable:no-unused-variable member-ordering */
13
- import { Inject, Injectable, Optional } from '@angular/core';
14
- import { HttpHeaders, HttpParams } from '@angular/common/http';
15
- import { CustomHttpUrlEncodingCodec } from '../encoder';
16
- import { BASE_PATH } from '../variables';
17
- import { Configuration } from '../configuration';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "@angular/common/http";
20
- import * as i2 from "../configuration";
21
- export class CreativeSetsV2ControllerService {
22
- constructor(httpClient, basePath, configuration) {
23
- this.httpClient = httpClient;
24
- this.basePath = 'https://apiv2stage7.atomex.net';
25
- this.defaultHeaders = new HttpHeaders();
26
- this.configuration = new Configuration();
27
- if (basePath) {
28
- this.basePath = basePath;
29
- }
30
- if (configuration) {
31
- this.configuration = configuration;
32
- this.basePath = basePath || configuration.basePath || this.basePath;
33
- }
34
- }
35
- /**
36
- * @param consumes string[] mime-types
37
- * @return true: consumes contains 'multipart/form-data', false: otherwise
38
- */
39
- canConsumeForm(consumes) {
40
- const form = 'multipart/form-data';
41
- for (const consume of consumes) {
42
- if (form === consume) {
43
- return true;
44
- }
45
- }
46
- return false;
47
- }
48
- getJobStatusUsingGET(jobId, reqId, token, observe = 'body', reportProgress = false) {
49
- if (jobId === null || jobId === undefined) {
50
- throw new Error('Required parameter jobId was null or undefined when calling getJobStatusUsingGET.');
51
- }
52
- let headers = this.defaultHeaders;
53
- if (reqId !== undefined && reqId !== null) {
54
- headers = headers.set('reqId', String(reqId));
55
- }
56
- if (token !== undefined && token !== null) {
57
- headers = headers.set('token', String(token));
58
- }
59
- // to determine the Accept header
60
- let httpHeaderAccepts = [
61
- 'application/json'
62
- ];
63
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
64
- if (httpHeaderAcceptSelected != undefined) {
65
- headers = headers.set('Accept', httpHeaderAcceptSelected);
66
- }
67
- // to determine the Content-Type header
68
- const consumes = [];
69
- return this.httpClient.get(`${this.basePath}/v2/api/creativesets/v2/jobs/${encodeURIComponent(String(jobId))}`, {
70
- withCredentials: this.configuration.withCredentials,
71
- headers: headers,
72
- observe: observe,
73
- reportProgress: reportProgress
74
- });
75
- }
76
- getSizeMappingConfigUsingGET(creativeType, reqId, token, observe = 'body', reportProgress = false) {
77
- if (creativeType === null || creativeType === undefined) {
78
- throw new Error('Required parameter creativeType was null or undefined when calling getSizeMappingConfigUsingGET.');
79
- }
80
- let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
81
- if (creativeType !== undefined && creativeType !== null) {
82
- queryParameters = queryParameters.set('creativeType', creativeType);
83
- }
84
- let headers = this.defaultHeaders;
85
- if (reqId !== undefined && reqId !== null) {
86
- headers = headers.set('reqId', String(reqId));
87
- }
88
- if (token !== undefined && token !== null) {
89
- headers = headers.set('token', String(token));
90
- }
91
- // to determine the Accept header
92
- let httpHeaderAccepts = [
93
- 'application/json'
94
- ];
95
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
96
- if (httpHeaderAcceptSelected != undefined) {
97
- headers = headers.set('Accept', httpHeaderAcceptSelected);
98
- }
99
- // to determine the Content-Type header
100
- const consumes = [];
101
- return this.httpClient.get(`${this.basePath}/v2/api/creativesets/v2/size-mapping-config`, {
102
- params: queryParameters,
103
- withCredentials: this.configuration.withCredentials,
104
- headers: headers,
105
- observe: observe,
106
- reportProgress: reportProgress
107
- });
108
- }
109
- saveUsingPOST(request, reqId, token, observe = 'body', reportProgress = false) {
110
- if (request === null || request === undefined) {
111
- throw new Error('Required parameter request was null or undefined when calling saveUsingPOST.');
112
- }
113
- let headers = this.defaultHeaders;
114
- if (reqId !== undefined && reqId !== null) {
115
- headers = headers.set('reqId', String(reqId));
116
- }
117
- if (token !== undefined && token !== null) {
118
- headers = headers.set('token', String(token));
119
- }
120
- // to determine the Accept header
121
- let httpHeaderAccepts = [
122
- 'application/json'
123
- ];
124
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
125
- if (httpHeaderAcceptSelected != undefined) {
126
- headers = headers.set('Accept', httpHeaderAcceptSelected);
127
- }
128
- // to determine the Content-Type header
129
- const consumes = [
130
- 'application/json'
131
- ];
132
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
133
- if (httpContentTypeSelected != undefined) {
134
- headers = headers.set('Content-Type', httpContentTypeSelected);
135
- }
136
- return this.httpClient.post(`${this.basePath}/v2/api/creativesets/v2/save`, request, {
137
- withCredentials: this.configuration.withCredentials,
138
- headers: headers,
139
- observe: observe,
140
- reportProgress: reportProgress
141
- });
142
- }
143
- updateUsingPOST(id, request, reqId, token, observe = 'body', reportProgress = false) {
144
- if (id === null || id === undefined) {
145
- throw new Error('Required parameter id was null or undefined when calling updateUsingPOST.');
146
- }
147
- if (request === null || request === undefined) {
148
- throw new Error('Required parameter request was null or undefined when calling updateUsingPOST.');
149
- }
150
- let headers = this.defaultHeaders;
151
- if (reqId !== undefined && reqId !== null) {
152
- headers = headers.set('reqId', String(reqId));
153
- }
154
- if (token !== undefined && token !== null) {
155
- headers = headers.set('token', String(token));
156
- }
157
- // to determine the Accept header
158
- let httpHeaderAccepts = [
159
- 'application/json'
160
- ];
161
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
162
- if (httpHeaderAcceptSelected != undefined) {
163
- headers = headers.set('Accept', httpHeaderAcceptSelected);
164
- }
165
- // to determine the Content-Type header
166
- const consumes = [
167
- 'application/json'
168
- ];
169
- const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
170
- if (httpContentTypeSelected != undefined) {
171
- headers = headers.set('Content-Type', httpContentTypeSelected);
172
- }
173
- return this.httpClient.post(`${this.basePath}/v2/api/creativesets/v2/save/${encodeURIComponent(String(id))}`, request, {
174
- withCredentials: this.configuration.withCredentials,
175
- headers: headers,
176
- observe: observe,
177
- reportProgress: reportProgress
178
- });
179
- }
180
- uploadUsingPOST(advertiserId, creativeSetType, file, reqId, token, observe = 'body', reportProgress = false) {
181
- if (advertiserId === null || advertiserId === undefined) {
182
- throw new Error('Required parameter advertiserId was null or undefined when calling uploadUsingPOST.');
183
- }
184
- if (creativeSetType === null || creativeSetType === undefined) {
185
- throw new Error('Required parameter creativeSetType was null or undefined when calling uploadUsingPOST.');
186
- }
187
- if (file === null || file === undefined) {
188
- throw new Error('Required parameter file was null or undefined when calling uploadUsingPOST.');
189
- }
190
- let headers = this.defaultHeaders;
191
- if (reqId !== undefined && reqId !== null) {
192
- headers = headers.set('reqId', String(reqId));
193
- }
194
- if (token !== undefined && token !== null) {
195
- headers = headers.set('token', String(token));
196
- }
197
- // to determine the Accept header
198
- let httpHeaderAccepts = [
199
- 'application/json'
200
- ];
201
- const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
202
- if (httpHeaderAcceptSelected != undefined) {
203
- headers = headers.set('Accept', httpHeaderAcceptSelected);
204
- }
205
- // to determine the Content-Type header
206
- const consumes = [
207
- 'multipart/form-data'
208
- ];
209
- const canConsumeForm = this.canConsumeForm(consumes);
210
- let formParams;
211
- let useForm = false;
212
- let convertFormParamsToString = false;
213
- // use FormData to transmit files using content-type "multipart/form-data"
214
- // see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
215
- useForm = canConsumeForm;
216
- if (useForm) {
217
- formParams = new FormData();
218
- }
219
- else {
220
- formParams = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
221
- }
222
- if (advertiserId !== undefined) {
223
- formParams = formParams.append('advertiserId', advertiserId) || formParams;
224
- }
225
- if (creativeSetType !== undefined) {
226
- formParams = formParams.append('creativeSetType', creativeSetType) || formParams;
227
- }
228
- if (file !== undefined) {
229
- formParams = formParams.append('file', file) || formParams;
230
- }
231
- return this.httpClient.post(`${this.basePath}/v2/api/creativesets/v2/upload`, convertFormParamsToString ? formParams.toString() : formParams, {
232
- withCredentials: this.configuration.withCredentials,
233
- headers: headers,
234
- observe: observe,
235
- reportProgress: reportProgress
236
- });
237
- }
238
- }
239
- CreativeSetsV2ControllerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CreativeSetsV2ControllerService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
240
- CreativeSetsV2ControllerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CreativeSetsV2ControllerService });
241
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CreativeSetsV2ControllerService, decorators: [{
242
- type: Injectable
243
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
244
- type: Optional
245
- }, {
246
- type: Inject,
247
- args: [BASE_PATH]
248
- }] }, { type: i2.Configuration, decorators: [{
249
- type: Optional
250
- }] }]; } });
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRpdmVTZXRzVjJDb250cm9sbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcGkvY3JlYXRpdmVTZXRzVjJDb250cm9sbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxXQUFXLEVBQUUsVUFBVSxFQUNWLE1BQWdDLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUE2QixZQUFZLENBQUM7QUFTL0UsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFJckYsTUFBTSxPQUFPLCtCQUErQjtJQU14QyxZQUFzQixVQUFzQixFQUFnQyxRQUFnQixFQUFjLGFBQTRCO1FBQWhILGVBQVUsR0FBVixVQUFVLENBQVk7UUFKbEMsYUFBUSxHQUFHLGdDQUFnQyxDQUFDO1FBQy9DLG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFHdkMsSUFBSSxRQUFRLEVBQUU7WUFDVixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztTQUM1QjtRQUNELElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksYUFBYSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3ZFO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGNBQWMsQ0FBQyxRQUFrQjtRQUNyQyxNQUFNLElBQUksR0FBRyxxQkFB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QUMsSUFBSSxVQUFVLENBQUM7U0FDekY7UUFDRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDcEIsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFPLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQztTQUNuRTtRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQThCLEdBQUcsSUFBSSxDQUFDLFFBQVEsZ0NBQWdDLEVBQ3JHLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFDOUQ7WUFDSSxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlO1lBQ25ELE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLGNBQWMsRUFBRSxjQUFjO1NBQ2pDLENBQ0osQ0FBQztJQUNOLENBQUM7OzZIQXZWUSwrQkFBK0IsNENBTXlCLFNBQVM7aUlBTmpFLCtCQUErQjs0RkFBL0IsK0JBQStCO2tCQUQzQyxVQUFVOzswQkFPd0MsUUFBUTs7MEJBQUcsTUFBTTsyQkFBQyxTQUFTOzswQkFBcUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBpIERvY3VtZW50YXRpb25cbiAqIEFwaSBEb2N1bWVudGF0aW9uXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMFxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50IH0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZW5jb2Rlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQXBpTGlzdFJlc3BvbnNlQ3JlYXRpdmVTaXplTWFwcGluZ0RUTyB9IGZyb20gJy4uL21vZGVsL2FwaUxpc3RSZXNwb25zZUNyZWF0aXZlU2l6ZU1hcHBpbmdEVE8nO1xuaW1wb3J0IHsgQ3JlYXRpdmVBc3NldE9wdGltaXphdGlvblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9jcmVhdGl2ZUFzc2V0T3B0aW1pemF0aW9uUmVxdWVzdCc7XG5pbXBvcnQgeyBDcmVhdGl2ZUFzc2V0VXBsb2FkUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9jcmVhdGl2ZUFzc2V0VXBsb2FkUmVzcG9uc2UnO1xuaW1wb3J0IHsgT3B0aW1pemF0aW9uSm9iU3RhdHVzUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9vcHRpbWl6YXRpb25Kb2JTdGF0dXNSZXNwb25zZSc7XG5cbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTIH0gICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDcmVhdGl2ZVNldHNWMkNvbnRyb2xsZXJTZXJ2aWNlIHtcblxuICAgIHByb3RlY3RlZCBiYXNlUGF0aCA9ICdodHRwczovL2FwaXYyc3RhZ2U3LmF0b21leC5uZXQnO1xuICAgIHB1YmxpYyBkZWZhdWx0SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChiYXNlUGF0aCkge1xuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoIHx8IGNvbmZpZ3VyYXRpb24uYmFzZVBhdGggfHwgdGhpcy5iYXNlUGF0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25zdW1lcyBzdHJpbmdbXSBtaW1lLXR5cGVzXG4gICAgICogQHJldHVybiB0cnVlOiBjb25zdW1lcyBjb250YWlucyAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsIGZhbHNlOiBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbkNvbnN1bWVGb3JtKGNvbnN1bWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmb3JtID0gJ211bHRpcGFydC9mb3JtLWRhdGEnO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnN1bWUgb2YgY29uc3VtZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtID09PSBjb25zdW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUG9sbCBqb2Igc3RhdHVzL3Byb2dyZXNzIOKAlCBkcml2ZXMgdGhlIGxvYWRlciAlIGFuZCB0aGUgR2VuZXJhdGlvbiBSZXN1bHRzIHRhYmxlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBqb2JJZCBqb2JJZFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Sm9iU3RhdHVzVXNpbmdHRVQoam9iSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPE9wdGltaXphdGlvbkpvYlN0YXR1c1Jlc3BvbnNlPjtcbiAgICBwdWJsaWMgZ2V0Sm9iU3RhdHVzVXNpbmdHRVQoam9iSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8T3B0aW1pemF0aW9uSm9iU3RhdHVzUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0Sm9iU3RhdHVzVXNpbmdHRVQoam9iSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PE9wdGltaXphdGlvbkpvYlN0YXR1c1Jlc3BvbnNlPj47XG4gICAgcHVibGljIGdldEpvYlN0YXR1c1VzaW5nR0VUKGpvYklkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGpvYklkID09PSBudWxsIHx8IGpvYklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGpvYklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0Sm9iU3RhdHVzVXNpbmdHRVQuJyk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxPcHRpbWl6YXRpb25Kb2JTdGF0dXNSZXNwb25zZT4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2NyZWF0aXZlc2V0cy92Mi9qb2JzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhqb2JJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCB0aGUgZnVsbCBzaXplLW1hcHBpbmcgY29uZmlnIGZvciBhIGNyZWF0aXZlIHR5cGUgKGJyb3dzZXIgY2FjaGVzIHRoaXMgZm9yIHRoZSBzZXNzaW9uKS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gY3JlYXRpdmVUeXBlIGNyZWF0aXZlVHlwZVxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2l6ZU1hcHBpbmdDb25maWdVc2luZ0dFVChjcmVhdGl2ZVR5cGU6ICdJTUFHRScgfCAnVklERU8nIHwgJ1RISVJEX1BBUlRZX0FEX1RBR1MnIHwgJ1pJUFBFRF9IVE1MJyB8ICdOQVRJVkVfSU1BR0UnIHwgJ05BVElWRV9WSURFTycgfCAnRFlOQU1JQ19JTUFHRScgfCAnRFlOQU1JQ19NQUNSTycgfCAnRFlOQU1JQ19IVE1MJyB8ICdEWU5BTUlDX1ZJREVPJyB8ICdIWUJSSURfU1RBVElDX0FEJyB8ICdIWUJSSURfRFlOQU1JQ19BRCcgfCAnVEhJUkRfUEFSVFlfVklERU9fQURfVEFHUycgfCAnTkFUSVZFX0lDT04nIHwgJ0lDT04nIHwgJ0NUVl9WSURFTycgfCAnUExBWUFCTEUnLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpTGlzdFJlc3BvbnNlQ3JlYXRpdmVTaXplTWFwcGluZ0RUTz47XG4gICAgcHVibGljIGdldFNpemVNYXBwaW5nQ29uZmlnVXNpbmdHRVQoY3JlYXRpdmVUeXBlOiAnSU1BR0UnIHwgJ1ZJREVPJyB8ICdUSElSRF9QQVJUWV9BRF9UQUdTJyB8ICdaSVBQRURfSFRNTCcgfCAnTkFUSVZFX0lNQUdFJyB8ICdOQVRJVkVfVklERU8nIHwgJ0RZTkFNSUNfSU1BR0UnIHwgJ0RZTkFNSUNfTUFDUk8nIHwgJ0RZTkFNSUNfSFRNTCcgfCAnRFlOQU1JQ19WSURFTycgfCAnSFlCUklEX1NUQVRJQ19BRCcgfCAnSFlCUklEX0RZTkFNSUNfQUQnIHwgJ1RISVJEX1BBUlRZX1ZJREVPX0FEX1RBR1MnIHwgJ05BVElWRV9JQ09OJyB8ICdJQ09OJyB8ICdDVFZfVklERU8nIHwgJ1BMQVlBQkxFJywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpTGlzdFJlc3BvbnNlQ3JlYXRpdmVTaXplTWFwcGluZ0RUTz4+O1xuICAgIHB1YmxpYyBnZXRTaXplTWFwcGluZ0NvbmZpZ1VzaW5nR0VUKGNyZWF0aXZlVHlwZTogJ0lNQUdFJyB8ICdWSURFTycgfCAnVEhJUkRfUEFSVFlfQURfVEFHUycgfCAnWklQUEVEX0hUTUwnIHwgJ05BVElWRV9JTUFHRScgfCAnTkFUSVZFX1ZJREVPJyB8ICdEWU5BTUlDX0lNQUdFJyB8ICdEWU5BTUlDX01BQ1JPJyB8ICdEWU5BTUlDX0hUTUwnIHwgJ0RZTkFNSUNfVklERU8nIHwgJ0hZQlJJRF9TVEFUSUNfQUQnIHwgJ0hZQlJJRF9EWU5BTUlDX0FEJyB8ICdUSElSRF9QQVJUWV9WSURFT19BRF9UQUdTJyB8ICdOQVRJVkVfSUNPTicgfCAnSUNPTicgfCAnQ1RWX1ZJREVPJyB8ICdQTEFZQUJMRScsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlMaXN0UmVzcG9uc2VDcmVhdGl2ZVNpemVNYXBwaW5nRFRPPj47XG4gICAgcHVibGljIGdldFNpemVNYXBwaW5nQ29uZmlnVXNpbmdHRVQoY3JlYXRpdmVUeXBlOiAnSU1BR0UnIHwgJ1ZJREVPJyB8ICdUSElSRF9QQVJUWV9BRF9UQUdTJyB8ICdaSVBQRURfSFRNTCcgfCAnTkFUSVZFX0lNQUdFJyB8ICdOQVRJVkVfVklERU8nIHwgJ0RZTkFNSUNfSU1BR0UnIHwgJ0RZTkFNSUNfTUFDUk8nIHwgJ0RZTkFNSUNfSFRNTCcgfCAnRFlOQU1JQ19WSURFTycgfCAnSFlCUklEX1NUQVRJQ19BRCcgfCAnSFlCUklEX0RZTkFNSUNfQUQnIHwgJ1RISVJEX1BBUlRZX1ZJREVPX0FEX1RBR1MnIHwgJ05BVElWRV9JQ09OJyB8ICdJQ09OJyB8ICdDVFZfVklERU8nIHwgJ1BMQVlBQkxFJywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoY3JlYXRpdmVUeXBlID09PSBudWxsIHx8IGNyZWF0aXZlVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjcmVhdGl2ZVR5cGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRTaXplTWFwcGluZ0NvbmZpZ1VzaW5nR0VULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKGNyZWF0aXZlVHlwZSAhPT0gdW5kZWZpbmVkICYmIGNyZWF0aXZlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnY3JlYXRpdmVUeXBlJywgPGFueT5jcmVhdGl2ZVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlMaXN0UmVzcG9uc2VDcmVhdGl2ZVNpemVNYXBwaW5nRFRPPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvY3JlYXRpdmVzZXRzL3YyL3NpemUtbWFwcGluZy1jb25maWdgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IENyZWF0aXZlU2V0IGZyb20gdGhlIHByZXZpb3VzbHktdXBsb2FkZWQgYXNzZXQmIzM5O3MgbWVkaWFJZCArIHNlbGVjdGVkIHRhcmdldCBzaXplcy4gUHVyZSBKU09OIOKAlCB0aGUgZmlsZSBpdHNlbGYgYWxyZWFkeSB0cmF2ZWxlZCBpbiB0aGUgZWFybGllciAvdXBsb2FkIGNhbGwuIFJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIGpvYklkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSByZXF1ZXN0IHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHNhdmVVc2luZ1BPU1QocmVxdWVzdDogQ3JlYXRpdmVBc3NldE9wdGltaXphdGlvblJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IG51bWJlcjsgfT47XG4gICAgcHVibGljIHNhdmVVc2luZ1BPU1QocmVxdWVzdDogQ3JlYXRpdmVBc3NldE9wdGltaXphdGlvblJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPHsgW2tleTogc3RyaW5nXTogbnVtYmVyOyB9Pj47XG4gICAgcHVibGljIHNhdmVVc2luZ1BPU1QocmVxdWVzdDogQ3JlYXRpdmVBc3NldE9wdGltaXphdGlvblJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx7IFtrZXk6IHN0cmluZ106IG51bWJlcjsgfT4+O1xuICAgIHB1YmxpYyBzYXZlVXNpbmdQT1NUKHJlcXVlc3Q6IENyZWF0aXZlQXNzZXRPcHRpbWl6YXRpb25SZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChyZXF1ZXN0ID09PSBudWxsIHx8IHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHNhdmVVc2luZ1BPU1QuJyk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8eyBba2V5OiBzdHJpbmddOiBudW1iZXI7IH0+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9jcmVhdGl2ZXNldHMvdjIvc2F2ZWAsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRWRpdCBhbiBleGlzdGluZyBDcmVhdGl2ZVNldCDigJQgcmVwbGFjZXMgZXZlcnkgb25lIG9mIGl0cyBjcmVhdGl2ZXMgd2l0aCBmcmVzaGx5LWdlbmVyYXRlZCBvbmVzIGZyb20gdGhlIHN1Ym1pdHRlZCBhc3NldHMvdGFyZ2V0IHNpemVzLiBNaXJyb3JzIHRoZSBsZWdhY3kgZmxvdyYjMzk7cyBQT1NUIC9jcmVhdGl2ZXNldHMve2lkfSwgYnV0IGdvZXMgdGhyb3VnaCB0aGUgc2FtZSBhc3luYyB1cGxvYWQgLSZndDsgc2F2ZSAtJmd0OyBwb2xsIGpvYiBwaXBlbGluZSBhcyBjcmVhdGUuIFJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIGpvYklkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBpZCBpZFxuICAgICAqIEBwYXJhbSByZXF1ZXN0IHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVVzaW5nUE9TVChpZDogbnVtYmVyLCByZXF1ZXN0OiBDcmVhdGl2ZUFzc2V0T3B0aW1pemF0aW9uUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPHsgW2tleTogc3RyaW5nXTogbnVtYmVyOyB9PjtcbiAgICBwdWJsaWMgdXBkYXRlVXNpbmdQT1NUKGlkOiBudW1iZXIsIHJlcXVlc3Q6IENyZWF0aXZlQXNzZXRPcHRpbWl6YXRpb25SZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTx7IFtrZXk6IHN0cmluZ106IG51bWJlcjsgfT4+O1xuICAgIHB1YmxpYyB1cGRhdGVVc2luZ1BPU1QoaWQ6IG51bWJlciwgcmVxdWVzdDogQ3JlYXRpdmVBc3NldE9wdGltaXphdGlvblJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx7IFtrZXk6IHN0cmluZ106IG51bWJlcjsgfT4+O1xuICAgIHB1YmxpYyB1cGRhdGVVc2luZ1BPU1QoaWQ6IG51bWJlciwgcmVxdWVzdDogQ3JlYXRpdmVBc3NldE9wdGltaXphdGlvblJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGlkID09PSBudWxsIHx8IGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3QgPT09IG51bGwgfHwgcmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PHsgW2tleTogc3RyaW5nXTogbnVtYmVyOyB9PihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvY3JlYXRpdmVzZXRzL3YyL3NhdmUvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGlkKSl9YCxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgdGhlIG9yaWdpbmFsIGFzc2V0IG9ubHkg4oCUIHBlcnNpc3RzIGl0LCBkZXRlY3RzIGl0cyBkaW1lbnNpb25zLCBhbmQgcmV0dXJucyBhIG1lZGlhSWQuIENhbGxlZCBzaWxlbnRseSBpbiB0aGUgYmFja2dyb3VuZCB3aGlsZSB0aGUgdXNlciBmaWxscyBvdXQgdGhlIHJlc3Qgb2YgdGhlIGNyZWF0aXZlIGZvcm07IGRvZXMgbm90IGNyZWF0ZSBhIGpvYiBvciB0b3VjaCB0aGUgZGF0YWJhc2UmIzM5O3MgQ3JlYXRpdmUvQ3JlYXRpdmVTZXRzIHRhYmxlcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYWR2ZXJ0aXNlcklkIGFkdmVydGlzZXJJZFxuICAgICAqIEBwYXJhbSBjcmVhdGl2ZVNldFR5cGUgY3JlYXRpdmVTZXRUeXBlXG4gICAgICogQHBhcmFtIGZpbGUgZmlsZVxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBsb2FkVXNpbmdQT1NUKGFkdmVydGlzZXJJZDogYW55LCBjcmVhdGl2ZVNldFR5cGU6IGFueSwgZmlsZTogQmxvYiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPENyZWF0aXZlQXNzZXRVcGxvYWRSZXNwb25zZT47XG4gICAgcHVibGljIHVwbG9hZFVzaW5nUE9TVChhZHZlcnRpc2VySWQ6IGFueSwgY3JlYXRpdmVTZXRUeXBlOiBhbnksIGZpbGU6IEJsb2IsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPENyZWF0aXZlQXNzZXRVcGxvYWRSZXNwb25zZT4+O1xuICAgIHB1YmxpYyB1cGxvYWRVc2luZ1BPU1QoYWR2ZXJ0aXNlcklkOiBhbnksIGNyZWF0aXZlU2V0VHlwZTogYW55LCBmaWxlOiBCbG9iLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8Q3JlYXRpdmVBc3NldFVwbG9hZFJlc3BvbnNlPj47XG4gICAgcHVibGljIHVwbG9hZFVzaW5nUE9TVChhZHZlcnRpc2VySWQ6IGFueSwgY3JlYXRpdmVTZXRUeXBlOiBhbnksIGZpbGU6IEJsb2IsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCA9PT0gbnVsbCB8fCBhZHZlcnRpc2VySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWR2ZXJ0aXNlcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBsb2FkVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNyZWF0aXZlU2V0VHlwZSA9PT0gbnVsbCB8fCBjcmVhdGl2ZVNldFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY3JlYXRpdmVTZXRUeXBlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBsb2FkVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGUgPT09IG51bGwgfHwgZmlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmaWxlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBsb2FkVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSdcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBjYW5Db25zdW1lRm9ybSA9IHRoaXMuY2FuQ29uc3VtZUZvcm0oY29uc3VtZXMpO1xuXG4gICAgICAgIGxldCBmb3JtUGFyYW1zOiB7IGFwcGVuZChwYXJhbTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB8IEh0dHBQYXJhbXM7IH07XG4gICAgICAgIGxldCB1c2VGb3JtID0gZmFsc2U7XG4gICAgICAgIGxldCBjb252ZXJ0Rm9ybVBhcmFtc1RvU3RyaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIHVzZSBGb3JtRGF0YSB0byB0cmFuc21pdCBmaWxlcyB1c2luZyBjb250ZW50LXR5cGUgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCJcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwMDc5NjkvYXBwbGljYXRpb24teC13d3ctZm9ybS11cmxlbmNvZGVkLW9yLW11bHRpcGFydC1mb3JtLWRhdGFcbiAgICAgICAgdXNlRm9ybSA9IGNhbkNvbnN1bWVGb3JtO1xuICAgICAgICBpZiAodXNlRm9ybSkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3JtUGFyYW1zID0gZm9ybVBhcmFtcy5hcHBlbmQoJ2FkdmVydGlzZXJJZCcsIDxhbnk+YWR2ZXJ0aXNlcklkKSB8fCBmb3JtUGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjcmVhdGl2ZVNldFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IGZvcm1QYXJhbXMuYXBwZW5kKCdjcmVhdGl2ZVNldFR5cGUnLCA8YW55PmNyZWF0aXZlU2V0VHlwZSkgfHwgZm9ybVBhcmFtcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3JtUGFyYW1zID0gZm9ybVBhcmFtcy5hcHBlbmQoJ2ZpbGUnLCA8YW55PmZpbGUpIHx8IGZvcm1QYXJhbXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8Q3JlYXRpdmVBc3NldFVwbG9hZFJlc3BvbnNlPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvY3JlYXRpdmVzZXRzL3YyL3VwbG9hZGAsXG4gICAgICAgICAgICBjb252ZXJ0Rm9ybVBhcmFtc1RvU3RyaW5nID8gZm9ybVBhcmFtcy50b1N0cmluZygpIDogZm9ybVBhcmFtcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxufVxuIl19