@omujs/omu 0.9.42 → 0.9.47

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 (154) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/package.json +1 -1
  3. package/src/api/dashboard/extension.ts +42 -42
  4. package/src/api/dashboard/handler.ts +1 -1
  5. package/src/api/registry/extension.ts +109 -23
  6. package/src/network/network.ts +5 -0
  7. package/src/omu.ts +1 -0
  8. package/src/serialize/bytebuffer.ts +8 -0
  9. package/src/version.ts +1 -1
  10. package/dist/dts/address.d.ts +0 -6
  11. package/dist/dts/api/asset/extension.d.ts +0 -25
  12. package/dist/dts/api/asset/index.d.ts +0 -2
  13. package/dist/dts/api/dashboard/extension.d.ts +0 -181
  14. package/dist/dts/api/dashboard/handler.d.ts +0 -22
  15. package/dist/dts/api/dashboard/index.d.ts +0 -3
  16. package/dist/dts/api/dashboard/packets.d.ts +0 -73
  17. package/dist/dts/api/endpoint/endpoint.d.ts +0 -32
  18. package/dist/dts/api/endpoint/extension.d.ts +0 -23
  19. package/dist/dts/api/endpoint/index.d.ts +0 -2
  20. package/dist/dts/api/endpoint/packets.d.ts +0 -51
  21. package/dist/dts/api/extension-registry.d.ts +0 -8
  22. package/dist/dts/api/extension.d.ts +0 -11
  23. package/dist/dts/api/http/extension.d.ts +0 -41
  24. package/dist/dts/api/http/http.d.ts +0 -36
  25. package/dist/dts/api/http/index.d.ts +0 -2
  26. package/dist/dts/api/http/websocket.d.ts +0 -123
  27. package/dist/dts/api/i18n/extension.d.ts +0 -19
  28. package/dist/dts/api/i18n/index.d.ts +0 -1
  29. package/dist/dts/api/index.d.ts +0 -2
  30. package/dist/dts/api/logger/extension.d.ts +0 -25
  31. package/dist/dts/api/logger/index.d.ts +0 -1
  32. package/dist/dts/api/logger/packets.d.ts +0 -18
  33. package/dist/dts/api/permission/extension.d.ts +0 -19
  34. package/dist/dts/api/permission/index.d.ts +0 -1
  35. package/dist/dts/api/permission/permission.d.ts +0 -25
  36. package/dist/dts/api/plugin/extension.d.ts +0 -43
  37. package/dist/dts/api/plugin/index.d.ts +0 -2
  38. package/dist/dts/api/plugin/package-info.d.ts +0 -84
  39. package/dist/dts/api/registry/extension.d.ts +0 -26
  40. package/dist/dts/api/registry/index.d.ts +0 -2
  41. package/dist/dts/api/registry/packets.d.ts +0 -20
  42. package/dist/dts/api/registry/registry.d.ts +0 -57
  43. package/dist/dts/api/server/extension.d.ts +0 -61
  44. package/dist/dts/api/server/index.d.ts +0 -1
  45. package/dist/dts/api/session/extension.d.ts +0 -52
  46. package/dist/dts/api/session/index.d.ts +0 -1
  47. package/dist/dts/api/signal/extension.d.ts +0 -22
  48. package/dist/dts/api/signal/index.d.ts +0 -1
  49. package/dist/dts/api/signal/packets.d.ts +0 -21
  50. package/dist/dts/api/signal/signal.d.ts +0 -33
  51. package/dist/dts/api/table/extension.d.ts +0 -29
  52. package/dist/dts/api/table/index.d.ts +0 -2
  53. package/dist/dts/api/table/packets.d.ts +0 -65
  54. package/dist/dts/api/table/table.d.ts +0 -76
  55. package/dist/dts/app.d.ts +0 -49
  56. package/dist/dts/const.d.ts +0 -2
  57. package/dist/dts/errors.d.ts +0 -36
  58. package/dist/dts/event/index.d.ts +0 -6
  59. package/dist/dts/helper.d.ts +0 -13
  60. package/dist/dts/identifier.d.ts +0 -51
  61. package/dist/dts/index.d.ts +0 -36
  62. package/dist/dts/localization/index.d.ts +0 -2
  63. package/dist/dts/localization/locale.d.ts +0 -735
  64. package/dist/dts/localization/localization.d.ts +0 -5
  65. package/dist/dts/lock.d.ts +0 -6
  66. package/dist/dts/network/connection.d.ts +0 -17
  67. package/dist/dts/network/encryption.d.ts +0 -38
  68. package/dist/dts/network/frame-transport.d.ts +0 -22
  69. package/dist/dts/network/index.d.ts +0 -5
  70. package/dist/dts/network/network.d.ts +0 -58
  71. package/dist/dts/network/packet/index.d.ts +0 -2
  72. package/dist/dts/network/packet/packet-types.d.ts +0 -84
  73. package/dist/dts/network/packet/packet.d.ts +0 -28
  74. package/dist/dts/network/websocket-transport.d.ts +0 -24
  75. package/dist/dts/omu.d.ts +0 -61
  76. package/dist/dts/result.d.ts +0 -41
  77. package/dist/dts/serialize/bytebuffer.d.ts +0 -71
  78. package/dist/dts/serialize/index.d.ts +0 -2
  79. package/dist/dts/serialize/serializer.d.ts +0 -38
  80. package/dist/dts/token.d.ts +0 -14
  81. package/dist/dts/version.d.ts +0 -2
  82. package/dist/esm/address.js +0 -4
  83. package/dist/esm/api/asset/extension.js +0 -905
  84. package/dist/esm/api/asset/index.js +0 -903
  85. package/dist/esm/api/dashboard/extension.js +0 -1355
  86. package/dist/esm/api/dashboard/handler.js +0 -4
  87. package/dist/esm/api/dashboard/index.js +0 -1354
  88. package/dist/esm/api/dashboard/packets.js +0 -413
  89. package/dist/esm/api/endpoint/endpoint.js +0 -383
  90. package/dist/esm/api/endpoint/extension.js +0 -1090
  91. package/dist/esm/api/endpoint/index.js +0 -383
  92. package/dist/esm/api/endpoint/packets.js +0 -793
  93. package/dist/esm/api/extension-registry.js +0 -23
  94. package/dist/esm/api/extension.js +0 -278
  95. package/dist/esm/api/http/extension.js +0 -1414
  96. package/dist/esm/api/http/http.js +0 -442
  97. package/dist/esm/api/http/index.js +0 -1413
  98. package/dist/esm/api/http/websocket.js +0 -220
  99. package/dist/esm/api/i18n/extension.js +0 -1270
  100. package/dist/esm/api/i18n/index.js +0 -1268
  101. package/dist/esm/api/index.js +0 -295
  102. package/dist/esm/api/logger/extension.js +0 -850
  103. package/dist/esm/api/logger/index.js +0 -846
  104. package/dist/esm/api/logger/packets.js +0 -667
  105. package/dist/esm/api/permission/extension.js +0 -535
  106. package/dist/esm/api/permission/index.js +0 -294
  107. package/dist/esm/api/permission/permission.js +0 -294
  108. package/dist/esm/api/plugin/extension.js +0 -531
  109. package/dist/esm/api/plugin/index.js +0 -529
  110. package/dist/esm/api/plugin/package-info.js +0 -4
  111. package/dist/esm/api/registry/extension.js +0 -1217
  112. package/dist/esm/api/registry/index.js +0 -1216
  113. package/dist/esm/api/registry/packets.js +0 -688
  114. package/dist/esm/api/registry/registry.js +0 -383
  115. package/dist/esm/api/server/extension.js +0 -2071
  116. package/dist/esm/api/server/index.js +0 -2049
  117. package/dist/esm/api/session/extension.js +0 -2166
  118. package/dist/esm/api/session/index.js +0 -2166
  119. package/dist/esm/api/signal/extension.js +0 -1025
  120. package/dist/esm/api/signal/index.js +0 -379
  121. package/dist/esm/api/signal/packets.js +0 -684
  122. package/dist/esm/api/signal/signal.js +0 -379
  123. package/dist/esm/api/table/extension.js +0 -1547
  124. package/dist/esm/api/table/index.js +0 -1546
  125. package/dist/esm/api/table/packets.js +0 -898
  126. package/dist/esm/api/table/table.js +0 -383
  127. package/dist/esm/app.js +0 -264
  128. package/dist/esm/const.js +0 -11
  129. package/dist/esm/errors.js +0 -548
  130. package/dist/esm/event/index.js +0 -22
  131. package/dist/esm/helper.js +0 -15
  132. package/dist/esm/identifier.js +0 -266
  133. package/dist/esm/index.js +0 -5111
  134. package/dist/esm/localization/index.js +0 -742
  135. package/dist/esm/localization/locale.js +0 -742
  136. package/dist/esm/localization/localization.js +0 -4
  137. package/dist/esm/lock.js +0 -46
  138. package/dist/esm/network/connection.js +0 -293
  139. package/dist/esm/network/encryption.js +0 -980
  140. package/dist/esm/network/frame-transport.js +0 -525
  141. package/dist/esm/network/index.js +0 -1617
  142. package/dist/esm/network/network.js +0 -1358
  143. package/dist/esm/network/packet/index.js +0 -485
  144. package/dist/esm/network/packet/packet-types.js +0 -486
  145. package/dist/esm/network/packet/packet.js +0 -126
  146. package/dist/esm/network/websocket-transport.js +0 -487
  147. package/dist/esm/omu.js +0 -4870
  148. package/dist/esm/result.js +0 -68
  149. package/dist/esm/serialize/bytebuffer.js +0 -378
  150. package/dist/esm/serialize/index.js +0 -465
  151. package/dist/esm/serialize/serializer.js +0 -97
  152. package/dist/esm/token.js +0 -42
  153. package/dist/esm/version.js +0 -11
  154. package/tsconfig.tsbuildinfo +0 -1
