@hanzo/s3 0.6.4 → 8.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/LICENSE +202 -0
  2. package/MAINTAINERS.md +62 -0
  3. package/README.md +262 -0
  4. package/README_zh_CN.md +192 -0
  5. package/dist/esm/AssumeRoleProvider.d.mts +86 -0
  6. package/dist/esm/AssumeRoleProvider.mjs +183 -0
  7. package/dist/esm/CredentialProvider.d.mts +22 -0
  8. package/dist/esm/CredentialProvider.mjs +48 -0
  9. package/dist/esm/Credentials.d.mts +22 -0
  10. package/dist/esm/Credentials.mjs +38 -0
  11. package/dist/esm/IamAwsProvider.d.mts +27 -0
  12. package/dist/esm/IamAwsProvider.mjs +189 -0
  13. package/dist/esm/errors.d.mts +82 -0
  14. package/dist/esm/errors.mjs +117 -0
  15. package/dist/esm/helpers.d.mts +156 -0
  16. package/dist/esm/helpers.mjs +218 -0
  17. package/dist/esm/internal/async.d.mts +9 -0
  18. package/dist/esm/internal/async.mjs +14 -0
  19. package/dist/esm/internal/callbackify.d.mts +1 -0
  20. package/dist/esm/internal/callbackify.mjs +15 -0
  21. package/dist/esm/internal/client.d.mts +394 -0
  22. package/dist/esm/internal/client.mjs +3007 -0
  23. package/dist/esm/internal/copy-conditions.d.mts +10 -0
  24. package/dist/esm/internal/copy-conditions.mjs +25 -0
  25. package/dist/esm/internal/extensions.d.mts +18 -0
  26. package/dist/esm/internal/extensions.mjs +114 -0
  27. package/dist/esm/internal/helper.d.mts +177 -0
  28. package/dist/esm/internal/helper.mjs +552 -0
  29. package/dist/esm/internal/join-host-port.d.mts +11 -0
  30. package/dist/esm/internal/join-host-port.mjs +23 -0
  31. package/dist/esm/internal/post-policy.d.mts +17 -0
  32. package/dist/esm/internal/post-policy.mjs +98 -0
  33. package/dist/esm/internal/request.d.mts +11 -0
  34. package/dist/esm/internal/request.mjs +75 -0
  35. package/dist/esm/internal/response.d.mts +8 -0
  36. package/dist/esm/internal/response.mjs +16 -0
  37. package/dist/esm/internal/s3-endpoints.d.mts +38 -0
  38. package/dist/esm/internal/s3-endpoints.mjs +68 -0
  39. package/dist/esm/internal/type.d.mts +482 -0
  40. package/dist/esm/internal/type.mjs +30 -0
  41. package/dist/esm/internal/xml-parser.d.mts +93 -0
  42. package/dist/esm/internal/xml-parser.mjs +819 -0
  43. package/dist/esm/notification.d.mts +58 -0
  44. package/dist/esm/notification.mjs +209 -0
  45. package/dist/esm/s3.d.mts +40 -0
  46. package/dist/esm/s3.mjs +86 -0
  47. package/dist/esm/signing.d.mts +5 -0
  48. package/dist/esm/signing.mjs +258 -0
  49. package/dist/main/AssumeRoleProvider.d.ts +86 -0
  50. package/dist/main/AssumeRoleProvider.js +191 -0
  51. package/dist/main/CredentialProvider.d.ts +22 -0
  52. package/dist/main/CredentialProvider.js +55 -0
  53. package/dist/main/Credentials.d.ts +22 -0
  54. package/dist/main/Credentials.js +45 -0
  55. package/dist/main/IamAwsProvider.d.ts +27 -0
  56. package/dist/main/IamAwsProvider.js +198 -0
  57. package/dist/main/errors.d.ts +82 -0
  58. package/dist/main/errors.js +138 -0
  59. package/dist/main/helpers.d.ts +156 -0
  60. package/dist/main/helpers.js +233 -0
  61. package/dist/main/internal/async.d.ts +9 -0
  62. package/dist/main/internal/async.js +24 -0
  63. package/dist/main/internal/callbackify.d.ts +1 -0
  64. package/dist/main/internal/callbackify.js +21 -0
  65. package/dist/main/internal/client.d.ts +394 -0
  66. package/dist/main/internal/client.js +3014 -0
  67. package/dist/main/internal/copy-conditions.d.ts +10 -0
  68. package/dist/main/internal/copy-conditions.js +31 -0
  69. package/dist/main/internal/extensions.d.ts +18 -0
  70. package/dist/main/internal/extensions.js +122 -0
  71. package/dist/main/internal/helper.d.ts +177 -0
  72. package/dist/main/internal/helper.js +608 -0
  73. package/dist/main/internal/join-host-port.d.ts +11 -0
  74. package/dist/main/internal/join-host-port.js +29 -0
  75. package/dist/main/internal/post-policy.d.ts +17 -0
  76. package/dist/main/internal/post-policy.js +107 -0
  77. package/dist/main/internal/request.d.ts +11 -0
  78. package/dist/main/internal/request.js +83 -0
  79. package/dist/main/internal/response.d.ts +8 -0
  80. package/dist/main/internal/response.js +24 -0
  81. package/dist/main/internal/s3-endpoints.d.ts +38 -0
  82. package/dist/main/internal/s3-endpoints.js +73 -0
  83. package/dist/main/internal/type.d.ts +482 -0
  84. package/dist/main/internal/type.js +42 -0
  85. package/dist/main/internal/xml-parser.d.ts +93 -0
  86. package/dist/main/internal/xml-parser.js +849 -0
  87. package/dist/main/notification.d.ts +58 -0
  88. package/dist/main/notification.js +230 -0
  89. package/dist/main/s3.d.ts +40 -0
  90. package/dist/main/s3.js +117 -0
  91. package/dist/main/signing.d.ts +5 -0
  92. package/dist/main/signing.js +269 -0
  93. package/package.json +146 -39
  94. package/src/AssumeRoleProvider.ts +262 -0
  95. package/src/CredentialProvider.ts +54 -0
  96. package/src/Credentials.ts +44 -0
  97. package/src/IamAwsProvider.ts +234 -0
  98. package/src/errors.ts +120 -0
  99. package/src/helpers.ts +354 -0
  100. package/src/internal/async.ts +14 -0
  101. package/src/internal/callbackify.ts +19 -0
  102. package/src/internal/client.ts +3412 -0
  103. package/src/internal/copy-conditions.ts +30 -0
  104. package/src/internal/extensions.ts +140 -0
  105. package/src/internal/helper.ts +606 -0
  106. package/src/internal/join-host-port.ts +23 -0
  107. package/src/internal/post-policy.ts +99 -0
  108. package/src/internal/request.ts +102 -0
  109. package/src/internal/response.ts +26 -0
  110. package/src/internal/s3-endpoints.ts +70 -0
  111. package/src/internal/type.ts +577 -0
  112. package/src/internal/xml-parser.ts +871 -0
  113. package/src/notification.ts +254 -0
  114. package/src/s3.ts +155 -0
  115. package/src/signing.ts +325 -0
  116. package/lib/index.js +0 -450
  117. package/lib/index.js.map +0 -7
  118. package/lib/perfTest.js +0 -91
  119. package/lib/perfTest.js.map +0 -7
