@rudderstack/integrations-lib 0.2.35 → 0.2.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/sdks/criteoAudience/config.d.ts +3 -0
- package/build/sdks/criteoAudience/config.d.ts.map +1 -0
- package/build/sdks/criteoAudience/config.js +6 -0
- package/build/sdks/criteoAudience/criteoAudience.d.ts +51 -0
- package/build/sdks/criteoAudience/criteoAudience.d.ts.map +1 -0
- package/build/sdks/criteoAudience/criteoAudience.js +112 -0
- package/build/sdks/criteoAudience/index.d.ts +4 -0
- package/build/sdks/criteoAudience/index.d.ts.map +1 -0
- package/build/sdks/criteoAudience/index.js +9 -0
- package/build/sdks/criteoAudience/types.d.ts +45 -0
- package/build/sdks/criteoAudience/types.d.ts.map +1 -0
- package/build/sdks/criteoAudience/types.js +3 -0
- package/build/sdks/index.d.ts +1 -0
- package/build/sdks/index.d.ts.map +1 -1
- package/build/sdks/index.js +3 -2
- package/build/utils/misc.d.ts +24 -7
- package/build/utils/misc.d.ts.map +1 -1
- package/build/utils/misc.js +48 -11
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/sdks/criteoAudience/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,eAAO,MAAM,QAAQ,mCAA0C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BASE_URL = exports.API_VERSION = void 0;
|
|
4
|
+
exports.API_VERSION = '2025-04';
|
|
5
|
+
exports.BASE_URL = `https://api.criteo.com/${exports.API_VERSION}`;
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Nka3MvY3JpdGVvQXVkaWVuY2UvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFhLFFBQUEsV0FBVyxHQUFHLFNBQVMsQ0FBQztBQUV4QixRQUFBLFFBQVEsR0FBRywwQkFBMEIsbUJBQVcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IEFQSV9WRVJTSU9OID0gJzIwMjUtMDQnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9VUkwgPSBgaHR0cHM6Ly9hcGkuY3JpdGVvLmNvbS8ke0FQSV9WRVJTSU9OfWA7XG4iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { AuthObject, AudienceSegmentBody, AudienceSegmentData } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* CriteoAudience SDK for managing audience segments in Criteo
|
|
4
|
+
* @class
|
|
5
|
+
*/
|
|
6
|
+
export default class CriteoAudience {
|
|
7
|
+
private authObject;
|
|
8
|
+
private httpClient;
|
|
9
|
+
/**
|
|
10
|
+
* Creates an instance of CriteoAudience
|
|
11
|
+
* @param {AuthObject} authObject - Authentication object containing access token and refresh function
|
|
12
|
+
* @throws {Error} If authObject is invalid or missing required properties
|
|
13
|
+
*/
|
|
14
|
+
constructor(authObject: AuthObject);
|
|
15
|
+
/**
|
|
16
|
+
* Validates the authentication object
|
|
17
|
+
* @param {AuthObject} authObject - Authentication object to validate
|
|
18
|
+
* @throws {Error} If authObject is invalid or missing required properties
|
|
19
|
+
* @private
|
|
20
|
+
*/
|
|
21
|
+
private static validateAuthObject;
|
|
22
|
+
/**
|
|
23
|
+
* Refreshes the access token using the provided refresh function
|
|
24
|
+
* @throws {Error} If token refresh fails
|
|
25
|
+
* @private
|
|
26
|
+
*/
|
|
27
|
+
private refreshToken;
|
|
28
|
+
/**
|
|
29
|
+
* Gets the request headers with authentication
|
|
30
|
+
* @returns {RequestConfig} Request configuration with headers
|
|
31
|
+
* @private
|
|
32
|
+
*/
|
|
33
|
+
private getHeader;
|
|
34
|
+
/**
|
|
35
|
+
* Executes a POST request with token refresh handling
|
|
36
|
+
* @template T - Response type
|
|
37
|
+
* @param {string} url - API endpoint URL
|
|
38
|
+
* @param {object} data - Request payload
|
|
39
|
+
* @returns {Promise<ApiResponse<T>>} API response
|
|
40
|
+
* @private
|
|
41
|
+
*/
|
|
42
|
+
private executePostRequest;
|
|
43
|
+
/**
|
|
44
|
+
* Creates a new audience segment in Criteo
|
|
45
|
+
* @param {AudienceSegmentBody} audienceSegmentBody - Audience segment data
|
|
46
|
+
* @returns {Promise<AudienceSegmentData>} Created audience segment data
|
|
47
|
+
* @throws {Error} If audience segment creation fails
|
|
48
|
+
*/
|
|
49
|
+
createAudienceSegment(audienceSegmentBody: AudienceSegmentBody): Promise<AudienceSegmentData>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=criteoAudience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"criteoAudience.d.ts","sourceRoot":"","sources":["../../../src/sdks/criteoAudience/criteoAudience.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,UAAU,EACV,mBAAmB,EAEnB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,UAAU,CAAa;IAE/B;;;;OAIG;gBACS,UAAU,EAAE,UAAU;IAQlC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAajC;;;;OAIG;YACW,YAAY;IAS1B;;;;OAIG;IACH,OAAO,CAAC,SAAS;IAUjB;;;;;;;OAOG;YACW,kBAAkB;IAkBhC;;;;;OAKG;IACU,qBAAqB,CAChC,mBAAmB,EAAE,mBAAmB,GACvC,OAAO,CAAC,mBAAmB,CAAC;CAmBhC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const factory_1 = require("../../network/factory");
|
|
4
|
+
const config_1 = require("./config");
|
|
5
|
+
/**
|
|
6
|
+
* CriteoAudience SDK for managing audience segments in Criteo
|
|
7
|
+
* @class
|
|
8
|
+
*/
|
|
9
|
+
class CriteoAudience {
|
|
10
|
+
/**
|
|
11
|
+
* Creates an instance of CriteoAudience
|
|
12
|
+
* @param {AuthObject} authObject - Authentication object containing access token and refresh function
|
|
13
|
+
* @throws {Error} If authObject is invalid or missing required properties
|
|
14
|
+
*/
|
|
15
|
+
constructor(authObject) {
|
|
16
|
+
CriteoAudience.validateAuthObject(authObject);
|
|
17
|
+
this.authObject = authObject;
|
|
18
|
+
this.httpClient = factory_1.HttpClientFactory.getHttpClient(factory_1.ClientNames.Axios, {
|
|
19
|
+
baseURL: config_1.BASE_URL,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validates the authentication object
|
|
24
|
+
* @param {AuthObject} authObject - Authentication object to validate
|
|
25
|
+
* @throws {Error} If authObject is invalid or missing required properties
|
|
26
|
+
* @private
|
|
27
|
+
*/
|
|
28
|
+
static validateAuthObject(authObject) {
|
|
29
|
+
if (!authObject) {
|
|
30
|
+
throw new Error('authObject is required.');
|
|
31
|
+
}
|
|
32
|
+
const { accessToken, refreshAccessTokenFunc } = authObject;
|
|
33
|
+
if (!accessToken) {
|
|
34
|
+
throw new Error('Criteo Audience accessToken is required.');
|
|
35
|
+
}
|
|
36
|
+
if (!refreshAccessTokenFunc) {
|
|
37
|
+
throw new Error('Criteo Audience a refresh access token function is required.');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Refreshes the access token using the provided refresh function
|
|
42
|
+
* @throws {Error} If token refresh fails
|
|
43
|
+
* @private
|
|
44
|
+
*/
|
|
45
|
+
async refreshToken() {
|
|
46
|
+
try {
|
|
47
|
+
const accessToken = await this.authObject.refreshAccessTokenFunc();
|
|
48
|
+
this.authObject.accessToken = accessToken;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
throw new Error(`Unable to refresh token, with error: ${error}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Gets the request headers with authentication
|
|
56
|
+
* @returns {RequestConfig} Request configuration with headers
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
59
|
+
getHeader() {
|
|
60
|
+
return {
|
|
61
|
+
headers: {
|
|
62
|
+
authorization: `Bearer ${this.authObject.accessToken}`,
|
|
63
|
+
accept: 'application/json',
|
|
64
|
+
'content-type': 'application/json',
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Executes a POST request with token refresh handling
|
|
70
|
+
* @template T - Response type
|
|
71
|
+
* @param {string} url - API endpoint URL
|
|
72
|
+
* @param {object} data - Request payload
|
|
73
|
+
* @returns {Promise<ApiResponse<T>>} API response
|
|
74
|
+
* @private
|
|
75
|
+
*/
|
|
76
|
+
async executePostRequest(url, data) {
|
|
77
|
+
const response = await this.httpClient.post(url, data, this.getHeader());
|
|
78
|
+
switch (response.type) {
|
|
79
|
+
case 'application-error':
|
|
80
|
+
if (response.statusCode === 401 &&
|
|
81
|
+
(response.responseBody.errors[0].code === 'authorization-token-invalid' ||
|
|
82
|
+
response.responseBody.errors[0].code === 'authorization-token-expired')) {
|
|
83
|
+
await this.refreshToken();
|
|
84
|
+
return this.httpClient.post(url, data, this.getHeader());
|
|
85
|
+
}
|
|
86
|
+
return response;
|
|
87
|
+
default:
|
|
88
|
+
return response;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Creates a new audience segment in Criteo
|
|
93
|
+
* @param {AudienceSegmentBody} audienceSegmentBody - Audience segment data
|
|
94
|
+
* @returns {Promise<AudienceSegmentData>} Created audience segment data
|
|
95
|
+
* @throws {Error} If audience segment creation fails
|
|
96
|
+
*/
|
|
97
|
+
async createAudienceSegment(audienceSegmentBody) {
|
|
98
|
+
const createAudienceSegmentResponse = await this.executePostRequest(`/marketing-solutions/audience-segments/create`, audienceSegmentBody);
|
|
99
|
+
if (createAudienceSegmentResponse.type === 'success') {
|
|
100
|
+
const { data } = createAudienceSegmentResponse.responseBody;
|
|
101
|
+
if (data && data.length > 0) {
|
|
102
|
+
return data[0];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const errorMessage = createAudienceSegmentResponse.type === 'client-error'
|
|
106
|
+
? createAudienceSegmentResponse.message
|
|
107
|
+
: JSON.stringify(createAudienceSegmentResponse.responseBody);
|
|
108
|
+
throw new Error(`Failed to create audience segment, with error: ${errorMessage}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.default = CriteoAudience;
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JpdGVvQXVkaWVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2Rrcy9jcml0ZW9BdWRpZW5jZS9jcml0ZW9BdWRpZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1EQUF1RTtBQUV2RSxxQ0FBb0M7QUFRcEM7OztHQUdHO0FBQ0gsTUFBcUIsY0FBYztJQUtqQzs7OztPQUlHO0lBQ0gsWUFBWSxVQUFzQjtRQUNoQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRywyQkFBaUIsQ0FBQyxhQUFhLENBQUMscUJBQVcsQ0FBQyxLQUFLLEVBQUU7WUFDbkUsT0FBTyxFQUFFLGlCQUFRO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFzQjtRQUN0RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQzNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDNUMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFNBQVM7UUFDZixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUN0RCxNQUFNLEVBQUUsa0JBQWtCO2dCQUMxQixjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQixDQUFJLEdBQVcsRUFBRSxJQUFZO1FBQzNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1RSxRQUFRLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixLQUFLLG1CQUFtQjtnQkFDdEIsSUFDRSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUc7b0JBQzNCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUE2Qjt3QkFDckUsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUE2QixDQUFDLEVBQ3pFLENBQUM7b0JBQ0QsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztnQkFDRCxPQUFPLFFBQVEsQ0FBQztZQUNsQjtnQkFDRSxPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLHFCQUFxQixDQUNoQyxtQkFBd0M7UUFFeEMsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDakUsK0NBQStDLEVBQy9DLG1CQUFtQixDQUNwQixDQUFDO1FBQ0YsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLDZCQUE2QixDQUFDLFlBQVksQ0FBQztZQUM1RCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUNoQiw2QkFBNkIsQ0FBQyxJQUFJLEtBQUssY0FBYztZQUNuRCxDQUFDLENBQUMsNkJBQTZCLENBQUMsT0FBTztZQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVqRSxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Q0FDRjtBQXZIRCxpQ0F1SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50RmFjdG9yeSwgQ2xpZW50TmFtZXMgfSBmcm9tICcuLi8uLi9uZXR3b3JrL2ZhY3RvcnknO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgUmVxdWVzdENvbmZpZywgQXBpUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9uZXR3b3JrL2NsaWVudHMvdHlwZXMnO1xuaW1wb3J0IHsgQkFTRV9VUkwgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBBdXRoT2JqZWN0LFxuICBBdWRpZW5jZVNlZ21lbnRCb2R5LFxuICBBdWRpZW5jZVNlZ21lbnRSZXNwb25zZSxcbiAgQXVkaWVuY2VTZWdtZW50RGF0YSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ3JpdGVvQXVkaWVuY2UgU0RLIGZvciBtYW5hZ2luZyBhdWRpZW5jZSBzZWdtZW50cyBpbiBDcml0ZW9cbiAqIEBjbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcml0ZW9BdWRpZW5jZSB7XG4gIHByaXZhdGUgYXV0aE9iamVjdDogQXV0aE9iamVjdDtcblxuICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3JpdGVvQXVkaWVuY2VcbiAgICogQHBhcmFtIHtBdXRoT2JqZWN0fSBhdXRoT2JqZWN0IC0gQXV0aGVudGljYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgYWNjZXNzIHRva2VuIGFuZCByZWZyZXNoIGZ1bmN0aW9uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhdXRoT2JqZWN0IGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdXRoT2JqZWN0OiBBdXRoT2JqZWN0KSB7XG4gICAgQ3JpdGVvQXVkaWVuY2UudmFsaWRhdGVBdXRoT2JqZWN0KGF1dGhPYmplY3QpO1xuICAgIHRoaXMuYXV0aE9iamVjdCA9IGF1dGhPYmplY3Q7XG4gICAgdGhpcy5odHRwQ2xpZW50ID0gSHR0cENsaWVudEZhY3RvcnkuZ2V0SHR0cENsaWVudChDbGllbnROYW1lcy5BeGlvcywge1xuICAgICAgYmFzZVVSTDogQkFTRV9VUkwsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBhdXRoZW50aWNhdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHtBdXRoT2JqZWN0fSBhdXRoT2JqZWN0IC0gQXV0aGVudGljYXRpb24gb2JqZWN0IHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhdXRoT2JqZWN0IGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZUF1dGhPYmplY3QoYXV0aE9iamVjdDogQXV0aE9iamVjdCkge1xuICAgIGlmICghYXV0aE9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdXRoT2JqZWN0IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICBjb25zdCB7IGFjY2Vzc1Rva2VuLCByZWZyZXNoQWNjZXNzVG9rZW5GdW5jIH0gPSBhdXRoT2JqZWN0O1xuICAgIGlmICghYWNjZXNzVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JpdGVvIEF1ZGllbmNlIGFjY2Vzc1Rva2VuIGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICBpZiAoIXJlZnJlc2hBY2Nlc3NUb2tlbkZ1bmMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JpdGVvIEF1ZGllbmNlIGEgcmVmcmVzaCBhY2Nlc3MgdG9rZW4gZnVuY3Rpb24gaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIHVzaW5nIHRoZSBwcm92aWRlZCByZWZyZXNoIGZ1bmN0aW9uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0b2tlbiByZWZyZXNoIGZhaWxzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUb2tlbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGhPYmplY3QucmVmcmVzaEFjY2Vzc1Rva2VuRnVuYygpO1xuICAgICAgdGhpcy5hdXRoT2JqZWN0LmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlZnJlc2ggdG9rZW4sIHdpdGggZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlcXVlc3QgaGVhZGVycyB3aXRoIGF1dGhlbnRpY2F0aW9uXG4gICAqIEByZXR1cm5zIHtSZXF1ZXN0Q29uZmlnfSBSZXF1ZXN0IGNvbmZpZ3VyYXRpb24gd2l0aCBoZWFkZXJzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldEhlYWRlcigpOiBSZXF1ZXN0Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hdXRoT2JqZWN0LmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgUE9TVCByZXF1ZXN0IHdpdGggdG9rZW4gcmVmcmVzaCBoYW5kbGluZ1xuICAgKiBAdGVtcGxhdGUgVCAtIFJlc3BvbnNlIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIEFQSSBlbmRwb2ludCBVUkxcbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBSZXF1ZXN0IHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QXBpUmVzcG9uc2U8VD4+fSBBUEkgcmVzcG9uc2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVBvc3RSZXF1ZXN0PFQ+KHVybDogc3RyaW5nLCBkYXRhOiBvYmplY3QpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmh0dHBDbGllbnQucG9zdDxUPih1cmwsIGRhdGEsIHRoaXMuZ2V0SGVhZGVyKCkpO1xuICAgIHN3aXRjaCAocmVzcG9uc2UudHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24tZXJyb3InOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxICYmXG4gICAgICAgICAgKHJlc3BvbnNlLnJlc3BvbnNlQm9keS5lcnJvcnNbMF0uY29kZSA9PT0gJ2F1dGhvcml6YXRpb24tdG9rZW4taW52YWxpZCcgfHxcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlc3BvbnNlQm9keS5lcnJvcnNbMF0uY29kZSA9PT0gJ2F1dGhvcml6YXRpb24tdG9rZW4tZXhwaXJlZCcpXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PFQ+KHVybCwgZGF0YSwgdGhpcy5nZXRIZWFkZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGF1ZGllbmNlIHNlZ21lbnQgaW4gQ3JpdGVvXG4gICAqIEBwYXJhbSB7QXVkaWVuY2VTZWdtZW50Qm9keX0gYXVkaWVuY2VTZWdtZW50Qm9keSAtIEF1ZGllbmNlIHNlZ21lbnQgZGF0YVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBdWRpZW5jZVNlZ21lbnREYXRhPn0gQ3JlYXRlZCBhdWRpZW5jZSBzZWdtZW50IGRhdGFcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGF1ZGllbmNlIHNlZ21lbnQgY3JlYXRpb24gZmFpbHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVBdWRpZW5jZVNlZ21lbnQoXG4gICAgYXVkaWVuY2VTZWdtZW50Qm9keTogQXVkaWVuY2VTZWdtZW50Qm9keSxcbiAgKTogUHJvbWlzZTxBdWRpZW5jZVNlZ21lbnREYXRhPiB7XG4gICAgY29uc3QgY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVQb3N0UmVxdWVzdDxBdWRpZW5jZVNlZ21lbnRSZXNwb25zZT4oXG4gICAgICBgL21hcmtldGluZy1zb2x1dGlvbnMvYXVkaWVuY2Utc2VnbWVudHMvY3JlYXRlYCxcbiAgICAgIGF1ZGllbmNlU2VnbWVudEJvZHksXG4gICAgKTtcbiAgICBpZiAoY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UudHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGNyZWF0ZUF1ZGllbmNlU2VnbWVudFJlc3BvbnNlLnJlc3BvbnNlQm9keTtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGF0YVswXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UudHlwZSA9PT0gJ2NsaWVudC1lcnJvcidcbiAgICAgICAgPyBjcmVhdGVBdWRpZW5jZVNlZ21lbnRSZXNwb25zZS5tZXNzYWdlXG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkoY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UucmVzcG9uc2VCb2R5KTtcblxuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBhdWRpZW5jZSBzZWdtZW50LCB3aXRoIGVycm9yOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdks/criteoAudience/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CriteoAudience = void 0;
|
|
7
|
+
const criteoAudience_1 = __importDefault(require("./criteoAudience"));
|
|
8
|
+
exports.CriteoAudience = criteoAudience_1.default;
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2Rrcy9jcml0ZW9BdWRpZW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzRUFBOEM7QUFJckMseUJBSkYsd0JBQWMsQ0FJRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDcml0ZW9BdWRpZW5jZSBmcm9tICcuL2NyaXRlb0F1ZGllbmNlJztcblxuaW1wb3J0IHsgQXV0aE9iamVjdCwgQXVkaWVuY2VTZWdtZW50Qm9keSwgQXVkaWVuY2VTZWdtZW50RGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgeyBDcml0ZW9BdWRpZW5jZSwgQXV0aE9iamVjdCwgQXVkaWVuY2VTZWdtZW50Qm9keSwgQXVkaWVuY2VTZWdtZW50RGF0YSB9O1xuIl19
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface AuthObject {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshAccessTokenFunc: () => Promise<string>;
|
|
4
|
+
}
|
|
5
|
+
export interface AudienceSegmentBody {
|
|
6
|
+
data: {
|
|
7
|
+
attributes: {
|
|
8
|
+
advertiserId: string;
|
|
9
|
+
name: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
contactList: object;
|
|
12
|
+
};
|
|
13
|
+
type: 'AudienceSegment';
|
|
14
|
+
}[];
|
|
15
|
+
}
|
|
16
|
+
export interface AudienceSegmentData {
|
|
17
|
+
id: string;
|
|
18
|
+
type: 'AudienceSegment';
|
|
19
|
+
attributes: {
|
|
20
|
+
name: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
type: 'ContactList';
|
|
23
|
+
createdAt?: string;
|
|
24
|
+
updatedAt?: string;
|
|
25
|
+
advertiserId?: string;
|
|
26
|
+
contactList?: {
|
|
27
|
+
isReadOnly?: boolean;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface AudienceSegmentError {
|
|
32
|
+
traceId?: string;
|
|
33
|
+
traceIdentifier?: string;
|
|
34
|
+
type?: string;
|
|
35
|
+
code?: string;
|
|
36
|
+
instance?: string;
|
|
37
|
+
title?: string;
|
|
38
|
+
detail?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface AudienceSegmentResponse {
|
|
41
|
+
data?: AudienceSegmentData[];
|
|
42
|
+
warnings?: unknown;
|
|
43
|
+
errors?: AudienceSegmentError[];
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sdks/criteoAudience/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE;QACJ,UAAU,EAAE;YACV,YAAY,EAAE,MAAM,CAAC;YACrB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC;QACF,IAAI,EAAE,iBAAiB,CAAC;KACzB,EAAE,CAAC;CACL;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,aAAa,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE;YACZ,UAAU,CAAC,EAAE,OAAO,CAAC;SACtB,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACjC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2Rrcy9jcml0ZW9BdWRpZW5jZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBBdXRoT2JqZWN0IHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuRnVuYzogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGllbmNlU2VnbWVudEJvZHkge1xuICBkYXRhOiB7XG4gICAgYXR0cmlidXRlczoge1xuICAgICAgYWR2ZXJ0aXNlcklkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAgIGNvbnRhY3RMaXN0OiBvYmplY3Q7XG4gICAgfTtcbiAgICB0eXBlOiAnQXVkaWVuY2VTZWdtZW50JztcbiAgfVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGllbmNlU2VnbWVudERhdGEge1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiAnQXVkaWVuY2VTZWdtZW50JztcbiAgYXR0cmlidXRlczoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB0eXBlOiAnQ29udGFjdExpc3QnO1xuICAgIGNyZWF0ZWRBdD86IHN0cmluZztcbiAgICB1cGRhdGVkQXQ/OiBzdHJpbmc7XG4gICAgYWR2ZXJ0aXNlcklkPzogc3RyaW5nO1xuICAgIGNvbnRhY3RMaXN0Pzoge1xuICAgICAgaXNSZWFkT25seT86IGJvb2xlYW47XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdWRpZW5jZVNlZ21lbnRFcnJvciB7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHRyYWNlSWRlbnRpZmllcj86IHN0cmluZztcbiAgdHlwZT86IHN0cmluZztcbiAgY29kZT86IHN0cmluZztcbiAgaW5zdGFuY2U/OiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBkZXRhaWw/OiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIEF1ZGllbmNlU2VnbWVudFJlc3BvbnNlIHtcbiAgZGF0YT86IEF1ZGllbmNlU2VnbWVudERhdGFbXTtcbiAgd2FybmluZ3M/OiB1bmtub3duO1xuICBlcnJvcnM/OiBBdWRpZW5jZVNlZ21lbnRFcnJvcltdO1xufVxuIl19
|
package/build/sdks/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { default as SFMC } from './sfmc';
|
|
|
2
2
|
export { default as CustomerIOSegment } from './customerio_audience';
|
|
3
3
|
export * as ZOHO_SDK from './zoho';
|
|
4
4
|
export * as GoogleAdsSDK from './googleAdsRestAPI';
|
|
5
|
+
export * as CriteoAudience from './criteoAudience';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAC"}
|
package/build/sdks/index.js
CHANGED
|
@@ -36,11 +36,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.GoogleAdsSDK = exports.ZOHO_SDK = exports.CustomerIOSegment = exports.SFMC = void 0;
|
|
39
|
+
exports.CriteoAudience = exports.GoogleAdsSDK = exports.ZOHO_SDK = exports.CustomerIOSegment = exports.SFMC = void 0;
|
|
40
40
|
var sfmc_1 = require("./sfmc");
|
|
41
41
|
Object.defineProperty(exports, "SFMC", { enumerable: true, get: function () { return __importDefault(sfmc_1).default; } });
|
|
42
42
|
var customerio_audience_1 = require("./customerio_audience");
|
|
43
43
|
Object.defineProperty(exports, "CustomerIOSegment", { enumerable: true, get: function () { return __importDefault(customerio_audience_1).default; } });
|
|
44
44
|
exports.ZOHO_SDK = __importStar(require("./zoho"));
|
|
45
45
|
exports.GoogleAdsSDK = __importStar(require("./googleAdsRestAPI"));
|
|
46
|
-
|
|
46
|
+
exports.CriteoAudience = __importStar(require("./criteoAudience"));
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2Rrcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBeUM7QUFBaEMsNkdBQUEsT0FBTyxPQUFRO0FBQ3hCLDZEQUFxRTtBQUE1RCx5SUFBQSxPQUFPLE9BQXFCO0FBQ3JDLG1EQUFtQztBQUNuQyxtRUFBbUQ7QUFDbkQsbUVBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgZGVmYXVsdCBhcyBTRk1DIH0gZnJvbSAnLi9zZm1jJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3VzdG9tZXJJT1NlZ21lbnQgfSBmcm9tICcuL2N1c3RvbWVyaW9fYXVkaWVuY2UnO1xuZXhwb3J0ICogYXMgWk9IT19TREsgZnJvbSAnLi96b2hvJztcbmV4cG9ydCAqIGFzIEdvb2dsZUFkc1NESyBmcm9tICcuL2dvb2dsZUFkc1Jlc3RBUEknO1xuZXhwb3J0ICogYXMgQ3JpdGVvQXVkaWVuY2UgZnJvbSAnLi9jcml0ZW9BdWRpZW5jZSc7XG4iXX0=
|
package/build/utils/misc.d.ts
CHANGED
|
@@ -137,16 +137,33 @@ export declare const generateRandomString: (length?: number) => string;
|
|
|
137
137
|
*/
|
|
138
138
|
export declare const flattenQueryParams: (qParams: Record<string, any | any[]>) => Record<string, any>;
|
|
139
139
|
/**
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* @
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
* Locks a property of an object, making it immutable.
|
|
141
|
+
* @param obj - The object to lock the property of.
|
|
142
|
+
* @param key - The key of the property to lock.
|
|
143
|
+
* @returns The object with the property locked.
|
|
144
|
+
*/
|
|
145
|
+
export declare const lockProperty: <T extends object, K extends keyof T>(obj: T, key: K) => T;
|
|
146
|
+
/**
|
|
147
|
+
* Deep freezes an object, making it immutable.
|
|
148
|
+
* @param obj - The object to deep freeze.
|
|
149
|
+
* @returns {T | Readonly<T>} - If `propKey` is provided, returns the original object `T` with `obj[propKey]` deep frozen and `propKey` locked. Otherwise, returns a `Readonly<T>` version of the entire object.
|
|
146
150
|
*
|
|
147
151
|
* @example
|
|
148
152
|
* const config = deepFreeze({ api: { key: 'secret', timeout: 1000 } });
|
|
149
153
|
* // Attempting to modify config.api.key will throw an error in strict mode
|
|
150
154
|
*/
|
|
151
|
-
export declare const deepFreeze: <T
|
|
155
|
+
export declare const deepFreeze: <T extends Record<string, unknown>>(obj: T) => Readonly<T>;
|
|
156
|
+
/**
|
|
157
|
+
* Deep freezes a specific property of an object and locks that property from reassignment.
|
|
158
|
+
* @template T - The type of the object.
|
|
159
|
+
* @param {T} obj - The object containing the property to freeze.
|
|
160
|
+
* @param {keyof T} propKey - The key of the property to deep freeze and lock.
|
|
161
|
+
* @returns {T} - The original object `T` with `obj[propKey]` deep frozen and `propKey` locked.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* const myObject = { data: { value: 123 } };
|
|
165
|
+
* deepFreezeProperty(myObject, 'data');
|
|
166
|
+
* // myObject.data is now immutable, and myObject.data cannot be reassigned.
|
|
167
|
+
*/
|
|
168
|
+
export declare const deepFreezeProperty: <T extends Record<string, unknown>>(obj: T, propKey: keyof T) => T;
|
|
152
169
|
//# sourceMappingURL=misc.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":"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"}
|
package/build/utils/misc.js
CHANGED
|
@@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.deepFreeze = exports.flattenQueryParams = exports.generateRandomString = exports.uuidv5 = exports.convertToString = exports.generateUUID = exports.hashToSha256 = exports.formatTimeStamp = exports.getOffsetInSec = exports.flattenJson = exports.getValueFromPropertiesOrTraits = exports.getHashFromArrayWithValueAsObject = exports.getHashFromArrayWithDuplicate = exports.getHashFromArray = exports.removeUndefinedNullEmptyExclBoolInt = exports.isDefinedNotNullNotEmpty = exports.isEmptyObject = exports.isEmpty = exports.isObject = exports.getType = exports.isPrimitive = exports.stripTrailingSlash = exports.isValidUrl = exports.base64Convertor = exports.flattenMap = exports.removeUndefinedAndNullAndEmptyValues = exports.removeUndefinedAndNullValues = exports.removeNullValues = exports.removeUndefinedValues = exports.isBlank = exports.isDefinedAndNotNullAndNotEmpty = exports.isDefinedAndNotNull = exports.isNotNull = exports.isNotEmpty = exports.isDefined = exports.set = exports.get = void 0;
|
|
39
|
+
exports.deepFreezeProperty = exports.deepFreeze = exports.lockProperty = exports.flattenQueryParams = exports.generateRandomString = exports.uuidv5 = exports.convertToString = exports.generateUUID = exports.hashToSha256 = exports.formatTimeStamp = exports.getOffsetInSec = exports.flattenJson = exports.getValueFromPropertiesOrTraits = exports.getHashFromArrayWithValueAsObject = exports.getHashFromArrayWithDuplicate = exports.getHashFromArray = exports.removeUndefinedNullEmptyExclBoolInt = exports.isDefinedNotNullNotEmpty = exports.isEmptyObject = exports.isEmpty = exports.isObject = exports.getType = exports.isPrimitive = exports.stripTrailingSlash = exports.isValidUrl = exports.base64Convertor = exports.flattenMap = exports.removeUndefinedAndNullAndEmptyValues = exports.removeUndefinedAndNullValues = exports.removeNullValues = exports.removeUndefinedValues = exports.isBlank = exports.isDefinedAndNotNullAndNotEmpty = exports.isDefinedAndNotNull = exports.isNotNull = exports.isNotEmpty = exports.isDefined = exports.set = exports.get = void 0;
|
|
40
40
|
const lodash_1 = __importDefault(require("lodash"));
|
|
41
41
|
const get_value_1 = __importDefault(require("get-value"));
|
|
42
42
|
exports.get = get_value_1.default;
|
|
@@ -387,12 +387,21 @@ const flattenQueryParams = (qParams) => {
|
|
|
387
387
|
};
|
|
388
388
|
exports.flattenQueryParams = flattenQueryParams;
|
|
389
389
|
/**
|
|
390
|
-
*
|
|
391
|
-
*
|
|
392
|
-
*
|
|
393
|
-
* @
|
|
394
|
-
|
|
395
|
-
|
|
390
|
+
* Locks a property of an object, making it immutable.
|
|
391
|
+
* @param obj - The object to lock the property of.
|
|
392
|
+
* @param key - The key of the property to lock.
|
|
393
|
+
* @returns The object with the property locked.
|
|
394
|
+
*/
|
|
395
|
+
const lockProperty = (obj, key) => Object.defineProperty(obj, key, {
|
|
396
|
+
value: obj[key],
|
|
397
|
+
writable: false,
|
|
398
|
+
configurable: false,
|
|
399
|
+
});
|
|
400
|
+
exports.lockProperty = lockProperty;
|
|
401
|
+
/**
|
|
402
|
+
* Deep freezes an object, making it immutable.
|
|
403
|
+
* @param obj - The object to deep freeze.
|
|
404
|
+
* @returns {T | Readonly<T>} - If `propKey` is provided, returns the original object `T` with `obj[propKey]` deep frozen and `propKey` locked. Otherwise, returns a `Readonly<T>` version of the entire object.
|
|
396
405
|
*
|
|
397
406
|
* @example
|
|
398
407
|
* const config = deepFreeze({ api: { key: 'secret', timeout: 1000 } });
|
|
@@ -402,15 +411,43 @@ const deepFreeze = (obj) => {
|
|
|
402
411
|
// If the object is null, undefined, or not an object, return it as is
|
|
403
412
|
if (!obj || typeof obj !== 'object')
|
|
404
413
|
return obj;
|
|
405
|
-
|
|
406
|
-
Object.getOwnPropertyNames(obj).forEach((key) => {
|
|
407
|
-
const value = obj[key];
|
|
414
|
+
const freezeIfObject = (value) => {
|
|
408
415
|
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
409
416
|
(0, exports.deepFreeze)(value);
|
|
410
417
|
}
|
|
418
|
+
};
|
|
419
|
+
// Freeze all properties of the object
|
|
420
|
+
Object.getOwnPropertyNames(obj).forEach((key) => {
|
|
421
|
+
// Access property using string key, which is allowed by Record<string, unknown>
|
|
422
|
+
freezeIfObject(obj[key]);
|
|
411
423
|
});
|
|
412
424
|
// Freeze the object itself and return it
|
|
413
425
|
return Object.freeze(obj);
|
|
414
426
|
};
|
|
415
427
|
exports.deepFreeze = deepFreeze;
|
|
416
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9taXNjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUF1QjtBQUN2QiwwREFBNEI7QUFlbkIsY0FmRixtQkFBRyxDQWVFO0FBZFosMERBQTRCO0FBY2QsY0FkUCxtQkFBRyxDQWNPO0FBYmpCLHNFQUFxQztBQUNyQyxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLCtCQUEwQjtBQUMxQixrREFBb0M7QUFVN0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFBOUMsUUFBQSxTQUFTLGFBQXFDO0FBQ3BELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGdCQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQTNDLFFBQUEsVUFBVSxjQUFpQztBQUNqRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUF0QyxRQUFBLFNBQVMsYUFBNkI7QUFDNUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQUMsSUFBQSxpQkFBUyxFQUFDLENBQUMsQ0FBQyxJQUFJLElBQUEsaUJBQVMsRUFBQyxDQUFDLENBQUMsQ0FBQztBQUFuRSxRQUFBLG1CQUFtQix1QkFBZ0Q7QUFDekUsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQzNELElBQUEsaUJBQVMsRUFBQyxDQUFDLENBQUMsSUFBSSxJQUFBLGlCQUFTLEVBQUMsQ0FBQyxDQUFDLElBQUksSUFBQSxrQkFBVSxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBRG5DLFFBQUEsOEJBQThCLGtDQUNLO0FBQ3pDLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQTNELFFBQUEsT0FBTyxXQUFvRDtBQUV4RSwyRUFBMkU7QUFDcEUsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQ3BELElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNqQyxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBSFcsUUFBQSxxQkFBcUIseUJBR2hDO0FBRUssTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQy9DLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNqQyxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBSFcsUUFBQSxnQkFBZ0Isb0JBRzNCO0FBQ0ssTUFBTSw0QkFBNEIsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQzNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNqQyxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSwyQkFBbUIsQ0FBQyxDQUFDO0FBQzVDLENBQUMsQ0FBQztBQUhXLFFBQUEsNEJBQTRCLGdDQUd2QztBQUNLLE1BQU0sb0NBQW9DLEdBQUcsQ0FBQyxHQUFZLEVBQUUsRUFBRTtJQUNuRSxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDakMsT0FBTyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsc0NBQThCLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFIVyxRQUFBLG9DQUFvQyx3Q0FHL0M7QUFFRjs7OztHQUlHO0FBQ0ksTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFtQixFQUFFLEVBQUU7SUFDaEQsSUFBSSxDQUFDLGdCQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFDekUsT0FBTyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQztBQUhXLFFBQUEsVUFBVSxjQUdyQjtBQUVGLDJFQUEyRTtBQUMzRSxpQkFBaUI7QUFDakIsMkVBQTJFO0FBRXBFLE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUE3RSxRQUFBLGVBQWUsbUJBQThEO0FBRTFGLGlEQUFpRDtBQUMxQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQWlCLEVBQUUsRUFBRTtJQUM5QyxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBTlcsUUFBQSxVQUFVLGNBTXJCO0FBRUssTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQ2hELEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFEdkMsUUFBQSxrQkFBa0Isc0JBQ3FCO0FBRTdDLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBWSxFQUFFLEVBQUU7SUFDMUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxHQUFHLENBQUM7SUFDeEIsT0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0FBSFcsUUFBQSxXQUFXLGVBR3RCO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLE9BQU8sR0FBRyxDQUFDO0lBQ3hCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2hCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFUVyxRQUFBLE9BQU8sV0FTbEI7QUFFSyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLE9BQU8sS0FBSyxDQUFDO0lBQzFCLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RixDQUFDLENBQUM7QUFIVyxRQUFBLFFBQVEsWUFHbkI7QUFFSyxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsZ0JBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUFsRSxRQUFBLE9BQU8sV0FBMkQ7QUFFL0U7Ozs7R0FJRztBQUNJLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7SUFDeEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQztBQU5XLFFBQUEsYUFBYSxpQkFNeEI7QUFFRjs7Ozs7OztHQU9HO0FBQ0ksTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQ3pELENBQUMsQ0FDQyxLQUFLLEtBQUssU0FBUztJQUNuQixLQUFLLEtBQUssSUFBSTtJQUNkLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ25CLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUM5RCxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUN6RCxDQUFDO0FBUFMsUUFBQSx3QkFBd0IsNEJBT2pDO0FBRUcsTUFBTSxtQ0FBbUMsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQ2xFLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNqQyxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxnQ0FBd0IsQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUhXLFFBQUEsbUNBQW1DLHVDQUc5QztBQUVGLDZEQUE2RDtBQUN0RCxNQUFNLGdCQUFnQixHQUFHLENBQzlCLE1BQTZCLEVBQzdCLFVBQWtCLE1BQU0sRUFDeEIsUUFBZ0IsSUFBSSxFQUNwQixXQUFXLEdBQUcsSUFBSSxFQUNsQixFQUFFO0lBQ0YsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztJQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkIsSUFBSSxJQUFBLGVBQU8sRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQUUsT0FBTztZQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQWZXLFFBQUEsZ0JBQWdCLG9CQWUzQjtBQUVGOzs7Ozs7OztHQVFHO0FBQ0ksTUFBTSw2QkFBNkIsR0FBRyxDQUMzQyxNQUE2QixFQUM3QixVQUFVLE1BQWdCLEVBQzFCLEtBQUssR0FBRyxJQUFJLEVBQ1osV0FBVyxHQUFHLElBQUksRUFDbEIsRUFBRTtJQUNGLE1BQU0sT0FBTyxHQUF3QixFQUFFLENBQUM7SUFDeEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZCLElBQUksSUFBQSxlQUFPLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUFFLE9BQU87WUFDcEMsTUFBTSxHQUFHLEdBQUcsV0FBVztnQkFDckIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hELENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFckMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQXZCVyxRQUFBLDZCQUE2QixpQ0F1QnhDO0FBRUY7Ozs7OztHQU1HO0FBQ0ksTUFBTSxpQ0FBaUMsR0FBRyxDQUMvQyxNQUE2QixFQUM3QixPQUFPLEdBQUcsTUFBTSxFQUNoQixXQUFXLEdBQUcsSUFBSSxFQUNsQixFQUFFO0lBQ0YsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztJQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkIsSUFBSSxJQUFBLGVBQU8sRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQUUsT0FBTztZQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMvRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFiVyxRQUFBLGlDQUFpQyxxQ0FhNUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0ksTUFBTSw4QkFBOEIsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBOEIsRUFBRSxFQUFFO0lBQzdGLE1BQU0sTUFBTSxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTFELE1BQU0sR0FBRyxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUNoQixnQkFBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUEsbUJBQUcsRUFBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUNqRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDbkIsQ0FBQztJQUNGLE9BQU8sQ0FBQyxnQkFBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBUlcsUUFBQSw4QkFBOEIsa0NBUXpDO0FBRUY7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBYSxFQUFFLFNBQVMsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLFFBQVEsRUFBRSxFQUFFO0lBQzdFLE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7SUFFcEMsNkRBQTZEO0lBQzdELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBUSxFQUFFLElBQVMsRUFBRSxFQUFFO1FBQ3RDLElBQUksQ0FBQyxDQUFDO1FBQ04sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNyQixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztZQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMvQixXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksV0FBVyxJQUFJLElBQUk7Z0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUEvQlcsUUFBQSxXQUFXLGVBK0J0QjtBQUVGOzs7Ozs7Ozs7R0FTRztBQUNJLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDOUMsTUFBTSxJQUFJLEdBQUcseUJBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLElBQUksSUFBSSxFQUFFLENBQUM7UUFDVCxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFNLEdBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUMvRSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFaVyxRQUFBLGNBQWMsa0JBWXpCO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQWUsRUFBRSxNQUFlLEVBQUUsRUFBRTtJQUNsRSxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQiw4Q0FBOEM7SUFDOUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE9BQU8seUJBQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBVFcsUUFBQSxlQUFlLG1CQVMxQjtBQUVLLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBaUMsRUFBRSxFQUFFLENBQUMsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO0FBQXBFLFFBQUEsWUFBWSxnQkFBd0Q7QUFFakY7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sWUFBWSxHQUFHLEdBQVcsRUFBRSxDQUFDLGdCQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUE5RSxRQUFBLFlBQVksZ0JBQWtFO0FBRXBGLE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7SUFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBTFcsUUFBQSxlQUFlLG1CQUsxQjtBQUVGLE1BQU0sY0FBYyxHQUFHLHNDQUFzQyxDQUFDO0FBQ3ZELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFBLFNBQUUsRUFBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFBbEQsUUFBQSxNQUFNLFVBQTRDO0FBRXhELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsRUFBRSxDQUMxRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQURqRCxRQUFBLG9CQUFvQix3QkFDNkI7QUFFOUQ7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLGtCQUFrQixHQUFHLENBQUMsT0FBb0MsRUFBdUIsRUFBRTtJQUM5RixJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsa0NBQWtDO0lBQzNELE1BQU0sZUFBZSxHQUF3QixFQUFFLENBQUM7SUFFaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQy9DLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2hGLElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDLENBQUM7QUFaVyxRQUFBLGtCQUFrQixzQkFZN0I7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNJLE1BQU0sVUFBVSxHQUFHLENBQUksR0FBTSxFQUFlLEVBQUU7SUFDbkQsc0VBQXNFO0lBQ3RFLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBRWhELHNDQUFzQztJQUN0QyxNQUFNLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDOUMsTUFBTSxLQUFLLEdBQUksR0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRSxJQUFBLGtCQUFVLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgseUNBQXlDO0lBQ3pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFkVyxRQUFBLFVBQVUsY0FjckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGdldCBmcm9tICdnZXQtdmFsdWUnO1xuaW1wb3J0IHNldCBmcm9tICdzZXQtdmFsdWUnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuaW1wb3J0IHNoYTI1NiBmcm9tICdzaGEyNTYnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgdjUgfSBmcm9tICd1dWlkJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuXG5pbnRlcmZhY2UgRGVzdGluYXRpb25NYXAge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSU5MSU5FUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHsgZ2V0LCBzZXQgfTtcbmV4cG9ydCBjb25zdCBpc0RlZmluZWQgPSAoeDogdW5rbm93bikgPT4gIV8uaXNVbmRlZmluZWQoeCk7XG5leHBvcnQgY29uc3QgaXNOb3RFbXB0eSA9ICh4OiB1bmtub3duKSA9PiAhXy5pc0VtcHR5KHgpO1xuZXhwb3J0IGNvbnN0IGlzTm90TnVsbCA9ICh4OiB1bmtub3duKSA9PiB4ICE9IG51bGw7XG5leHBvcnQgY29uc3QgaXNEZWZpbmVkQW5kTm90TnVsbCA9ICh4OiB1bmtub3duKSA9PiBpc0RlZmluZWQoeCkgJiYgaXNOb3ROdWxsKHgpO1xuZXhwb3J0IGNvbnN0IGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSA9ICh4OiB1bmtub3duKSA9PlxuICBpc0RlZmluZWQoeCkgJiYgaXNOb3ROdWxsKHgpICYmIGlzTm90RW1wdHkoeCk7XG5leHBvcnQgY29uc3QgaXNCbGFuayA9ICh2YWx1ZTogdW5rbm93bikgPT4gXy5pc0VtcHR5KF8udG9TdHJpbmcodmFsdWUpKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgY29uc3QgcmVtb3ZlVW5kZWZpbmVkVmFsdWVzID0gKG9iajogdW5rbm93bikgPT4ge1xuICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIF8ucGlja0J5KG9iaiwgaXNEZWZpbmVkKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVOdWxsVmFsdWVzID0gKG9iajogdW5rbm93bikgPT4ge1xuICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIF8ucGlja0J5KG9iaiwgaXNOb3ROdWxsKTtcbn07XG5leHBvcnQgY29uc3QgcmVtb3ZlVW5kZWZpbmVkQW5kTnVsbFZhbHVlcyA9IChvYmo6IHVua25vd24pID0+IHtcbiAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIHJldHVybiBfLnBpY2tCeShvYmosIGlzRGVmaW5lZEFuZE5vdE51bGwpO1xufTtcbmV4cG9ydCBjb25zdCByZW1vdmVVbmRlZmluZWRBbmROdWxsQW5kRW1wdHlWYWx1ZXMgPSAob2JqOiB1bmtub3duKSA9PiB7XG4gIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gb2JqO1xuICByZXR1cm4gXy5waWNrQnkob2JqLCBpc0RlZmluZWRBbmROb3ROdWxsQW5kTm90RW1wdHkpO1xufTtcblxuLyoqXG4gKiBUaGUgZmxhdHRlbk1hcCBmdW5jdGlvbiB0YWtlcyBhIGNvbGxlY3Rpb24gYXMgaW5wdXQgYW5kIHJldHVybnMgYSBmbGF0dGVuZWQgdmVyc2lvbiBvZiB0aGUgY29sbGVjdGlvbi4gSWYgdGhlIGlucHV0IGlzIG5vdCBhbiBhcnJheSBvciBhbiBvYmplY3QsIGl0IGlzIHJldHVybmVkIGFzIGlzLiBPdGhlcndpc2UsIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSBmbGF0TWFwIGZ1bmN0aW9uIGZyb20gdGhlIGxvZGFzaCBsaWJyYXJ5IHRvIGZsYXR0ZW4gdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gY29sbGVjdGlvblxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW5NYXAgPSAoY29sbGVjdGlvbjogdW5rbm93bikgPT4ge1xuICBpZiAoIV8uaXNBcnJheShjb2xsZWN0aW9uKSAmJiAhXy5pc09iamVjdChjb2xsZWN0aW9uKSkgcmV0dXJuIGNvbGxlY3Rpb247XG4gIHJldHVybiBfLmZsYXRNYXAoY29sbGVjdGlvbiwgKHgpID0+IHgpO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBHRU5FUklDIFVUTElUWVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBiYXNlNjRDb252ZXJ0b3IgPSAoc3RyaW5nOiBzdHJpbmcpID0+IEJ1ZmZlci5mcm9tKHN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4vLyByZXR1cm4gYSB2YWxpZCBVUkwgb2JqZWN0IGlmIGNvcnJlY3QgZWxzZSBudWxsXG5leHBvcnQgY29uc3QgaXNWYWxpZFVybCA9ICh1cmw6IHN0cmluZyB8IFVSTCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc3RyaXBUcmFpbGluZ1NsYXNoID0gKHN0cjogc3RyaW5nKSA9PlxuICBzdHIgJiYgc3RyLmVuZHNXaXRoKCcvJykgPyBzdHIuc2xpY2UoMCwgLTEpIDogc3RyO1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAoYXJnOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgYXJnO1xuICByZXR1cm4gYXJnID09IG51bGwgfHwgKHR5cGUgIT09ICdvYmplY3QnICYmIHR5cGUgIT09ICdmdW5jdGlvbicpO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHsqfSBhcmdcbiAqIEByZXR1cm5zIHt0eXBlfVxuICpcbiAqIFJldHVybnMgdHlwZSBvZiBwYXNzZWQgYXJnXG4gKiBmb3IgbnVsbCBhcmdzcyByZXR1cm5zIFwiTlVMTFwiIGluc3RlZCBvZiBcIm9iamVjdFwiXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0VHlwZSA9IChhcmc6IHVua25vd24pID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiBhcmc7XG4gIGlmIChhcmcgPT0gbnVsbCkge1xuICAgIHJldHVybiAnTlVMTCc7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgIHJldHVybiAnYXJyYXknO1xuICB9XG4gIHJldHVybiB0eXBlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFbXB0eSA9IChpbnB1dDogdW5rbm93bikgPT4gXy5pc0VtcHR5KF8udG9TdHJpbmcoaW5wdXQpLnRyaW0oKSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGZvciBlbXB0eSBvYmplY3Qge31cbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaXNFbXB0eU9iamVjdCA9IChvYmo6IGFueSkgPT4ge1xuICBpZiAoIW9iaikge1xuICAgIGxvZ2dlci53YXJuKCdpbnB1dCBpcyB1bmRlZmluZWQgb3IgbnVsbCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgdmFsdWUgaXMgRGVmaW5lZCwgTm90IG51bGwgYW5kIE5vdCBFbXB0eS5cbiAqIENyZWF0ZSB0aGlzIGZ1bmN0aW9uLCBCZWNhdXNlIGV4aXN0aW5nIGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSgxMjMpIGlzIHJldHVybmluZyBmYWxzZSBkdWUgdG8gbG9kYXNoIF8uaXNFbXB0eSBmdW5jdGlvbi5cbiAqIF8uaXNFbXB0eSBpcyB1c2VkIHRvIGRldGVjdCBlbXB0eSBjb2xsZWN0aW9ucy9vYmplY3RzIGFuZCBpdCB3aWxsIHJldHVybiB0cnVlIGZvciBJbnRlZ2VyLCBCb29sZWFuIHZhbHVlcy5cbiAqIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvaXNzdWVzLzQ5NlxuICogQHBhcmFtIHsqfSB2YWx1ZSAxMjNcbiAqIEByZXR1cm5zIHllc1xuICovXG5leHBvcnQgY29uc3QgaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5ID0gKHZhbHVlOiB1bmtub3duKSA9PlxuICAhKFxuICAgIHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIE51bWJlci5pc05hTih2YWx1ZSkgfHxcbiAgICAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKSB8fFxuICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICk7XG5cbmV4cG9ydCBjb25zdCByZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludCA9IChvYmo6IHVua25vd24pID0+IHtcbiAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIHJldHVybiBfLnBpY2tCeShvYmosIGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSk7XG59O1xuXG4vLyBGb3JtYXQgdGhlIGRlc3RpbmF0aW9uLkNvbmZpZy5keW5hbWljTWFwIGFycmF5cyB0byBoYXNoTWFwXG5leHBvcnQgY29uc3QgZ2V0SGFzaEZyb21BcnJheSA9IChcbiAgYXJyYXlzOiBBcnJheTxEZXN0aW5hdGlvbk1hcD4sXG4gIGZyb21LZXk6IHN0cmluZyA9ICdmcm9tJyxcbiAgdG9LZXk6IHN0cmluZyA9ICd0bycsXG4gIGlzTG93ZXJDYXNlID0gdHJ1ZSxcbikgPT4ge1xuICBjb25zdCBoYXNoTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmIChBcnJheS5pc0FycmF5KGFycmF5cykpIHtcbiAgICBhcnJheXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcbiAgICAgIGlmIChpc0VtcHR5KGFycmF5W2Zyb21LZXldKSkgcmV0dXJuO1xuICAgICAgaGFzaE1hcFtpc0xvd2VyQ2FzZSA/IGFycmF5W2Zyb21LZXldLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA6IGFycmF5W2Zyb21LZXldXSA9XG4gICAgICAgIGFycmF5W3RvS2V5XTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGFzaE1hcDtcbn07XG5cbi8qKlxuICogRm9ybWF0IHRoZSBkZXN0aW5hdGlvbi5Db25maWcuZHluYW1pY01hcCBhcnJheXMgdG8gaGFzaE1hcFxuICogd2hlcmUgdmFsdWUgaXMgYW4gYXJyYXlcbiAqIEBwYXJhbSAge30gYXJyYXlzIFt7XCJmcm9tXCI6XCJwcm9wMVwiLFwidG9cIjpcInZhbDFcIn0se1wiZnJvbVwiOlwicHJvcDFcIixcInRvXCI6XCJ2YWwyXCJ9LHtcImZyb21cIjpcInByb3AyXCIsXCJ0b1wiOlwidmFsMlwifV1cbiAqIEBwYXJhbSAge30gZnJvbUtleT1cImZyb21cIlxuICogQHBhcmFtICB7fSB0b0tleT1cInRvXCJcbiAqIEBwYXJhbSAge30gaXNMb3dlckNhc2U9dHJ1ZVxuICogQHBhcmFtICB7fSByZXR1cm4gaGFzaG1hcCB7XCJwcm9wMVwiOltcInZhbDFcIixcInZhbDJcIl0sXCJwcm9wMlwiOltcInZhbDJcIl19XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRIYXNoRnJvbUFycmF5V2l0aER1cGxpY2F0ZSA9IChcbiAgYXJyYXlzOiBBcnJheTxEZXN0aW5hdGlvbk1hcD4sXG4gIGZyb21LZXkgPSAnZnJvbScgYXMgc3RyaW5nLFxuICB0b0tleSA9ICd0bycsXG4gIGlzTG93ZXJDYXNlID0gdHJ1ZSxcbikgPT4ge1xuICBjb25zdCBoYXNoTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmIChBcnJheS5pc0FycmF5KGFycmF5cykpIHtcbiAgICBhcnJheXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcbiAgICAgIGlmIChpc0VtcHR5KGFycmF5W2Zyb21LZXldKSkgcmV0dXJuO1xuICAgICAgY29uc3Qga2V5ID0gaXNMb3dlckNhc2VcbiAgICAgICAgPyBhcnJheVtmcm9tS2V5XS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkudHJpbSgpXG4gICAgICAgIDogYXJyYXlbZnJvbUtleV0udG9TdHJpbmcoKS50cmltKCk7XG5cbiAgICAgIGlmIChoYXNoTWFwW2tleV0pIHtcbiAgICAgICAgaGFzaE1hcFtrZXldLmFkZChhcnJheVt0b0tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzaE1hcFtrZXldID0gbmV3IFNldCgpO1xuICAgICAgICBoYXNoTWFwW2tleV0uYWRkKGFycmF5W3RvS2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhc2hNYXA7XG59O1xuXG4vKipcbiAqIEZvcm1hdCB0aGUgYXJyYXlzIHRvIGhhc2hNYXAgd2l0aCBrZXkgYXMgYGZyb21LZXlgIGFuZCB2YWx1ZSBhcyBPYmplY3RcbiAqIEBwYXJhbSB7Kn0gYXJyYXlzIFt7XCJpZFwiOlwiYTBiOGVmZTEtYzgyOC00YzYzLTg4NTAtMGQwNzQyODg4ZjlkXCIsXCJuYW1lXCI6XCJFbWFpbFwiLFwidHlwZVwiOlwiZW1haWxcIixcInR5cGVfY29uZmlnXCI6e30sXCJkYXRlX2NyZWF0ZWRcIjpcIjE2NjIyMjU4NDAyODRcIixcImhpZGVfZnJvbV9ndWVzdHNcIjpmYWxzZSxcInJlcXVpcmVkXCI6ZmFsc2V9XVxuICogQHBhcmFtIHsqfSBmcm9tS2V5IG5hbWVcbiAqIEBwYXJhbSB7Kn0gaXNMb3dlckNhc2UgZmFsc2VcbiAqIEByZXR1cm5zIC8vIHtcIkVtYWlsXCI6e1wiaWRcIjpcImEwYjhlZmUxLWM4MjgtNGM2My04ODUwLTBkMDc0Mjg4OGY5ZFwiLFwibmFtZVwiOlwiRW1haWxcIixcInR5cGVcIjpcImVtYWlsXCIsXCJ0eXBlX2NvbmZpZ1wiOnt9LFwiZGF0ZV9jcmVhdGVkXCI6XCIxNjYyMjI1ODQwMjg0XCIsXCJoaWRlX2Zyb21fZ3Vlc3RzXCI6ZmFsc2UsXCJyZXF1aXJlZFwiOmZhbHNlfX1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEhhc2hGcm9tQXJyYXlXaXRoVmFsdWVBc09iamVjdCA9IChcbiAgYXJyYXlzOiBBcnJheTxEZXN0aW5hdGlvbk1hcD4sXG4gIGZyb21LZXkgPSAnZnJvbScsXG4gIGlzTG93ZXJDYXNlID0gdHJ1ZSxcbikgPT4ge1xuICBjb25zdCBoYXNoTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmIChBcnJheS5pc0FycmF5KGFycmF5cykpIHtcbiAgICBhcnJheXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcbiAgICAgIGlmIChpc0VtcHR5KGFycmF5W2Zyb21LZXldKSkgcmV0dXJuO1xuICAgICAgaGFzaE1hcFtpc0xvd2VyQ2FzZSA/IGFycmF5W2Zyb21LZXldLnRvTG93ZXJDYXNlKCkgOiBhcnJheVtmcm9tS2V5XV0gPSBhcnJheTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGFzaE1hcDtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGEgdmFsdWUgZnJvbSBhIG1lc3NhZ2Ugb2JqZWN0IGJhc2VkIG9uIGEgZ2l2ZW4ga2V5LiBJdCBzZWFyY2hlcyBmb3IgdGhlIGtleSBpbiB0aGUgcHJvcGVydGllcywgdHJhaXRzLCBhbmQgY29udGV4dC50cmFpdHMgb2YgdGhlIG1lc3NhZ2Ugb2JqZWN0IGluIHRoYXQgb3JkZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5tZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcywgdHJhaXRzLCBhbmQgY29udGV4dC50cmFpdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5rZXkgLSBUaGUga2V5IHRvIHNlYXJjaCBmb3IgaW4gdGhlIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgbWVzc2FnZSBvYmplY3QgZm9yIHRoZSBnaXZlbiBrZXksIG9yIG51bGwgaWYgdGhlIGtleSBpcyBub3QgZm91bmQgb3IgdGhlIHZhbHVlIGlzIG51bGwuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMgPSAoeyBtZXNzYWdlLCBrZXkgfTogeyBtZXNzYWdlOiBhbnk7IGtleTogYW55IH0pID0+IHtcbiAgY29uc3Qga2V5U2V0ID0gWydwcm9wZXJ0aWVzJywgJ3RyYWl0cycsICdjb250ZXh0LnRyYWl0cyddO1xuXG4gIGNvbnN0IHZhbCA9IF8uZmluZChcbiAgICBfLm1hcChrZXlTZXQsIChrKSA9PiBnZXQobWVzc2FnZSwgYCR7a30uJHtrZXl9YCkpLFxuICAgICh2KSA9PiAhXy5pc05pbCh2KSxcbiAgKTtcbiAgcmV0dXJuICFfLmlzTmlsKHZhbCkgPyB2YWwgOiBudWxsO1xufTtcblxuLyoqXG4gKiBGbGF0dGVucyBhIEpTT04gb2JqZWN0IGludG8gYSBzaW5nbGUtbGV2ZWwgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIEpTT04gb2JqZWN0IHRvIGJlIGZsYXR0ZW5lZC5cbiAqIEBwYXJhbSBzZXBhcmF0b3IgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gc2VwYXJhdGUgdGhlIGtleXMgaW4gdGhlIGZsYXR0ZW5lZCBvYmplY3QuIERlZmF1bHQgaXMgJy4nLlxuICogQHBhcmFtIG1vZGUgLSBUaGUgbW9kZSB1c2VkIHRvIGZsYXR0ZW4gYXJyYXlzLiBJZiBzZXQgdG8gJ3N0cmljdCcsIHRoZSBhcnJheSBpbmRpY2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZsYXR0ZW5lZCBrZXlzLiBEZWZhdWx0IGlzICdub3JtYWwnLlxuICogQHJldHVybnMgVGhlIGZsYXR0ZW5lZCBKU09OIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW5Kc29uID0gKGRhdGE6IHVua25vd24sIHNlcGFyYXRvciA9ICcuJywgbW9kZSA9ICdub3JtYWwnKSA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuXG4gIC8vIGEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRvIGxvb3AgdGhyb3VnaCB0aGUgYXJyYXkgb2YgdGhlIGRhdGFcbiAgY29uc3QgcmVjdXJzZSA9IChjdXI6IGFueSwgcHJvcDogYW55KSA9PiB7XG4gICAgbGV0IGk7XG4gICAgaWYgKE9iamVjdChjdXIpICE9PSBjdXIpIHtcbiAgICAgIHJlc3VsdFtwcm9wXSA9IGN1cjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY3VyKSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGN1ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAobW9kZSA9PT0gJ3N0cmljdCcpIHtcbiAgICAgICAgICByZWN1cnNlKGN1cltpXSwgYCR7cHJvcH0ke3NlcGFyYXRvcn0ke2l9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzZShjdXJbaV0sIGAke3Byb3B9WyR7aX1dYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjdXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wXSA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaXNFbXB0eUZsYWcgPSB0cnVlO1xuICAgICAgT2JqZWN0LmtleXMoY3VyKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaXNFbXB0eUZsYWcgPSBmYWxzZTtcbiAgICAgICAgcmVjdXJzZShjdXJba2V5XSwgcHJvcCA/IGAke3Byb3B9JHtzZXBhcmF0b3J9JHtrZXl9YCA6IGtleSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChpc0VtcHR5RmxhZyAmJiBwcm9wKSByZXN1bHRbcHJvcF0gPSB7fTtcbiAgICB9XG4gIH07XG5cbiAgcmVjdXJzZShkYXRhLCAnJyk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgb2Zmc2V0IHZhbHVlIGluIHNlY29uZHMgZm9yIGEgZ2l2ZW4gdGltZXpvbmUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRpbWV6b25lIHZhbHVlIGZvciB3aGljaCB0aGUgb2Zmc2V0IG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQuXG4gKiBAcmV0dXJucyBUaGUgb2Zmc2V0IHZhbHVlIGluIHNlY29uZHMgZm9yIHRoZSBnaXZlbiB0aW1lem9uZS4gSWYgdGhlIHRpbWV6b25lIGlzIGludmFsaWQgb3Igbm90IGZvdW5kLCBpdCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnQXNpYS9DYWxjdXR0YScpO1xuICogY29uc29sZS5sb2cob2Zmc2V0KTsgLy8gT3V0cHV0OiAxOTgwMFxuICovXG5leHBvcnQgY29uc3QgZ2V0T2Zmc2V0SW5TZWMgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuICBjb25zdCBuYW1lID0gbW9tZW50LnR6LnpvbmUodmFsdWUpO1xuICBpZiAobmFtZSkge1xuICAgIGNvbnN0IHggPSBtb21lbnQoKS50eih2YWx1ZSkuZm9ybWF0KCdaJyk7XG4gICAgY29uc3Qgc3BsaXQgPSB4LnNwbGl0KCc6Jyk7XG4gICAgY29uc3QgaG91ciA9IE51bWJlcihzcGxpdFswXSk7XG4gICAgY29uc3QgbWluID0gTnVtYmVyKHNwbGl0WzFdKTtcbiAgICBsZXQgc2VjID0gMDtcbiAgICBzZWMgPSBob3VyIDwgMCA/IC0xICogKGhvdXIgKiAtNjAgKiA2MCArIG1pbiAqIDYwKSA6IGhvdXIgKiA2MCAqIDYwICsgbWluICogNjA7XG4gICAgcmV0dXJuIHNlYztcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRhdGUgc3RyaW5nIGludG8gYSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICogSWYgYSBmb3JtYXQgc3RyaW5nIGlzIHByb3ZpZGVkLCBpdCB1c2VzIHRoZSBtb21lbnQgbGlicmFyeSB0byBmb3JtYXQgdGhlIGRhdGUuXG4gKiBJZiBubyBmb3JtYXQgc3RyaW5nIGlzIHByb3ZpZGVkLCBpdCByZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGRhdGUuXG4gKiBAcGFyYW0gZGF0ZVN0ciAtIFRoZSBkYXRlIHN0cmluZyB0byBiZSBmb3JtYXR0ZWQuXG4gKiBAcGFyYW0gZm9ybWF0IC0gKE9wdGlvbmFsKSBUaGUgZm9ybWF0IHN0cmluZyB0byBiZSB1c2VkIGZvciBmb3JtYXR0aW5nIHRoZSBkYXRlLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkYXRlIGFzIGEgc3RyaW5nIGlmIGEgZm9ybWF0IHN0cmluZyBpcyBwcm92aWRlZCxcbiAqICAgICAgICAgIG90aGVyd2lzZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBkYXRlIGFzIGEgbnVtYmVyLlxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0VGltZVN0YW1wID0gKGRhdGVTdHI6IHN0cmluZywgZm9ybWF0Pzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlU3RyKTtcbiAgLy8gbW9tZW50IGZvcm1hdCBpcyBwYXNzZWQuIGZvcm1hdCBhY2NvcmRpbmdseVxuICBpZiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIG1vbWVudC51dGMoZGF0ZSkuZm9ybWF0KGZvcm1hdCk7XG4gIH1cblxuICAvLyByZXR1cm4gZGVmYXVsdCBmb3JtYXRcbiAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhc2hUb1NoYTI1NiA9ICh2YWx1ZTogc3RyaW5nIHwgQnVmZmVyIHwgbnVtYmVyW10pID0+IHNoYTI1Nih2YWx1ZSk7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgVW5pdmVyc2FsbHkgVW5pcXVlIElkZW50aWZpZXIgKFVVSUQpIHVzaW5nIHRoZSBgY3J5cHRvLnJhbmRvbVVVSUQoKWAgbWV0aG9kLlxuICogVGhlIGBkaXNhYmxlRW50cm9weUNhY2hlYCBvcHRpb24gaXMgc2V0IHRvIGB0cnVlYCB0byBwcmV2ZW50IGNhY2hpbmcgb2YgZ2VuZXJhdGVkIFVVSURzLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmFuZG9tbHkgZ2VuZXJhdGVkIFVVSUQuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jcnlwdG8uaHRtbCNjcnlwdG9yYW5kb211dWlkb3B0aW9uczp+OnRleHQ9b3B0aW9ucyUyMCUzQ09iamVjdCUzRS0sZGlzYWJsZUVudHJvcHlDYWNoZSwtJTNDYm9vbGVhbiUzRSUyMEJ5fVxuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVVVUlEID0gKCk6IHN0cmluZyA9PiBjcnlwdG8ucmFuZG9tVVVJRCh7IGRpc2FibGVFbnRyb3B5Q2FjaGU6IHRydWUgfSk7XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0VG9TdHJpbmcgPSAodmFsdWU6IGFueSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufTtcblxuY29uc3QgdXVpZF9uYW1lc3BhY2UgPSAnZTc2YzZlNTEtMDZmOS00MjIyLTk2MzYtNWFiYTdlM2E4NGI2JztcbmV4cG9ydCBjb25zdCB1dWlkdjUgPSAodmFsOiBzdHJpbmcpID0+IHY1KHZhbCwgdXVpZF9uYW1lc3BhY2UpO1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSYW5kb21TdHJpbmcgPSAobGVuZ3RoOiBudW1iZXIgPSAxMCkgPT5cbiAgY3J5cHRvLnJhbmRvbUJ5dGVzKGxlbmd0aCkudG9TdHJpbmcoJ2hleCcpLnNsaWNlKDAsIGxlbmd0aCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55IHwgYW55W119IHFQYXJhbXMgLSBPYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXJzIHdoZXJlIHZhbHVlcyBhcmUgYXJyYXlzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gRmxhdHRlbmVkIG9iamVjdCB3aGVyZSBhcnJheSB2YWx1ZXMgb2YgbGVuZ3RoIG9uZSBhcmUgcmVwbGFjZWQgd2l0aCB0aGVpciBmaXJzdCBlbGVtZW50XG4gKiBAZGVzY3JpcHRpb25cbiAqIEZsYXR0ZW5zIGFuIG9iamVjdCBieSByZXBsYWNpbmcgYXJyYXkgdmFsdWVzIG9mIGxlbmd0aCBvbmUgd2l0aCB0aGVpciBmaXJzdCBlbGVtZW50LFxuICogd2hpbGUga2VlcGluZyBub24tYXJyYXkgdmFsdWVzIG9yIGFycmF5cyBvZiBsZW5ndGggbW9yZSB0aGFuIG9uZSB1bmNoYW5nZWQuXG4gKiBJbiBjYXNlIG9mIGVtcHR5IGFycmF5LCB0aGUga2V5IGlzIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBmbGF0dGVuUXVlcnlQYXJhbXMgPSAocVBhcmFtczogUmVjb3JkPHN0cmluZywgYW55IHwgYW55W10+KTogUmVjb3JkPHN0cmluZywgYW55PiA9PiB7XG4gIGlmICghcVBhcmFtcykgcmV0dXJuIHt9OyAvLyBFYXJseSByZXR1cm4gZm9yIG51bGxpc2ggdmFsdWVzXG4gIGNvbnN0IGZvcm1hdHRlZE91dHB1dDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIE9iamVjdC5lbnRyaWVzKHFQYXJhbXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IGZpbmFsVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPD0gMSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgaWYgKGZpbmFsVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaW5hbFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBmb3JtYXR0ZWRPdXRwdXRba2V5XSA9IGZpbmFsVmFsdWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZm9ybWF0dGVkT3V0cHV0O1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBmcmVlemVzIGFuIG9iamVjdCBhbmQgYWxsIGl0cyBwcm9wZXJ0aWVzLlxuICogVGhpcyBtYWtlcyB0aGUgb2JqZWN0IGFuZCBpdHMgbmVzdGVkIHByb3BlcnRpZXMgaW1tdXRhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byBmcmVlemVcbiAqIEBwYXJhbSB7VH0gb2JqIC0gVGhlIG9iamVjdCB0byBmcmVlemVcbiAqIEByZXR1cm5zIHtSZWFkb25seTxUPn0gLSBUaGUgZnJvemVuIG9iamVjdFxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBjb25maWcgPSBkZWVwRnJlZXplKHsgYXBpOiB7IGtleTogJ3NlY3JldCcsIHRpbWVvdXQ6IDEwMDAgfSB9KTtcbiAqIC8vIEF0dGVtcHRpbmcgdG8gbW9kaWZ5IGNvbmZpZy5hcGkua2V5IHdpbGwgdGhyb3cgYW4gZXJyb3IgaW4gc3RyaWN0IG1vZGVcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZXBGcmVlemUgPSA8VD4ob2JqOiBUKTogUmVhZG9ubHk8VD4gPT4ge1xuICAvLyBJZiB0aGUgb2JqZWN0IGlzIG51bGwsIHVuZGVmaW5lZCwgb3Igbm90IGFuIG9iamVjdCwgcmV0dXJuIGl0IGFzIGlzXG4gIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSByZXR1cm4gb2JqO1xuXG4gIC8vIEZyZWV6ZSBhbGwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSAob2JqIGFzIGFueSlba2V5XTtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkge1xuICAgICAgZGVlcEZyZWV6ZSh2YWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBGcmVlemUgdGhlIG9iamVjdCBpdHNlbGYgYW5kIHJldHVybiBpdFxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShvYmopO1xufTtcbiJdfQ==
|
|
428
|
+
/**
|
|
429
|
+
* Deep freezes a specific property of an object and locks that property from reassignment.
|
|
430
|
+
* @template T - The type of the object.
|
|
431
|
+
* @param {T} obj - The object containing the property to freeze.
|
|
432
|
+
* @param {keyof T} propKey - The key of the property to deep freeze and lock.
|
|
433
|
+
* @returns {T} - The original object `T` with `obj[propKey]` deep frozen and `propKey` locked.
|
|
434
|
+
*
|
|
435
|
+
* @example
|
|
436
|
+
* const myObject = { data: { value: 123 } };
|
|
437
|
+
* deepFreezeProperty(myObject, 'data');
|
|
438
|
+
* // myObject.data is now immutable, and myObject.data cannot be reassigned.
|
|
439
|
+
*/
|
|
440
|
+
const deepFreezeProperty = (obj, propKey) => {
|
|
441
|
+
// If the object is null, undefined, or not an object, or propKey is not found, return it as is
|
|
442
|
+
if (!obj || typeof obj !== 'object' || !Object.prototype.hasOwnProperty.call(obj, propKey))
|
|
443
|
+
return obj;
|
|
444
|
+
const valueToFreeze = obj[propKey];
|
|
445
|
+
if (valueToFreeze && typeof valueToFreeze === 'object' && !Object.isFrozen(valueToFreeze)) {
|
|
446
|
+
(0, exports.deepFreeze)(valueToFreeze);
|
|
447
|
+
}
|
|
448
|
+
// Lock the property from reassignment
|
|
449
|
+
(0, exports.lockProperty)(obj, propKey);
|
|
450
|
+
return obj;
|
|
451
|
+
};
|
|
452
|
+
exports.deepFreezeProperty = deepFreezeProperty;
|
|
453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9taXNjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUF1QjtBQUN2QiwwREFBNEI7QUFlbkIsY0FmRixtQkFBRyxDQWVFO0FBZFosMERBQTRCO0FBY2QsY0FkUCxtQkFBRyxDQWNPO0FBYmpCLHNFQUFxQztBQUNyQyxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLCtCQUEwQjtBQUMxQixrREFBb0M7QUFVN0IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsZ0JBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFBOUMsUUFBQSxTQUFTLGFBQXFDO0FBQ3BELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGdCQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQTNDLFFBQUEsVUFBVSxjQUFpQztBQUNqRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUF0QyxRQUFBLFNBQVMsYUFBNkI7QUFDNUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQUMsSUFBQSxpQkFBUyxFQUFDLENBQUMsQ0FBQyxJQUFJLElBQUEsaUJBQVMsRUFBQyxDQUFDLENBQUMsQ0FBQztBQUFuRSxRQUFBLG1CQUFtQix1QkFBZ0Q7QUFDekUsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQzNELElBQUEsaUJBQVMsRUFBQyxDQUFDLENBQUMsSUFBSSxJQUFBLGlCQUFTLEVBQUMsQ0FBQyxDQUFDLElBQUksSUFBQSxrQkFBVSxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBRG5DLFFBQUEsOEJBQThCLGtDQUNLO0FBQ3pDLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQTNELFFBQUEsT0FBTyxXQUFvRDtBQUV4RSwyRUFBMkU7QUFDcEUsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQ3BELElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNqQyxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBSFcsUUFBQSxxQkFBcUIseUJBR2hDO0FBRUssTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQy9DLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNqQyxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxpQkFBUyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBSFcsUUFBQSxnQkFBZ0Isb0JBRzNCO0FBQ0ssTUFBTSw0QkFBNEIsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQzNELElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNqQyxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSwyQkFBbUIsQ0FBQyxDQUFDO0FBQzVDLENBQUMsQ0FBQztBQUhXLFFBQUEsNEJBQTRCLGdDQUd2QztBQUNLLE1BQU0sb0NBQW9DLEdBQUcsQ0FBQyxHQUFZLEVBQUUsRUFBRTtJQUNuRSxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDakMsT0FBTyxnQkFBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsc0NBQThCLENBQUMsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFIVyxRQUFBLG9DQUFvQyx3Q0FHL0M7QUFFRjs7OztHQUlHO0FBQ0ksTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFtQixFQUFFLEVBQUU7SUFDaEQsSUFBSSxDQUFDLGdCQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFDekUsT0FBTyxnQkFBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQztBQUhXLFFBQUEsVUFBVSxjQUdyQjtBQUVGLDJFQUEyRTtBQUMzRSxpQkFBaUI7QUFDakIsMkVBQTJFO0FBRXBFLE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUE3RSxRQUFBLGVBQWUsbUJBQThEO0FBRTFGLGlEQUFpRDtBQUMxQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQWlCLEVBQUUsRUFBRTtJQUM5QyxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBTlcsUUFBQSxVQUFVLGNBTXJCO0FBRUssTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQ2hELEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFEdkMsUUFBQSxrQkFBa0Isc0JBQ3FCO0FBRTdDLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBWSxFQUFFLEVBQUU7SUFDMUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxHQUFHLENBQUM7SUFDeEIsT0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0FBSFcsUUFBQSxXQUFXLGVBR3RCO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLE9BQU8sR0FBRyxDQUFDO0lBQ3hCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2hCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFUVyxRQUFBLE9BQU8sV0FTbEI7QUFFSyxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLE9BQU8sS0FBSyxDQUFDO0lBQzFCLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RixDQUFDLENBQUM7QUFIVyxRQUFBLFFBQVEsWUFHbkI7QUFFSyxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsZ0JBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUFsRSxRQUFBLE9BQU8sV0FBMkQ7QUFFL0U7Ozs7R0FJRztBQUNJLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7SUFDeEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQztBQU5XLFFBQUEsYUFBYSxpQkFNeEI7QUFFRjs7Ozs7OztHQU9HO0FBQ0ksTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQ3pELENBQUMsQ0FDQyxLQUFLLEtBQUssU0FBUztJQUNuQixLQUFLLEtBQUssSUFBSTtJQUNkLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ25CLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUM5RCxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUN6RCxDQUFDO0FBUFMsUUFBQSx3QkFBd0IsNEJBT2pDO0FBRUcsTUFBTSxtQ0FBbUMsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFO0lBQ2xFLElBQUksQ0FBQyxnQkFBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUNqQyxPQUFPLGdCQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxnQ0FBd0IsQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUhXLFFBQUEsbUNBQW1DLHVDQUc5QztBQUVGLDZEQUE2RDtBQUN0RCxNQUFNLGdCQUFnQixHQUFHLENBQzlCLE1BQTZCLEVBQzdCLFVBQWtCLE1BQU0sRUFDeEIsUUFBZ0IsSUFBSSxFQUNwQixXQUFXLEdBQUcsSUFBSSxFQUNsQixFQUFFO0lBQ0YsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztJQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkIsSUFBSSxJQUFBLGVBQU8sRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQUUsT0FBTztZQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQWZXLFFBQUEsZ0JBQWdCLG9CQWUzQjtBQUVGOzs7Ozs7OztHQVFHO0FBQ0ksTUFBTSw2QkFBNkIsR0FBRyxDQUMzQyxNQUE2QixFQUM3QixVQUFVLE1BQWdCLEVBQzFCLEtBQUssR0FBRyxJQUFJLEVBQ1osV0FBVyxHQUFHLElBQUksRUFDbEIsRUFBRTtJQUNGLE1BQU0sT0FBTyxHQUF3QixFQUFFLENBQUM7SUFDeEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZCLElBQUksSUFBQSxlQUFPLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUFFLE9BQU87WUFDcEMsTUFBTSxHQUFHLEdBQUcsV0FBVztnQkFDckIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hELENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFckMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQXZCVyxRQUFBLDZCQUE2QixpQ0F1QnhDO0FBRUY7Ozs7OztHQU1HO0FBQ0ksTUFBTSxpQ0FBaUMsR0FBRyxDQUMvQyxNQUE2QixFQUM3QixPQUFPLEdBQUcsTUFBTSxFQUNoQixXQUFXLEdBQUcsSUFBSSxFQUNsQixFQUFFO0lBQ0YsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztJQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkIsSUFBSSxJQUFBLGVBQU8sRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQUUsT0FBTztZQUNwQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMvRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUM7QUFiVyxRQUFBLGlDQUFpQyxxQ0FhNUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0ksTUFBTSw4QkFBOEIsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBOEIsRUFBRSxFQUFFO0lBQzdGLE1BQU0sTUFBTSxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTFELE1BQU0sR0FBRyxHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUNoQixnQkFBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUEsbUJBQUcsRUFBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUNqRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDbkIsQ0FBQztJQUNGLE9BQU8sQ0FBQyxnQkFBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBUlcsUUFBQSw4QkFBOEIsa0NBUXpDO0FBRUY7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBYSxFQUFFLFNBQVMsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLFFBQVEsRUFBRSxFQUFFO0lBQzdFLE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7SUFFcEMsNkRBQTZEO0lBQzdELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBUSxFQUFFLElBQVMsRUFBRSxFQUFFO1FBQ3RDLElBQUksQ0FBQyxDQUFDO1FBQ04sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNyQixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztZQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUMvQixXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksV0FBVyxJQUFJLElBQUk7Z0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUEvQlcsUUFBQSxXQUFXLGVBK0J0QjtBQUVGOzs7Ozs7Ozs7R0FTRztBQUNJLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDOUMsTUFBTSxJQUFJLEdBQUcseUJBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLElBQUksSUFBSSxFQUFFLENBQUM7UUFDVCxNQUFNLENBQUMsR0FBRyxJQUFBLHlCQUFNLEdBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUMvRSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFaVyxRQUFBLGNBQWMsa0JBWXpCO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLGVBQWUsR0FBRyxDQUFDLE9BQWUsRUFBRSxNQUFlLEVBQUUsRUFBRTtJQUNsRSxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQiw4Q0FBOEM7SUFDOUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE9BQU8seUJBQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBVFcsUUFBQSxlQUFlLG1CQVMxQjtBQUVLLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBaUMsRUFBRSxFQUFFLENBQUMsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO0FBQXBFLFFBQUEsWUFBWSxnQkFBd0Q7QUFFakY7Ozs7Ozs7R0FPRztBQUNJLE1BQU0sWUFBWSxHQUFHLEdBQVcsRUFBRSxDQUFDLGdCQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUE5RSxRQUFBLFlBQVksZ0JBQWtFO0FBRXBGLE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7SUFDNUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDO0FBTFcsUUFBQSxlQUFlLG1CQUsxQjtBQUVGLE1BQU0sY0FBYyxHQUFHLHNDQUFzQyxDQUFDO0FBQ3ZELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFBLFNBQUUsRUFBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFBbEQsUUFBQSxNQUFNLFVBQTRDO0FBRXhELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsRUFBRSxDQUMxRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQURqRCxRQUFBLG9CQUFvQix3QkFDNkI7QUFFOUQ7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLGtCQUFrQixHQUFHLENBQUMsT0FBb0MsRUFBdUIsRUFBRTtJQUM5RixJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsa0NBQWtDO0lBQzNELE1BQU0sZUFBZSxHQUF3QixFQUFFLENBQUM7SUFFaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQy9DLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2hGLElBQUksVUFBVSxLQUFLLFNBQVMsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDLENBQUM7QUFaVyxRQUFBLGtCQUFrQixzQkFZN0I7QUFFRjs7Ozs7R0FLRztBQUNJLE1BQU0sWUFBWSxHQUFHLENBQXNDLEdBQU0sRUFBRSxHQUFNLEVBQUssRUFBRSxDQUNyRixNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7SUFDOUIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDZixRQUFRLEVBQUUsS0FBSztJQUNmLFlBQVksRUFBRSxLQUFLO0NBQ3BCLENBQUMsQ0FBQztBQUxRLFFBQUEsWUFBWSxnQkFLcEI7QUFFTDs7Ozs7Ozs7R0FRRztBQUNJLE1BQU0sVUFBVSxHQUFHLENBQW9DLEdBQU0sRUFBZSxFQUFFO0lBQ25GLHNFQUFzRTtJQUN0RSxJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUVoRCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hDLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRSxJQUFBLGtCQUFVLEVBQUMsS0FBZ0MsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixzQ0FBc0M7SUFDdEMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQzlDLGdGQUFnRjtRQUNoRixjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFFSCx5Q0FBeUM7SUFDekMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQztBQWxCVyxRQUFBLFVBQVUsY0FrQnJCO0FBRUY7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxNQUFNLGtCQUFrQixHQUFHLENBQ2hDLEdBQU0sRUFDTixPQUFnQixFQUNiLEVBQUU7SUFDTCwrRkFBK0Y7SUFDL0YsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztRQUN4RixPQUFPLEdBQUcsQ0FBQztJQUViLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxJQUFJLGFBQWEsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDMUYsSUFBQSxrQkFBVSxFQUFDLGFBQXdDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0Qsc0NBQXNDO0lBQ3RDLElBQUEsb0JBQVksRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0IsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFmVyxRQUFBLGtCQUFrQixzQkFlN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGdldCBmcm9tICdnZXQtdmFsdWUnO1xuaW1wb3J0IHNldCBmcm9tICdzZXQtdmFsdWUnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQtdGltZXpvbmUnO1xuaW1wb3J0IHNoYTI1NiBmcm9tICdzaGEyNTYnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgdjUgfSBmcm9tICd1dWlkJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuXG5pbnRlcmZhY2UgRGVzdGluYXRpb25NYXAge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSU5MSU5FUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHsgZ2V0LCBzZXQgfTtcbmV4cG9ydCBjb25zdCBpc0RlZmluZWQgPSAoeDogdW5rbm93bikgPT4gIV8uaXNVbmRlZmluZWQoeCk7XG5leHBvcnQgY29uc3QgaXNOb3RFbXB0eSA9ICh4OiB1bmtub3duKSA9PiAhXy5pc0VtcHR5KHgpO1xuZXhwb3J0IGNvbnN0IGlzTm90TnVsbCA9ICh4OiB1bmtub3duKSA9PiB4ICE9IG51bGw7XG5leHBvcnQgY29uc3QgaXNEZWZpbmVkQW5kTm90TnVsbCA9ICh4OiB1bmtub3duKSA9PiBpc0RlZmluZWQoeCkgJiYgaXNOb3ROdWxsKHgpO1xuZXhwb3J0IGNvbnN0IGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSA9ICh4OiB1bmtub3duKSA9PlxuICBpc0RlZmluZWQoeCkgJiYgaXNOb3ROdWxsKHgpICYmIGlzTm90RW1wdHkoeCk7XG5leHBvcnQgY29uc3QgaXNCbGFuayA9ICh2YWx1ZTogdW5rbm93bikgPT4gXy5pc0VtcHR5KF8udG9TdHJpbmcodmFsdWUpKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgY29uc3QgcmVtb3ZlVW5kZWZpbmVkVmFsdWVzID0gKG9iajogdW5rbm93bikgPT4ge1xuICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIF8ucGlja0J5KG9iaiwgaXNEZWZpbmVkKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVOdWxsVmFsdWVzID0gKG9iajogdW5rbm93bikgPT4ge1xuICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIF8ucGlja0J5KG9iaiwgaXNOb3ROdWxsKTtcbn07XG5leHBvcnQgY29uc3QgcmVtb3ZlVW5kZWZpbmVkQW5kTnVsbFZhbHVlcyA9IChvYmo6IHVua25vd24pID0+IHtcbiAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIHJldHVybiBfLnBpY2tCeShvYmosIGlzRGVmaW5lZEFuZE5vdE51bGwpO1xufTtcbmV4cG9ydCBjb25zdCByZW1vdmVVbmRlZmluZWRBbmROdWxsQW5kRW1wdHlWYWx1ZXMgPSAob2JqOiB1bmtub3duKSA9PiB7XG4gIGlmICghXy5pc09iamVjdChvYmopKSByZXR1cm4gb2JqO1xuICByZXR1cm4gXy5waWNrQnkob2JqLCBpc0RlZmluZWRBbmROb3ROdWxsQW5kTm90RW1wdHkpO1xufTtcblxuLyoqXG4gKiBUaGUgZmxhdHRlbk1hcCBmdW5jdGlvbiB0YWtlcyBhIGNvbGxlY3Rpb24gYXMgaW5wdXQgYW5kIHJldHVybnMgYSBmbGF0dGVuZWQgdmVyc2lvbiBvZiB0aGUgY29sbGVjdGlvbi4gSWYgdGhlIGlucHV0IGlzIG5vdCBhbiBhcnJheSBvciBhbiBvYmplY3QsIGl0IGlzIHJldHVybmVkIGFzIGlzLiBPdGhlcndpc2UsIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSBmbGF0TWFwIGZ1bmN0aW9uIGZyb20gdGhlIGxvZGFzaCBsaWJyYXJ5IHRvIGZsYXR0ZW4gdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gY29sbGVjdGlvblxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW5NYXAgPSAoY29sbGVjdGlvbjogdW5rbm93bikgPT4ge1xuICBpZiAoIV8uaXNBcnJheShjb2xsZWN0aW9uKSAmJiAhXy5pc09iamVjdChjb2xsZWN0aW9uKSkgcmV0dXJuIGNvbGxlY3Rpb247XG4gIHJldHVybiBfLmZsYXRNYXAoY29sbGVjdGlvbiwgKHgpID0+IHgpO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBHRU5FUklDIFVUTElUWVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBiYXNlNjRDb252ZXJ0b3IgPSAoc3RyaW5nOiBzdHJpbmcpID0+IEJ1ZmZlci5mcm9tKHN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4vLyByZXR1cm4gYSB2YWxpZCBVUkwgb2JqZWN0IGlmIGNvcnJlY3QgZWxzZSBudWxsXG5leHBvcnQgY29uc3QgaXNWYWxpZFVybCA9ICh1cmw6IHN0cmluZyB8IFVSTCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc3RyaXBUcmFpbGluZ1NsYXNoID0gKHN0cjogc3RyaW5nKSA9PlxuICBzdHIgJiYgc3RyLmVuZHNXaXRoKCcvJykgPyBzdHIuc2xpY2UoMCwgLTEpIDogc3RyO1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAoYXJnOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgYXJnO1xuICByZXR1cm4gYXJnID09IG51bGwgfHwgKHR5cGUgIT09ICdvYmplY3QnICYmIHR5cGUgIT09ICdmdW5jdGlvbicpO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHsqfSBhcmdcbiAqIEByZXR1cm5zIHt0eXBlfVxuICpcbiAqIFJldHVybnMgdHlwZSBvZiBwYXNzZWQgYXJnXG4gKiBmb3IgbnVsbCBhcmdzcyByZXR1cm5zIFwiTlVMTFwiIGluc3RlZCBvZiBcIm9iamVjdFwiXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0VHlwZSA9IChhcmc6IHVua25vd24pID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiBhcmc7XG4gIGlmIChhcmcgPT0gbnVsbCkge1xuICAgIHJldHVybiAnTlVMTCc7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgIHJldHVybiAnYXJyYXknO1xuICB9XG4gIHJldHVybiB0eXBlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0ID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFbXB0eSA9IChpbnB1dDogdW5rbm93bikgPT4gXy5pc0VtcHR5KF8udG9TdHJpbmcoaW5wdXQpLnRyaW0oKSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGZvciBlbXB0eSBvYmplY3Qge31cbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaXNFbXB0eU9iamVjdCA9IChvYmo6IGFueSkgPT4ge1xuICBpZiAoIW9iaikge1xuICAgIGxvZ2dlci53YXJuKCdpbnB1dCBpcyB1bmRlZmluZWQgb3IgbnVsbCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgdmFsdWUgaXMgRGVmaW5lZCwgTm90IG51bGwgYW5kIE5vdCBFbXB0eS5cbiAqIENyZWF0ZSB0aGlzIGZ1bmN0aW9uLCBCZWNhdXNlIGV4aXN0aW5nIGlzRGVmaW5lZEFuZE5vdE51bGxBbmROb3RFbXB0eSgxMjMpIGlzIHJldHVybmluZyBmYWxzZSBkdWUgdG8gbG9kYXNoIF8uaXNFbXB0eSBmdW5jdGlvbi5cbiAqIF8uaXNFbXB0eSBpcyB1c2VkIHRvIGRldGVjdCBlbXB0eSBjb2xsZWN0aW9ucy9vYmplY3RzIGFuZCBpdCB3aWxsIHJldHVybiB0cnVlIGZvciBJbnRlZ2VyLCBCb29sZWFuIHZhbHVlcy5cbiAqIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvaXNzdWVzLzQ5NlxuICogQHBhcmFtIHsqfSB2YWx1ZSAxMjNcbiAqIEByZXR1cm5zIHllc1xuICovXG5leHBvcnQgY29uc3QgaXNEZWZpbmVkTm90TnVsbE5vdEVtcHR5ID0gKHZhbHVlOiB1bmtub3duKSA9PlxuICAhKFxuICAgIHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgIE51bWJlci5pc05hTih2YWx1ZSkgfHxcbiAgICAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKSB8fFxuICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICk7XG5cbmV4cG9ydCBjb25zdCByZW1vdmVVbmRlZmluZWROdWxsRW1wdHlFeGNsQm9vbEludCA9IChvYmo6IHVua25vd24pID0+IHtcbiAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gIHJldHVybiBfLnBpY2tCeShvYmosIGlzRGVmaW5lZE5vdE51bGxOb3RFbXB0eSk7XG59O1xuXG4vLyBGb3JtYXQgdGhlIGRlc3RpbmF0aW9uLkNvbmZpZy5keW5hbWljTWFwIGFycmF5cyB0byBoYXNoTWFwXG5leHBvcnQgY29uc3QgZ2V0SGFzaEZyb21BcnJheSA9IChcbiAgYXJyYXlzOiBBcnJheTxEZXN0aW5hdGlvbk1hcD4sXG4gIGZyb21LZXk6IHN0cmluZyA9ICdmcm9tJyxcbiAgdG9LZXk6IHN0cmluZyA9ICd0bycsXG4gIGlzTG93ZXJDYXNlID0gdHJ1ZSxcbikgPT4ge1xuICBjb25zdCBoYXNoTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmIChBcnJheS5pc0FycmF5KGFycmF5cykpIHtcbiAgICBhcnJheXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcbiAgICAgIGlmIChpc0VtcHR5KGFycmF5W2Zyb21LZXldKSkgcmV0dXJuO1xuICAgICAgaGFzaE1hcFtpc0xvd2VyQ2FzZSA/IGFycmF5W2Zyb21LZXldLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA6IGFycmF5W2Zyb21LZXldXSA9XG4gICAgICAgIGFycmF5W3RvS2V5XTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGFzaE1hcDtcbn07XG5cbi8qKlxuICogRm9ybWF0IHRoZSBkZXN0aW5hdGlvbi5Db25maWcuZHluYW1pY01hcCBhcnJheXMgdG8gaGFzaE1hcFxuICogd2hlcmUgdmFsdWUgaXMgYW4gYXJyYXlcbiAqIEBwYXJhbSAge30gYXJyYXlzIFt7XCJmcm9tXCI6XCJwcm9wMVwiLFwidG9cIjpcInZhbDFcIn0se1wiZnJvbVwiOlwicHJvcDFcIixcInRvXCI6XCJ2YWwyXCJ9LHtcImZyb21cIjpcInByb3AyXCIsXCJ0b1wiOlwidmFsMlwifV1cbiAqIEBwYXJhbSAge30gZnJvbUtleT1cImZyb21cIlxuICogQHBhcmFtICB7fSB0b0tleT1cInRvXCJcbiAqIEBwYXJhbSAge30gaXNMb3dlckNhc2U9dHJ1ZVxuICogQHBhcmFtICB7fSByZXR1cm4gaGFzaG1hcCB7XCJwcm9wMVwiOltcInZhbDFcIixcInZhbDJcIl0sXCJwcm9wMlwiOltcInZhbDJcIl19XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRIYXNoRnJvbUFycmF5V2l0aER1cGxpY2F0ZSA9IChcbiAgYXJyYXlzOiBBcnJheTxEZXN0aW5hdGlvbk1hcD4sXG4gIGZyb21LZXkgPSAnZnJvbScgYXMgc3RyaW5nLFxuICB0b0tleSA9ICd0bycsXG4gIGlzTG93ZXJDYXNlID0gdHJ1ZSxcbikgPT4ge1xuICBjb25zdCBoYXNoTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmIChBcnJheS5pc0FycmF5KGFycmF5cykpIHtcbiAgICBhcnJheXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcbiAgICAgIGlmIChpc0VtcHR5KGFycmF5W2Zyb21LZXldKSkgcmV0dXJuO1xuICAgICAgY29uc3Qga2V5ID0gaXNMb3dlckNhc2VcbiAgICAgICAgPyBhcnJheVtmcm9tS2V5XS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkudHJpbSgpXG4gICAgICAgIDogYXJyYXlbZnJvbUtleV0udG9TdHJpbmcoKS50cmltKCk7XG5cbiAgICAgIGlmIChoYXNoTWFwW2tleV0pIHtcbiAgICAgICAgaGFzaE1hcFtrZXldLmFkZChhcnJheVt0b0tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzaE1hcFtrZXldID0gbmV3IFNldCgpO1xuICAgICAgICBoYXNoTWFwW2tleV0uYWRkKGFycmF5W3RvS2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhc2hNYXA7XG59O1xuXG4vKipcbiAqIEZvcm1hdCB0aGUgYXJyYXlzIHRvIGhhc2hNYXAgd2l0aCBrZXkgYXMgYGZyb21LZXlgIGFuZCB2YWx1ZSBhcyBPYmplY3RcbiAqIEBwYXJhbSB7Kn0gYXJyYXlzIFt7XCJpZFwiOlwiYTBiOGVmZTEtYzgyOC00YzYzLTg4NTAtMGQwNzQyODg4ZjlkXCIsXCJuYW1lXCI6XCJFbWFpbFwiLFwidHlwZVwiOlwiZW1haWxcIixcInR5cGVfY29uZmlnXCI6e30sXCJkYXRlX2NyZWF0ZWRcIjpcIjE2NjIyMjU4NDAyODRcIixcImhpZGVfZnJvbV9ndWVzdHNcIjpmYWxzZSxcInJlcXVpcmVkXCI6ZmFsc2V9XVxuICogQHBhcmFtIHsqfSBmcm9tS2V5IG5hbWVcbiAqIEBwYXJhbSB7Kn0gaXNMb3dlckNhc2UgZmFsc2VcbiAqIEByZXR1cm5zIC8vIHtcIkVtYWlsXCI6e1wiaWRcIjpcImEwYjhlZmUxLWM4MjgtNGM2My04ODUwLTBkMDc0Mjg4OGY5ZFwiLFwibmFtZVwiOlwiRW1haWxcIixcInR5cGVcIjpcImVtYWlsXCIsXCJ0eXBlX2NvbmZpZ1wiOnt9LFwiZGF0ZV9jcmVhdGVkXCI6XCIxNjYyMjI1ODQwMjg0XCIsXCJoaWRlX2Zyb21fZ3Vlc3RzXCI6ZmFsc2UsXCJyZXF1aXJlZFwiOmZhbHNlfX1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEhhc2hGcm9tQXJyYXlXaXRoVmFsdWVBc09iamVjdCA9IChcbiAgYXJyYXlzOiBBcnJheTxEZXN0aW5hdGlvbk1hcD4sXG4gIGZyb21LZXkgPSAnZnJvbScsXG4gIGlzTG93ZXJDYXNlID0gdHJ1ZSxcbikgPT4ge1xuICBjb25zdCBoYXNoTWFwOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmIChBcnJheS5pc0FycmF5KGFycmF5cykpIHtcbiAgICBhcnJheXMuZm9yRWFjaCgoYXJyYXkpID0+IHtcbiAgICAgIGlmIChpc0VtcHR5KGFycmF5W2Zyb21LZXldKSkgcmV0dXJuO1xuICAgICAgaGFzaE1hcFtpc0xvd2VyQ2FzZSA/IGFycmF5W2Zyb21LZXldLnRvTG93ZXJDYXNlKCkgOiBhcnJheVtmcm9tS2V5XV0gPSBhcnJheTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGFzaE1hcDtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGEgdmFsdWUgZnJvbSBhIG1lc3NhZ2Ugb2JqZWN0IGJhc2VkIG9uIGEgZ2l2ZW4ga2V5LiBJdCBzZWFyY2hlcyBmb3IgdGhlIGtleSBpbiB0aGUgcHJvcGVydGllcywgdHJhaXRzLCBhbmQgY29udGV4dC50cmFpdHMgb2YgdGhlIG1lc3NhZ2Ugb2JqZWN0IGluIHRoYXQgb3JkZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5tZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcywgdHJhaXRzLCBhbmQgY29udGV4dC50cmFpdHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5rZXkgLSBUaGUga2V5IHRvIHNlYXJjaCBmb3IgaW4gdGhlIG1lc3NhZ2Ugb2JqZWN0LlxuICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgbWVzc2FnZSBvYmplY3QgZm9yIHRoZSBnaXZlbiBrZXksIG9yIG51bGwgaWYgdGhlIGtleSBpcyBub3QgZm91bmQgb3IgdGhlIHZhbHVlIGlzIG51bGwuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRWYWx1ZUZyb21Qcm9wZXJ0aWVzT3JUcmFpdHMgPSAoeyBtZXNzYWdlLCBrZXkgfTogeyBtZXNzYWdlOiBhbnk7IGtleTogYW55IH0pID0+IHtcbiAgY29uc3Qga2V5U2V0ID0gWydwcm9wZXJ0aWVzJywgJ3RyYWl0cycsICdjb250ZXh0LnRyYWl0cyddO1xuXG4gIGNvbnN0IHZhbCA9IF8uZmluZChcbiAgICBfLm1hcChrZXlTZXQsIChrKSA9PiBnZXQobWVzc2FnZSwgYCR7a30uJHtrZXl9YCkpLFxuICAgICh2KSA9PiAhXy5pc05pbCh2KSxcbiAgKTtcbiAgcmV0dXJuICFfLmlzTmlsKHZhbCkgPyB2YWwgOiBudWxsO1xufTtcblxuLyoqXG4gKiBGbGF0dGVucyBhIEpTT04gb2JqZWN0IGludG8gYSBzaW5nbGUtbGV2ZWwgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIEpTT04gb2JqZWN0IHRvIGJlIGZsYXR0ZW5lZC5cbiAqIEBwYXJhbSBzZXBhcmF0b3IgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gc2VwYXJhdGUgdGhlIGtleXMgaW4gdGhlIGZsYXR0ZW5lZCBvYmplY3QuIERlZmF1bHQgaXMgJy4nLlxuICogQHBhcmFtIG1vZGUgLSBUaGUgbW9kZSB1c2VkIHRvIGZsYXR0ZW4gYXJyYXlzLiBJZiBzZXQgdG8gJ3N0cmljdCcsIHRoZSBhcnJheSBpbmRpY2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZsYXR0ZW5lZCBrZXlzLiBEZWZhdWx0IGlzICdub3JtYWwnLlxuICogQHJldHVybnMgVGhlIGZsYXR0ZW5lZCBKU09OIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGZsYXR0ZW5Kc29uID0gKGRhdGE6IHVua25vd24sIHNlcGFyYXRvciA9ICcuJywgbW9kZSA9ICdub3JtYWwnKSA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuXG4gIC8vIGEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRvIGxvb3AgdGhyb3VnaCB0aGUgYXJyYXkgb2YgdGhlIGRhdGFcbiAgY29uc3QgcmVjdXJzZSA9IChjdXI6IGFueSwgcHJvcDogYW55KSA9PiB7XG4gICAgbGV0IGk7XG4gICAgaWYgKE9iamVjdChjdXIpICE9PSBjdXIpIHtcbiAgICAgIHJlc3VsdFtwcm9wXSA9IGN1cjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY3VyKSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGN1ci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBpZiAobW9kZSA9PT0gJ3N0cmljdCcpIHtcbiAgICAgICAgICByZWN1cnNlKGN1cltpXSwgYCR7cHJvcH0ke3NlcGFyYXRvcn0ke2l9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzZShjdXJbaV0sIGAke3Byb3B9WyR7aX1dYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjdXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wXSA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaXNFbXB0eUZsYWcgPSB0cnVlO1xuICAgICAgT2JqZWN0LmtleXMoY3VyKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaXNFbXB0eUZsYWcgPSBmYWxzZTtcbiAgICAgICAgcmVjdXJzZShjdXJba2V5XSwgcHJvcCA/IGAke3Byb3B9JHtzZXBhcmF0b3J9JHtrZXl9YCA6IGtleSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChpc0VtcHR5RmxhZyAmJiBwcm9wKSByZXN1bHRbcHJvcF0gPSB7fTtcbiAgICB9XG4gIH07XG5cbiAgcmVjdXJzZShkYXRhLCAnJyk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgb2Zmc2V0IHZhbHVlIGluIHNlY29uZHMgZm9yIGEgZ2l2ZW4gdGltZXpvbmUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHRpbWV6b25lIHZhbHVlIGZvciB3aGljaCB0aGUgb2Zmc2V0IG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQuXG4gKiBAcmV0dXJucyBUaGUgb2Zmc2V0IHZhbHVlIGluIHNlY29uZHMgZm9yIHRoZSBnaXZlbiB0aW1lem9uZS4gSWYgdGhlIHRpbWV6b25lIGlzIGludmFsaWQgb3Igbm90IGZvdW5kLCBpdCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvZmZzZXQgPSBnZXRPZmZzZXRJblNlYygnQXNpYS9DYWxjdXR0YScpO1xuICogY29uc29sZS5sb2cob2Zmc2V0KTsgLy8gT3V0cHV0OiAxOTgwMFxuICovXG5leHBvcnQgY29uc3QgZ2V0T2Zmc2V0SW5TZWMgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuICBjb25zdCBuYW1lID0gbW9tZW50LnR6LnpvbmUodmFsdWUpO1xuICBpZiAobmFtZSkge1xuICAgIGNvbnN0IHggPSBtb21lbnQoKS50eih2YWx1ZSkuZm9ybWF0KCdaJyk7XG4gICAgY29uc3Qgc3BsaXQgPSB4LnNwbGl0KCc6Jyk7XG4gICAgY29uc3QgaG91ciA9IE51bWJlcihzcGxpdFswXSk7XG4gICAgY29uc3QgbWluID0gTnVtYmVyKHNwbGl0WzFdKTtcbiAgICBsZXQgc2VjID0gMDtcbiAgICBzZWMgPSBob3VyIDwgMCA/IC0xICogKGhvdXIgKiAtNjAgKiA2MCArIG1pbiAqIDYwKSA6IGhvdXIgKiA2MCAqIDYwICsgbWluICogNjA7XG4gICAgcmV0dXJuIHNlYztcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRhdGUgc3RyaW5nIGludG8gYSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICogSWYgYSBmb3JtYXQgc3RyaW5nIGlzIHByb3ZpZGVkLCBpdCB1c2VzIHRoZSBtb21lbnQgbGlicmFyeSB0byBmb3JtYXQgdGhlIGRhdGUuXG4gKiBJZiBubyBmb3JtYXQgc3RyaW5nIGlzIHByb3ZpZGVkLCBpdCByZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGRhdGUuXG4gKiBAcGFyYW0gZGF0ZVN0ciAtIFRoZSBkYXRlIHN0cmluZyB0byBiZSBmb3JtYXR0ZWQuXG4gKiBAcGFyYW0gZm9ybWF0IC0gKE9wdGlvbmFsKSBUaGUgZm9ybWF0IHN0cmluZyB0byBiZSB1c2VkIGZvciBmb3JtYXR0aW5nIHRoZSBkYXRlLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkYXRlIGFzIGEgc3RyaW5nIGlmIGEgZm9ybWF0IHN0cmluZyBpcyBwcm92aWRlZCxcbiAqICAgICAgICAgIG90aGVyd2lzZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBkYXRlIGFzIGEgbnVtYmVyLlxuICovXG5leHBvcnQgY29uc3QgZm9ybWF0VGltZVN0YW1wID0gKGRhdGVTdHI6IHN0cmluZywgZm9ybWF0Pzogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlU3RyKTtcbiAgLy8gbW9tZW50IGZvcm1hdCBpcyBwYXNzZWQuIGZvcm1hdCBhY2NvcmRpbmdseVxuICBpZiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIG1vbWVudC51dGMoZGF0ZSkuZm9ybWF0KGZvcm1hdCk7XG4gIH1cblxuICAvLyByZXR1cm4gZGVmYXVsdCBmb3JtYXRcbiAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhc2hUb1NoYTI1NiA9ICh2YWx1ZTogc3RyaW5nIHwgQnVmZmVyIHwgbnVtYmVyW10pID0+IHNoYTI1Nih2YWx1ZSk7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgVW5pdmVyc2FsbHkgVW5pcXVlIElkZW50aWZpZXIgKFVVSUQpIHVzaW5nIHRoZSBgY3J5cHRvLnJhbmRvbVVVSUQoKWAgbWV0aG9kLlxuICogVGhlIGBkaXNhYmxlRW50cm9weUNhY2hlYCBvcHRpb24gaXMgc2V0IHRvIGB0cnVlYCB0byBwcmV2ZW50IGNhY2hpbmcgb2YgZ2VuZXJhdGVkIFVVSURzLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmFuZG9tbHkgZ2VuZXJhdGVkIFVVSUQuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jcnlwdG8uaHRtbCNjcnlwdG9yYW5kb211dWlkb3B0aW9uczp+OnRleHQ9b3B0aW9ucyUyMCUzQ09iamVjdCUzRS0sZGlzYWJsZUVudHJvcHlDYWNoZSwtJTNDYm9vbGVhbiUzRSUyMEJ5fVxuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVVVUlEID0gKCk6IHN0cmluZyA9PiBjcnlwdG8ucmFuZG9tVVVJRCh7IGRpc2FibGVFbnRyb3B5Q2FjaGU6IHRydWUgfSk7XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0VG9TdHJpbmcgPSAodmFsdWU6IGFueSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xufTtcblxuY29uc3QgdXVpZF9uYW1lc3BhY2UgPSAnZTc2YzZlNTEtMDZmOS00MjIyLTk2MzYtNWFiYTdlM2E4NGI2JztcbmV4cG9ydCBjb25zdCB1dWlkdjUgPSAodmFsOiBzdHJpbmcpID0+IHY1KHZhbCwgdXVpZF9uYW1lc3BhY2UpO1xuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSYW5kb21TdHJpbmcgPSAobGVuZ3RoOiBudW1iZXIgPSAxMCkgPT5cbiAgY3J5cHRvLnJhbmRvbUJ5dGVzKGxlbmd0aCkudG9TdHJpbmcoJ2hleCcpLnNsaWNlKDAsIGxlbmd0aCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55IHwgYW55W119IHFQYXJhbXMgLSBPYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXJzIHdoZXJlIHZhbHVlcyBhcmUgYXJyYXlzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gRmxhdHRlbmVkIG9iamVjdCB3aGVyZSBhcnJheSB2YWx1ZXMgb2YgbGVuZ3RoIG9uZSBhcmUgcmVwbGFjZWQgd2l0aCB0aGVpciBmaXJzdCBlbGVtZW50XG4gKiBAZGVzY3JpcHRpb25cbiAqIEZsYXR0ZW5zIGFuIG9iamVjdCBieSByZXBsYWNpbmcgYXJyYXkgdmFsdWVzIG9mIGxlbmd0aCBvbmUgd2l0aCB0aGVpciBmaXJzdCBlbGVtZW50LFxuICogd2hpbGUga2VlcGluZyBub24tYXJyYXkgdmFsdWVzIG9yIGFycmF5cyBvZiBsZW5ndGggbW9yZSB0aGFuIG9uZSB1bmNoYW5nZWQuXG4gKiBJbiBjYXNlIG9mIGVtcHR5IGFycmF5LCB0aGUga2V5IGlzIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBmbGF0dGVuUXVlcnlQYXJhbXMgPSAocVBhcmFtczogUmVjb3JkPHN0cmluZywgYW55IHwgYW55W10+KTogUmVjb3JkPHN0cmluZywgYW55PiA9PiB7XG4gIGlmICghcVBhcmFtcykgcmV0dXJuIHt9OyAvLyBFYXJseSByZXR1cm4gZm9yIG51bGxpc2ggdmFsdWVzXG4gIGNvbnN0IGZvcm1hdHRlZE91dHB1dDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIE9iamVjdC5lbnRyaWVzKHFQYXJhbXMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IGZpbmFsVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPD0gMSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgaWYgKGZpbmFsVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaW5hbFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBmb3JtYXR0ZWRPdXRwdXRba2V5XSA9IGZpbmFsVmFsdWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZm9ybWF0dGVkT3V0cHV0O1xufTtcblxuLyoqXG4gKiBMb2NrcyBhIHByb3BlcnR5IG9mIGFuIG9iamVjdCwgbWFraW5nIGl0IGltbXV0YWJsZS5cbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGxvY2sgdGhlIHByb3BlcnR5IG9mLlxuICogQHBhcmFtIGtleSAtIFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGxvY2suXG4gKiBAcmV0dXJucyBUaGUgb2JqZWN0IHdpdGggdGhlIHByb3BlcnR5IGxvY2tlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvY2tQcm9wZXJ0eSA9IDxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVD4ob2JqOiBULCBrZXk6IEspOiBUID0+XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIHZhbHVlOiBvYmpba2V5XSxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgfSk7XG5cbi8qKlxuICogRGVlcCBmcmVlemVzIGFuIG9iamVjdCwgbWFraW5nIGl0IGltbXV0YWJsZS5cbiAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIGRlZXAgZnJlZXplLlxuICogQHJldHVybnMge1QgfCBSZWFkb25seTxUPn0gLSBJZiBgcHJvcEtleWAgaXMgcHJvdmlkZWQsIHJldHVybnMgdGhlIG9yaWdpbmFsIG9iamVjdCBgVGAgd2l0aCBgb2JqW3Byb3BLZXldYCBkZWVwIGZyb3plbiBhbmQgYHByb3BLZXlgIGxvY2tlZC4gT3RoZXJ3aXNlLCByZXR1cm5zIGEgYFJlYWRvbmx5PFQ+YCB2ZXJzaW9uIG9mIHRoZSBlbnRpcmUgb2JqZWN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBjb25maWcgPSBkZWVwRnJlZXplKHsgYXBpOiB7IGtleTogJ3NlY3JldCcsIHRpbWVvdXQ6IDEwMDAgfSB9KTtcbiAqIC8vIEF0dGVtcHRpbmcgdG8gbW9kaWZ5IGNvbmZpZy5hcGkua2V5IHdpbGwgdGhyb3cgYW4gZXJyb3IgaW4gc3RyaWN0IG1vZGVcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZXBGcmVlemUgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBSZWFkb25seTxUPiA9PiB7XG4gIC8vIElmIHRoZSBvYmplY3QgaXMgbnVsbCwgdW5kZWZpbmVkLCBvciBub3QgYW4gb2JqZWN0LCByZXR1cm4gaXQgYXMgaXNcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHJldHVybiBvYmo7XG5cbiAgY29uc3QgZnJlZXplSWZPYmplY3QgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkge1xuICAgICAgZGVlcEZyZWV6ZSh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9O1xuXG4gIC8vIEZyZWV6ZSBhbGwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgLy8gQWNjZXNzIHByb3BlcnR5IHVzaW5nIHN0cmluZyBrZXksIHdoaWNoIGlzIGFsbG93ZWQgYnkgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICBmcmVlemVJZk9iamVjdChvYmpba2V5XSk7XG4gIH0pO1xuXG4gIC8vIEZyZWV6ZSB0aGUgb2JqZWN0IGl0c2VsZiBhbmQgcmV0dXJuIGl0XG4gIHJldHVybiBPYmplY3QuZnJlZXplKG9iaik7XG59O1xuXG4vKipcbiAqIERlZXAgZnJlZXplcyBhIHNwZWNpZmljIHByb3BlcnR5IG9mIGFuIG9iamVjdCBhbmQgbG9ja3MgdGhhdCBwcm9wZXJ0eSBmcm9tIHJlYXNzaWdubWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSB7VH0gb2JqIC0gVGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSB0byBmcmVlemUuXG4gKiBAcGFyYW0ge2tleW9mIFR9IHByb3BLZXkgLSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBkZWVwIGZyZWV6ZSBhbmQgbG9jay5cbiAqIEByZXR1cm5zIHtUfSAtIFRoZSBvcmlnaW5hbCBvYmplY3QgYFRgIHdpdGggYG9ialtwcm9wS2V5XWAgZGVlcCBmcm96ZW4gYW5kIGBwcm9wS2V5YCBsb2NrZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG15T2JqZWN0ID0geyBkYXRhOiB7IHZhbHVlOiAxMjMgfSB9O1xuICogZGVlcEZyZWV6ZVByb3BlcnR5KG15T2JqZWN0LCAnZGF0YScpO1xuICogLy8gbXlPYmplY3QuZGF0YSBpcyBub3cgaW1tdXRhYmxlLCBhbmQgbXlPYmplY3QuZGF0YSBjYW5ub3QgYmUgcmVhc3NpZ25lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlZXBGcmVlemVQcm9wZXJ0eSA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBvYmo6IFQsXG4gIHByb3BLZXk6IGtleW9mIFQsXG4pOiBUID0+IHtcbiAgLy8gSWYgdGhlIG9iamVjdCBpcyBudWxsLCB1bmRlZmluZWQsIG9yIG5vdCBhbiBvYmplY3QsIG9yIHByb3BLZXkgaXMgbm90IGZvdW5kLCByZXR1cm4gaXQgYXMgaXNcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3BLZXkpKVxuICAgIHJldHVybiBvYmo7XG5cbiAgY29uc3QgdmFsdWVUb0ZyZWV6ZSA9IG9ialtwcm9wS2V5XTtcbiAgaWYgKHZhbHVlVG9GcmVlemUgJiYgdHlwZW9mIHZhbHVlVG9GcmVlemUgPT09ICdvYmplY3QnICYmICFPYmplY3QuaXNGcm96ZW4odmFsdWVUb0ZyZWV6ZSkpIHtcbiAgICBkZWVwRnJlZXplKHZhbHVlVG9GcmVlemUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICB9XG4gIC8vIExvY2sgdGhlIHByb3BlcnR5IGZyb20gcmVhc3NpZ25tZW50XG4gIGxvY2tQcm9wZXJ0eShvYmosIHByb3BLZXkpO1xuICByZXR1cm4gb2JqO1xufTtcbiJdfQ==
|