@@ -1,980 +0,0 @@
1
- // @bun
2
- // src/const.ts
3
- var textEncoder = new TextEncoder;
4
- var textDecoder = new TextDecoder;
5
-
6
- // src/serialize/bytebuffer.ts
7
- class Flags {
8
- value;
9
- length;
10
- constructor(options) {
11
- this.value = options.value ?? 0;
12
- this.length = options.length ?? 32;
13
- }
14
- has(position) {
15
- return (this.value & 1 << position) !== 0;
16
- }
17
- get(position) {
18
- return (this.value & 1 << position) !== 0;
19
- }
20
- ifSet(position, callback) {
21
- if (this.has(position)) {
22
- return callback();
23
- }
24
- return;
25
- }
26
- set(position, value) {
27
- if (value) {
28
- this.value |= 1 << position;
29
- } else {
30
- this.value &= ~(1 << position);
31
- }
32
- }
33
- write(writer) {
34
- const bits = new Uint8Array((this.length + 7) / 8);
35
- for (let i = 0;i < bits.length; i++) {
36
- bits[i] = this.value >> i * 8 & 255;
37
- }
38
- writer.write(bits);
39
- }
40
- static read(reader, length) {
41
- let value = 0;
42
- for (let i = 0;i < (length + 7) / 8; i++) {
43
- value |= reader.readUint8() << i * 8;
44
- }
45
- return new Flags({ value, length });
46
- }
47
- }
48
- function readFloat16(dataView, offset) {
49
- const sign = dataView.getUint16(offset) & 32768 ? -1 : 1;
50
- const exponent = (dataView.getUint16(offset) & 31744) >> 10;
51
- const mantissa = dataView.getUint16(offset) & 1023;
52
- if (exponent === 0 && mantissa === 0) {
53
- return 0;
54
- } else if (exponent === 31) {
55
- return mantissa === 0 ? Infinity * sign : NaN;
56
- } else {
57
- const normalizedExponent = exponent - 15;
58
- const normalizedMantissa = mantissa / 1024;
59
- return sign * Math.pow(2, normalizedExponent) * (1 + normalizedMantissa);
60
- }
61
- }
62
- function writeFloat16(dataView, offset, value) {
63
- if (value === 0) {
64
- dataView.setUint16(offset, 0);
65
- return;
66
- }
67
- const sign = value < 0 ? 1 : 0;
68
- value = Math.abs(value);
69
- if (!isFinite(value)) {
70
- dataView.setUint16(offset, 31744 | sign << 15);
71
- return;
72
- }
73
- const exponent = Math.floor(Math.log2(value));
74
- const mantissa = value / Math.pow(2, exponent) - 1;
75
- const normalizedExponent = exponent + 15;
76
- const normalizedMantissa = Math.round(mantissa * 1024);
77
- if (normalizedExponent <= 0) {
78
- dataView.setUint16(offset, sign << 15);
79
- } else if (normalizedExponent >= 31) {
80
- dataView.setUint16(offset, 31744 | sign << 15);
81
- } else {
82
- dataView.setUint16(offset, sign << 15 | normalizedExponent << 10 | normalizedMantissa);
83
- }
84
- }
85
-
86
- class ByteWriter {
87
- dataView;
88
- buffer;
89
- offset = 0;
90
- finished = false;
91
- constructor(init, offset) {
92
- this.offset = offset ?? 0;
93
- this.buffer = init ?? new ArrayBuffer(1024);
94
- this.dataView = new DataView(this.buffer);
95
- }
96
- static fromUint8Array(buffer) {
97
- const arrayBuffer = new ArrayBuffer(buffer.byteLength);
98
- const uint8Array = new Uint8Array(arrayBuffer);
99
- uint8Array.set(new Uint8Array(buffer));
100
- return new ByteWriter(arrayBuffer, buffer.byteLength);
101
- }
102
- allocate(length) {
103
- if (this.offset + length > this.buffer.byteLength) {
104
- const newByteLength = Math.max(this.buffer.byteLength * 2, this.offset + length);
105
- const newBuffer = new ArrayBuffer(newByteLength);
106
- new Uint8Array(newBuffer).set(new Uint8Array(this.buffer));
107
- this.buffer = newBuffer;
108
- this.dataView = new DataView(this.buffer);
109
- }
110
- }
111
- write(data) {
112
- if (this.finished) {
113
- throw new Error("Buffer already finished");
114
- }
115
- this.allocate(data.length);
116
- new Uint8Array(this.buffer).set(data, this.offset);
117
- this.offset += data.length;
118
- return this;
119
- }
120
- writeBoolean(value) {
121
- this.allocate(1);
122
- this.dataView.setInt8(this.offset, value ? 1 : 0);
123
- this.offset += 1;
124
- return this;
125
- }
126
- writeInt8(value) {
127
- this.allocate(1);
128
- this.dataView.setInt8(this.offset, value);
129
- this.offset += 1;
130
- return this;
131
- }
132
- writeUint8(value) {
133
- this.allocate(1);
134
- this.dataView.setUint8(this.offset, value);
135
- this.offset += 1;
136
- return this;
137
- }
138
- writeInt16(value) {
139
- this.allocate(2);
140
- this.dataView.setInt16(this.offset, value);
141
- this.offset += 2;
142
- return this;
143
- }
144
- writeUint16(value) {
145
- this.allocate(2);
146
- this.dataView.setUint16(this.offset, value);
147
- this.offset += 2;
148
- return this;
149
- }
150
- writeInt32(value) {
151
- this.allocate(4);
152
- this.dataView.setInt32(this.offset, value);
153
- this.offset += 4;
154
- return this;
155
- }
156
- writeUint32(value) {
157
- this.allocate(4);
158
- this.dataView.setUint32(this.offset, value);
159
- this.offset += 4;
160
- return this;
161
- }
162
- writeInt64(value) {
163
- this.allocate(8);
164
- this.dataView.setBigInt64(this.offset, value);
165
- this.offset += 8;
166
- return this;
167
- }
168
- writeUint64(value) {
169
- this.allocate(8);
170
- this.dataView.setBigUint64(this.offset, value);
171
- this.offset += 8;
172
- return this;
173
- }
174
- writeULEB128(value) {
175
- if (value < 0) {
176
- throw new Error("Value must be non-negative");
177
- }
178
- while (value > 127) {
179
- this.allocate(1);
180
- this.dataView.setUint8(this.offset, value & 127 | 128);
181
- this.offset += 1;
182
- value >>= 7;
183
- }
184
- this.allocate(1);
185
- this.dataView.setUint8(this.offset, value & 127);
186
- this.offset += 1;
187
- return this;
188
- }
189
- writeFloat16(value) {
190
- this.allocate(2);
191
- writeFloat16(this.dataView, this.offset, value);
192
- this.offset += 2;
193
- return this;
194
- }
195
- writeFloat32(value) {
196
- this.allocate(4);
197
- this.dataView.setFloat32(this.offset, value);
198
- this.offset += 4;
199
- return this;
200
- }
201
- writeFloat64(value) {
202
- this.allocate(4);
203
- this.dataView.setFloat64(this.offset, value);
204
- this.offset += 4;
205
- return this;
206
- }
207
- writeUint8Array(value) {
208
- this.writeULEB128(value.byteLength);
209
- this.write(value);
210
- return this;
211
- }
212
- writeString(value) {
213
- this.writeUint8Array(textEncoder.encode(value));
214
- return this;
215
- }
216
- writeJSON(value) {
217
- this.writeString(JSON.stringify(value));
218
- return this;
219
- }
220
- writeFlags(flags) {
221
- flags.write(this);
222
- return this;
223
- }
224
- finish() {
225
- if (this.finished) {
226
- throw new Error("Buffer already finished");
227
- }
228
- this.finished = true;
229
- return new Uint8Array(this.buffer, 0, this.offset);
230
- }
231
- }
232
-
233
- class ByteReader {
234
- dataView;
235
- offset;
236
- finished;
237
- constructor(data) {
238
- this.dataView = data;
239
- this.offset = 0;
240
- this.finished = false;
241
- }
242
- static fromUint8Array(buffer) {
243
- const arrayBuffer = new ArrayBuffer(buffer.byteLength);
244
- const uint8Array = new Uint8Array(arrayBuffer);
245
- uint8Array.set(new Uint8Array(buffer));
246
- const dataView = new DataView(arrayBuffer);
247
- return new ByteReader(dataView);
248
- }
249
- static fromArrayBuffer(buffer) {
250
- const dataView = new DataView(buffer);
251
- return new ByteReader(dataView);
252
- }
253
- static async fromBlob(blob) {
254
- const arrayBuffer = await blob.arrayBuffer();
255
- const dataView = new DataView(arrayBuffer);
256
- return new ByteReader(dataView);
257
- }
258
- read(size) {
259
- if (this.finished) {
260
- throw new Error("Buffer already finished");
261
- }
262
- if (size < 0) {
263
- throw new Error("Size must be positive");
264
- }
265
- if (this.offset + size > this.dataView.byteLength) {
266
- throw new Error("Buffer not fully read");
267
- }
268
- const value = new Uint8Array(this.dataView.buffer, this.offset, size);
269
- this.offset += size;
270
- return value;
271
- }
272
- readBoolean() {
273
- const value = this.dataView.getInt8(this.offset);
274
- this.offset += 1;
275
- return value !== 0;
276
- }
277
- readInt8() {
278
- const value = this.dataView.getInt8(this.offset);
279
- this.offset += 1;
280
- return value;
281
- }
282
- readUint8() {
283
- const value = this.dataView.getUint8(this.offset);
284
- this.offset += 1;
285
- return value;
286
- }
287
- readInt16() {
288
- const value = this.dataView.getInt16(this.offset);
289
- this.offset += 2;
290
- return value;
291
- }
292
- readUint16() {
293
- const value = this.dataView.getUint16(this.offset);
294
- this.offset += 2;
295
- return value;
296
- }
297
- readInt32() {
298
- const value = this.dataView.getInt32(this.offset);
299
- this.offset += 4;
300
- return value;
301
- }
302
- readUint32() {
303
- const value = this.dataView.getUint32(this.offset);
304
- this.offset += 4;
305
- return value;
306
- }
307
- readInt64() {
308
- const value = this.dataView.getBigInt64(this.offset);
309
- this.offset += 8;
310
- return value;
311
- }
312
- readUint64() {
313
- const value = this.dataView.getBigUint64(this.offset);
314
- this.offset += 8;
315
- return value;
316
- }
317
- readULEB128() {
318
- let value = 0;
319
- let shift = 0;
320
- let byte;
321
- do {
322
- if (this.offset >= this.dataView.byteLength) {
323
- throw new Error("Buffer not fully read");
324
- }
325
- byte = this.dataView.getUint8(this.offset);
326
- this.offset += 1;
327
- value |= (byte & 127) << shift;
328
- shift += 7;
329
- } while ((byte & 128) !== 0);
330
- return value;
331
- }
332
- readFloat16() {
333
- const value = readFloat16(this.dataView, this.offset);
334
- this.offset += 2;
335
- return value;
336
- }
337
- readFloat32() {
338
- const value = this.dataView.getFloat32(this.offset);
339
- this.offset += 4;
340
- return value;
341
- }
342
- readFloat64() {
343
- const value = this.dataView.getFloat64(this.offset);
344
- this.offset += 8;
345
- return value;
346
- }
347
- readUint8Array() {
348
- const length = this.readULEB128();
349
- return this.read(length);
350
- }
351
- readString() {
352
- const byteArray = this.readUint8Array();
353
- return textDecoder.decode(byteArray);
354
- }
355
- readJSON() {
356
- return JSON.parse(this.readString());
357
- }
358
- readFlags(length) {
359
- return Flags.read(this, length);
360
- }
361
- finish() {
362
- if (this.finished) {
363
- throw new Error("Buffer already finished");
364
- }
365
- this.finished = true;
366
- if (this.offset !== this.dataView.byteLength) {
367
- throw new Error("Buffer not fully read");
368
- }
369
- }
370
- }
371
- // src/serialize/serializer.ts
372
- class Serializer {
373
- serialize;
374
- deserialize;
375
- constructor(serialize, deserialize) {
376
- this.serialize = serialize;
377
- this.deserialize = deserialize;
378
- }
379
- static of(serializer) {
380
- return new Serializer(serializer.serialize, serializer.deserialize);
381
- }
382
- static pipe(ser1, ser2) {
383
- return new Serializer((data) => ser2.serialize(ser1.serialize(data)), (data) => ser1.deserialize(ser2.deserialize(data)));
384
- }
385
- static transform(func) {
386
- return new Serializer(func, func);
387
- }
388
- static noop() {
389
- return new Serializer((data) => data, (data) => data);
390
- }
391
- field(key, serializer) {
392
- return new Serializer((data) => {
393
- const serialized = this.serialize(data);
394
- return {
395
- ...serialized,
396
- [key]: serializer.serialize(serialized[key])
397
- };
398
- }, (data) => {
399
- return this.deserialize({
400
- ...data,
401
- [key]: serializer.deserialize(data[key])
402
- });
403
- });
404
- }
405
- static json() {
406
- return new Serializer((data) => textEncoder.encode(JSON.stringify(data)), (data) => {
407
- const text = textDecoder.decode(data);
408
- return JSON.parse(text);
409
- });
410
- }
411
- toJson() {
412
- return new Serializer((data) => textEncoder.encode(JSON.stringify(this.serialize(data))), (data) => {
413
- const text = textDecoder.decode(data);
414
- return this.deserialize(JSON.parse(text));
415
- });
416
- }
417
- toArray() {
418
- return new Serializer((data) => data.map((item) => this.serialize(item)), (data) => data.map((item) => this.deserialize(item)));
419
- }
420
- toMap() {
421
- return new Serializer((data) => {
422
- const result = new Map;
423
- data.forEach((value, key) => {
424
- result.set(key, this.serialize(value));
425
- });
426
- return result;
427
- }, (data) => {
428
- const result = new Map;
429
- data.forEach((value, key) => {
430
- result.set(key, this.deserialize(value));
431
- });
432
- return result;
433
- });
434
- }
435
- fallback(fallback) {
436
- return new Serializer((data) => this.serialize(data), (data) => {
437
- try {
438
- return this.deserialize(data);
439
- } catch {
440
- return fallback;
441
- }
442
- });
443
- }
444
- fallbackMap(fallback) {
445
- return new Serializer((data) => this.serialize(data), (data) => {
446
- try {
447
- return this.deserialize(data);
448
- } catch (error) {
449
- return fallback(data, error);
450
- }
451
- });
452
- }
453
- pipe(serializer) {
454
- return new Serializer((data) => serializer.serialize(this.serialize(data)), (data) => this.deserialize(serializer.deserialize(data)));
455
- }
456
- }
457
- // src/identifier.ts
458
- var NAMESPACE_REGEX = /^(\.[^/:.]|[\w-])+$/;
459
- var NAME_REGEX = /^[^/:]+$/;
460
-
461
- class Identifier {
462
- namespace;
463
- path;
464
- constructor(namespace, ...path) {
465
- Identifier.validate(namespace, path);
466
- this.namespace = namespace;
467
- this.path = path;
468
- }
469
- static serialize(identifier) {
470
- return identifier.key();
471
- }
472
- static deserialize(json) {
473
- return Identifier.fromJson(json);
474
- }
475
- static from(id) {
476
- if (id instanceof Identifier) {
477
- return id;
478
- } else if (id instanceof App) {
479
- return id.id;
480
- } else if (typeof id === "string") {
481
- return Identifier.fromKey(id);
482
- } else {
483
- const idCasted = id;
484
- if (typeof idCasted.namespace === "string" && Array.isArray(idCasted.path) && idCasted.path.every((p) => typeof p === "string")) {
485
- return new Identifier(idCasted.namespace, ...idCasted.path);
486
- }
487
- const idWithId = id;
488
- if (typeof idWithId.id !== "undefined") {
489
- return Identifier.from(idWithId.id);
490
- }
491
- throw new Error(`Cannot convert to Identifier: ${id}`);
492
- }
493
- }
494
- static fromOptional(id) {
495
- if (id === undefined || id === null) {
496
- return;
497
- }
498
- return Identifier.from(id);
499
- }
500
- static validate(namespace, path) {
501
- if (!namespace) {
502
- throw new Error("Invalid namespace: Namespace cannot be empty");
503
- }
504
- if (path.length === 0) {
505
- throw new Error("Invalid path: Path must have at least one name");
506
- }
507
- if (!NAMESPACE_REGEX.test(namespace)) {
508
- throw new Error(`Invalid namespace: Namespace must match ${NAMESPACE_REGEX}`);
509
- }
510
- for (const name of path) {
511
- if (!NAME_REGEX.test(name)) {
512
- throw new Error(`Invalid path: Name must match ${NAME_REGEX} but got ${name}`);
513
- }
514
- }
515
- }
516
- static format(namespace, ...path) {
517
- Identifier.validate(namespace, path);
518
- return `${namespace}:${path.join("/")}`;
519
- }
520
- static fromKey(key) {
521
- const separator = key.indexOf(":");
522
- if (separator === -1) {
523
- throw new Error(`Invalid key: No separator found in ${key}`);
524
- }
525
- if (key.indexOf(":", separator + 1) !== -1) {
526
- throw new Error(`Invalid key: Multiple separators found in ${key}`);
527
- }
528
- const namespace = key.slice(0, separator);
529
- const path = key.slice(separator + 1);
530
- if (!namespace || !path) {
531
- throw new Error("Invalid key: Namespace and path cannot be empty");
532
- }
533
- return new Identifier(namespace, ...path.split("/"));
534
- }
535
- static fromUrl(url) {
536
- const parsedUrl = new URL(url);
537
- const namespace = Identifier.namespaceFromUrl(parsedUrl.href);
538
- const path = parsedUrl.pathname.slice(1).split("/");
539
- return new Identifier(namespace, ...path);
540
- }
541
- static namespaceFromUrl(url) {
542
- const parsed = new URL(url);
543
- return parsed.hostname.split(".").reverse().join(".");
544
- }
545
- get base() {
546
- return new Identifier(this.namespace, this.path[0]);
547
- }
548
- toJson() {
549
- return this.key();
550
- }
551
- static fromJson(json) {
552
- return Identifier.fromKey(json);
553
- }
554
- key() {
555
- return Identifier.format(this.namespace, ...this.path);
556
- }
557
- isEqual(other) {
558
- return this.key() === other.key();
559
- }
560
- isNamespaceEqual(other) {
561
- return this.namespace === other.namespace;
562
- }
563
- isSubpathOf(other) {
564
- if (this.namespace !== other.namespace) {
565
- return false;
566
- }
567
- if (this.path.length < other.path.length) {
568
- return false;
569
- }
570
- for (let i = 0;i < other.path.length; i++) {
571
- if (this.path[i] !== other.path[i]) {
572
- return false;
573
- }
574
- }
575
- return true;
576
- }
577
- join(...path) {
578
- return new Identifier(this.namespace, ...this.path, ...path);
579
- }
580
- }
581
-
582
- class IdentifierMap {
583
- map = new Map;
584
- constructor(entries) {
585
- if (!entries)
586
- return;
587
- for (const [id, value] of entries) {
588
- this.map.set(id.key(), value);
589
- }
590
- }
591
- get size() {
592
- return this.map.size;
593
- }
594
- set(identifier, value) {
595
- this.map.set(identifier.key(), value);
596
- }
597
- get(identifier) {
598
- return this.map.get(identifier.key());
599
- }
600
- has(identifier) {
601
- return this.map.has(identifier.key());
602
- }
603
- delete(identifier) {
604
- this.map.delete(identifier.key());
605
- }
606
- clear() {
607
- this.map.clear();
608
- }
609
- *keys() {
610
- for (const key of this.map.keys()) {
611
- yield Identifier.fromKey(key);
612
- }
613
- }
614
- values() {
615
- return this.map.values();
616
- }
617
- *entries() {
618
- for (const [key, value] of this.map.entries()) {
619
- yield [Identifier.fromKey(key), value];
620
- }
621
- }
622
- [Symbol.iterator]() {
623
- return this.entries();
624
- }
625
- }
626
-
627
- class IdentifierSet {
628
- set = new Set;
629
- get size() {
630
- return this.set.size;
631
- }
632
- add(identifier) {
633
- this.set.add(identifier.key());
634
- }
635
- has(identifier) {
636
- return this.set.has(identifier.key());
637
- }
638
- delete(identifier) {
639
- this.set.delete(identifier.key());
640
- }
641
- clear() {
642
- this.set.clear();
643
- }
644
- *keys() {
645
- for (const key of this.set.keys()) {
646
- yield Identifier.fromKey(key);
647
- }
648
- }
649
- values() {
650
- return this.keys();
651
- }
652
- *entries() {
653
- for (const key of this.set.keys()) {
654
- const identifier = Identifier.fromKey(key);
655
- yield [identifier, identifier];
656
- }
657
- }
658
- [Symbol.iterator]() {
659
- return this.entries();
660
- }
661
- }
662
-
663
- // src/app.ts
664
- class App {
665
- id;
666
- type;
667
- parentId;
668
- version;
669
- url;
670
- metadata;
671
- dependencies;
672
- constructor(id, options) {
673
- this.id = Identifier.from(id);
674
- this.parentId = Identifier.fromOptional(options.parentId);
675
- this.version = options.version;
676
- this.url = options.url;
677
- this.metadata = options.metadata;
678
- this.type = options.type ?? "app";
679
- this.dependencies = options.dependencies ?? {};
680
- }
681
- static deserialize(info) {
682
- const id = Identifier.fromKey(info.id);
683
- return new App(id, {
684
- parentId: Identifier.fromOptional(info.parent_id),
685
- version: info.version,
686
- url: info.url,
687
- type: info.type,
688
- metadata: info.metadata,
689
- dependencies: info.dependencies ?? {}
690
- });
691
- }
692
- static serialize(data) {
693
- return {
694
- id: data.id.key(),
695
- type: data.type,
696
- parent_id: data.parentId?.key(),
697
- version: data.version,
698
- url: data.url,
699
- metadata: data.metadata,
700
- dependencies: data.dependencies
701
- };
702
- }
703
- join(...paths) {
704
- return new App(this.id.join(...paths), {
705
- parentId: this.parentId,
706
- version: this.version,
707
- url: this.url,
708
- type: this.type,
709
- metadata: this.metadata,
710
- dependencies: this.dependencies
711
- });
712
- }
713
- }
714
-
715
- // src/network/packet/packet.ts
716
- class PacketType {
717
- id;
718
- serializer;
719
- constructor(id, serializer) {
720
- this.id = id;
721
- this.serializer = serializer;
722
- }
723
- new(data) {
724
- return {
725
- type: this,
726
- data
727
- };
728
- }
729
- match(packet) {
730
- return packet.type === this;
731
- }
732
- static createJson(identifier, {
733
- name,
734
- serializer
735
- }) {
736
- return new PacketType(identifier.join(name), Serializer.pipe(serializer ?? Serializer.noop(), Serializer.json()));
737
- }
738
- static createSerialized(identifier, {
739
- name,
740
- serializer
741
- }) {
742
- return new PacketType(identifier.join(name), serializer);
743
- }
744
- }
745
-
746
- // src/network/packet/packet-types.ts
747
- var IDENTIFIER = new Identifier("core", "packet");
748
-
749
- class ConnectPacket {
750
- protocol;
751
- app;
752
- token;
753
- encryption;
754
- constructor(options) {
755
- this.protocol = options.protocol;
756
- this.app = options.app;
757
- this.token = options.token;
758
- this.encryption = options.encryption ?? null;
759
- }
760
- static deserialize(data) {
761
- return new ConnectPacket({
762
- protocol: data.protocol,
763
- app: App.deserialize(data.app),
764
- encryption: data.encryption,
765
- token: data.token
766
- });
767
- }
768
- static serialize(data) {
769
- return {
770
- protocol: data.protocol,
771
- app: App.serialize(data.app),
772
- encryption: data.encryption,
773
- token: data.token
774
- };
775
- }
776
- }
777
- class DisconnectPacket {
778
- type;
779
- message;
780
- constructor(options) {
781
- this.type = options.type;
782
- this.message = options.message ?? null;
783
- }
784
- static serialize(data) {
785
- return data.toJson();
786
- }
787
- static deserialize(data) {
788
- return DisconnectPacket.fromJson(data);
789
- }
790
- static fromJson(data) {
791
- return new DisconnectPacket({
792
- type: data.type,
793
- message: data.message
794
- });
795
- }
796
- toJson() {
797
- return {
798
- type: this.type,
799
- message: this.message
800
- };
801
- }
802
- }
803
- var PACKET_TYPES = {
804
- SERVER_META: PacketType.createJson(IDENTIFIER, {
805
- name: "server_meta"
806
- }),
807
- CONNECT: PacketType.createJson(IDENTIFIER, {
808
- name: "connect",
809
- serializer: ConnectPacket
810
- }),
811
- DISCONNECT: PacketType.createJson(IDENTIFIER, {
812
- name: "disconnect",
813
- serializer: DisconnectPacket
814
- }),
815
- TOKEN: PacketType.createJson(IDENTIFIER, {
816
- name: "token"
817
- }),
818
- READY: PacketType.createJson(IDENTIFIER, {
819
- name: "ready"
820
- }),
821
- ENCRYPTED_PACKET: PacketType.createSerialized(IDENTIFIER, {
822
- name: "e",
823
- serializer: Serializer.noop()
824
- })
825
- };
826
-
827
- // src/network/encryption.ts
828
- function base64UrlEncode(buffer) {
829
- return buffer.toBase64().replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
830
- }
831
- function base64UrlDecode(data) {
832
- data = data.replace(/-/g, "+").replace(/_/g, "/");
833
- while (data.length % 4) {
834
- data += "=";
835
- }
836
- return Uint8Array.fromBase64(data);
837
- }
838
- function convertUint8ArrayToArrayBuffer(u8) {
839
- const buf = new ArrayBuffer(u8.length);
840
- const view = new Uint8Array(buf);
841
- view.set(u8);
842
- return buf;
843
- }
844
- var ENCRYPTION_AVAILABLE = typeof crypto !== "undefined" && !!crypto.subtle;
845
-
846
- class Decryptor {
847
- privateKey;
848
- publicKey;
849
- constructor(privateKey, publicKey) {
850
- this.privateKey = privateKey;
851
- this.publicKey = publicKey;
852
- }
853
- static async new() {
854
- const { privateKey, publicKey } = await crypto.subtle.generateKey({
855
- name: "RSA-OAEP",
856
- modulusLength: 4096,
857
- publicExponent: new Uint8Array([1, 0, 1]),
858
- hash: "SHA-256"
859
- }, true, ["encrypt", "decrypt"]);
860
- return new Decryptor(privateKey, publicKey);
861
- }
862
- async toRequest() {
863
- const key = await crypto.subtle.exportKey("jwk", this.publicKey);
864
- if (!key.e)
865
- throw new Error("Key export failed: missing exponent");
866
- if (!key.n)
867
- throw new Error("Key export failed: missing modulus");
868
- return {
869
- e: key.e,
870
- n: key.n
871
- };
872
- }
873
- async decrypt(data) {
874
- const decrypted = await crypto.subtle.decrypt({ name: "RSA-OAEP" }, this.privateKey, data);
875
- return decrypted;
876
- }
877
- async decryptString(data) {
878
- const decrypted = await crypto.subtle.decrypt({ name: "RSA-OAEP" }, this.privateKey, convertUint8ArrayToArrayBuffer(base64UrlDecode(data)));
879
- return textDecoder.decode(decrypted);
880
- }
881
- }
882
-
883
- class Encryptor {
884
- publicKey;
885
- constructor(publicKey) {
886
- this.publicKey = publicKey;
887
- }
888
- static async new(request) {
889
- const publicKey = await crypto.subtle.importKey("jwk", {
890
- alg: "RSA-OAEP-256",
891
- ext: true,
892
- key_ops: ["encrypt"],
893
- kty: "RSA",
894
- e: request.e.replace(/=+$/, ""),
895
- n: request.n.replace(/=+$/, "")
896
- }, {
897
- name: "RSA-OAEP",
898
- hash: "SHA-256"
899
- }, true, ["encrypt"]);
900
- return new Encryptor(publicKey);
901
- }
902
- async encrypt(data) {
903
- return await crypto.subtle.encrypt({
904
- name: "RSA-OAEP"
905
- }, this.publicKey, data);
906
- }
907
- async encryptString(data) {
908
- const encrypted = await crypto.subtle.encrypt({
909
- name: "RSA-OAEP"
910
- }, this.publicKey, textEncoder.encode(data));
911
- return base64UrlEncode(new Uint8Array(encrypted));
912
- }
913
- }
914
-
915
- class AES {
916
- key;
917
- iv;
918
- constructor(key, iv) {
919
- this.key = key;
920
- this.iv = iv;
921
- }
922
- static async new() {
923
- const key = await crypto.subtle.generateKey({
924
- name: "AES-CBC",
925
- length: 128
926
- }, true, ["encrypt", "decrypt"]);
927
- const iv = crypto.getRandomValues(new Uint8Array(16));
928
- return new AES(key, iv.buffer);
929
- }
930
- static async deserialize(aes, decryptor) {
931
- const decrypted = await decryptor.decrypt(convertUint8ArrayToArrayBuffer(base64UrlDecode(aes)));
932
- const reader = ByteReader.fromArrayBuffer(decrypted);
933
- const key = reader.readUint8Array();
934
- const iv = reader.readUint8Array();
935
- const key_encoded = await crypto.subtle.importKey("raw", convertUint8ArrayToArrayBuffer(key), "AES-CBC", false, ["encrypt", "decrypt"]);
936
- return new AES(key_encoded, convertUint8ArrayToArrayBuffer(iv));
937
- }
938
- async serialize(encryptor) {
939
- const writer = new ByteWriter;
940
- const rawKey = await crypto.subtle.exportKey("raw", this.key);
941
- writer.writeUint8Array(new Uint8Array(rawKey));
942
- writer.writeUint8Array(new Uint8Array(this.iv));
943
- const encrypted = await encryptor.encrypt(convertUint8ArrayToArrayBuffer(writer.finish()));
944
- return base64UrlEncode(new Uint8Array(encrypted));
945
- }
946
- async encrypt(data) {
947
- const writer = new ByteWriter;
948
- writer.writeString(data.type);
949
- writer.writeUint8Array(data.data);
950
- const encrypted = await crypto.subtle.encrypt({
951
- name: "AES-CBC",
952
- iv: this.iv,
953
- length: 16
954
- }, this.key, convertUint8ArrayToArrayBuffer(writer.finish()));
955
- return PACKET_TYPES.ENCRYPTED_PACKET.new(new Uint8Array(encrypted));
956
- }
957
- async decrypt(packet) {
958
- const decrypted = await crypto.subtle.decrypt({
959
- name: "AES-CBC",
960
- iv: this.iv,
961
- length: 16
962
- }, this.key, convertUint8ArrayToArrayBuffer(packet.data));
963
- const reader = ByteReader.fromArrayBuffer(decrypted);
964
- const type = reader.readString();
965
- const data = reader.readUint8Array();
966
- return {
967
- type,
968
- data
969
- };
970
- }
971
- }
972
- export {
973
- Encryptor,
974
- ENCRYPTION_AVAILABLE,
975
- Decryptor,
976
- AES
977
- };
978
-
979
- //# debugId=B267BB3E560E9EDA64756E2164756E21
980
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnN0LnRzIiwgIi4uLy4uL3NyYy9zZXJpYWxpemUvYnl0ZWJ1ZmZlci50cyIsICIuLi8uLi9zcmMvc2VyaWFsaXplL3NlcmlhbGl6ZXIudHMiLCAiLi4vLi4vc3JjL2lkZW50aWZpZXIudHMiLCAiLi4vLi4vc3JjL2FwcC50cyIsICIuLi8uLi9zcmMvbmV0d29yay9wYWNrZXQvcGFja2V0LnRzIiwgIi4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9wYWNrZXQtdHlwZXMudHMiLCAiLi4vLi4vc3JjL25ldHdvcmsvZW5jcnlwdGlvbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJleHBvcnQgY29uc3QgdGV4dEVuY29kZXI6IFRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5leHBvcnQgY29uc3QgdGV4dERlY29kZXI6IFRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4iLAogICAgImltcG9ydCB7IHRleHREZWNvZGVyLCB0ZXh0RW5jb2RlciB9IGZyb20gJy4uL2NvbnN0LmpzJztcbmltcG9ydCB7IEpzb25UeXBlIH0gZnJvbSAnLi9zZXJpYWxpemVyLmpzJztcblxuZXhwb3J0IGNsYXNzIEZsYWdzIHtcbiAgICBwcml2YXRlIHZhbHVlOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBsZW5ndGg6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgdmFsdWU/OiBudW1iZXI7IGxlbmd0aD86IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlID8/IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5sZW5ndGggPz8gMzI7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldChwb3NpdGlvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSAmICgxIDw8IHBvc2l0aW9uKSkgIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGlmU2V0PFQ+KHBvc2l0aW9uOiBudW1iZXIsIGNhbGxiYWNrOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLmhhcyhwb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChwb3NpdGlvbjogbnVtYmVyLCB2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgfD0gMSA8PCBwb3NpdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgJj0gfigxIDw8IHBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZSh3cml0ZXI6IEJ5dGVXcml0ZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYml0cyA9IG5ldyBVaW50OEFycmF5KCh0aGlzLmxlbmd0aCArIDcpIC8gOCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYml0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYml0c1tpXSA9ICh0aGlzLnZhbHVlID4+IChpICogOCkpICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIud3JpdGUoYml0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkKHJlYWRlcjogQnl0ZVJlYWRlciwgbGVuZ3RoOiBudW1iZXIpOiBGbGFncyB7XG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKGxlbmd0aCArIDcpIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZSB8PSByZWFkZXIucmVhZFVpbnQ4KCkgPDwgKGkgKiA4KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZsYWdzKHsgdmFsdWUsIGxlbmd0aCB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHNpZ24gPSAoZGF0YVZpZXcuZ2V0VWludDE2KG9mZnNldCkgJiAweDgwMDApID8gLTEgOiAxO1xuICAgIGNvbnN0IGV4cG9uZW50ID0gKGRhdGFWaWV3LmdldFVpbnQxNihvZmZzZXQpICYgMHg3YzAwKSA+PiAxMDtcbiAgICBjb25zdCBtYW50aXNzYSA9IChkYXRhVmlldy5nZXRVaW50MTYob2Zmc2V0KSAmIDB4MDNmZik7XG4gICAgaWYgKGV4cG9uZW50ID09PSAwICYmIG1hbnRpc3NhID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoZXhwb25lbnQgPT09IDB4MWYpIHtcbiAgICAgICAgcmV0dXJuIG1hbnRpc3NhID09PSAwID8gSW5maW5pdHkgKiBzaWduIDogTmFOO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50IC0gMTU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNYW50aXNzYSA9IG1hbnRpc3NhIC8gMTAyNDtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNYXRoLnBvdygyLCBub3JtYWxpemVkRXhwb25lbnQpICogKDEgKyBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdDE2KGRhdGFWaWV3OiBEYXRhVmlldywgb2Zmc2V0OiBudW1iZXIsIHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2lnbiA9IHZhbHVlIDwgMCA/IDEgOiAwO1xuICAgIHZhbHVlID0gTWF0aC5hYnModmFsdWUpO1xuICAgIGlmICghaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nMih2YWx1ZSkpO1xuICAgIGNvbnN0IG1hbnRpc3NhID0gdmFsdWUgLyBNYXRoLnBvdygyLCBleHBvbmVudCkgLSAxO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBvbmVudCA9IGV4cG9uZW50ICsgMTU7XG4gICAgY29uc3Qgbm9ybWFsaXplZE1hbnRpc3NhID0gTWF0aC5yb3VuZChtYW50aXNzYSAqIDEwMjQpO1xuICAgIGlmIChub3JtYWxpemVkRXhwb25lbnQgPD0gMCkge1xuICAgICAgICBkYXRhVmlldy5zZXRVaW50MTYob2Zmc2V0LCBzaWduIDw8IDE1KTtcbiAgICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRFeHBvbmVudCA+PSAweDFmKSB7XG4gICAgICAgIGRhdGFWaWV3LnNldFVpbnQxNihvZmZzZXQsIDB4N2MwMCB8IChzaWduIDw8IDE1KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVZpZXcuc2V0VWludDE2KG9mZnNldCwgKHNpZ24gPDwgMTUpIHwgKG5vcm1hbGl6ZWRFeHBvbmVudCA8PCAxMCkgfCBub3JtYWxpemVkTWFudGlzc2EpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVXcml0ZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgYnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgICBwcml2YXRlIG9mZnNldCA9IDA7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoaW5pdD86IEFycmF5QnVmZmVyLCBvZmZzZXQ/OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQgPz8gMDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBpbml0ID8/IG5ldyBBcnJheUJ1ZmZlcigxMDI0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tVWludDhBcnJheShidWZmZXI6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBjb25zdCB1aW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICB1aW50OEFycmF5LnNldChuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlV3JpdGVyKGFycmF5QnVmZmVyLCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhbGxvY2F0ZShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgKyBsZW5ndGggPiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdCeXRlTGVuZ3RoID0gTWF0aC5tYXgodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCAqIDIsIHRoaXMub2Zmc2V0ICsgbGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0J1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihuZXdCeXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KG5ld0J1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyKSk7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ld0J1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGRhdGE6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIGFscmVhZHkgZmluaXNoZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG9jYXRlKGRhdGEubGVuZ3RoKTtcbiAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIpLnNldChkYXRhLCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVCb29sZWFuKHZhbHVlOiBib29sZWFuKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50OCh0aGlzLm9mZnNldCwgdmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEludDgodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDEpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUludDE2KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSgyKTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRJbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVVaW50MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQxNih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVJbnQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0SW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVWludDMyKHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRVaW50MzIodGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSW50NjQodmFsdWU6IGJpZ2ludCk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDgpO1xuICAgICAgICB0aGlzLmRhdGFWaWV3LnNldEJpZ0ludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ2NCh2YWx1ZTogYmlnaW50KTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoOCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0QmlnVWludDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVMRUIxMjgodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICAvLyBVbnNpZ25lZCBMRUIxMjhcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LnNldFVpbnQ4KHRoaXMub2Zmc2V0LCAodmFsdWUgJiAweDdmKSB8IDB4ODApO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIHZhbHVlID4+PSA3O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoMSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0VWludDgodGhpcy5vZmZzZXQsIHZhbHVlICYgMHg3Zik7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUZsb2F0MTYodmFsdWU6IG51bWJlcik6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLmFsbG9jYXRlKDIpO1xuICAgICAgICB3cml0ZUZsb2F0MTYodGhpcy5kYXRhVmlldywgdGhpcy5vZmZzZXQsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlRmxvYXQzMih2YWx1ZTogbnVtYmVyKTogQnl0ZVdyaXRlciB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGUoNCk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuc2V0RmxvYXQzMih0aGlzLm9mZnNldCwgdmFsdWUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbG9hdDY0KHZhbHVlOiBudW1iZXIpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZSg0KTtcbiAgICAgICAgdGhpcy5kYXRhVmlldy5zZXRGbG9hdDY0KHRoaXMub2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVVpbnQ4QXJyYXkodmFsdWU6IFVpbnQ4QXJyYXkpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVVMRUIxMjgodmFsdWUuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMud3JpdGUodmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJpbmcodmFsdWU6IHN0cmluZyk6IEJ5dGVXcml0ZXIge1xuICAgICAgICB0aGlzLndyaXRlVWludDhBcnJheSh0ZXh0RW5jb2Rlci5lbmNvZGUodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlSlNPTih2YWx1ZTogSnNvblR5cGUpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyhKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVGbGFncyhmbGFnczogRmxhZ3MpOiBCeXRlV3JpdGVyIHtcbiAgICAgICAgZmxhZ3Mud3JpdGUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlciwgMCwgdGhpcy5vZmZzZXQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ5dGVSZWFkZXIge1xuICAgIHByaXZhdGUgZGF0YVZpZXc6IERhdGFWaWV3O1xuICAgIHByaXZhdGUgb2Zmc2V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBmaW5pc2hlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoZGF0YTogRGF0YVZpZXcpIHtcbiAgICAgICAgdGhpcy5kYXRhVmlldyA9IGRhdGE7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVpbnQ4QXJyYXkoYnVmZmVyOiBVaW50OEFycmF5KTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgdWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgICAgICAgdWludDhBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlUmVhZGVyKGRhdGFWaWV3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21BcnJheUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyKTogQnl0ZVJlYWRlciB7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBmcm9tQmxvYihibG9iOiBCbG9iKTogUHJvbWlzZTxCeXRlUmVhZGVyPiB7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVJlYWRlcihkYXRhVmlldyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQoc2l6ZTogbnVtYmVyKTogVWludDhBcnJheSB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpemUgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIHNpemUgPiB0aGlzLmRhdGFWaWV3LmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVmZmVyIG5vdCBmdWxseSByZWFkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGFWaWV3LmJ1ZmZlciwgdGhpcy5vZmZzZXQsIHNpemUpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBzaXplO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRCb29sZWFuKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50OCh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50OCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRJbnQxNigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0SW50MTYodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAyO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVaW50MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQxNih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEludDMyKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRJbnQzMih0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFVpbnQzMigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVZpZXcuZ2V0VWludDMyKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkSW50NjQoKTogYmlnaW50IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEJpZ0ludDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDY0KCk6IGJpZ2ludCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRCaWdVaW50NjQodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA4O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRVTEVCMTI4KCk6IG51bWJlciB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExFQjEyOFxuICAgICAgICBsZXQgdmFsdWUgPSAwO1xuICAgICAgICBsZXQgc2hpZnQgPSAwO1xuICAgICAgICBsZXQgYnl0ZTogbnVtYmVyO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWZmZXIgbm90IGZ1bGx5IHJlYWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5dGUgPSB0aGlzLmRhdGFWaWV3LmdldFVpbnQ4KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICB2YWx1ZSB8PSAoYnl0ZSAmIDBiMDExMTExMTEpIDw8IHNoaWZ0O1xuICAgICAgICAgICAgc2hpZnQgKz0gNztcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoKGJ5dGUgJiAwYjEwMDAwMDAwKSAhPT0gMCk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MTYoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkRmxvYXQxNih0aGlzLmRhdGFWaWV3LCB0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDI7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsb2F0MzIoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGFWaWV3LmdldEZsb2F0MzIodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSA0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRGbG9hdDY0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhVmlldy5nZXRGbG9hdDY0KHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkVWludDhBcnJheSgpOiBVaW50OEFycmF5IHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5yZWFkVUxFQjEyOCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkKGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gdGhpcy5yZWFkVWludDhBcnJheSgpO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVBcnJheSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRKU09OPFQgZXh0ZW5kcyBKc29uVHlwZT4oKTogVCB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVhZFN0cmluZygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZEZsYWdzKGxlbmd0aDogbnVtYmVyKTogRmxhZ3Mge1xuICAgICAgICByZXR1cm4gRmxhZ3MucmVhZCh0aGlzLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBhbHJlYWR5IGZpbmlzaGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCAhPT0gdGhpcy5kYXRhVmlldy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1ZmZlciBub3QgZnVsbHkgcmVhZCcpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyB0ZXh0RGVjb2RlciwgdGV4dEVuY29kZXIgfSBmcm9tICcuLi9jb25zdC5qcyc7XG5cbmV4cG9ydCB0eXBlIEpzb25UeXBlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgfCB7IFtrZXkgaW4gbmV2ZXJdPzogSnNvblR5cGUgfSB8IEpzb25UeXBlW107XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICBzZXJpYWxpemUoZGF0YTogVCk6IEQ7XG4gICAgZGVzZXJpYWxpemUoZGF0YTogRCk6IFQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemVyPFQsIEQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHNlcmlhbGl6ZTogKGRhdGE6IFQpID0+IEQsXG4gICAgICAgIHB1YmxpYyBkZXNlcmlhbGl6ZTogKGRhdGE6IEQpID0+IFQsXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgb2Y8VCwgRD4oc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIEQ+KTogU2VyaWFsaXplcjxULCBEPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBEPihzZXJpYWxpemVyLnNlcmlhbGl6ZSwgc2VyaWFsaXplci5kZXNlcmlhbGl6ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwaXBlPFQsIFIsIEQ+KHNlcjE6IFNlcmlhbGl6YWJsZTxULCBSPiwgc2VyMjogU2VyaWFsaXphYmxlPFIsIEQ+KTogU2VyaWFsaXphYmxlPFQsIEQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEQ+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcjIuc2VyaWFsaXplKHNlcjEuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBzZXIxLmRlc2VyaWFsaXplKHNlcjIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdHJhbnNmb3JtPFQ+KGZ1bmM6ICh2YWx1ZTogVCkgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgVD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVD4oXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgZnVuYyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vb3A8VD4oKTogU2VyaWFsaXplcjxULCBUPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxULCBUPihcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLFxuICAgICAgICAgICAgKGRhdGEpID0+IGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpZWxkPFxuICAgICAgICBLIGV4dGVuZHMga2V5b2YgRCxcbiAgICAgICAgUixcbiAgICA+KFxuICAgICAgICBrZXk6IEssXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6YWJsZTxEW0tdLCBSPixcbiAgICApOiBTZXJpYWxpemVyPFxuICAgICAgICBULFxuICAgICAgICB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH1cbiAgICA+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFxuICAgICAgICAgICAgVCxcbiAgICAgICAgICAgIHsgW1AgaW4ga2V5b2YgRF06IFAgZXh0ZW5kcyBLID8gUiA6IERbUF0gfVxuICAgICAgICA+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gdGhpcy5zZXJpYWxpemUoZGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2VyaWFsaXplZCxcbiAgICAgICAgICAgICAgICAgICAgW2tleV06IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNlcmlhbGl6ZWRba2V5XSksXG4gICAgICAgICAgICAgICAgfSBhcyB7IFtQIGluIGtleW9mIERdOiBQIGV4dGVuZHMgSyA/IFIgOiBEW1BdIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRhdGFba2V5XSBhcyBSKSxcbiAgICAgICAgICAgICAgICB9IGFzIEQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMganNvbjxUIGV4dGVuZHMgSnNvblR5cGU+KCk6IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgVWludDhBcnJheT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGV4dEVuY29kZXIuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvSnNvbigpOiBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIFVpbnQ4QXJyYXk+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHRleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZShkYXRhKSkpLFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BcnJheSgpOiBTZXJpYWxpemVyPFRbXSwgRFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxUW10sIERbXT4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gZGF0YS5tYXAoKGl0ZW0pID0+IHRoaXMuc2VyaWFsaXplKGl0ZW0pKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiBkYXRhLm1hcCgoaXRlbSkgPT4gdGhpcy5kZXNlcmlhbGl6ZShpdGVtKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvTWFwKCk6IFNlcmlhbGl6ZXI8TWFwPHN0cmluZywgVD4sIE1hcDxzdHJpbmcsIEQ+PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplcjxNYXA8c3RyaW5nLCBUPiwgTWFwPHN0cmluZywgRD4+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgRD4oKTtcbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHRoaXMuc2VyaWFsaXplKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgdGhpcy5kZXNlcmlhbGl6ZSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmYWxsYmFjayhmYWxsYmFjazogVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tNYXAoZmFsbGJhY2s6IChkYXRhOiBELCBlcnJvcjogdW5rbm93bikgPT4gVCk6IFNlcmlhbGl6ZXI8VCwgRD4ge1xuICAgICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXI8VCwgRD4oXG4gICAgICAgICAgICAoZGF0YSkgPT4gdGhpcy5zZXJpYWxpemUoZGF0YSksXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjayhkYXRhLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGlwZTxFPihzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8RCwgRT4pOiBTZXJpYWxpemVyPFQsIEU+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXJpYWxpemVyPFQsIEU+KFxuICAgICAgICAgICAgKGRhdGEpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuc2VyaWFsaXplKGRhdGEpKSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB0aGlzLmRlc2VyaWFsaXplKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBFeHRlbnNpb25UeXBlIH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi9hcHAnO1xuXG5jb25zdCBOQU1FU1BBQ0VfUkVHRVggPSAvXihcXC5bXi86Ll18W1xcdy1dKSskLztcbmNvbnN0IE5BTUVfUkVHRVggPSAvXlteLzpdKyQvO1xuXG5leHBvcnQgdHlwZSBJbnRvSWQgPSBJZGVudGlmaWVyIHwgc3RyaW5nIHwgRXh0ZW5zaW9uVHlwZSB8IEFwcDtcblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXIge1xuICAgIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgICAgIC4uLnBhdGg6IHN0cmluZ1tdXG4gICAgKSB7XG4gICAgICAgIElkZW50aWZpZXIudmFsaWRhdGUobmFtZXNwYWNlLCBwYXRoKTtcbiAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpZGVudGlmaWVyLmtleSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoanNvbjogc3RyaW5nKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21Kc29uKGpzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbShpZDogSW50b0lkKTogSWRlbnRpZmllciB7XG4gICAgICAgIGlmIChpZCBpbnN0YW5jZW9mIElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfSBlbHNlIGlmIChpZCBpbnN0YW5jZW9mIEFwcCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkLmlkO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb21LZXkoaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIGluZmVyXG4gICAgICAgICAgICAvLyBWaXRlIGRvZXMgbm90IHByZXNlcnZlIGNsYXNzIGluZm9ybWF0aW9uIHdoZW4gaW1wb3J0aW5nIGZyb20gZGlmZmVyZW50IHBhY2thZ2VzXG4gICAgICAgICAgICBjb25zdCBpZENhc3RlZCA9IGlkIGFzIHsgbmFtZXNwYWNlOiBzdHJpbmc7IHBhdGg6IHN0cmluZ1tdIH07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIGlkQ2FzdGVkLm5hbWVzcGFjZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGlkQ2FzdGVkLnBhdGgpICYmXG4gICAgICAgICAgICAgICAgaWRDYXN0ZWQucGF0aC5ldmVyeSgocCkgPT4gdHlwZW9mIHAgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKGlkQ2FzdGVkLm5hbWVzcGFjZSwgLi4uaWRDYXN0ZWQucGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZFdpdGhJZCA9IGlkIGFzIHsgaWQ6IEludG9JZCB8IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZFdpdGhJZC5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSWRlbnRpZmllci5mcm9tKGlkV2l0aElkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgdG8gSWRlbnRpZmllcjogJHtpZH1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbU9wdGlvbmFsKGlkOiBJbnRvSWQgfCB1bmRlZmluZWQgfCBudWxsKTogSWRlbnRpZmllciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZyb20oaWQpO1xuICAgIH1cblxuICAgIHN0YXRpYyB2YWxpZGF0ZShuYW1lc3BhY2U6IHN0cmluZywgcGF0aDogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBuYW1lc3BhY2U6IE5hbWVzcGFjZSBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXRoOiBQYXRoIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbmFtZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghTkFNRVNQQUNFX1JFR0VYLnRlc3QobmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5hbWVzcGFjZTogTmFtZXNwYWNlIG11c3QgbWF0Y2ggJHtOQU1FU1BBQ0VfUkVHRVh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHBhdGgpIHtcbiAgICAgICAgICAgIGlmICghTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhdGg6IE5hbWUgbXVzdCBtYXRjaCAke05BTUVfUkVHRVh9IGJ1dCBnb3QgJHtuYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZvcm1hdChuYW1lc3BhY2U6IHN0cmluZywgLi4ucGF0aDogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBJZGVudGlmaWVyLnZhbGlkYXRlKG5hbWVzcGFjZSwgcGF0aCk7XG4gICAgICAgIHJldHVybiBgJHtuYW1lc3BhY2V9OiR7cGF0aC5qb2luKCcvJyl9YDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUtleShrZXk6IHN0cmluZyk6IElkZW50aWZpZXIge1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSBrZXkuaW5kZXhPZignOicpO1xuICAgICAgICBpZiAoc2VwYXJhdG9yID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleTogTm8gc2VwYXJhdG9yIGZvdW5kIGluICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkuaW5kZXhPZignOicsIHNlcGFyYXRvciArIDEpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleTogTXVsdGlwbGUgc2VwYXJhdG9ycyBmb3VuZCBpbiAke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBrZXkuc2xpY2UoMCwgc2VwYXJhdG9yKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IGtleS5zbGljZShzZXBhcmF0b3IgKyAxKTtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2UgfHwgIXBhdGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXk6IE5hbWVzcGFjZSBhbmQgcGF0aCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIobmFtZXNwYWNlLCAuLi5wYXRoLnNwbGl0KCcvJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZnJvbVVybCh1cmw6IHN0cmluZyB8IFVSTCk6IElkZW50aWZpZXIge1xuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IElkZW50aWZpZXIubmFtZXNwYWNlRnJvbVVybChwYXJzZWRVcmwuaHJlZik7XG4gICAgICAgIGNvbnN0IHBhdGggPSBwYXJzZWRVcmwucGF0aG5hbWUuc2xpY2UoMSkuc3BsaXQoJy8nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyKG5hbWVzcGFjZSwgLi4ucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBuYW1lc3BhY2VGcm9tVXJsKHVybDogc3RyaW5nIHwgVVJMKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICByZXR1cm4gcGFyc2VkLmhvc3RuYW1lLnNwbGl0KCcuJykucmV2ZXJzZSgpLmpvaW4oJy4nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJhc2UoKTogSWRlbnRpZmllciB7XG4gICAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllcih0aGlzLm5hbWVzcGFjZSwgdGhpcy5wYXRoWzBdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9Kc29uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmtleSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSnNvbihqc29uOiBzdHJpbmcpOiBJZGVudGlmaWVyIHtcbiAgICAgICAgcmV0dXJuIElkZW50aWZpZXIuZnJvbUtleShqc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBJZGVudGlmaWVyLmZvcm1hdCh0aGlzLm5hbWVzcGFjZSwgLi4udGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFcXVhbChvdGhlcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXkoKSA9PT0gb3RoZXIua2V5KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzTmFtZXNwYWNlRXF1YWwob3RoZXI6IElkZW50aWZpZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlID09PSBvdGhlci5uYW1lc3BhY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU3VicGF0aE9mKG90aGVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLm5hbWVzcGFjZSAhPT0gb3RoZXIubmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGF0aC5sZW5ndGggPCBvdGhlci5wYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3RoZXIucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMucGF0aFtpXSAhPT0gb3RoZXIucGF0aFtpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbiguLi5wYXRoOiBzdHJpbmdbXSk6IElkZW50aWZpZXIge1xuICAgICAgICByZXR1cm4gbmV3IElkZW50aWZpZXIodGhpcy5uYW1lc3BhY2UsIC4uLnRoaXMucGF0aCwgLi4ucGF0aCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllck1hcDxUPiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXA6IE1hcDxzdHJpbmcsIFQ+ID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbnRyaWVzPzogSXRlcmFibGU8W0lkZW50aWZpZXIsIFRdPixcbiAgICApIHtcbiAgICAgICAgaWYgKCFlbnRyaWVzKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgW2lkLCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgdGhpcy5tYXAuc2V0KGlkLmtleSgpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnNpemU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldChpZGVudGlmaWVyOiBJZGVudGlmaWVyLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcC5zZXQoaWRlbnRpZmllci5rZXkoKSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGlkZW50aWZpZXIua2V5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcC5kZWxldGUoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcC5jbGVhcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqa2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5tYXAua2V5cygpKSB7XG4gICAgICAgICAgICB5aWVsZCBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWx1ZXMoKTogSXRlcmFibGVJdGVyYXRvcjxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcC52YWx1ZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbSWRlbnRpZmllciwgVF0+IHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5tYXAuZW50cmllcygpKSB7XG4gICAgICAgICAgICB5aWVsZCBbSWRlbnRpZmllci5mcm9tS2V5KGtleSksIHZhbHVlXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBUXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllclNldCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldC5zaXplO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoaWRlbnRpZmllcjogSWRlbnRpZmllcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldC5hZGQoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhcyhpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldC5oYXMoaWRlbnRpZmllci5rZXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShpZGVudGlmaWVyOiBJZGVudGlmaWVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0LmRlbGV0ZShpZGVudGlmaWVyLmtleSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljICprZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SWRlbnRpZmllcj4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnNldC5rZXlzKCkpIHtcbiAgICAgICAgICAgIHlpZWxkIElkZW50aWZpZXIuZnJvbUtleShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPElkZW50aWZpZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBJZGVudGlmaWVyXT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnNldC5rZXlzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBJZGVudGlmaWVyLmZyb21LZXkoa2V5KTtcbiAgICAgICAgICAgIHlpZWxkIFtpZGVudGlmaWVyLCBpZGVudGlmaWVyXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPFtJZGVudGlmaWVyLCBJZGVudGlmaWVyXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzKCk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBJZGVudGlmaWVyLCBJbnRvSWQgfSBmcm9tICcuL2lkZW50aWZpZXInO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGUgfSBmcm9tICcuL2xvY2FsaXphdGlvbi9sb2NhbGUuanMnO1xuaW1wb3J0IHR5cGUgeyBMb2NhbGl6ZWRUZXh0IH0gZnJvbSAnLi9sb2NhbGl6YXRpb24vbG9jYWxpemF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgQXBwTWV0YWRhdGEgPSB7XG4gICAgbG9jYWxlOiBMb2NhbGU7XG4gICAgbmFtZT86IExvY2FsaXplZFRleHQ7XG4gICAgaWNvbj86IExvY2FsaXplZFRleHQ7XG4gICAgZGVzY3JpcHRpb24/OiBMb2NhbGl6ZWRUZXh0O1xuICAgIGltYWdlPzogTG9jYWxpemVkVGV4dDtcbiAgICBzaXRlPzogTG9jYWxpemVkVGV4dDtcbiAgICByZXBvc2l0b3J5PzogTG9jYWxpemVkVGV4dDtcbiAgICBhdXRob3JzPzogTG9jYWxpemVkVGV4dDtcbiAgICBsaWNlbnNlPzogTG9jYWxpemVkVGV4dDtcbiAgICB0YWdzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBBcHBUeXBlID0gJ2FwcCcgfCAnc2VydmljZScgfCAncmVtb3RlJyB8ICdwbHVnaW4nIHwgJ2Rhc2hib2FyZCc7XG5cbmV4cG9ydCB0eXBlIERlcGVuZGVuY3lTcGVjaWZpZXIgPSB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICAgIGluZGV4Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXBwSnNvbiA9IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IEFwcFR5cGU7XG4gICAgcGFyZW50X2lkPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogQXBwTWV0YWRhdGE7XG4gICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG59O1xuXG5leHBvcnQgY2xhc3MgQXBwIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IElkZW50aWZpZXI7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IEFwcFR5cGU7XG4gICAgcHVibGljIHJlYWRvbmx5IHBhcmVudElkPzogSWRlbnRpZmllcjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YT86IEFwcE1ldGFkYXRhO1xuICAgIHB1YmxpYyByZWFkb25seSBkZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIERlcGVuZGVuY3lTcGVjaWZpZXIgfCBzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IEludG9JZCwgb3B0aW9uczoge1xuICAgICAgICB0eXBlPzogQXBwVHlwZTtcbiAgICAgICAgcGFyZW50SWQ/OiBJbnRvSWQ7XG4gICAgICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgICAgIHVybD86IHN0cmluZztcbiAgICAgICAgbWV0YWRhdGE/OiBBcHBNZXRhZGF0YTtcbiAgICAgICAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgRGVwZW5kZW5jeVNwZWNpZmllciB8IHN0cmluZz47XG4gICAgfSkge1xuICAgICAgICB0aGlzLmlkID0gSWRlbnRpZmllci5mcm9tKGlkKTtcbiAgICAgICAgdGhpcy5wYXJlbnRJZCA9IElkZW50aWZpZXIuZnJvbU9wdGlvbmFsKG9wdGlvbnMucGFyZW50SWQpO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb247XG4gICAgICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmw7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgPz8gJ2FwcCc7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gb3B0aW9ucy5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZXNlcmlhbGl6ZShpbmZvOiBBcHBKc29uKTogQXBwIHtcbiAgICAgICAgY29uc3QgaWQgPSBJZGVudGlmaWVyLmZyb21LZXkoaW5mby5pZCk7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKGlkLCB7XG4gICAgICAgICAgICBwYXJlbnRJZDogSWRlbnRpZmllci5mcm9tT3B0aW9uYWwoaW5mby5wYXJlbnRfaWQpLFxuICAgICAgICAgICAgdmVyc2lvbjogaW5mby52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiBpbmZvLnVybCxcbiAgICAgICAgICAgIHR5cGU6IGluZm8udHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBpbmZvLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiBpbmZvLmRlcGVuZGVuY2llcyA/PyB7fSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemUoZGF0YTogQXBwKTogQXBwSnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogZGF0YS5pZC5rZXkoKSxcbiAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgIHBhcmVudF9pZDogZGF0YS5wYXJlbnRJZD8ua2V5KCksXG4gICAgICAgICAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sXG4gICAgICAgICAgICB1cmw6IGRhdGEudXJsLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGRhdGEubWV0YWRhdGEsXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXM6IGRhdGEuZGVwZW5kZW5jaWVzLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luKC4uLnBhdGhzOiBzdHJpbmdbXSk6IEFwcCB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwKHRoaXMuaWQuam9pbiguLi5wYXRocyksIHtcbiAgICAgICAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmRlcGVuZGVuY2llcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IElkZW50aWZpZXIgfSBmcm9tICcuLi8uLi9pZGVudGlmaWVyJztcbmltcG9ydCB7IEpzb25UeXBlLCB0eXBlIFNlcmlhbGl6YWJsZSwgU2VyaWFsaXplciB9IGZyb20gJy4uLy4uL3NlcmlhbGl6ZSc7XG5cbmV4cG9ydCB0eXBlIFBhY2tldERhdGEgPSB7XG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGRhdGE6IFVpbnQ4QXJyYXk7XG59O1xuXG5leHBvcnQgdHlwZSBQYWNrZXQ8VCA9IHVua25vd24+ID0ge1xuICAgIHJlYWRvbmx5IHR5cGU6IFBhY2tldFR5cGU8VD47XG4gICAgcmVhZG9ubHkgZGF0YTogVDtcbn07XG5cbmV4cG9ydCBjbGFzcyBQYWNrZXRUeXBlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGlkOiBJZGVudGlmaWVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc2VyaWFsaXplcjogU2VyaWFsaXphYmxlPFQsIFVpbnQ4QXJyYXk+LFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmV3KGRhdGE6IFQpOiBQYWNrZXQ8VD4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdGhpcyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBtYXRjaChwYWNrZXQ6IFBhY2tldCk6IHBhY2tldCBpcyBQYWNrZXQ8VD4ge1xuICAgICAgICByZXR1cm4gcGFja2V0LnR5cGUgPT09IHRoaXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZUpzb248VCwgRCBleHRlbmRzIEpzb25UeXBlID0gSnNvblR5cGU+KGlkZW50aWZpZXI6IElkZW50aWZpZXIsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2VyaWFsaXplcixcbiAgICB9OiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgc2VyaWFsaXplcj86IFNlcmlhbGl6YWJsZTxULCBEPjtcbiAgICB9KTogUGFja2V0VHlwZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFja2V0VHlwZTxUPihcbiAgICAgICAgICAgIGlkZW50aWZpZXIuam9pbihuYW1lKSxcbiAgICAgICAgICAgIFNlcmlhbGl6ZXIucGlwZTxULCBELCBVaW50OEFycmF5PihzZXJpYWxpemVyID8/IFNlcmlhbGl6ZXIubm9vcCgpLCBTZXJpYWxpemVyLmpzb24oKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVNlcmlhbGl6ZWQ8VD4oaWRlbnRpZmllcjogSWRlbnRpZmllciwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBzZXJpYWxpemVyLFxuICAgIH06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBzZXJpYWxpemVyOiBTZXJpYWxpemFibGU8VCwgVWludDhBcnJheT47XG4gICAgfSk6IFBhY2tldFR5cGU8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhY2tldFR5cGUoXG4gICAgICAgICAgICBpZGVudGlmaWVyLmpvaW4obmFtZSksXG4gICAgICAgICAgICBzZXJpYWxpemVyLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBBcHBKc29uIH0gZnJvbSAnLi4vLi4vYXBwLmpzJztcbmltcG9ydCB7IEFwcCB9IGZyb20gJy4uLy4uL2FwcC5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyIH0gZnJvbSAnLi4vLi4vaWRlbnRpZmllcic7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSAnLi4vLi4vc2VyaWFsaXplL3NlcmlhbGl6ZXIuanMnO1xuaW1wb3J0IHsgUGFja2V0VHlwZSB9IGZyb20gJy4vcGFja2V0LmpzJztcblxuY29uc3QgSURFTlRJRklFUiA9IG5ldyBJZGVudGlmaWVyKCdjb3JlJywgJ3BhY2tldCcpO1xuXG50eXBlIFByb3RvY29sSW5mbyA9IHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG59O1xuXG50eXBlIFJTQU51bWJlcnMgPSB7XG4gICAgZTogc3RyaW5nO1xuICAgIG46IHN0cmluZztcbn07XG5cbnR5cGUgRW5jcnlwdGlvblJlcXVlc3QgPSB7XG4gICAga2luZDogJ3YxJztcbiAgICByc2E6IFJTQU51bWJlcnM7XG59O1xuXG50eXBlIEVuY3J5cHRpb25SZXNwb25zZSA9IHtcbiAgICBraW5kOiAndjEnO1xuICAgIHJzYTogUlNBTnVtYmVycztcbiAgICBhZXM6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNlcnZlck1ldGEgPSB7XG4gICAgcHJvdG9jb2w6IFByb3RvY29sSW5mbztcbiAgICBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVxdWVzdCB8IG51bGw7XG4gICAgaGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufTtcblxudHlwZSBDb25uZWN0UGFja2V0SnNvbiA9IHtcbiAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgIGFwcDogQXBwSnNvbjtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGVuY3J5cHRpb246IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHByb3RvY29sOiBQcm90b2NvbEluZm87XG4gICAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICAgIHB1YmxpYyByZWFkb25seSB0b2tlbjogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uUmVzcG9uc2UgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICBwcm90b2NvbDogUHJvdG9jb2xJbmZvO1xuICAgICAgICBhcHA6IEFwcDtcbiAgICAgICAgdG9rZW46IHN0cmluZztcbiAgICAgICAgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25SZXNwb25zZSB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbDtcbiAgICAgICAgdGhpcy5hcHAgPSBvcHRpb25zLmFwcDtcbiAgICAgICAgdGhpcy50b2tlbiA9IG9wdGlvbnMudG9rZW47XG4gICAgICAgIHRoaXMuZW5jcnlwdGlvbiA9IG9wdGlvbnMuZW5jcnlwdGlvbiA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogQ29ubmVjdFBhY2tldEpzb24pOiBDb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0UGFja2V0KHtcbiAgICAgICAgICAgIHByb3RvY29sOiBkYXRhLnByb3RvY29sLFxuICAgICAgICAgICAgYXBwOiBBcHAuZGVzZXJpYWxpemUoZGF0YS5hcHApLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogZGF0YS5lbmNyeXB0aW9uLFxuICAgICAgICAgICAgdG9rZW46IGRhdGEudG9rZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IENvbm5lY3RQYWNrZXQpOiBDb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcm90b2NvbDogZGF0YS5wcm90b2NvbCxcbiAgICAgICAgICAgIGFwcDogQXBwLnNlcmlhbGl6ZShkYXRhLmFwcCksXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBkYXRhLmVuY3J5cHRpb24sXG4gICAgICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBlbnVtIERpc2Nvbm5lY3RUeXBlIHtcbiAgICBJTlZBTElEX1RPS0VOID0gJ2ludmFsaWRfdG9rZW4nLFxuICAgIElOVkFMSURfT1JJR0lOID0gJ2ludmFsaWRfb3JpZ2luJyxcbiAgICBJTlZBTElEX1ZFUlNJT04gPSAnaW52YWxpZF92ZXJzaW9uJyxcbiAgICBJTlZBTElEX1BBQ0tFVF9UWVBFID0gJ2ludmFsaWRfcGFja2V0X3R5cGUnLFxuICAgIElOVkFMSURfUEFDS0VUX0RBVEEgPSAnaW52YWxpZF9wYWNrZXRfZGF0YScsXG4gICAgSU5WQUxJRF9QQUNLRVQgPSAnaW52YWxpZF9wYWNrZXQnLFxuICAgIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsX2Vycm9yJyxcbiAgICBBTk9USEVSX0NPTk5FQ1RJT04gPSAnYW5vdGhlcl9jb25uZWN0aW9uJyxcbiAgICBQRVJNSVNTSU9OX0RFTklFRCA9ICdwZXJtaXNzaW9uX2RlbmllZCcsXG4gICAgQVBQX1JFTU9WRUQgPSAnYXBwX3JlbW92ZWQnLFxuICAgIFNFUlZFUl9SRVNUQVJUID0gJ3NlcnZlcl9yZXN0YXJ0JyxcbiAgICBTSFVURE9XTiA9ICdzaHV0ZG93bicsXG4gICAgQ0xPU0UgPSAnY2xvc2UnLFxufVxuXG50eXBlIERpc2Nvbm5lY3RQYWNrZXRKc29uID0ge1xuICAgIHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIG1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgY2xhc3MgRGlzY29ubmVjdFBhY2tldCB7XG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU6IERpc2Nvbm5lY3RUeXBlO1xuICAgIHB1YmxpYyByZWFkb25seSBtZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgICAgICB0eXBlOiBEaXNjb25uZWN0VHlwZTtcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG4gICAgfSkge1xuICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXQpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiBkYXRhLnRvSnNvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemUoZGF0YTogRGlzY29ubmVjdFBhY2tldEpzb24pOiBEaXNjb25uZWN0UGFja2V0IHtcbiAgICAgICAgcmV0dXJuIERpc2Nvbm5lY3RQYWNrZXQuZnJvbUpzb24oZGF0YSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21Kc29uKGRhdGE6IERpc2Nvbm5lY3RQYWNrZXRKc29uKTogRGlzY29ubmVjdFBhY2tldCB7XG4gICAgICAgIHJldHVybiBuZXcgRGlzY29ubmVjdFBhY2tldCh7XG4gICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBkYXRhLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRvSnNvbigpOiBEaXNjb25uZWN0UGFja2V0SnNvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUEFDS0VUX1RZUEVTOiB7XG4gICAgU0VSVkVSX01FVEE6IFBhY2tldFR5cGU8U2VydmVyTWV0YT47XG4gICAgQ09OTkVDVDogUGFja2V0VHlwZTxDb25uZWN0UGFja2V0PjtcbiAgICBESVNDT05ORUNUOiBQYWNrZXRUeXBlPERpc2Nvbm5lY3RQYWNrZXQ+O1xuICAgIFRPS0VOOiBQYWNrZXRUeXBlPHN0cmluZz47XG4gICAgUkVBRFk6IFBhY2tldFR5cGU8dW5kZWZpbmVkPjtcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlPFVpbnQ4QXJyYXk+O1xufSA9IHtcbiAgICBTRVJWRVJfTUVUQTogUGFja2V0VHlwZS5jcmVhdGVKc29uPFNlcnZlck1ldGE+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3NlcnZlcl9tZXRhJyxcbiAgICB9KSxcbiAgICBDT05ORUNUOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248Q29ubmVjdFBhY2tldD4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnY29ubmVjdCcsXG4gICAgICAgIHNlcmlhbGl6ZXI6IENvbm5lY3RQYWNrZXQsXG4gICAgfSksXG4gICAgRElTQ09OTkVDVDogUGFja2V0VHlwZS5jcmVhdGVKc29uPERpc2Nvbm5lY3RQYWNrZXQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ2Rpc2Nvbm5lY3QnLFxuICAgICAgICBzZXJpYWxpemVyOiBEaXNjb25uZWN0UGFja2V0LFxuICAgIH0pLFxuICAgIFRPS0VOOiBQYWNrZXRUeXBlLmNyZWF0ZUpzb248c3RyaW5nPihJREVOVElGSUVSLCB7XG4gICAgICAgIG5hbWU6ICd0b2tlbicsXG4gICAgfSksXG4gICAgUkVBRFk6IFBhY2tldFR5cGUuY3JlYXRlSnNvbjx1bmRlZmluZWQ+KElERU5USUZJRVIsIHtcbiAgICAgICAgbmFtZTogJ3JlYWR5JyxcbiAgICB9KSxcbiAgICBFTkNSWVBURURfUEFDS0VUOiBQYWNrZXRUeXBlLmNyZWF0ZVNlcmlhbGl6ZWQ8VWludDhBcnJheT4oSURFTlRJRklFUiwge1xuICAgICAgICBuYW1lOiAnZScsXG4gICAgICAgIHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXIubm9vcCgpLFxuICAgIH0pLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgdGV4dERlY29kZXIsIHRleHRFbmNvZGVyIH0gZnJvbSAnLi4vY29uc3QnO1xuaW1wb3J0IHsgQnl0ZVJlYWRlciwgQnl0ZVdyaXRlciB9IGZyb20gJy4uL3NlcmlhbGl6ZSc7XG5pbXBvcnQgeyBQYWNrZXQsIFBhY2tldERhdGEgfSBmcm9tICcuL3BhY2tldCc7XG5pbXBvcnQgeyBQQUNLRVRfVFlQRVMgfSBmcm9tICcuL3BhY2tldC9wYWNrZXQtdHlwZXMnO1xuXG5mdW5jdGlvbiBiYXNlNjRVcmxFbmNvZGUoYnVmZmVyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVmZmVyXG4gICAgICAgIC50b0Jhc2U2NCgpXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAgICAgICAucmVwbGFjZSgvXFwvL2csICdfJylcbiAgICAgICAgLnJlcGxhY2UoLz0vZywgJycpO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoZGF0YTogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoZGF0YS5sZW5ndGggJSA0KSB7XG4gICAgICAgIGRhdGEgKz0gJz0nO1xuICAgIH1cbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tQmFzZTY0KGRhdGEpO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIodTg6IFVpbnQ4QXJyYXkpOiBBcnJheUJ1ZmZlciB7XG4gICAgY29uc3QgYnVmID0gbmV3IEFycmF5QnVmZmVyKHU4Lmxlbmd0aCk7XG4gICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgdmlldy5zZXQodTgpO1xuICAgIHJldHVybiBidWY7XG59XG5cbnR5cGUgUlNBTnVtYmVycyA9IHtcbiAgICBlOiBzdHJpbmc7XG4gICAgbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRW5jcnlwdGlvblJlc3BvbnNlID0ge1xuICAgIGtpbmQ6ICd2MSc7XG4gICAgcnNhOiBSU0FOdW1iZXJzO1xuICAgIGFlczogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IEVOQ1JZUFRJT05fQVZBSUxBQkxFOiBib29sZWFuID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgISFjcnlwdG8uc3VidGxlO1xuXG5leHBvcnQgY2xhc3MgRGVjcnlwdG9yIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHByaXZhdGVLZXk6IENyeXB0b0tleSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwdWJsaWNLZXk6IENyeXB0b0tleSxcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIG5ldygpOiBQcm9taXNlPERlY3J5cHRvcj4ge1xuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXksIHB1YmxpY0tleSB9ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgICAgIG1vZHVsdXNMZW5ndGg6IDQwOTYsXG4gICAgICAgICAgICAgICAgcHVibGljRXhwb25lbnQ6IG5ldyBVaW50OEFycmF5KFsxLCAwLCAxXSksXG4gICAgICAgICAgICAgICAgaGFzaDogJ1NIQS0yNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBuZXcgRGVjcnlwdG9yKHByaXZhdGVLZXksIHB1YmxpY0tleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHRvUmVxdWVzdCgpOiBQcm9taXNlPFJTQU51bWJlcnM+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoJ2p3aycsIHRoaXMucHVibGljS2V5KTtcbiAgICAgICAgaWYgKCFrZXkuZSkgdGhyb3cgbmV3IEVycm9yKCdLZXkgZXhwb3J0IGZhaWxlZDogbWlzc2luZyBleHBvbmVudCcpO1xuICAgICAgICBpZiAoIWtleS5uKSB0aHJvdyBuZXcgRXJyb3IoJ0tleSBleHBvcnQgZmFpbGVkOiBtaXNzaW5nIG1vZHVsdXMnKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGU6IGtleS5lLFxuICAgICAgICAgICAgbjoga2V5Lm4sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlY3J5cHQoZGF0YTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHsgbmFtZTogJ1JTQS1PQUVQJyB9LFxuICAgICAgICAgICAgdGhpcy5wcml2YXRlS2V5LFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVjcnlwdFN0cmluZyhkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7IG5hbWU6ICdSU0EtT0FFUCcgfSxcbiAgICAgICAgICAgIHRoaXMucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihiYXNlNjRVcmxEZWNvZGUoZGF0YSkpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGV4dERlY29kZXIuZGVjb2RlKGRlY3J5cHRlZCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5jcnlwdG9yIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHB1YmxpY0tleTogQ3J5cHRvS2V5LFxuICAgICkge31cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbmV3KHJlcXVlc3Q6IFJTQU51bWJlcnMpOiBQcm9taXNlPEVuY3J5cHRvcj4ge1xuICAgICAgICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgICAgICdqd2snLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFsZzogJ1JTQS1PQUVQLTI1NicsXG4gICAgICAgICAgICAgICAgZXh0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGtleV9vcHM6IFsnZW5jcnlwdCddLFxuICAgICAgICAgICAgICAgIGt0eTogJ1JTQScsXG4gICAgICAgICAgICAgICAgZTogcmVxdWVzdC5lLnJlcGxhY2UoLz0rJC8sICcnKSxcbiAgICAgICAgICAgICAgICBuOiByZXF1ZXN0Lm4ucmVwbGFjZSgvPSskLywgJycpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnLFxuICAgICAgICAgICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgWydlbmNyeXB0J10sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgRW5jcnlwdG9yKHB1YmxpY0tleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuY3J5cHQoZGF0YTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnB1YmxpY0tleSxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuY3J5cHRTdHJpbmcoZGF0YTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5wdWJsaWNLZXksXG4gICAgICAgICAgICB0ZXh0RW5jb2Rlci5lbmNvZGUoZGF0YSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQUVTIHtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGtleTogQ3J5cHRvS2V5LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGl2OiBBcnJheUJ1ZmZlcixcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIG5ldygpOiBQcm9taXNlPEFFUz4ge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDEyOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXYgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDE2KSk7XG4gICAgICAgIHJldHVybiBuZXcgQUVTKGtleSwgaXYuYnVmZmVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc2VyaWFsaXplKGFlczogc3RyaW5nLCBkZWNyeXB0b3I6IERlY3J5cHRvcik6IFByb21pc2U8QUVTPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY3J5cHRvci5kZWNyeXB0KGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihiYXNlNjRVcmxEZWNvZGUoYWVzKSkpO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBCeXRlUmVhZGVyLmZyb21BcnJheUJ1ZmZlcihkZWNyeXB0ZWQpO1xuICAgICAgICBjb25zdCBrZXkgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgY29uc3QgaXYgPSByZWFkZXIucmVhZFVpbnQ4QXJyYXkoKTtcblxuICAgICAgICBjb25zdCBrZXlfZW5jb2RlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAgICAgJ3JhdycsXG4gICAgICAgICAgICBjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIoa2V5KSxcbiAgICAgICAgICAgICdBRVMtQ0JDJyxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBRVMoXG4gICAgICAgICAgICBrZXlfZW5jb2RlZCxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihpdiksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlcmlhbGl6ZShlbmNyeXB0b3I6IEVuY3J5cHRvcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCdyYXcnLCB0aGlzLmtleSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkocmF3S2V5KSk7XG4gICAgICAgIHdyaXRlci53cml0ZVVpbnQ4QXJyYXkobmV3IFVpbnQ4QXJyYXkodGhpcy5pdikpO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBlbmNyeXB0b3IuZW5jcnlwdChjb252ZXJ0VWludDhBcnJheVRvQXJyYXlCdWZmZXIod3JpdGVyLmZpbmlzaCgpKSk7XG4gICAgICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVuY3J5cHQoZGF0YTogUGFja2V0RGF0YSk6IFByb21pc2U8UGFja2V0PiB7XG4gICAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCeXRlV3JpdGVyKCk7XG4gICAgICAgIHdyaXRlci53cml0ZVN0cmluZyhkYXRhLnR5cGUpO1xuICAgICAgICB3cml0ZXIud3JpdGVVaW50OEFycmF5KGRhdGEuZGF0YSk7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgICAgICAgaXY6IHRoaXMuaXYsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleSxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcih3cml0ZXIuZmluaXNoKCkpLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gUEFDS0VUX1RZUEVTLkVOQ1JZUFRFRF9QQUNLRVQubmV3KG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWNyeXB0KHBhY2tldDogUGFja2V0PFVpbnQ4QXJyYXk+KTogUHJvbWlzZTxQYWNrZXREYXRhPiB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG4gICAgICAgICAgICAgICAgaXY6IHRoaXMuaXYsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxNixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleSxcbiAgICAgICAgICAgIGNvbnZlcnRVaW50OEFycmF5VG9BcnJheUJ1ZmZlcihwYWNrZXQuZGF0YSksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IEJ5dGVSZWFkZXIuZnJvbUFycmF5QnVmZmVyKGRlY3J5cHRlZCk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSByZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhID0gcmVhZGVyLnJlYWRVaW50OEFycmF5KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iCiAgXSwKICAibWFw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