@@ -0,0 +1,156 @@
1
+ import type { Encryption, ObjectMetaData, RequestHeaders } from "./internal/type.js";
2
+ import { RETENTION_MODES } from "./internal/type.js";
3
+ export { ENCRYPTION_TYPES, LEGAL_HOLD_STATUS, RETENTION_MODES, RETENTION_VALIDITY_UNITS } from "./internal/type.js";
4
+ export declare const DEFAULT_REGION = "us-east-1";
5
+ export declare const PRESIGN_EXPIRY_DAYS_MAX: number;
6
+ export interface ICopySourceOptions {
7
+ Bucket: string;
8
+ Object: string;
9
+ /**
10
+ * Valid versionId
11
+ */
12
+ VersionID?: string;
13
+ /**
14
+ * Etag to match
15
+ */
16
+ MatchETag?: string;
17
+ /**
18
+ * Etag to exclude
19
+ */
20
+ NoMatchETag?: string;
21
+ /**
22
+ * Modified Date of the object/part. UTC Date in string format
23
+ */
24
+ MatchModifiedSince?: string | null;
25
+ /**
26
+ * Modified Date of the object/part to exclude UTC Date in string format
27
+ */
28
+ MatchUnmodifiedSince?: string | null;
29
+ /**
30
+ * true or false Object range to match
31
+ */
32
+ MatchRange?: boolean;
33
+ Start?: number;
34
+ End?: number;
35
+ Encryption?: Encryption;
36
+ }
37
+ export declare class CopySourceOptions {
38
+ readonly Bucket: string;
39
+ readonly Object: string;
40
+ readonly VersionID: string;
41
+ MatchETag: string;
42
+ private readonly NoMatchETag;
43
+ private readonly MatchModifiedSince;
44
+ private readonly MatchUnmodifiedSince;
45
+ readonly MatchRange: boolean;
46
+ readonly Start: number;
47
+ readonly End: number;
48
+ private readonly Encryption?;
49
+ constructor({
50
+ Bucket,
51
+ Object,
52
+ VersionID,
53
+ MatchETag,
54
+ NoMatchETag,
55
+ MatchModifiedSince,
56
+ MatchUnmodifiedSince,
57
+ MatchRange,
58
+ Start,
59
+ End,
60
+ Encryption
61
+ }: ICopySourceOptions);
62
+ validate(): boolean;
63
+ getHeaders(): RequestHeaders;
64
+ }
65
+ /**
66
+ * @deprecated use nodejs fs module
67
+ */
68
+ export declare function removeDirAndFiles(dirPath: string, removeSelf?: boolean): void;
69
+ export interface ICopyDestinationOptions {
70
+ /**
71
+ * Bucket name
72
+ */
73
+ Bucket: string;
74
+ /**
75
+ * Object Name for the destination (composed/copied) object defaults
76
+ */
77
+ Object: string;
78
+ /**
79
+ * Encryption configuration defaults to {}
80
+ * @default {}
81
+ */
82
+ Encryption?: Encryption;
83
+ UserMetadata?: ObjectMetaData;
84
+ /**
85
+ * query-string encoded string or Record<string, string> Object
86
+ */
87
+ UserTags?: Record<string, string> | string;
88
+ LegalHold?: 'on' | 'off';
89
+ /**
90
+ * UTC Date String
91
+ */
92
+ RetainUntilDate?: string;
93
+ Mode?: RETENTION_MODES;
94
+ MetadataDirective?: 'COPY' | 'REPLACE';
95
+ /**
96
+ * Extra headers for the target object
97
+ */
98
+ Headers?: Record<string, string>;
99
+ }
100
+ export declare class CopyDestinationOptions {
101
+ readonly Bucket: string;
102
+ readonly Object: string;
103
+ private readonly Encryption?;
104
+ private readonly UserMetadata?;
105
+ private readonly UserTags?;
106
+ private readonly LegalHold?;
107
+ private readonly RetainUntilDate?;
108
+ private readonly Mode?;
109
+ private readonly MetadataDirective?;
110
+ private readonly Headers?;
111
+ constructor({
112
+ Bucket,
113
+ Object,
114
+ Encryption,
115
+ UserMetadata,
116
+ UserTags,
117
+ LegalHold,
118
+ RetainUntilDate,
119
+ Mode,
120
+ MetadataDirective,
121
+ Headers
122
+ }: ICopyDestinationOptions);
123
+ getHeaders(): RequestHeaders;
124
+ validate(): boolean;
125
+ }
126
+ /**
127
+ * maybe this should be a generic type for Records, leave it for later refactor
128
+ */
129
+ export declare class SelectResults {
130
+ private records?;
131
+ private response?;
132
+ private stats?;
133
+ private progress?;
134
+ constructor({
135
+ records,
136
+ // parsed data as stream
137
+ response,
138
+ // original response stream
139
+ stats,
140
+ // stats as xml
141
+ progress
142
+ }: {
143
+ records?: unknown;
144
+ response?: unknown;
145
+ stats?: string;
146
+ progress?: unknown;
147
+ });
148
+ setStats(stats: string): void;
149
+ getStats(): string | undefined;
150
+ setProgress(progress: unknown): void;
151
+ getProgress(): unknown;
152
+ setResponse(response: unknown): void;
153
+ getResponse(): unknown;
154
+ setRecords(records: unknown): void;
155
+ getRecords(): unknown;
156
+ }
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.removeDirAndFiles = removeDirAndFiles;
7
+ var fs = _interopRequireWildcard(require("fs"), true);
8
+ var path = _interopRequireWildcard(require("path"), true);
9
+ var querystring = _interopRequireWildcard(require("query-string"), true);
10
+ var errors = _interopRequireWildcard(require("./errors.js"), true);
11
+ var _helper = require("./internal/helper.js");
12
+ var _type = require("./internal/type.js");
13
+ exports.RETENTION_MODES = _type.RETENTION_MODES;
14
+ exports.ENCRYPTION_TYPES = _type.ENCRYPTION_TYPES;
15
+ exports.LEGAL_HOLD_STATUS = _type.LEGAL_HOLD_STATUS;
16
+ exports.RETENTION_VALIDITY_UNITS = _type.RETENTION_VALIDITY_UNITS;
17
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+ const DEFAULT_REGION = 'us-east-1';
20
+ exports.DEFAULT_REGION = DEFAULT_REGION;
21
+ const PRESIGN_EXPIRY_DAYS_MAX = 24 * 60 * 60 * 7; // 7 days in seconds
22
+ exports.PRESIGN_EXPIRY_DAYS_MAX = PRESIGN_EXPIRY_DAYS_MAX;
23
+ class CopySourceOptions {
24
+ constructor({
25
+ Bucket,
26
+ Object,
27
+ VersionID = '',
28
+ MatchETag = '',
29
+ NoMatchETag = '',
30
+ MatchModifiedSince = null,
31
+ MatchUnmodifiedSince = null,
32
+ MatchRange = false,
33
+ Start = 0,
34
+ End = 0,
35
+ Encryption = undefined
36
+ }) {
37
+ this.Bucket = Bucket;
38
+ this.Object = Object;
39
+ this.VersionID = VersionID;
40
+ this.MatchETag = MatchETag;
41
+ this.NoMatchETag = NoMatchETag;
42
+ this.MatchModifiedSince = MatchModifiedSince;
43
+ this.MatchUnmodifiedSince = MatchUnmodifiedSince;
44
+ this.MatchRange = MatchRange;
45
+ this.Start = Start;
46
+ this.End = End;
47
+ this.Encryption = Encryption;
48
+ }
49
+ validate() {
50
+ if (!(0, _helper.isValidBucketName)(this.Bucket)) {
51
+ throw new errors.InvalidBucketNameError('Invalid Source bucket name: ' + this.Bucket);
52
+ }
53
+ if (!(0, _helper.isValidObjectName)(this.Object)) {
54
+ throw new errors.InvalidObjectNameError(`Invalid Source object name: ${this.Object}`);
55
+ }
56
+ if (this.MatchRange && this.Start !== -1 && this.End !== -1 && this.Start > this.End || this.Start < 0) {
57
+ throw new errors.InvalidObjectNameError('Source start must be non-negative, and start must be at most end.');
58
+ } else if (this.MatchRange && !(0, _helper.isNumber)(this.Start) || !(0, _helper.isNumber)(this.End)) {
59
+ throw new errors.InvalidObjectNameError('MatchRange is specified. But Invalid Start and End values are specified.');
60
+ }
61
+ return true;
62
+ }
63
+ getHeaders() {
64
+ const headerOptions = {};
65
+ headerOptions['x-amz-copy-source'] = encodeURI(this.Bucket + '/' + this.Object);
66
+ if (!(0, _helper.isEmpty)(this.VersionID)) {
67
+ headerOptions['x-amz-copy-source'] = `${encodeURI(this.Bucket + '/' + this.Object)}?versionId=${this.VersionID}`;
68
+ }
69
+ if (!(0, _helper.isEmpty)(this.MatchETag)) {
70
+ headerOptions['x-amz-copy-source-if-match'] = this.MatchETag;
71
+ }
72
+ if (!(0, _helper.isEmpty)(this.NoMatchETag)) {
73
+ headerOptions['x-amz-copy-source-if-none-match'] = this.NoMatchETag;
74
+ }
75
+ if (!(0, _helper.isEmpty)(this.MatchModifiedSince)) {
76
+ headerOptions['x-amz-copy-source-if-modified-since'] = this.MatchModifiedSince;
77
+ }
78
+ if (!(0, _helper.isEmpty)(this.MatchUnmodifiedSince)) {
79
+ headerOptions['x-amz-copy-source-if-unmodified-since'] = this.MatchUnmodifiedSince;
80
+ }
81
+ return headerOptions;
82
+ }
83
+ }
84
+
85
+ /**
86
+ * @deprecated use nodejs fs module
87
+ */
88
+ exports.CopySourceOptions = CopySourceOptions;
89
+ function removeDirAndFiles(dirPath, removeSelf = true) {
90
+ if (removeSelf) {
91
+ return fs.rmSync(dirPath, {
92
+ recursive: true,
93
+ force: true
94
+ });
95
+ }
96
+ fs.readdirSync(dirPath).forEach(item => {
97
+ fs.rmSync(path.join(dirPath, item), {
98
+ recursive: true,
99
+ force: true
100
+ });
101
+ });
102
+ }
103
+ class CopyDestinationOptions {
104
+ constructor({
105
+ Bucket,
106
+ Object,
107
+ Encryption,
108
+ UserMetadata,
109
+ UserTags,
110
+ LegalHold,
111
+ RetainUntilDate,
112
+ Mode,
113
+ MetadataDirective,
114
+ Headers
115
+ }) {
116
+ this.Bucket = Bucket;
117
+ this.Object = Object;
118
+ this.Encryption = Encryption ?? undefined; // null input will become undefined, easy for runtime assert
119
+ this.UserMetadata = UserMetadata;
120
+ this.UserTags = UserTags;
121
+ this.LegalHold = LegalHold;
122
+ this.Mode = Mode; // retention mode
123
+ this.RetainUntilDate = RetainUntilDate;
124
+ this.MetadataDirective = MetadataDirective;
125
+ this.Headers = Headers;
126
+ }
127
+ getHeaders() {
128
+ const replaceDirective = 'REPLACE';
129
+ const headerOptions = {};
130
+ const userTags = this.UserTags;
131
+ if (!(0, _helper.isEmpty)(userTags)) {
132
+ headerOptions['X-Amz-Tagging-Directive'] = replaceDirective;
133
+ headerOptions['X-Amz-Tagging'] = (0, _helper.isObject)(userTags) ? querystring.stringify(userTags) : (0, _helper.isString)(userTags) ? userTags : '';
134
+ }
135
+ if (this.Mode) {
136
+ headerOptions['X-Amz-Object-Lock-Mode'] = this.Mode; // GOVERNANCE or COMPLIANCE
137
+ }
138
+
139
+ if (this.RetainUntilDate) {
140
+ headerOptions['X-Amz-Object-Lock-Retain-Until-Date'] = this.RetainUntilDate; // needs to be UTC.
141
+ }
142
+
143
+ if (this.LegalHold) {
144
+ headerOptions['X-Amz-Object-Lock-Legal-Hold'] = this.LegalHold; // ON or OFF
145
+ }
146
+
147
+ if (this.UserMetadata) {
148
+ for (const [key, value] of Object.entries(this.UserMetadata)) {
149
+ headerOptions[`X-Amz-Meta-${key}`] = value.toString();
150
+ }
151
+ }
152
+ if (this.MetadataDirective) {
153
+ headerOptions[`X-Amz-Metadata-Directive`] = this.MetadataDirective;
154
+ }
155
+ if (this.Encryption) {
156
+ const encryptionHeaders = (0, _helper.getEncryptionHeaders)(this.Encryption);
157
+ for (const [key, value] of Object.entries(encryptionHeaders)) {
158
+ headerOptions[key] = value;
159
+ }
160
+ }
161
+ if (this.Headers) {
162
+ for (const [key, value] of Object.entries(this.Headers)) {
163
+ headerOptions[key] = value;
164
+ }
165
+ }
166
+ return headerOptions;
167
+ }
168
+ validate() {
169
+ if (!(0, _helper.isValidBucketName)(this.Bucket)) {
170
+ throw new errors.InvalidBucketNameError('Invalid Destination bucket name: ' + this.Bucket);
171
+ }
172
+ if (!(0, _helper.isValidObjectName)(this.Object)) {
173
+ throw new errors.InvalidObjectNameError(`Invalid Destination object name: ${this.Object}`);
174
+ }
175
+ if (!(0, _helper.isEmpty)(this.UserMetadata) && !(0, _helper.isObject)(this.UserMetadata)) {
176
+ throw new errors.InvalidObjectNameError(`Destination UserMetadata should be an object with key value pairs`);
177
+ }
178
+ if (!(0, _helper.isEmpty)(this.Mode) && ![_type.RETENTION_MODES.GOVERNANCE, _type.RETENTION_MODES.COMPLIANCE].includes(this.Mode)) {
179
+ throw new errors.InvalidObjectNameError(`Invalid Mode specified for destination object it should be one of [GOVERNANCE,COMPLIANCE]`);
180
+ }
181
+ if (this.Encryption !== undefined && (0, _helper.isEmptyObject)(this.Encryption)) {
182
+ throw new errors.InvalidObjectNameError(`Invalid Encryption configuration for destination object `);
183
+ }
184
+ return true;
185
+ }
186
+ }
187
+
188
+ /**
189
+ * maybe this should be a generic type for Records, leave it for later refactor
190
+ */
191
+ exports.CopyDestinationOptions = CopyDestinationOptions;
192
+ class SelectResults {
193
+ constructor({
194
+ records,
195
+ // parsed data as stream
196
+ response,
197
+ // original response stream
198
+ stats,
199
+ // stats as xml
200
+ progress // stats as xml
201
+ }) {
202
+ this.records = records;
203
+ this.response = response;
204
+ this.stats = stats;
205
+ this.progress = progress;
206
+ }
207
+ setStats(stats) {
208
+ this.stats = stats;
209
+ }
210
+ getStats() {
211
+ return this.stats;
212
+ }
213
+ setProgress(progress) {
214
+ this.progress = progress;
215
+ }
216
+ getProgress() {
217
+ return this.progress;
218
+ }
219
+ setResponse(response) {
220
+ this.response = response;
221
+ }
222
+ getResponse() {
223
+ return this.response;
224
+ }
225
+ setRecords(records) {
226
+ this.records = records;
227
+ }
228
+ getRecords() {
229
+ return this.records;
230
+ }
231
+ }
232
+ exports.SelectResults = SelectResults;
233
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsInBhdGgiLCJxdWVyeXN0cmluZyIsImVycm9ycyIsIl9oZWxwZXIiLCJfdHlwZSIsImV4cG9ydHMiLCJSRVRFTlRJT05fTU9ERVMiLCJFTkNSWVBUSU9OX1RZUEVTIiwiTEVHQUxfSE9MRF9TVEFUVVMiLCJSRVRFTlRJT05fVkFMSURJVFlfVU5JVFMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiREVGQVVMVF9SRUdJT04iLCJQUkVTSUdOX0VYUElSWV9EQVlTX01BWCIsIkNvcHlTb3VyY2VPcHRpb25zIiwiY29uc3RydWN0b3IiLCJCdWNrZXQiLCJWZXJzaW9uSUQiLCJNYXRjaEVUYWciLCJOb01hdGNoRVRhZyIsIk1hdGNoTW9kaWZpZWRTaW5jZSIsIk1hdGNoVW5tb2RpZmllZFNpbmNlIiwiTWF0Y2hSYW5nZSIsIlN0YXJ0IiwiRW5kIiwiRW5jcnlwdGlvbiIsInVuZGVmaW5lZCIsInZhbGlkYXRlIiwiaXNWYWxpZEJ1Y2tldE5hbWUiLCJJbnZhbGlkQnVja2V0TmFtZUVycm9yIiwiaXNWYWxpZE9iamVjdE5hbWUiLCJJbnZhbGlkT2JqZWN0TmFtZUVycm9yIiwiaXNOdW1iZXIiLCJnZXRIZWFkZXJzIiwiaGVhZGVyT3B0aW9ucyIsImVuY29kZVVSSSIsImlzRW1wdHkiLCJyZW1vdmVEaXJBbmRGaWxlcyIsImRpclBhdGgiLCJyZW1vdmVTZWxmIiwicm1TeW5jIiwicmVjdXJzaXZlIiwiZm9yY2UiLCJyZWFkZGlyU3luYyIsImZvckVhY2giLCJpdGVtIiwiam9pbiIsIkNvcHlEZXN0aW5hdGlvbk9wdGlvbnMiLCJVc2VyTWV0YWRhdGEiLCJVc2VyVGFncyIsIkxlZ2FsSG9sZCIsIlJldGFpblVudGlsRGF0ZSIsIk1vZGUiLCJNZXRhZGF0YURpcmVjdGl2ZSIsIkhlYWRlcnMiLCJyZXBsYWNlRGlyZWN0aXZlIiwidXNlclRhZ3MiLCJpc09iamVjdCIsInN0cmluZ2lmeSIsImlzU3RyaW5nIiwidmFsdWUiLCJlbnRyaWVzIiwidG9TdHJpbmciLCJlbmNyeXB0aW9uSGVhZGVycyIsImdldEVuY3J5cHRpb25IZWFkZXJzIiwiR09WRVJOQU5DRSIsIkNPTVBMSUFOQ0UiLCJpbmNsdWRlcyIsImlzRW1wdHlPYmplY3QiLCJTZWxlY3RSZXN1bHRzIiwicmVjb3JkcyIsInJlc3BvbnNlIiwic3RhdHMiLCJwcm9ncmVzcyIsInNldFN0YXRzIiwiZ2V0U3RhdHMiLCJzZXRQcm9ncmVzcyIsImdldFByb2dyZXNzIiwic2V0UmVzcG9uc2UiLCJnZXRSZXNwb25zZSIsInNldFJlY29yZHMiLCJnZXRSZWNvcmRzIl0sInNvdXJjZXMiOlsiaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnXG5cbmltcG9ydCAqIGFzIHF1ZXJ5c3RyaW5nIGZyb20gJ3F1ZXJ5LXN0cmluZydcblxuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gJy4vZXJyb3JzLnRzJ1xuaW1wb3J0IHtcbiAgZ2V0RW5jcnlwdGlvbkhlYWRlcnMsXG4gIGlzRW1wdHksXG4gIGlzRW1wdHlPYmplY3QsXG4gIGlzTnVtYmVyLFxuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzVmFsaWRCdWNrZXROYW1lLFxuICBpc1ZhbGlkT2JqZWN0TmFtZSxcbn0gZnJvbSAnLi9pbnRlcm5hbC9oZWxwZXIudHMnXG5pbXBvcnQgdHlwZSB7IEVuY3J5cHRpb24sIE9iamVjdE1ldGFEYXRhLCBSZXF1ZXN0SGVhZGVycyB9IGZyb20gJy4vaW50ZXJuYWwvdHlwZS50cydcbmltcG9ydCB7IFJFVEVOVElPTl9NT0RFUyB9IGZyb20gJy4vaW50ZXJuYWwvdHlwZS50cydcblxuZXhwb3J0IHsgRU5DUllQVElPTl9UWVBFUywgTEVHQUxfSE9MRF9TVEFUVVMsIFJFVEVOVElPTl9NT0RFUywgUkVURU5USU9OX1ZBTElESVRZX1VOSVRTIH0gZnJvbSAnLi9pbnRlcm5hbC90eXBlLnRzJ1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUdJT04gPSAndXMtZWFzdC0xJ1xuXG5leHBvcnQgY29uc3QgUFJFU0lHTl9FWFBJUllfREFZU19NQVggPSAyNCAqIDYwICogNjAgKiA3IC8vIDcgZGF5cyBpbiBzZWNvbmRzXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvcHlTb3VyY2VPcHRpb25zIHtcbiAgQnVja2V0OiBzdHJpbmdcbiAgT2JqZWN0OiBzdHJpbmdcbiAgLyoqXG4gICAqIFZhbGlkIHZlcnNpb25JZFxuICAgKi9cbiAgVmVyc2lvbklEPzogc3RyaW5nXG4gIC8qKlxuICAgKiBFdGFnIHRvIG1hdGNoXG4gICAqL1xuICBNYXRjaEVUYWc/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEV0YWcgdG8gZXhjbHVkZVxuICAgKi9cbiAgTm9NYXRjaEVUYWc/OiBzdHJpbmdcbiAgLyoqXG4gICAqIE1vZGlmaWVkIERhdGUgb2YgdGhlIG9iamVjdC9wYXJ0LiAgVVRDIERhdGUgaW4gc3RyaW5nIGZvcm1hdFxuICAgKi9cbiAgTWF0Y2hNb2RpZmllZFNpbmNlPzogc3RyaW5nIHwgbnVsbFxuICAvKipcbiAgICogTW9kaWZpZWQgRGF0ZSBvZiB0aGUgb2JqZWN0L3BhcnQgdG8gZXhjbHVkZSBVVEMgRGF0ZSBpbiBzdHJpbmcgZm9ybWF0XG4gICAqL1xuICBNYXRjaFVubW9kaWZpZWRTaW5jZT86IHN0cmluZyB8IG51bGxcbiAgLyoqXG4gICAqIHRydWUgb3IgZmFsc2UgT2JqZWN0IHJhbmdlIHRvIG1hdGNoXG4gICAqL1xuICBNYXRjaFJhbmdlPzogYm9vbGVhblxuICBTdGFydD86IG51bWJlclxuICBFbmQ/OiBudW1iZXJcbiAgRW5jcnlwdGlvbj86IEVuY3J5cHRpb25cbn1cblxuZXhwb3J0IGNsYXNzIENvcHlTb3VyY2VPcHRpb25zIHtcbiAgcHVibGljIHJlYWRvbmx5IEJ1Y2tldDogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBPYmplY3Q6IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgVmVyc2lvbklEOiBzdHJpbmdcbiAgcHVibGljIE1hdGNoRVRhZzogc3RyaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgTm9NYXRjaEVUYWc6IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IE1hdGNoTW9kaWZpZWRTaW5jZTogc3RyaW5nIHwgbnVsbFxuICBwcml2YXRlIHJlYWRvbmx5IE1hdGNoVW5tb2RpZmllZFNpbmNlOiBzdHJpbmcgfCBudWxsXG4gIHB1YmxpYyByZWFkb25seSBNYXRjaFJhbmdlOiBib29sZWFuXG4gIHB1YmxpYyByZWFkb25seSBTdGFydDogbnVtYmVyXG4gIHB1YmxpYyByZWFkb25seSBFbmQ6IG51bWJlclxuICBwcml2YXRlIHJlYWRvbmx5IEVuY3J5cHRpb24/OiBFbmNyeXB0aW9uXG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIEJ1Y2tldCxcbiAgICBPYmplY3QsXG4gICAgVmVyc2lvbklEID0gJycsXG4gICAgTWF0Y2hFVGFnID0gJycsXG4gICAgTm9NYXRjaEVUYWcgPSAnJyxcbiAgICBNYXRjaE1vZGlmaWVkU2luY2UgPSBudWxsLFxuICAgIE1hdGNoVW5tb2RpZmllZFNpbmNlID0gbnVsbCxcbiAgICBNYXRjaFJhbmdlID0gZmFsc2UsXG4gICAgU3RhcnQgPSAwLFxuICAgIEVuZCA9IDAsXG4gICAgRW5jcnlwdGlvbiA9IHVuZGVmaW5lZCxcbiAgfTogSUNvcHlTb3VyY2VPcHRpb25zKSB7XG4gICAgdGhpcy5CdWNrZXQgPSBCdWNrZXRcbiAgICB0aGlzLk9iamVjdCA9IE9iamVjdFxuICAgIHRoaXMuVmVyc2lvbklEID0gVmVyc2lvbklEXG4gICAgdGhpcy5NYXRjaEVUYWcgPSBNYXRjaEVUYWdcbiAgICB0aGlzLk5vTWF0Y2hFVGFnID0gTm9NYXRjaEVUYWdcbiAgICB0aGlzLk1hdGNoTW9kaWZpZWRTaW5jZSA9IE1hdGNoTW9kaWZpZWRTaW5jZVxuICAgIHRoaXMuTWF0Y2hVbm1vZGlmaWVkU2luY2UgPSBNYXRjaFVubW9kaWZpZWRTaW5jZVxuICAgIHRoaXMuTWF0Y2hSYW5nZSA9IE1hdGNoUmFuZ2VcbiAgICB0aGlzLlN0YXJ0ID0gU3RhcnRcbiAgICB0aGlzLkVuZCA9IEVuZFxuICAgIHRoaXMuRW5jcnlwdGlvbiA9IEVuY3J5cHRpb25cbiAgfVxuXG4gIHZhbGlkYXRlKCkge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUodGhpcy5CdWNrZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgU291cmNlIGJ1Y2tldCBuYW1lOiAnICsgdGhpcy5CdWNrZXQpXG4gICAgfVxuICAgIGlmICghaXNWYWxpZE9iamVjdE5hbWUodGhpcy5PYmplY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgU291cmNlIG9iamVjdCBuYW1lOiAke3RoaXMuT2JqZWN0fWApXG4gICAgfVxuICAgIGlmICgodGhpcy5NYXRjaFJhbmdlICYmIHRoaXMuU3RhcnQgIT09IC0xICYmIHRoaXMuRW5kICE9PSAtMSAmJiB0aGlzLlN0YXJ0ID4gdGhpcy5FbmQpIHx8IHRoaXMuU3RhcnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoJ1NvdXJjZSBzdGFydCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgYW5kIHN0YXJ0IG11c3QgYmUgYXQgbW9zdCBlbmQuJylcbiAgICB9IGVsc2UgaWYgKCh0aGlzLk1hdGNoUmFuZ2UgJiYgIWlzTnVtYmVyKHRoaXMuU3RhcnQpKSB8fCAhaXNOdW1iZXIodGhpcy5FbmQpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoXG4gICAgICAgICdNYXRjaFJhbmdlIGlzIHNwZWNpZmllZC4gQnV0IEludmFsaWQgU3RhcnQgYW5kIEVuZCB2YWx1ZXMgYXJlIHNwZWNpZmllZC4nLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBnZXRIZWFkZXJzKCk6IFJlcXVlc3RIZWFkZXJzIHtcbiAgICBjb25zdCBoZWFkZXJPcHRpb25zOiBSZXF1ZXN0SGVhZGVycyA9IHt9XG4gICAgaGVhZGVyT3B0aW9uc1sneC1hbXotY29weS1zb3VyY2UnXSA9IGVuY29kZVVSSSh0aGlzLkJ1Y2tldCArICcvJyArIHRoaXMuT2JqZWN0KVxuXG4gICAgaWYgKCFpc0VtcHR5KHRoaXMuVmVyc2lvbklEKSkge1xuICAgICAgaGVhZGVyT3B0aW9uc1sneC1hbXotY29weS1zb3VyY2UnXSA9IGAke2VuY29kZVVSSSh0aGlzLkJ1Y2tldCArICcvJyArIHRoaXMuT2JqZWN0KX0/dmVyc2lvbklkPSR7dGhpcy5WZXJzaW9uSUR9YFxuICAgIH1cblxuICAgIGlmICghaXNFbXB0eSh0aGlzLk1hdGNoRVRhZykpIHtcbiAgICAgIGhlYWRlck9wdGlvbnNbJ3gtYW16LWNvcHktc291cmNlLWlmLW1hdGNoJ10gPSB0aGlzLk1hdGNoRVRhZ1xuICAgIH1cbiAgICBpZiAoIWlzRW1wdHkodGhpcy5Ob01hdGNoRVRhZykpIHtcbiAgICAgIGhlYWRlck9wdGlvbnNbJ3gtYW16LWNvcHktc291cmNlLWlmLW5vbmUtbWF0Y2gnXSA9IHRoaXMuTm9NYXRjaEVUYWdcbiAgICB9XG5cbiAgICBpZiAoIWlzRW1wdHkodGhpcy5NYXRjaE1vZGlmaWVkU2luY2UpKSB7XG4gICAgICBoZWFkZXJPcHRpb25zWyd4LWFtei1jb3B5LXNvdXJjZS1pZi1tb2RpZmllZC1zaW5jZSddID0gdGhpcy5NYXRjaE1vZGlmaWVkU2luY2VcbiAgICB9XG4gICAgaWYgKCFpc0VtcHR5KHRoaXMuTWF0Y2hVbm1vZGlmaWVkU2luY2UpKSB7XG4gICAgICBoZWFkZXJPcHRpb25zWyd4LWFtei1jb3B5LXNvdXJjZS1pZi11bm1vZGlmaWVkLXNpbmNlJ10gPSB0aGlzLk1hdGNoVW5tb2RpZmllZFNpbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlck9wdGlvbnNcbiAgfVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBub2RlanMgZnMgbW9kdWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEaXJBbmRGaWxlcyhkaXJQYXRoOiBzdHJpbmcsIHJlbW92ZVNlbGYgPSB0cnVlKSB7XG4gIGlmIChyZW1vdmVTZWxmKSB7XG4gICAgcmV0dXJuIGZzLnJtU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgfVxuXG4gIGZzLnJlYWRkaXJTeW5jKGRpclBhdGgpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBmcy5ybVN5bmMocGF0aC5qb2luKGRpclBhdGgsIGl0ZW0pLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgfSlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29weURlc3RpbmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBCdWNrZXQgbmFtZVxuICAgKi9cbiAgQnVja2V0OiBzdHJpbmdcbiAgLyoqXG4gICAqIE9iamVjdCBOYW1lIGZvciB0aGUgZGVzdGluYXRpb24gKGNvbXBvc2VkL2NvcGllZCkgb2JqZWN0IGRlZmF1bHRzXG4gICAqL1xuICBPYmplY3Q6IHN0cmluZ1xuICAvKipcbiAgICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGRlZmF1bHRzIHRvIHt9XG4gICAqIEBkZWZhdWx0IHt9XG4gICAqL1xuICBFbmNyeXB0aW9uPzogRW5jcnlwdGlvblxuICBVc2VyTWV0YWRhdGE/OiBPYmplY3RNZXRhRGF0YVxuICAvKipcbiAgICogcXVlcnktc3RyaW5nIGVuY29kZWQgc3RyaW5nIG9yIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gT2JqZWN0XG4gICAqL1xuICBVc2VyVGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdcbiAgTGVnYWxIb2xkPzogJ29uJyB8ICdvZmYnXG4gIC8qKlxuICAgKiBVVEMgRGF0ZSBTdHJpbmdcbiAgICovXG4gIFJldGFpblVudGlsRGF0ZT86IHN0cmluZ1xuICBNb2RlPzogUkVURU5USU9OX01PREVTXG4gIE1ldGFkYXRhRGlyZWN0aXZlPzogJ0NPUFknIHwgJ1JFUExBQ0UnXG4gIC8qKlxuICAgKiBFeHRyYSBoZWFkZXJzIGZvciB0aGUgdGFyZ2V0IG9iamVjdFxuICAgKi9cbiAgSGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuZXhwb3J0IGNsYXNzIENvcHlEZXN0aW5hdGlvbk9wdGlvbnMge1xuICBwdWJsaWMgcmVhZG9ubHkgQnVja2V0OiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IE9iamVjdDogc3RyaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgRW5jcnlwdGlvbj86IEVuY3J5cHRpb25cbiAgcHJpdmF0ZSByZWFkb25seSBVc2VyTWV0YWRhdGE/OiBPYmplY3RNZXRhRGF0YVxuICBwcml2YXRlIHJlYWRvbmx5IFVzZXJUYWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IExlZ2FsSG9sZD86ICdvbicgfCAnb2ZmJ1xuICBwcml2YXRlIHJlYWRvbmx5IFJldGFpblVudGlsRGF0ZT86IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IE1vZGU/OiBSRVRFTlRJT05fTU9ERVNcbiAgcHJpdmF0ZSByZWFkb25seSBNZXRhZGF0YURpcmVjdGl2ZT86IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IEhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIEJ1Y2tldCxcbiAgICBPYmplY3QsXG4gICAgRW5jcnlwdGlvbixcbiAgICBVc2VyTWV0YWRhdGEsXG4gICAgVXNlclRhZ3MsXG4gICAgTGVnYWxIb2xkLFxuICAgIFJldGFpblVudGlsRGF0ZSxcbiAgICBNb2RlLFxuICAgIE1ldGFkYXRhRGlyZWN0aXZlLFxuICAgIEhlYWRlcnMsXG4gIH06IElDb3B5RGVzdGluYXRpb25PcHRpb25zKSB7XG4gICAgdGhpcy5CdWNrZXQgPSBCdWNrZXRcbiAgICB0aGlzLk9iamVjdCA9IE9iamVjdFxuICAgIHRoaXMuRW5jcnlwdGlvbiA9IEVuY3J5cHRpb24gPz8gdW5kZWZpbmVkIC8vIG51bGwgaW5wdXQgd2lsbCBiZWNvbWUgdW5kZWZpbmVkLCBlYXN5IGZvciBydW50aW1lIGFzc2VydFxuICAgIHRoaXMuVXNlck1ldGFkYXRhID0gVXNlck1ldGFkYXRhXG4gICAgdGhpcy5Vc2VyVGFncyA9IFVzZXJUYWdzXG4gICAgdGhpcy5MZWdhbEhvbGQgPSBMZWdhbEhvbGRcbiAgICB0aGlzLk1vZGUgPSBNb2RlIC8vIHJldGVudGlvbiBtb2RlXG4gICAgdGhpcy5SZXRhaW5VbnRpbERhdGUgPSBSZXRhaW5VbnRpbERhdGVcbiAgICB0aGlzLk1ldGFkYXRhRGlyZWN0aXZlID0gTWV0YWRhdGFEaXJlY3RpdmVcbiAgICB0aGlzLkhlYWRlcnMgPSBIZWFkZXJzXG4gIH1cblxuICBnZXRIZWFkZXJzKCk6IFJlcXVlc3RIZWFkZXJzIHtcbiAgICBjb25zdCByZXBsYWNlRGlyZWN0aXZlID0gJ1JFUExBQ0UnXG4gICAgY29uc3QgaGVhZGVyT3B0aW9uczogUmVxdWVzdEhlYWRlcnMgPSB7fVxuXG4gICAgY29uc3QgdXNlclRhZ3MgPSB0aGlzLlVzZXJUYWdzXG4gICAgaWYgKCFpc0VtcHR5KHVzZXJUYWdzKSkge1xuICAgICAgaGVhZGVyT3B0aW9uc1snWC1BbXotVGFnZ2luZy1EaXJlY3RpdmUnXSA9IHJlcGxhY2VEaXJlY3RpdmVcbiAgICAgIGhlYWRlck9wdGlvbnNbJ1gtQW16LVRhZ2dpbmcnXSA9IGlzT2JqZWN0KHVzZXJUYWdzKVxuICAgICAgICA/IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh1c2VyVGFncylcbiAgICAgICAgOiBpc1N0cmluZyh1c2VyVGFncylcbiAgICAgICAgPyB1c2VyVGFnc1xuICAgICAgICA6ICcnXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuTW9kZSkge1xuICAgICAgaGVhZGVyT3B0aW9uc1snWC1BbXotT2JqZWN0LUxvY2stTW9kZSddID0gdGhpcy5Nb2RlIC8vIEdPVkVSTkFOQ0Ugb3IgQ09NUExJQU5DRVxuICAgIH1cblxuICAgIGlmICh0aGlzLlJldGFpblVudGlsRGF0ZSkge1xuICAgICAgaGVhZGVyT3B0aW9uc1snWC1BbXotT2JqZWN0LUxvY2stUmV0YWluLVVudGlsLURhdGUnXSA9IHRoaXMuUmV0YWluVW50aWxEYXRlIC8vIG5lZWRzIHRvIGJlIFVUQy5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5MZWdhbEhvbGQpIHtcbiAgICAgIGhlYWRlck9wdGlvbnNbJ1gtQW16LU9iamVjdC1Mb2NrLUxlZ2FsLUhvbGQnXSA9IHRoaXMuTGVnYWxIb2xkIC8vIE9OIG9yIE9GRlxuICAgIH1cblxuICAgIGlmICh0aGlzLlVzZXJNZXRhZGF0YSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5Vc2VyTWV0YWRhdGEpKSB7XG4gICAgICAgIGhlYWRlck9wdGlvbnNbYFgtQW16LU1ldGEtJHtrZXl9YF0gPSB2YWx1ZS50b1N0cmluZygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuTWV0YWRhdGFEaXJlY3RpdmUpIHtcbiAgICAgIGhlYWRlck9wdGlvbnNbYFgtQW16LU1ldGFkYXRhLURpcmVjdGl2ZWBdID0gdGhpcy5NZXRhZGF0YURpcmVjdGl2ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLkVuY3J5cHRpb24pIHtcbiAgICAgIGNvbnN0IGVuY3J5cHRpb25IZWFkZXJzID0gZ2V0RW5jcnlwdGlvbkhlYWRlcnModGhpcy5FbmNyeXB0aW9uKVxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW5jcnlwdGlvbkhlYWRlcnMpKSB7XG4gICAgICAgIGhlYWRlck9wdGlvbnNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLkhlYWRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuSGVhZGVycykpIHtcbiAgICAgICAgaGVhZGVyT3B0aW9uc1trZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyT3B0aW9uc1xuICB9XG5cbiAgdmFsaWRhdGUoKSB7XG4gICAgaWYgKCFpc1ZhbGlkQnVja2V0TmFtZSh0aGlzLkJ1Y2tldCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEJ1Y2tldE5hbWVFcnJvcignSW52YWxpZCBEZXN0aW5hdGlvbiBidWNrZXQgbmFtZTogJyArIHRoaXMuQnVja2V0KVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKHRoaXMuT2JqZWN0KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIERlc3RpbmF0aW9uIG9iamVjdCBuYW1lOiAke3RoaXMuT2JqZWN0fWApXG4gICAgfVxuICAgIGlmICghaXNFbXB0eSh0aGlzLlVzZXJNZXRhZGF0YSkgJiYgIWlzT2JqZWN0KHRoaXMuVXNlck1ldGFkYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBEZXN0aW5hdGlvbiBVc2VyTWV0YWRhdGEgc2hvdWxkIGJlIGFuIG9iamVjdCB3aXRoIGtleSB2YWx1ZSBwYWlyc2ApXG4gICAgfVxuXG4gICAgaWYgKCFpc0VtcHR5KHRoaXMuTW9kZSkgJiYgIVtSRVRFTlRJT05fTU9ERVMuR09WRVJOQU5DRSwgUkVURU5USU9OX01PREVTLkNPTVBMSUFOQ0VdLmluY2x1ZGVzKHRoaXMuTW9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihcbiAgICAgICAgYEludmFsaWQgTW9kZSBzcGVjaWZpZWQgZm9yIGRlc3RpbmF0aW9uIG9iamVjdCBpdCBzaG91bGQgYmUgb25lIG9mIFtHT1ZFUk5BTkNFLENPTVBMSUFOQ0VdYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5FbmNyeXB0aW9uICE9PSB1bmRlZmluZWQgJiYgaXNFbXB0eU9iamVjdCh0aGlzLkVuY3J5cHRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoYEludmFsaWQgRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBkZXN0aW5hdGlvbiBvYmplY3QgYClcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG4vKipcbiAqIG1heWJlIHRoaXMgc2hvdWxkIGJlIGEgZ2VuZXJpYyB0eXBlIGZvciBSZWNvcmRzLCBsZWF2ZSBpdCBmb3IgbGF0ZXIgcmVmYWN0b3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdFJlc3VsdHMge1xuICBwcml2YXRlIHJlY29yZHM/OiB1bmtub3duXG4gIHByaXZhdGUgcmVzcG9uc2U/OiB1bmtub3duXG4gIHByaXZhdGUgc3RhdHM/OiBzdHJpbmdcbiAgcHJpdmF0ZSBwcm9ncmVzcz86IHVua25vd25cblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgcmVjb3JkcywgLy8gcGFyc2VkIGRhdGEgYXMgc3RyZWFtXG4gICAgcmVzcG9uc2UsIC8vIG9yaWdpbmFsIHJlc3BvbnNlIHN0cmVhbVxuICAgIHN0YXRzLCAvLyBzdGF0cyBhcyB4bWxcbiAgICBwcm9ncmVzcywgLy8gc3RhdHMgYXMgeG1sXG4gIH06IHtcbiAgICByZWNvcmRzPzogdW5rbm93blxuICAgIHJlc3BvbnNlPzogdW5rbm93blxuICAgIHN0YXRzPzogc3RyaW5nXG4gICAgcHJvZ3Jlc3M/OiB1bmtub3duXG4gIH0pIHtcbiAgICB0aGlzLnJlY29yZHMgPSByZWNvcmRzXG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gICAgdGhpcy5zdGF0cyA9IHN0YXRzXG4gICAgdGhpcy5wcm9ncmVzcyA9IHByb2dyZXNzXG4gIH1cblxuICBzZXRTdGF0cyhzdGF0czogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGF0cyA9IHN0YXRzXG4gIH1cblxuICBnZXRTdGF0cygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0c1xuICB9XG5cbiAgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3M6IHVua25vd24pIHtcbiAgICB0aGlzLnByb2dyZXNzID0gcHJvZ3Jlc3NcbiAgfVxuXG4gIGdldFByb2dyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnByb2dyZXNzXG4gIH1cblxuICBzZXRSZXNwb25zZShyZXNwb25zZTogdW5rbm93bikge1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZVxuICB9XG5cbiAgZ2V0UmVzcG9uc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2VcbiAgfVxuXG4gIHNldFJlY29yZHMocmVjb3JkczogdW5rbm93bikge1xuICAgIHRoaXMucmVjb3JkcyA9IHJlY29yZHNcbiAgfVxuXG4gIGdldFJlY29yZHMoKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3Jkc1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLEVBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLElBQUEsR0FBQUYsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLFdBQUEsR0FBQUgsdUJBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLE1BQUEsR0FBQUosdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQVdBLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUFvRE0sT0FBQSxDQUFBQyxlQUFBLEdBQUFGLEtBQUEsQ0FBQUUsZUFBQTtBQUFBRCxPQUFBLENBQUFFLGdCQUFBLEdBQUFILEtBQUEsQ0FBQUcsZ0JBQUE7QUFBQUYsT0FBQSxDQUFBRyxpQkFBQSxHQUFBSixLQUFBLENBQUFJLGlCQUFBO0FBQUFILE9BQUEsQ0FBQUksd0JBQUEsR0FBQUwsS0FBQSxDQUFBSyx3QkFBQTtBQUFBLFNBQUFDLHlCQUFBQyxXQUFBLGVBQUFDLE9BQUEsa0NBQUFDLGlCQUFBLE9BQUFELE9BQUEsUUFBQUUsZ0JBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxXQUFBLFdBQUFBLFdBQUEsR0FBQUcsZ0JBQUEsR0FBQUQsaUJBQUEsS0FBQUYsV0FBQTtBQUFBLFNBQUFiLHdCQUFBaUIsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFBLHdCQUFBQSxHQUFBLDRCQUFBRSxPQUFBLEVBQUFGLEdBQUEsVUFBQUcsS0FBQSxHQUFBUix3QkFBQSxDQUFBQyxXQUFBLE9BQUFPLEtBQUEsSUFBQUEsS0FBQSxDQUFBQyxHQUFBLENBQUFKLEdBQUEsWUFBQUcsS0FBQSxDQUFBRSxHQUFBLENBQUFMLEdBQUEsU0FBQU0sTUFBQSxXQUFBQyxxQkFBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxHQUFBLElBQUFYLEdBQUEsUUFBQVcsR0FBQSxrQkFBQUgsTUFBQSxDQUFBSSxTQUFBLENBQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZCxHQUFBLEVBQUFXLEdBQUEsU0FBQUksSUFBQSxHQUFBUixxQkFBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFWLEdBQUEsRUFBQVcsR0FBQSxjQUFBSSxJQUFBLEtBQUFBLElBQUEsQ0FBQVYsR0FBQSxJQUFBVSxJQUFBLENBQUFDLEdBQUEsS0FBQVIsTUFBQSxDQUFBQyxjQUFBLENBQUFILE1BQUEsRUFBQUssR0FBQSxFQUFBSSxJQUFBLFlBQUFULE1BQUEsQ0FBQUssR0FBQSxJQUFBWCxHQUFBLENBQUFXLEdBQUEsU0FBQUwsTUFBQSxDQUFBSixPQUFBLEdBQUFGLEdBQUEsTUFBQUcsS0FBQSxJQUFBQSxLQUFBLENBQUFhLEdBQUEsQ0FBQWhCLEdBQUEsRUFBQU0sTUFBQSxZQUFBQSxNQUFBO0FBSTdDLE1BQU1XLGNBQWMsR0FBRyxXQUFXO0FBQUEzQixPQUFBLENBQUEyQixjQUFBLEdBQUFBLGNBQUE7QUFFbEMsTUFBTUMsdUJBQXVCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFDO0FBQUE1QixPQUFBLENBQUE0Qix1QkFBQSxHQUFBQSx1QkFBQTtBQWtDakQsTUFBTUMsaUJBQWlCLENBQUM7RUFhN0JDLFdBQVdBLENBQUM7SUFDVkMsTUFBTTtJQUNOYixNQUFNO0lBQ05jLFNBQVMsR0FBRyxFQUFFO0lBQ2RDLFNBQVMsR0FBRyxFQUFFO0lBQ2RDLFdBQVcsR0FBRyxFQUFFO0lBQ2hCQyxrQkFBa0IsR0FBRyxJQUFJO0lBQ3pCQyxvQkFBb0IsR0FBRyxJQUFJO0lBQzNCQyxVQUFVLEdBQUcsS0FBSztJQUNsQkMsS0FBSyxHQUFHLENBQUM7SUFDVEMsR0FBRyxHQUFHLENBQUM7SUFDUEMsVUFBVSxHQUFHQztFQUNLLENBQUMsRUFBRTtJQUNyQixJQUFJLENBQUNWLE1BQU0sR0FBR0EsTUFBTTtJQUNwQixJQUFJLENBQUNiLE1BQU0sR0FBR0EsTUFBTTtJQUNwQixJQUFJLENBQUNjLFNBQVMsR0FBR0EsU0FBUztJQUMxQixJQUFJLENBQUNDLFNBQVMsR0FBR0EsU0FBUztJQUMxQixJQUFJLENBQUNDLFdBQVcsR0FBR0EsV0FBVztJQUM5QixJQUFJLENBQUNDLGtCQUFrQixHQUFHQSxrQkFBa0I7SUFDNUMsSUFBSSxDQUFDQyxvQkFBb0IsR0FBR0Esb0JBQW9CO0lBQ2hELElBQUksQ0FBQ0MsVUFBVSxHQUFHQSxVQUFVO0lBQzVCLElBQUksQ0FBQ0MsS0FBSyxHQUFHQSxLQUFLO0lBQ2xCLElBQUksQ0FBQ0MsR0FBRyxHQUFHQSxHQUFHO0lBQ2QsSUFBSSxDQUFDQyxVQUFVLEdBQUdBLFVBQVU7RUFDOUI7RUFFQUUsUUFBUUEsQ0FBQSxFQUFHO0lBQ1QsSUFBSSxDQUFDLElBQUFDLHlCQUFpQixFQUFDLElBQUksQ0FBQ1osTUFBTSxDQUFDLEVBQUU7TUFDbkMsTUFBTSxJQUFJbEMsTUFBTSxDQUFDK0Msc0JBQXNCLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDYixNQUFNLENBQUM7SUFDdkY7SUFDQSxJQUFJLENBQUMsSUFBQWMseUJBQWlCLEVBQUMsSUFBSSxDQUFDM0IsTUFBTSxDQUFDLEVBQUU7TUFDbkMsTUFBTSxJQUFJckIsTUFBTSxDQUFDaUQsc0JBQXNCLENBQUUsK0JBQThCLElBQUksQ0FBQzVCLE1BQU8sRUFBQyxDQUFDO0lBQ3ZGO0lBQ0EsSUFBSyxJQUFJLENBQUNtQixVQUFVLElBQUksSUFBSSxDQUFDQyxLQUFLLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDQyxHQUFHLElBQUssSUFBSSxDQUFDRCxLQUFLLEdBQUcsQ0FBQyxFQUFFO01BQ3hHLE1BQU0sSUFBSXpDLE1BQU0sQ0FBQ2lELHNCQUFzQixDQUFDLG1FQUFtRSxDQUFDO0lBQzlHLENBQUMsTUFBTSxJQUFLLElBQUksQ0FBQ1QsVUFBVSxJQUFJLENBQUMsSUFBQVUsZ0JBQVEsRUFBQyxJQUFJLENBQUNULEtBQUssQ0FBQyxJQUFLLENBQUMsSUFBQVMsZ0JBQVEsRUFBQyxJQUFJLENBQUNSLEdBQUcsQ0FBQyxFQUFFO01BQzVFLE1BQU0sSUFBSTFDLE1BQU0sQ0FBQ2lELHNCQUFzQixDQUNyQywwRUFDRixDQUFDO0lBQ0g7SUFFQSxPQUFPLElBQUk7RUFDYjtFQUVBRSxVQUFVQSxDQUFBLEVBQW1CO0lBQzNCLE1BQU1DLGFBQTZCLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDQSxhQUFhLENBQUMsbUJBQW1CLENBQUMsR0FBR0MsU0FBUyxDQUFDLElBQUksQ0FBQ25CLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDYixNQUFNLENBQUM7SUFFL0UsSUFBSSxDQUFDLElBQUFpQyxlQUFPLEVBQUMsSUFBSSxDQUFDbkIsU0FBUyxDQUFDLEVBQUU7TUFDNUJpQixhQUFhLENBQUMsbUJBQW1CLENBQUMsR0FBSSxHQUFFQyxTQUFTLENBQUMsSUFBSSxDQUFDbkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUNiLE1BQU0sQ0FBRSxjQUFhLElBQUksQ0FBQ2MsU0FBVSxFQUFDO0lBQ2xIO0lBRUEsSUFBSSxDQUFDLElBQUFtQixlQUFPLEVBQUMsSUFBSSxDQUFDbEIsU0FBUyxDQUFDLEVBQUU7TUFDNUJnQixhQUFhLENBQUMsNEJBQTRCLENBQUMsR0FBRyxJQUFJLENBQUNoQixTQUFTO0lBQzlEO0lBQ0EsSUFBSSxDQUFDLElBQUFrQixlQUFPLEVBQUMsSUFBSSxDQUFDakIsV0FBVyxDQUFDLEVBQUU7TUFDOUJlLGFBQWEsQ0FBQyxpQ0FBaUMsQ0FBQyxHQUFHLElBQUksQ0FBQ2YsV0FBVztJQUNyRTtJQUVBLElBQUksQ0FBQyxJQUFBaUIsZUFBTyxFQUFDLElBQUksQ0FBQ2hCLGtCQUFrQixDQUFDLEVBQUU7TUFDckNjLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQyxHQUFHLElBQUksQ0FBQ2Qsa0JBQWtCO0lBQ2hGO0lBQ0EsSUFBSSxDQUFDLElBQUFnQixlQUFPLEVBQUMsSUFBSSxDQUFDZixvQkFBb0IsQ0FBQyxFQUFFO01BQ3ZDYSxhQUFhLENBQUMsdUNBQXVDLENBQUMsR0FBRyxJQUFJLENBQUNiLG9CQUFvQjtJQUNwRjtJQUVBLE9BQU9hLGFBQWE7RUFDdEI7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFGQWpELE9BQUEsQ0FBQTZCLGlCQUFBLEdBQUFBLGlCQUFBO0FBR08sU0FBU3VCLGlCQUFpQkEsQ0FBQ0MsT0FBZSxFQUFFQyxVQUFVLEdBQUcsSUFBSSxFQUFFO0VBQ3BFLElBQUlBLFVBQVUsRUFBRTtJQUNkLE9BQU85RCxFQUFFLENBQUMrRCxNQUFNLENBQUNGLE9BQU8sRUFBRTtNQUFFRyxTQUFTLEVBQUUsSUFBSTtNQUFFQyxLQUFLLEVBQUU7SUFBSyxDQUFDLENBQUM7RUFDN0Q7RUFFQWpFLEVBQUUsQ0FBQ2tFLFdBQVcsQ0FBQ0wsT0FBTyxDQUFDLENBQUNNLE9BQU8sQ0FBRUMsSUFBSSxJQUFLO0lBQ3hDcEUsRUFBRSxDQUFDK0QsTUFBTSxDQUFDNUQsSUFBSSxDQUFDa0UsSUFBSSxDQUFDUixPQUFPLEVBQUVPLElBQUksQ0FBQyxFQUFFO01BQUVKLFNBQVMsRUFBRSxJQUFJO01BQUVDLEtBQUssRUFBRTtJQUFLLENBQUMsQ0FBQztFQUN2RSxDQUFDLENBQUM7QUFDSjtBQWtDTyxNQUFNSyxzQkFBc0IsQ0FBQztFQVlsQ2hDLFdBQVdBLENBQUM7SUFDVkMsTUFBTTtJQUNOYixNQUFNO0lBQ05zQixVQUFVO0lBQ1Z1QixZQUFZO0lBQ1pDLFFBQVE7SUFDUkMsU0FBUztJQUNUQyxlQUFlO0lBQ2ZDLElBQUk7SUFDSkMsaUJBQWlCO0lBQ2pCQztFQUN1QixDQUFDLEVBQUU7SUFDMUIsSUFBSSxDQUFDdEMsTUFBTSxHQUFHQSxNQUFNO0lBQ3BCLElBQUksQ0FBQ2IsTUFBTSxHQUFHQSxNQUFNO0lBQ3BCLElBQUksQ0FBQ3NCLFVBQVUsR0FBR0EsVUFBVSxJQUFJQyxTQUFTLEVBQUM7SUFDMUMsSUFBSSxDQUFDc0IsWUFBWSxHQUFHQSxZQUFZO0lBQ2hDLElBQUksQ0FBQ0MsUUFBUSxHQUFHQSxRQUFRO0lBQ3hCLElBQUksQ0FBQ0MsU0FBUyxHQUFHQSxTQUFTO0lBQzFCLElBQUksQ0FBQ0UsSUFBSSxHQUFHQSxJQUFJLEVBQUM7SUFDakIsSUFBSSxDQUFDRCxlQUFlLEdBQUdBLGVBQWU7SUFDdEMsSUFBSSxDQUFDRSxpQkFBaUIsR0FBR0EsaUJBQWlCO0lBQzFDLElBQUksQ0FBQ0MsT0FBTyxHQUFHQSxPQUFPO0VBQ3hCO0VBRUFyQixVQUFVQSxDQUFBLEVBQW1CO0lBQzNCLE1BQU1zQixnQkFBZ0IsR0FBRyxTQUFTO0lBQ2xDLE1BQU1yQixhQUE2QixHQUFHLENBQUMsQ0FBQztJQUV4QyxNQUFNc0IsUUFBUSxHQUFHLElBQUksQ0FBQ1AsUUFBUTtJQUM5QixJQUFJLENBQUMsSUFBQWIsZUFBTyxFQUFDb0IsUUFBUSxDQUFDLEVBQUU7TUFDdEJ0QixhQUFhLENBQUMseUJBQXlCLENBQUMsR0FBR3FCLGdCQUFnQjtNQUMzRHJCLGFBQWEsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFBdUIsZ0JBQVEsRUFBQ0QsUUFBUSxDQUFDLEdBQy9DM0UsV0FBVyxDQUFDNkUsU0FBUyxDQUFDRixRQUFRLENBQUMsR0FDL0IsSUFBQUcsZ0JBQVEsRUFBQ0gsUUFBUSxDQUFDLEdBQ2xCQSxRQUFRLEdBQ1IsRUFBRTtJQUNSO0lBRUEsSUFBSSxJQUFJLENBQUNKLElBQUksRUFBRTtNQUNibEIsYUFBYSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsSUFBSSxDQUFDa0IsSUFBSSxFQUFDO0lBQ3REOztJQUVBLElBQUksSUFBSSxDQUFDRCxlQUFlLEVBQUU7TUFDeEJqQixhQUFhLENBQUMscUNBQXFDLENBQUMsR0FBRyxJQUFJLENBQUNpQixlQUFlLEVBQUM7SUFDOUU7O0lBRUEsSUFBSSxJQUFJLENBQUNELFNBQVMsRUFBRTtNQUNsQmhCLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLElBQUksQ0FBQ2dCLFNBQVMsRUFBQztJQUNqRTs7SUFFQSxJQUFJLElBQUksQ0FBQ0YsWUFBWSxFQUFFO01BQ3JCLEtBQUssTUFBTSxDQUFDMUMsR0FBRyxFQUFFc0QsS0FBSyxDQUFDLElBQUl6RCxNQUFNLENBQUMwRCxPQUFPLENBQUMsSUFBSSxDQUFDYixZQUFZLENBQUMsRUFBRTtRQUM1RGQsYUFBYSxDQUFFLGNBQWE1QixHQUFJLEVBQUMsQ0FBQyxHQUFHc0QsS0FBSyxDQUFDRSxRQUFRLENBQUMsQ0FBQztNQUN2RDtJQUNGO0lBRUEsSUFBSSxJQUFJLENBQUNULGlCQUFpQixFQUFFO01BQzFCbkIsYUFBYSxDQUFFLDBCQUF5QixDQUFDLEdBQUcsSUFBSSxDQUFDbUIsaUJBQWlCO0lBQ3BFO0lBRUEsSUFBSSxJQUFJLENBQUM1QixVQUFVLEVBQUU7TUFDbkIsTUFBTXNDLGlCQUFpQixHQUFHLElBQUFDLDRCQUFvQixFQUFDLElBQUksQ0FBQ3ZDLFVBQVUsQ0FBQztNQUMvRCxLQUFLLE1BQU0sQ0FBQ25CLEdBQUcsRUFBRXNELEtBQUssQ0FBQyxJQUFJekQsTUFBTSxDQUFDMEQsT0FBTyxDQUFDRSxpQkFBaUIsQ0FBQyxFQUFFO1FBQzVEN0IsYUFBYSxDQUFDNUIsR0FBRyxDQUFDLEdBQUdzRCxLQUFLO01BQzVCO0lBQ0Y7SUFDQSxJQUFJLElBQUksQ0FBQ04sT0FBTyxFQUFFO01BQ2hCLEtBQUssTUFBTSxDQUFDaEQsR0FBRyxFQUFFc0QsS0FBSyxDQUFDLElBQUl6RCxNQUFNLENBQUMwRCxPQUFPLENBQUMsSUFBSSxDQUFDUCxPQUFPLENBQUMsRUFBRTtRQUN2RHBCLGFBQWEsQ0FBQzVCLEdBQUcsQ0FBQyxHQUFHc0QsS0FBSztNQUM1QjtJQUNGO0lBRUEsT0FBTzFCLGFBQWE7RUFDdEI7RUFFQVAsUUFBUUEsQ0FBQSxFQUFHO0lBQ1QsSUFBSSxDQUFDLElBQUFDLHlCQUFpQixFQUFDLElBQUksQ0FBQ1osTUFBTSxDQUFDLEVBQUU7TUFDbkMsTUFBTSxJQUFJbEMsTUFBTSxDQUFDK0Msc0JBQXNCLENBQUMsbUNBQW1DLEdBQUcsSUFBSSxDQUFDYixNQUFNLENBQUM7SUFDNUY7SUFDQSxJQUFJLENBQUMsSUFBQWMseUJBQWlCLEVBQUMsSUFBSSxDQUFDM0IsTUFBTSxDQUFDLEVBQUU7TUFDbkMsTUFBTSxJQUFJckIsTUFBTSxDQUFDaUQsc0JBQXNCLENBQUUsb0NBQW1DLElBQUksQ0FBQzVCLE1BQU8sRUFBQyxDQUFDO0lBQzVGO0lBQ0EsSUFBSSxDQUFDLElBQUFpQyxlQUFPLEVBQUMsSUFBSSxDQUFDWSxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUFTLGdCQUFRLEVBQUMsSUFBSSxDQUFDVCxZQUFZLENBQUMsRUFBRTtNQUMvRCxNQUFNLElBQUlsRSxNQUFNLENBQUNpRCxzQkFBc0IsQ0FBRSxtRUFBa0UsQ0FBQztJQUM5RztJQUVBLElBQUksQ0FBQyxJQUFBSyxlQUFPLEVBQUMsSUFBSSxDQUFDZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDbEUscUJBQWUsQ0FBQytFLFVBQVUsRUFBRS9FLHFCQUFlLENBQUNnRixVQUFVLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLElBQUksQ0FBQ2YsSUFBSSxDQUFDLEVBQUU7TUFDeEcsTUFBTSxJQUFJdEUsTUFBTSxDQUFDaUQsc0JBQXNCLENBQ3BDLDJGQUNILENBQUM7SUFDSDtJQUVBLElBQUksSUFBSSxDQUFDTixVQUFVLEtBQUtDLFNBQVMsSUFBSSxJQUFBMEMscUJBQWEsRUFBQyxJQUFJLENBQUMzQyxVQUFVLENBQUMsRUFBRTtNQUNuRSxNQUFNLElBQUkzQyxNQUFNLENBQUNpRCxzQkFBc0IsQ0FBRSwwREFBeUQsQ0FBQztJQUNyRztJQUNBLE9BQU8sSUFBSTtFQUNiO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBRkE5QyxPQUFBLENBQUE4RCxzQkFBQSxHQUFBQSxzQkFBQTtBQUdPLE1BQU1zQixhQUFhLENBQUM7RUFNekJ0RCxXQUFXQSxDQUFDO0lBQ1Z1RCxPQUFPO0lBQUU7SUFDVEMsUUFBUTtJQUFFO0lBQ1ZDLEtBQUs7SUFBRTtJQUNQQyxRQUFRLENBQUU7RUFNWixDQUFDLEVBQUU7SUFDRCxJQUFJLENBQUNILE9BQU8sR0FBR0EsT0FBTztJQUN0QixJQUFJLENBQUNDLFFBQVEsR0FBR0EsUUFBUTtJQUN4QixJQUFJLENBQUNDLEtBQUssR0FBR0EsS0FBSztJQUNsQixJQUFJLENBQUNDLFFBQVEsR0FBR0EsUUFBUTtFQUMxQjtFQUVBQyxRQUFRQSxDQUFDRixLQUFhLEVBQUU7SUFDdEIsSUFBSSxDQUFDQSxLQUFLLEdBQUdBLEtBQUs7RUFDcEI7RUFFQUcsUUFBUUEsQ0FBQSxFQUFHO0lBQ1QsT0FBTyxJQUFJLENBQUNILEtBQUs7RUFDbkI7RUFFQUksV0FBV0EsQ0FBQ0gsUUFBaUIsRUFBRTtJQUM3QixJQUFJLENBQUNBLFFBQVEsR0FBR0EsUUFBUTtFQUMxQjtFQUVBSSxXQUFXQSxDQUFBLEVBQUc7SUFDWixPQUFPLElBQUksQ0FBQ0osUUFBUTtFQUN0QjtFQUVBSyxXQUFXQSxDQUFDUCxRQUFpQixFQUFFO0lBQzdCLElBQUksQ0FBQ0EsUUFBUSxHQUFHQSxRQUFRO0VBQzFCO0VBRUFRLFdBQVdBLENBQUEsRUFBRztJQUNaLE9BQU8sSUFBSSxDQUFDUixRQUFRO0VBQ3RCO0VBRUFTLFVBQVVBLENBQUNWLE9BQWdCLEVBQUU7SUFDM0IsSUFBSSxDQUFDQSxPQUFPLEdBQUdBLE9BQU87RUFDeEI7RUFFQVcsVUFBVUEsQ0FBQSxFQUFZO0lBQ3BCLE9BQU8sSUFBSSxDQUFDWCxPQUFPO0VBQ3JCO0FBQ0Y7QUFBQ3JGLE9BQUEsQ0FBQW9GLGFBQUEsR0FBQUEsYUFBQSJ9
@@ -0,0 +1,9 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import * as fs from 'node:fs';
4
+ import * as stream from 'node:stream';
5
+ export { promises as fsp } from 'node:fs';
6
+ export declare const streamPromise: {
7
+ pipeline: typeof stream.pipeline.__promisify__;
8
+ };
9
+ export declare const fstat: typeof fs.fstat.__promisify__;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var fs = _interopRequireWildcard(require("fs"), true);
7
+ var stream = _interopRequireWildcard(require("stream"), true);
8
+ var _util = require("util");
9
+ var _nodeFs = require("fs");
10
+ exports.fsp = _nodeFs.promises;
11
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
12
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
+ // promise helper for stdlib
14
+
15
+ // TODO: use "node:fs/promise" directly after we stop testing on nodejs 12
16
+
17
+ const streamPromise = {
18
+ // node:stream/promises Added in: v15.0.0
19
+ pipeline: (0, _util.promisify)(stream.pipeline)
20
+ };
21
+ exports.streamPromise = streamPromise;
22
+ const fstat = (0, _util.promisify)(fs.fstat);
23
+ exports.fstat = fstat;
24
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsInN0cmVhbSIsIl91dGlsIiwiX25vZGVGcyIsImV4cG9ydHMiLCJmc3AiLCJwcm9taXNlcyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJzdHJlYW1Qcm9taXNlIiwicGlwZWxpbmUiLCJwcm9taXNpZnkiLCJmc3RhdCJdLCJzb3VyY2VzIjpbImFzeW5jLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHByb21pc2UgaGVscGVyIGZvciBzdGRsaWJcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCAqIGFzIHN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcblxuLy8gVE9ETzogdXNlIFwibm9kZTpmcy9wcm9taXNlXCIgZGlyZWN0bHkgYWZ0ZXIgd2Ugc3RvcCB0ZXN0aW5nIG9uIG5vZGVqcyAxMlxuZXhwb3J0IHsgcHJvbWlzZXMgYXMgZnNwIH0gZnJvbSAnbm9kZTpmcydcbmV4cG9ydCBjb25zdCBzdHJlYW1Qcm9taXNlID0ge1xuICAvLyBub2RlOnN0cmVhbS9wcm9taXNlcyBBZGRlZCBpbjogdjE1LjAuMFxuICBwaXBlbGluZTogcHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSksXG59XG5cbmV4cG9ydCBjb25zdCBmc3RhdCA9IHByb21pc2lmeShmcy5mc3RhdClcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxJQUFBQSxFQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFGLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFHQSxJQUFBRyxPQUFBLEdBQUFILE9BQUE7QUFBeUNJLE9BQUEsQ0FBQUMsR0FBQSxHQUFBRixPQUFBLENBQUFHLFFBQUE7QUFBQSxTQUFBQyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBVCx3QkFBQWEsR0FBQSxFQUFBSixXQUFBLFNBQUFBLFdBQUEsSUFBQUksR0FBQSxJQUFBQSxHQUFBLENBQUFDLFVBQUEsV0FBQUQsR0FBQSxRQUFBQSxHQUFBLG9CQUFBQSxHQUFBLHdCQUFBQSxHQUFBLDRCQUFBRSxPQUFBLEVBQUFGLEdBQUEsVUFBQUcsS0FBQSxHQUFBUix3QkFBQSxDQUFBQyxXQUFBLE9BQUFPLEtBQUEsSUFBQUEsS0FBQSxDQUFBQyxHQUFBLENBQUFKLEdBQUEsWUFBQUcsS0FBQSxDQUFBRSxHQUFBLENBQUFMLEdBQUEsU0FBQU0sTUFBQSxXQUFBQyxxQkFBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxHQUFBLElBQUFYLEdBQUEsUUFBQVcsR0FBQSxrQkFBQUgsTUFBQSxDQUFBSSxTQUFBLENBQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBZCxHQUFBLEVBQUFXLEdBQUEsU0FBQUksSUFBQSxHQUFBUixxQkFBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFWLEdBQUEsRUFBQVcsR0FBQSxjQUFBSSxJQUFBLEtBQUFBLElBQUEsQ0FBQVYsR0FBQSxJQUFBVSxJQUFBLENBQUFDLEdBQUEsS0FBQVIsTUFBQSxDQUFBQyxjQUFBLENBQUFILE1BQUEsRUFBQUssR0FBQSxFQUFBSSxJQUFBLFlBQUFULE1BQUEsQ0FBQUssR0FBQSxJQUFBWCxHQUFBLENBQUFXLEdBQUEsU0FBQUwsTUFBQSxDQUFBSixPQUFBLEdBQUFGLEdBQUEsTUFBQUcsS0FBQSxJQUFBQSxLQUFBLENBQUFhLEdBQUEsQ0FBQWhCLEdBQUEsRUFBQU0sTUFBQSxZQUFBQSxNQUFBO0FBUHpDOztBQU1BOztBQUVPLE1BQU1XLGFBQWEsR0FBRztFQUMzQjtFQUNBQyxRQUFRLEVBQUUsSUFBQUMsZUFBUyxFQUFDOUIsTUFBTSxDQUFDNkIsUUFBUTtBQUNyQyxDQUFDO0FBQUExQixPQUFBLENBQUF5QixhQUFBLEdBQUFBLGFBQUE7QUFFTSxNQUFNRyxLQUFLLEdBQUcsSUFBQUQsZUFBUyxFQUFDakMsRUFBRSxDQUFDa0MsS0FBSyxDQUFDO0FBQUE1QixPQUFBLENBQUE0QixLQUFBLEdBQUFBLEtBQUEifQ==
@@ -0,0 +1 @@
1
+ export declare function callbackify(fn: (...args: any[]) => any): (this: any, ...args: any[]) => any;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.callbackify = callbackify;
7
+ /* eslint-disable @typescript-eslint/no-explicit-any */
8
+
9
+ // Wrapper for an async function that supports callback style API.
10
+ // It will preserve 'this'.
11
+ function callbackify(fn) {
12
+ return function (...args) {
13
+ const lastArg = args[args.length - 1];
14
+ if (typeof lastArg === 'function') {
15
+ const callback = args.pop();
16
+ return fn.apply(this, args).then(result => callback(null, result), err => callback(err));
17
+ }
18
+ return fn.apply(this, args);
19
+ };
20
+ }
21
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWxsYmFja2lmeSIsImZuIiwiYXJncyIsImxhc3RBcmciLCJsZW5ndGgiLCJjYWxsYmFjayIsInBvcCIsImFwcGx5IiwidGhlbiIsInJlc3VsdCIsImVyciJdLCJzb3VyY2VzIjpbImNhbGxiYWNraWZ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuLy8gV3JhcHBlciBmb3IgYW4gYXN5bmMgZnVuY3Rpb24gdGhhdCBzdXBwb3J0cyBjYWxsYmFjayBzdHlsZSBBUEkuXG4vLyBJdCB3aWxsIHByZXNlcnZlICd0aGlzJy5cbmV4cG9ydCBmdW5jdGlvbiBjYWxsYmFja2lmeShmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgbGFzdEFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXVxuXG4gICAgaWYgKHR5cGVvZiBsYXN0QXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3MucG9wKClcbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmdzKS50aGVuKFxuICAgICAgICAocmVzdWx0OiBhbnkpID0+IGNhbGxiYWNrKG51bGwsIHJlc3VsdCksXG4gICAgICAgIChlcnI6IGFueSkgPT4gY2FsbGJhY2soZXJyKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncylcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFFQTtBQUNBO0FBQ08sU0FBU0EsV0FBV0EsQ0FBQ0MsRUFBMkIsRUFBRTtFQUN2RCxPQUFPLFVBQXFCLEdBQUdDLElBQVcsRUFBRTtJQUMxQyxNQUFNQyxPQUFPLEdBQUdELElBQUksQ0FBQ0EsSUFBSSxDQUFDRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLElBQUksT0FBT0QsT0FBTyxLQUFLLFVBQVUsRUFBRTtNQUNqQyxNQUFNRSxRQUFRLEdBQUdILElBQUksQ0FBQ0ksR0FBRyxDQUFDLENBQUM7TUFDM0IsT0FBT0wsRUFBRSxDQUFDTSxLQUFLLENBQUMsSUFBSSxFQUFFTCxJQUFJLENBQUMsQ0FBQ00sSUFBSSxDQUM3QkMsTUFBVyxJQUFLSixRQUFRLENBQUMsSUFBSSxFQUFFSSxNQUFNLENBQUMsRUFDdENDLEdBQVEsSUFBS0wsUUFBUSxDQUFDSyxHQUFHLENBQzVCLENBQUM7SUFDSDtJQUVBLE9BQU9ULEVBQUUsQ0FBQ00sS0FBSyxDQUFDLElBQUksRUFBRUwsSUFBSSxDQUFDO0VBQzdCLENBQUM7QUFDSCJ9