@witnet/sdk 1.0.15 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +13 -13
- package/dist/src/bin/helpers.d.ts +1 -0
- package/dist/src/bin/helpers.d.ts.map +1 -1
- package/dist/src/bin/helpers.js +34 -5
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +7 -4
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads/DataRequestPayload.js +42 -16
- package/dist/src/lib/crypto/payloads.d.ts.map +1 -1
- package/dist/src/lib/crypto/payloads.js +1 -2
- package/dist/src/lib/crypto/signer.js +12 -9
- package/dist/src/lib/crypto/transmitters.js +2 -2
- package/dist/src/lib/crypto/types.d.ts.map +1 -1
- package/dist/src/lib/crypto/types.js +1 -2
- package/dist/src/lib/radon/index.d.ts +4 -2
- package/dist/src/lib/radon/index.d.ts.map +1 -1
- package/dist/src/lib/radon/index.js +50 -32
- package/dist/src/lib/radon/types.d.ts +31 -27
- package/dist/src/lib/radon/types.d.ts.map +1 -1
- package/dist/src/lib/radon/types.js +88 -46
- package/dist/src/lib/radon/utils.js +3 -3
- package/dist/src/lib/rpc/provider.d.ts +12 -0
- package/dist/src/lib/rpc/provider.d.ts.map +1 -1
- package/dist/src/lib/rpc/provider.js +11 -1
- package/dist/witnet/assets/index.d.ts +1 -2
- package/dist/witnet/assets/modals/index.d.ts +1 -2
- package/dist/witnet/assets/modals/web3/eth.js +3 -3
- package/dist/witnet/assets/modals/web3/ipfs.d.ts +1 -2
- package/dist/witnet/assets/modals/web3/ipfs.js +11 -9
- package/dist/witnet/assets/modals/web3/wit.js +4 -4
- package/dist/witnet/assets/requests.js +6 -51
- package/package.json +13 -13
- package/src/bin/cli/inspect.js +103 -13
- package/src/bin/cli/radon.js +157 -79
- package/src/bin/cli/wallet.js +4 -6
- package/src/bin/helpers.js +37 -4
- package/src/bin/toolkit.js +2 -2
- package/witnet/assets/modals/web3/eth.js +2 -2
- package/witnet/assets/modals/web3/ipfs.js +9 -6
- package/witnet/assets/modals/web3/wit.js +3 -3
- package/witnet/assets/requests.js +5 -51
|
@@ -41,12 +41,34 @@ var RadonEncodings;
|
|
|
41
41
|
(function (RadonEncodings) {
|
|
42
42
|
RadonEncodings[RadonEncodings["HexString"] = 0] = "HexString";
|
|
43
43
|
RadonEncodings[RadonEncodings["Base64"] = 1] = "Base64";
|
|
44
|
+
RadonEncodings[RadonEncodings["Utf8"] = 2] = "Utf8";
|
|
44
45
|
})(RadonEncodings || (exports.RadonEncodings = RadonEncodings = {}));
|
|
46
|
+
var RadonHashFunctions;
|
|
47
|
+
(function (RadonHashFunctions) {
|
|
48
|
+
// Blake256 = 0x00,
|
|
49
|
+
// Blake512 = 0x01,
|
|
50
|
+
// Blake2s256 = 0x02,
|
|
51
|
+
// Blake2b512 = 0x03,
|
|
52
|
+
// MD5_128 = 0x04,
|
|
53
|
+
// Ripemd128 = 0x05,
|
|
54
|
+
// Ripemd160 = 0x06,
|
|
55
|
+
// Ripemd320 = 0x07,
|
|
56
|
+
// SHA1_160 = 0x08,
|
|
57
|
+
// SHA2_224 = 0x09,
|
|
58
|
+
RadonHashFunctions[RadonHashFunctions["SHA2_256"] = 10] = "SHA2_256";
|
|
59
|
+
// SHA2_384 = 0x0B,
|
|
60
|
+
// SHA2_512 = 0x0C,
|
|
61
|
+
// SHA3_224 = 0x0D,
|
|
62
|
+
// SHA3_256 = 0x0E,
|
|
63
|
+
// SHA3_384 = 0x0F,
|
|
64
|
+
// SHA3_512 = 0x10,
|
|
65
|
+
// Whirlpool512 = 0x11,
|
|
66
|
+
})(RadonHashFunctions || (RadonHashFunctions = {}));
|
|
45
67
|
var RadonOperators;
|
|
46
68
|
(function (RadonOperators) {
|
|
47
69
|
RadonOperators[RadonOperators["ArrayLength"] = 16] = "ArrayLength";
|
|
48
70
|
RadonOperators[RadonOperators["ArrayFilter"] = 17] = "ArrayFilter";
|
|
49
|
-
|
|
71
|
+
// ArrayJoin = 0x12,
|
|
50
72
|
RadonOperators[RadonOperators["ArrayGetArray"] = 19] = "ArrayGetArray";
|
|
51
73
|
RadonOperators[RadonOperators["ArrayGetBoolean"] = 20] = "ArrayGetBoolean";
|
|
52
74
|
RadonOperators[RadonOperators["ArrayGetBytes"] = 21] = "ArrayGetBytes";
|
|
@@ -57,16 +79,16 @@ var RadonOperators;
|
|
|
57
79
|
RadonOperators[RadonOperators["ArrayMap"] = 26] = "ArrayMap";
|
|
58
80
|
RadonOperators[RadonOperators["ArrayReduce"] = 27] = "ArrayReduce";
|
|
59
81
|
RadonOperators[RadonOperators["ArraySort"] = 29] = "ArraySort";
|
|
60
|
-
|
|
61
|
-
RadonOperators[RadonOperators["
|
|
82
|
+
// ArrayPick = 0x1e,
|
|
83
|
+
RadonOperators[RadonOperators["BooleanToString"] = 32] = "BooleanToString";
|
|
62
84
|
RadonOperators[RadonOperators["BooleanNegate"] = 34] = "BooleanNegate";
|
|
63
|
-
RadonOperators[RadonOperators["
|
|
85
|
+
RadonOperators[RadonOperators["BytesToString"] = 48] = "BytesToString";
|
|
64
86
|
RadonOperators[RadonOperators["BytesHash"] = 49] = "BytesHash";
|
|
65
87
|
RadonOperators[RadonOperators["BytesAsInteger"] = 50] = "BytesAsInteger";
|
|
66
88
|
RadonOperators[RadonOperators["BytesLength"] = 52] = "BytesLength";
|
|
67
89
|
RadonOperators[RadonOperators["BytesSlice"] = 60] = "BytesSlice";
|
|
68
90
|
RadonOperators[RadonOperators["FloatAbsolute"] = 80] = "FloatAbsolute";
|
|
69
|
-
RadonOperators[RadonOperators["
|
|
91
|
+
RadonOperators[RadonOperators["FloatToString"] = 81] = "FloatToString";
|
|
70
92
|
RadonOperators[RadonOperators["FloatCeiling"] = 82] = "FloatCeiling";
|
|
71
93
|
RadonOperators[RadonOperators["FloatGreaterThan"] = 83] = "FloatGreaterThan";
|
|
72
94
|
RadonOperators[RadonOperators["FloatFloor"] = 84] = "FloatFloor";
|
|
@@ -79,7 +101,7 @@ var RadonOperators;
|
|
|
79
101
|
RadonOperators[RadonOperators["FloatTruncate"] = 93] = "FloatTruncate";
|
|
80
102
|
RadonOperators[RadonOperators["IntegerAbsolute"] = 64] = "IntegerAbsolute";
|
|
81
103
|
RadonOperators[RadonOperators["IntegerToFloat"] = 65] = "IntegerToFloat";
|
|
82
|
-
RadonOperators[RadonOperators["
|
|
104
|
+
RadonOperators[RadonOperators["IntegerToString"] = 66] = "IntegerToString";
|
|
83
105
|
RadonOperators[RadonOperators["IntegerGreaterThan"] = 67] = "IntegerGreaterThan";
|
|
84
106
|
RadonOperators[RadonOperators["IntegerLessThan"] = 68] = "IntegerLessThan";
|
|
85
107
|
RadonOperators[RadonOperators["IntegerModulo"] = 70] = "IntegerModulo";
|
|
@@ -87,7 +109,7 @@ var RadonOperators;
|
|
|
87
109
|
RadonOperators[RadonOperators["IntegerNegate"] = 72] = "IntegerNegate";
|
|
88
110
|
RadonOperators[RadonOperators["IntegerPower"] = 73] = "IntegerPower";
|
|
89
111
|
RadonOperators[RadonOperators["IntegerToBytes"] = 74] = "IntegerToBytes";
|
|
90
|
-
RadonOperators[RadonOperators["
|
|
112
|
+
RadonOperators[RadonOperators["MapToString"] = 96] = "MapToString";
|
|
91
113
|
RadonOperators[RadonOperators["MapGetArray"] = 97] = "MapGetArray";
|
|
92
114
|
RadonOperators[RadonOperators["MapGetBoolean"] = 98] = "MapGetBoolean";
|
|
93
115
|
RadonOperators[RadonOperators["MapGetFloat"] = 100] = "MapGetFloat";
|
|
@@ -101,6 +123,7 @@ var RadonOperators;
|
|
|
101
123
|
RadonOperators[RadonOperators["StringAsBoolean"] = 112] = "StringAsBoolean";
|
|
102
124
|
RadonOperators[RadonOperators["StringAsBytes"] = 113] = "StringAsBytes";
|
|
103
125
|
RadonOperators[RadonOperators["StringAsFloat"] = 114] = "StringAsFloat";
|
|
126
|
+
RadonOperators[RadonOperators["StringAsInteger"] = 115] = "StringAsInteger";
|
|
104
127
|
RadonOperators[RadonOperators["StringLength"] = 116] = "StringLength";
|
|
105
128
|
RadonOperators[RadonOperators["StringMatch"] = 117] = "StringMatch";
|
|
106
129
|
RadonOperators[RadonOperators["StringParseJSONArray"] = 118] = "StringParseJSONArray";
|
|
@@ -108,9 +131,9 @@ var RadonOperators;
|
|
|
108
131
|
RadonOperators[RadonOperators["StringParseXMLMap"] = 120] = "StringParseXMLMap";
|
|
109
132
|
RadonOperators[RadonOperators["StringToLowerCase"] = 121] = "StringToLowerCase";
|
|
110
133
|
RadonOperators[RadonOperators["StringToUppserCase"] = 122] = "StringToUppserCase";
|
|
111
|
-
RadonOperators[RadonOperators["
|
|
112
|
-
RadonOperators[RadonOperators["
|
|
113
|
-
RadonOperators[RadonOperators["
|
|
134
|
+
RadonOperators[RadonOperators["StringReplace"] = 123] = "StringReplace";
|
|
135
|
+
RadonOperators[RadonOperators["StringSlice"] = 124] = "StringSlice";
|
|
136
|
+
RadonOperators[RadonOperators["StringSplit"] = 125] = "StringSplit";
|
|
114
137
|
})(RadonOperators || (exports.RadonOperators = RadonOperators = {}));
|
|
115
138
|
class RadonClass {
|
|
116
139
|
constructor(prev) {
|
|
@@ -150,7 +173,7 @@ class RadonOperator extends RadonClass {
|
|
|
150
173
|
if (this.params && this.params[0] !== undefined) {
|
|
151
174
|
this.params.map(param => {
|
|
152
175
|
if (typeof param !== 'object' || !(param instanceof RadonScript)) {
|
|
153
|
-
args += (typeof param === 'string' ? `"${param}"` :
|
|
176
|
+
args += (typeof param === 'string' ? `"${param}"` : JSON.stringify(param)) + ", ";
|
|
154
177
|
}
|
|
155
178
|
else {
|
|
156
179
|
script = param;
|
|
@@ -188,6 +211,9 @@ class RadonOperator extends RadonClass {
|
|
|
188
211
|
else if (param instanceof RadonScript) {
|
|
189
212
|
return param.encode();
|
|
190
213
|
}
|
|
214
|
+
else {
|
|
215
|
+
return param;
|
|
216
|
+
}
|
|
191
217
|
}
|
|
192
218
|
else {
|
|
193
219
|
return param;
|
|
@@ -213,8 +239,13 @@ class RadonOperator extends RadonClass {
|
|
|
213
239
|
if (typeof param === 'string') {
|
|
214
240
|
return helpers.replaceWildcards(param, args);
|
|
215
241
|
}
|
|
216
|
-
else if (typeof param === 'object'
|
|
217
|
-
|
|
242
|
+
else if (typeof param === 'object') {
|
|
243
|
+
if (param instanceof RadonScript) {
|
|
244
|
+
return param.replaceWildcards(...args);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
return helpers.replaceWildcards(param, args);
|
|
248
|
+
}
|
|
218
249
|
}
|
|
219
250
|
else {
|
|
220
251
|
return param;
|
|
@@ -284,6 +315,23 @@ class RadonScript {
|
|
|
284
315
|
argsCount() {
|
|
285
316
|
return this.ops?.argsCount() || 0;
|
|
286
317
|
}
|
|
318
|
+
clone() {
|
|
319
|
+
const OutputType = [
|
|
320
|
+
RadonArray,
|
|
321
|
+
RadonBoolean,
|
|
322
|
+
RadonBytes,
|
|
323
|
+
RadonFloat,
|
|
324
|
+
RadonInteger,
|
|
325
|
+
RadonMap,
|
|
326
|
+
RadonString,
|
|
327
|
+
].find(OutputType => this.outputType instanceof OutputType);
|
|
328
|
+
if (OutputType) {
|
|
329
|
+
return new OutputType(this.ops);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
throw EvalError(`Cannot clone from empty script`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
287
335
|
disect(level = 0) {
|
|
288
336
|
return this.ops?.disect(level) || [[level, "RadonAny", ""]];
|
|
289
337
|
}
|
|
@@ -427,12 +475,10 @@ class RadonArray extends RadonAny {
|
|
|
427
475
|
* @param separator Separator to be used when joining strings. When joining RadonMaps, it can be used to settle base schema on resulting object.
|
|
428
476
|
* @param outputType Radon type of the output value.
|
|
429
477
|
*/
|
|
430
|
-
join(separator = "", outputType) {
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
this._pushOperator((RadonArray), [separator]);
|
|
435
|
-
}
|
|
478
|
+
// public join<OutputType extends RadonAny = RadonAny>(separator = "", outputType?: { new(): ItemsType; }) {
|
|
479
|
+
// if (outputType) this._pushOperator(RadonArray<OutputType>, [separator])
|
|
480
|
+
// else this._pushOperator(RadonArray<ItemsType>, [separator])
|
|
481
|
+
// }
|
|
436
482
|
/**
|
|
437
483
|
* Count the number of items.
|
|
438
484
|
* @returns A `RadonInteger` object.
|
|
@@ -469,20 +515,8 @@ class RadonArray extends RadonAny {
|
|
|
469
515
|
* @param innerScript (Optional) Sorting script returning either a `RadonInteger` or a `RadonString` object.
|
|
470
516
|
* @returns A `RadonArray` object.
|
|
471
517
|
*/
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
// return this._pushOperator(RadonArray<ItemsType>, [innerScript])
|
|
475
|
-
// }
|
|
476
|
-
/**
|
|
477
|
-
* Take a selection of items from the input array.
|
|
478
|
-
* @param indexes Indexes of the input items to take into the output array.
|
|
479
|
-
* @return A `RadonArray` object.
|
|
480
|
-
*/
|
|
481
|
-
pick(...indexes) {
|
|
482
|
-
if (Array(indexes).length == 0) {
|
|
483
|
-
throw new EvalError(`\x1b[1;33mRadonArray::pick: a non-empty array of numbers must be provided\x1b[0m`);
|
|
484
|
-
}
|
|
485
|
-
return this._pushOperator((RadonArray), [...indexes]);
|
|
518
|
+
sort(innerScript) {
|
|
519
|
+
return this._pushOperator((RadonArray), [innerScript]);
|
|
486
520
|
}
|
|
487
521
|
}
|
|
488
522
|
exports.RadonArray = RadonArray;
|
|
@@ -498,7 +532,7 @@ class RadonBoolean extends RadonAny {
|
|
|
498
532
|
* Cast value into a string.
|
|
499
533
|
* @returns A `RadonString` object.
|
|
500
534
|
*/
|
|
501
|
-
|
|
535
|
+
toString() {
|
|
502
536
|
return this._pushOperator(RadonString, []);
|
|
503
537
|
}
|
|
504
538
|
}
|
|
@@ -506,7 +540,7 @@ exports.RadonBoolean = RadonBoolean;
|
|
|
506
540
|
class RadonBytes extends RadonAny {
|
|
507
541
|
/**
|
|
508
542
|
* Convert buffer into (big-endian) integer.
|
|
509
|
-
* @returns A `
|
|
543
|
+
* @returns A `RadonInteger` object.
|
|
510
544
|
*/
|
|
511
545
|
asInteger() {
|
|
512
546
|
return this._pushOperator(RadonInteger, []);
|
|
@@ -516,7 +550,7 @@ class RadonBytes extends RadonAny {
|
|
|
516
550
|
* @returns A `RadonBytes` object.
|
|
517
551
|
*/
|
|
518
552
|
hash() {
|
|
519
|
-
return this._pushOperator(RadonBytes, []);
|
|
553
|
+
return this._pushOperator(RadonBytes, [RadonBytes.Hashers.SHA2_256]);
|
|
520
554
|
}
|
|
521
555
|
/**
|
|
522
556
|
* Count the number of bytes.
|
|
@@ -541,14 +575,16 @@ class RadonBytes extends RadonAny {
|
|
|
541
575
|
* @param encoding Enum integer value specifying the encoding schema on the output string, standing:
|
|
542
576
|
* 0 -> Hex string (default, if none was specified)
|
|
543
577
|
* 1 -> Base64 string
|
|
578
|
+
* 2 -> Utf-8 string
|
|
544
579
|
* @returns A `RadonString` object.
|
|
545
580
|
*/
|
|
546
|
-
|
|
581
|
+
toString(encoding = RadonEncodings.HexString) {
|
|
547
582
|
return this._pushOperator(RadonString, [encoding]);
|
|
548
583
|
}
|
|
549
584
|
}
|
|
550
585
|
exports.RadonBytes = RadonBytes;
|
|
551
586
|
RadonBytes.Encodings = RadonEncodings;
|
|
587
|
+
RadonBytes.Hashers = RadonHashFunctions;
|
|
552
588
|
class RadonFloat extends RadonAny {
|
|
553
589
|
/**
|
|
554
590
|
* Compute the absolute value.
|
|
@@ -629,7 +665,7 @@ class RadonFloat extends RadonAny {
|
|
|
629
665
|
* Stringify the float value.
|
|
630
666
|
* @returns A `RadonString` object.
|
|
631
667
|
*/
|
|
632
|
-
|
|
668
|
+
toString() {
|
|
633
669
|
return this._pushOperator(RadonString, []);
|
|
634
670
|
}
|
|
635
671
|
/**
|
|
@@ -700,7 +736,7 @@ class RadonInteger extends RadonAny {
|
|
|
700
736
|
* Stringify the value.
|
|
701
737
|
* @returns A `RadonString` object.
|
|
702
738
|
*/
|
|
703
|
-
|
|
739
|
+
toString() {
|
|
704
740
|
return this._pushOperator(RadonString, []);
|
|
705
741
|
}
|
|
706
742
|
/**
|
|
@@ -722,15 +758,14 @@ exports.RadonInteger = RadonInteger;
|
|
|
722
758
|
class RadonMap extends RadonAny {
|
|
723
759
|
/**
|
|
724
760
|
* Alter the value of the item(s) identified by `keys`, applying the given `innerScript` to each one of them.
|
|
725
|
-
* @param
|
|
761
|
+
* @param keys
|
|
726
762
|
* @param innerScript
|
|
727
763
|
* @returns The same RadonMap upon which this operator is executed, with the specified item(s) altered
|
|
728
764
|
* by the given `innerScript`.
|
|
729
765
|
*/
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
// }
|
|
766
|
+
alter(innerScript, ...keys) {
|
|
767
|
+
return this._pushOperator(RadonMap, [[...keys], innerScript]);
|
|
768
|
+
}
|
|
734
769
|
/**
|
|
735
770
|
* Fetch the array within the specified `key` field.
|
|
736
771
|
* @param key
|
|
@@ -808,7 +843,7 @@ class RadonMap extends RadonAny {
|
|
|
808
843
|
* Stringify input `RadonMap` object into a JSON string.
|
|
809
844
|
* @return A `RadonString` object.
|
|
810
845
|
*/
|
|
811
|
-
|
|
846
|
+
toString() {
|
|
812
847
|
return this._pushOperator(RadonString, []);
|
|
813
848
|
}
|
|
814
849
|
}
|
|
@@ -838,6 +873,13 @@ class RadonString extends RadonAny {
|
|
|
838
873
|
asFloat() {
|
|
839
874
|
return this._pushOperator(RadonFloat, []);
|
|
840
875
|
}
|
|
876
|
+
/**
|
|
877
|
+
* Cast into an integer number.
|
|
878
|
+
* @returns A `RadonInteger` object.
|
|
879
|
+
*/
|
|
880
|
+
asInteger() {
|
|
881
|
+
return this._pushOperator(RadonInteger, []);
|
|
882
|
+
}
|
|
841
883
|
/**
|
|
842
884
|
* Count the number of chars.
|
|
843
885
|
* @returns A `RadonInteger` object.
|
|
@@ -933,4 +975,4 @@ class RadonString extends RadonAny {
|
|
|
933
975
|
}
|
|
934
976
|
}
|
|
935
977
|
exports.RadonString = RadonString;
|
|
936
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUEyQztBQUMzQywyREFBNEM7QUFHNUMsZ0RBQWlDO0FBSWpDLElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN0Qiw2REFBYSxDQUFBO0lBQ2IsdURBQVUsQ0FBQTtBQUNkLENBQUMsRUFIVyxjQUFjLDhCQUFkLGNBQWMsUUFHekI7QUFFRCxJQUFZLGNBb0VYO0FBcEVELFdBQVksY0FBYztJQUN0QixrRUFBa0IsQ0FBQTtJQUNsQixrRUFBa0IsQ0FBQTtJQUNsQiw4REFBZ0IsQ0FBQTtJQUNoQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixzRUFBb0IsQ0FBQTtJQUNwQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixrRUFBa0IsQ0FBQTtJQUNsQix3RUFBcUIsQ0FBQTtJQUNyQiw0REFBZSxDQUFBO0lBQ2Ysa0VBQWtCLENBQUE7SUFDbEIsOERBQWdCLENBQUE7SUFDaEIsOERBQWdCLENBQUE7SUFDaEIsNEVBQXVCLENBQUE7SUFDdkIsc0VBQW9CLENBQUE7SUFDcEIsd0VBQXFCLENBQUE7SUFDckIsOERBQWdCLENBQUE7SUFDaEIsd0VBQXFCLENBQUE7SUFDckIsa0VBQWtCLENBQUE7SUFDbEIsZ0VBQWlCLENBQUE7SUFDakIsc0VBQW9CLENBQUE7SUFDcEIsd0VBQXFCLENBQUE7SUFDckIsb0VBQW1CLENBQUE7SUFDbkIsNEVBQXVCLENBQUE7SUFDdkIsZ0VBQWlCLENBQUE7SUFDakIsc0VBQW9CLENBQUE7SUFDcEIsa0VBQWtCLENBQUE7SUFDbEIsc0VBQW9CLENBQUE7SUFDcEIsa0VBQWtCLENBQUE7SUFDbEIsZ0VBQWlCLENBQUE7SUFDakIsZ0VBQWlCLENBQUE7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QUFpQjtRQUNsRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUNEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsUUFBZ0IsSUFBSTtRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQSxVQUF1QixDQUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFDRDs7O09BR0c7SUFDSSxXQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztDQUNKO0FBMUhELGtDQTBIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuY29kZSBhcyBjYm9yRW5jb2RlIH0gZnJvbSBcImNib3JcIlxyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gXCIuLi8uLi9iaW4vaGVscGVyc1wiXHJcblxyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIFJhZG9uUmVkdWNlck9wY29kZXMgfSBmcm9tICcuL3JlZHVjZXJzJ1xyXG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuLi91dGlscydcclxuXHJcbmV4cG9ydCB7IEhleFN0cmluZyBhcyBSYWRvbkJ5dGVjb2RlIH0gZnJvbSBcIi4uL3R5cGVzXCJcclxuXHJcbmV4cG9ydCBlbnVtIFJhZG9uRW5jb2RpbmdzIHtcclxuICAgIEhleFN0cmluZyA9IDAsXHJcbiAgICBCYXNlNjQgPSAxLFxyXG59XHJcblxyXG5leHBvcnQgZW51bSBSYWRvbk9wZXJhdG9ycyB7XHJcbiAgICBBcnJheUxlbmd0aCA9IDB4MTAsXHJcbiAgICBBcnJheUZpbHRlciA9IDB4MTEsXHJcbiAgICBBcnJheUpvaW4gPSAweDEyLFxyXG4gICAgQXJyYXlHZXRBcnJheSA9IDB4MTMsXHJcbiAgICBBcnJheUdldEJvb2xlYW4gPSAweDE0LFxyXG4gICAgQXJyYXlHZXRCeXRlcyA9IDB4MTUsXHJcbiAgICBBcnJheUdldEZsb2F0ID0gMHgxNixcclxuICAgIEFycmF5R2V0SW50ZWdlciA9IDB4MTcsXHJcbiAgICBBcnJheUdldE1hcCA9IDB4MTgsXHJcbiAgICBBcnJheUdldFN0cmluZyA9IDB4MTksXHJcbiAgICBBcnJheU1hcCA9IDB4MWEsXHJcbiAgICBBcnJheVJlZHVjZSA9IDB4MWIsXHJcbiAgICBBcnJheVNvcnQgPSAweDFkLFxyXG4gICAgQXJyYXlQaWNrID0gMHgxZSxcclxuICAgIEJvb2xlYW5TdHJpbmdpZnkgPSAweDIwLFxyXG4gICAgQm9vbGVhbk5lZ2F0ZSA9IDB4MjIsXHJcbiAgICBCeXRlc1N0cmluZ2lmeSA9IDB4MzAsXHJcbiAgICBCeXRlc0hhc2ggPSAweDMxLFxyXG4gICAgQnl0ZXNBc0ludGVnZXIgPSAweDMyLFxyXG4gICAgQnl0ZXNMZW5ndGggPSAweDM0LFxyXG4gICAgQnl0ZXNTbGljZSA9IDB4M2MsXHJcbiAgICBGbG9hdEFic29sdXRlID0gMHg1MCxcclxuICAgIEZsb2F0U3RyaW5naWZ5ID0gMHg1MSxcclxuICAgIEZsb2F0Q2VpbGluZyA9IDB4NTIsXHJcbiAgICBGbG9hdEdyZWF0ZXJUaGFuID0gMHg1MyxcclxuICAgIEZsb2F0Rmxvb3IgPSAweDU0LFxyXG4gICAgRmxvYXRMZXNzVGhhbiA9IDB4NTUsXHJcbiAgICBGbG9hdE1vZHVsZSA9IDB4NTYsXHJcbiAgICBGbG9hdE11bHRpcGx5ID0gMHg1NyxcclxuICAgIEZsb2F0TmVnYXRlID0gMHg1OCxcclxuICAgIEZsb2F0UG93ZXIgPSAweDU5LFxyXG4gICAgRmxvYXRSb3VuZCA9IDB4NWIsXHJcbiAgICBGbG9hdFRydW5jYXRlID0gMHg1ZCxcclxuICAgIEludGVnZXJBYnNvbHV0ZSA9IDB4NDAsXHJcbiAgICBJbnRlZ2VyVG9GbG9hdCA9IDB4NDEsXHJcbiAgICBJbnRlZ2VyU3RyaW5naWZ5ID0gMHg0MixcclxuICAgIEludGVnZXJHcmVhdGVyVGhhbiA9IDB4NDMsXHJcbiAgICBJbnRlZ2VyTGVzc1RoYW4gPSAweDQ0LFxyXG4gICAgSW50ZWdlck1vZHVsbyA9IDB4NDYsXHJcbiAgICBJbnRlZ2VyTXVsdGlwbHkgPSAweDQ3LFxyXG4gICAgSW50ZWdlck5lZ2F0ZSA9IDB4NDgsXHJcbiAgICBJbnRlZ2VyUG93ZXIgPSAweDQ5LFxyXG4gICAgSW50ZWdlclRvQnl0ZXMgPSAweDRhLFxyXG4gICAgTWFwU3RyaW5naWZ5ID0gMHg2MCxcclxuICAgIE1hcEdldEFycmF5ID0gMHg2MSxcclxuICAgIE1hcEdldEJvb2xlYW4gPSAweDYyLFxyXG4gICAgTWFwR2V0RmxvYXQgPSAweDY0LFxyXG4gICAgTWFwR2V0SW50ZWdlciA9IDB4NjUsXHJcbiAgICBNYXBHZXRNYXAgPSAweDY2LFxyXG4gICAgTWFwR2V0U3RyaW5nID0gMHg2NyxcclxuICAgIE1hcEtleXMgPSAweDY4LFxyXG4gICAgTWFwVmFsdWVzID0gMHg2OSxcclxuICAgIE1hcEFsdGVyID0gMHg2YixcclxuICAgIE1hcFBpY2sgPSAweDZlLCAgIFxyXG4gICAgU3RyaW5nQXNCb29sZWFuID0gMHg3MCxcclxuICAgIFN0cmluZ0FzQnl0ZXMgPSAweDcxLFxyXG4gICAgU3RyaW5nQXNGbG9hdCA9IDB4NzIsXHJcbiAgICBTdHJpbmdMZW5ndGggPSAweDc0LFxyXG4gICAgU3RyaW5nTWF0Y2ggPSAweDc1LFxyXG4gICAgU3RyaW5nUGFyc2VKU09OQXJyYXkgPSAweDc2LFxyXG4gICAgU3RyaW5nUGFyc2VKU09OTWFwID0gMHg3NyxcclxuICAgIFN0cmluZ1BhcnNlWE1MTWFwID0gMHg3OCxcclxuICAgIFN0cmluZ1RvTG93ZXJDYXNlID0gMHg3OSxcclxuICAgIFN0cmluZ1RvVXBwc2VyQ2FzZSA9IDB4N2EsXHJcbiAgICBTdHJpbmdQYXJzZVJlcGxhY2UgPSAweDdiLFxyXG4gICAgU3RyaW5nUGFyc2VTbGljZSA9IDB4N2MsXHJcbiAgICBTdHJpbmdQYXJzZVNwbGl0ID0gMHg3ZCxcclxufVxyXG5cclxuYWJzdHJhY3QgY2xhc3MgUmFkb25DbGFzcyB7XHJcbiAgICByZWFkb25seSBwcmV2PzogUmFkb25PcGVyYXRvcjtcclxuICAgIGNvbnN0cnVjdG9yKHByZXY/OiBSYWRvbk9wZXJhdG9yKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2ID0gcHJldlxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25PcGVyYXRvciBleHRlbmRzIFJhZG9uQ2xhc3Mge1xyXG4gICAgcmVhZG9ubHkgb3Bjb2RlOiBSYWRvbk9wZXJhdG9yc1xyXG4gICAgcmVhZG9ubHkgcGFyYW1zPzogYW55W11cclxuICAgIGNvbnN0cnVjdG9yKG9wY29kZTogUmFkb25PcGVyYXRvcnMsIHBhcmFtcz86IGFueVtdLCBvcHM/OiBSYWRvbk9wZXJhdG9yKSB7XHJcbiAgICAgICAgc3VwZXIob3BzKVxyXG4gICAgICAgIHRoaXMub3Bjb2RlID0gb3Bjb2RlXHJcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwgW11cclxuICAgIH1cclxuICAgIHB1YmxpYyBhcmdzQ291bnQoKTogbnVtYmVyIHsgXHJcbiAgICAgICAgbGV0IG1heENvdW50OiBudW1iZXIgPSAwXHJcbiAgICAgICAgdGhpcy5wYXJhbXM/LmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBoZWxwZXJzLmdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyhwYXJhbSlcclxuICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IG1heENvdW50KSBtYXhDb3VudCA9IGNvdW50XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IHBhcmFtLmFyZ3NDb3VudCgpXHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBtYXhDb3VudCkgbWF4Q291bnQgPSBjb3VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoXHJcbiAgICAgICAgICAgIG1heENvdW50LFxyXG4gICAgICAgICAgICB0aGlzLnByZXY/LmFyZ3NDb3VudCgpIHx8IDBcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzPy5wcmV2Py5kaXNlY3QobGV2ZWwpIHx8IFtdXHJcbiAgICAgICAgY29uc3Qgb3BlcmF0b3IgPSBSYWRvbk9wZXJhdG9yc1t0aGlzLm9wY29kZV1cclxuICAgICAgICBjb25zdCBpbnB1dFR5cGUgPSBgUmFkb24ke29wZXJhdG9yLnNwbGl0KC8oPz1bQS1aXSkvKVswXX1gXHJcbiAgICAgICAgbGV0IHJhZG9uQ2FsbCA9IG9wZXJhdG9yLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKS5qb2luKCcnKVxyXG4gICAgICAgIHJhZG9uQ2FsbCA9IHJhZG9uQ2FsbC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHJhZG9uQ2FsbC5zbGljZSgxKVxyXG4gICAgICAgIGxldCBhcmdzID0gXCJcIlxyXG4gICAgICAgIGxldCBzY3JpcHRcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5tYXAocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSAhPT0gJ29iamVjdCcgfHwgIShwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycgPyAgYFwiJHtwYXJhbX1cImAgOiBwYXJhbS50b1N0cmluZygpKSArIFwiLCBcIlxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzY3JpcHQgPSBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZiAoc2NyaXB0KSBhcmdzICs9IFwiUmFkb25PcGVyYXRvciB7XCJcclxuICAgICAgICAgICAgZWxzZSBhcmdzID0gYXJncy5zbGljZSgwLCAtMilcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjcmlwdCkge1xyXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gYCR7KHNjcmlwdCBhcyBSYWRvblNjcmlwdCkub3V0cHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSB8fCBcIlJhZG9uQW55XCJ9YFxyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9YFxyXG4gICAgICAgICAgICByZXN1bHQucHVzaChbbGV2ZWwsIGlucHV0VHlwZSwgcmFkb25DYWxsXSlcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uKHNjcmlwdCBhcyBSYWRvblNjcmlwdCkuZGlzZWN0KGxldmVsICsgMSkpXHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtsZXZlbCwgb3V0cHV0VHlwZSwgXCJ9KVwiXSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9KWBcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgIH1cclxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10geyBcclxuICAgICAgICBsZXQgZW5jb2RlZFxyXG4gICAgICAgIGlmICh0aGlzPy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJhbXMubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25BbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnByZXY/LmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uT3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5lbmNvZGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGVuY29kZWQgPSBbdGhpcy5vcGNvZGUsIC4uLmFyZ3NdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMub3Bjb2RlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnByZXYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsuLi50aGlzLnByZXYuZW5jb2RlKCksIGVuY29kZWRdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtlbmNvZGVkXVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyByZXBsYWNlV2lsZGNhcmRzKGFyZ3M6IHN0cmluZ1tdKTogUmFkb25PcGVyYXRvciB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgdGhpcy5hcmdzQ291bnQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYEluc3VmZmljZW50IGFyZ3Mgd2VyZSBwcm92aWRlZCAoJHthcmdzLmxlbmd0aH0gPCAke3RoaXMuYXJnc0NvdW50KCl9KWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcclxuICAgICAgICAgICAgdGhpcy5vcGNvZGUsIFxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcz8ubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMucmVwbGFjZVdpbGRjYXJkcyhwYXJhbSwgYXJncylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnJlcGxhY2VXaWxkY2FyZHMoLi4uYXJncylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgdGhpcz8ucHJldj8ucmVwbGFjZVdpbGRjYXJkcyhhcmdzKVxyXG4gICAgICAgIClcclxuICAgIH1cclxuICAgIHB1YmxpYyBzcGxpY2VXaWxkY2FyZChhcmdJbmRleDogbnVtYmVyLCBhcmdWYWx1ZTogc3RyaW5nKTogUmFkb25PcGVyYXRvciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSYWRvbk9wZXJhdG9yKFxyXG4gICAgICAgICAgICB0aGlzLm9wY29kZSxcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXM/Lm1hcChwYXJhbSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWxwZXJzLnNwbGljZVdpbGRjYXJkKHBhcmFtLCBhcmdJbmRleCwgYXJnVmFsdWUsIHRoaXMuYXJnc0NvdW50KCkpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcgJiYgcGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5zcGxpY2VXaWxkY2FyZChhcmdJbmRleCwgYXJnVmFsdWUpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgdGhpcz8ucHJldj8uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKVxyXG4gICAgICAgIClcclxuICAgIH1cclxuICAgIHB1YmxpYyB0b1N0cmluZyhsZWZ0ID0gXCJcIiwgaW5kZW50ID0gNCwgbGV2ZWwgPSAwKTogc3RyaW5nIHsgXHJcbiAgICAgICAgY29uc3QgbGYgPSBsZWZ0ICE9PSBcIlwiID8gXCJcXG5cIiA6IFwiXCJcclxuICAgICAgICBsZXQgc3RyID0gdGhpcz8ucHJldj8udG9TdHJpbmcobGVmdCwgaW5kZW50LCBsZXZlbCkgfHwgXCJcIlxyXG4gICAgICAgIGxldCBtZXRob2ROYW1lID0gUmFkb25PcGVyYXRvcnNbdGhpcy5vcGNvZGVdLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKS5qb2luKCcnKVxyXG4gICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgbWV0aG9kTmFtZS5zbGljZSgxKVxyXG4gICAgICAgIHN0ciArPSBgJHtsZWZ0fSR7XCIgXCIucmVwZWF0KGluZGVudCAqIGxldmVsKX0uJHttZXRob2ROYW1lfShgXHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHsgXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYFwiJHtwYXJhbX1cIiwgYFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnICYmIHBhcmFtIGluc3RhbmNlb2YgUmFkb25TY3JpcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYCR7cGFyYW0udG9TdHJpbmcobGVmdCwgaW5kZW50LCBsZXZlbCArIDEpfSR7bGVmdH0ke1wiIFwiLnJlcGVhdChpbmRlbnQgKiBsZXZlbCl9LCBgXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSBwYXJhbS50b1N0cmluZygpICsgXCIsIFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHN0ciA9IHN0ci5zbGljZSgwLCAtMilcclxuICAgICAgICB9XHJcbiAgICAgICAgc3RyICs9IGApJHtsZn1gXHJcbiAgICAgICAgcmV0dXJuIHN0clxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25TY3JpcHQge1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wcz86IFJhZG9uT3BlcmF0b3I7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW5wdXRUeXBlPzogUmFkb25Bbnk7XHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0VHlwZT86IFJhZG9uQW55O1xyXG4gICAgY29uc3RydWN0b3IgKG91dHB1dDogUmFkb25BbnkpIHtcclxuICAgICAgICB0aGlzLm9wcyA9IG91dHB1dD8ucHJldjtcclxuICAgICAgICBjb25zdCByYWRvblR5cGVzID0ge1xyXG4gICAgICAgICAgICBcIkFycmF5XCI6IFJhZG9uQXJyYXksXHJcbiAgICAgICAgICAgIFwiQm9vbGVhblwiOiBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFwiQnl0ZXNcIjogUmFkb25CeXRlcyxcclxuICAgICAgICAgICAgXCJGbG9hdFwiOiBSYWRvbkZsb2F0LFxyXG4gICAgICAgICAgICBcIkludGVnZXJcIjogUmFkb25JbnRlZ2VyLFxyXG4gICAgICAgICAgICBcIk1hcFwiOiBSYWRvbk1hcCxcclxuICAgICAgICAgICAgXCJTdHJpbmdcIjogUmFkb25TdHJpbmcsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpbnB1dCA9IG91dHB1dD8ucHJldlxyXG4gICAgICAgIHdoaWxlIChpbnB1dD8ucHJldikgaW5wdXQgPSBpbnB1dD8ucHJldlxyXG4gICAgICAgIGNvbnN0IGlucHV0VHlwZSA9IE9iamVjdC5lbnRyaWVzKHJhZG9uVHlwZXMpLmZpbmQoKFtwcmVmaXgsIF9dKSA9PiBpbnB1dCAmJiBSYWRvbk9wZXJhdG9yc1tpbnB1dC5vcGNvZGVdLnN0YXJ0c1dpdGgocHJlZml4KSlcclxuICAgICAgICBpZiAoaW5wdXRUeXBlICYmIGlucHV0VHlwZVsxXSkgdGhpcy5pbnB1dFR5cGUgPSBuZXcgaW5wdXRUeXBlWzFdKClcclxuICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gT2JqZWN0LnZhbHVlcyhyYWRvblR5cGVzKS5maW5kKG91dHB1dFR5cGUgPT4gb3V0cHV0IGluc3RhbmNlb2Ygb3V0cHV0VHlwZSk7XHJcbiAgICAgICAgaWYgKG91dHB1dFR5cGUpIHRoaXMub3V0cHV0VHlwZSA9IG5ldyBvdXRwdXRUeXBlKClcclxuICAgIH1cclxuICAgIHB1YmxpYyBhcmdzQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmFyZ3NDb3VudCgpIHx8IDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmRpc2VjdChsZXZlbCkgfHwgW1tsZXZlbCwgXCJSYWRvbkFueVwiLCBcIlwiXV1cclxuICAgIH1cclxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wcz8uZW5jb2RlKCkgfHwgW107XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgcmVwbGFjZVdpbGRjYXJkcyguLi5hcmdzOiBzdHJpbmdbXSk6IFJhZG9uQW55IHtcclxuICAgICAgICBjb25zdCBPdXRwdXRUeXBlID0gW1xyXG4gICAgICAgICAgICBSYWRvbkFycmF5LFxyXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFJhZG9uQnl0ZXMsXHJcbiAgICAgICAgICAgIFJhZG9uRmxvYXQsXHJcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcclxuICAgICAgICAgICAgUmFkb25NYXAsXHJcbiAgICAgICAgICAgIFJhZG9uU3RyaW5nLFxyXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xyXG4gICAgICAgIGlmIChPdXRwdXRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3V0cHV0VHlwZSh0aGlzLm9wcz8ucmVwbGFjZVdpbGRjYXJkcyhhcmdzKSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYENhbm5vdCByZXBsYWNlIHdpbGRjYXJkcyBvbiBlbXB0eSBzY3JpcHRgKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBzcGxpY2VXaWxkY2FyZChhcmdJbmRleDogbnVtYmVyLCBhcmdWYWx1ZTogc3RyaW5nKTogUmFkb25Bbnkge1xyXG4gICAgICAgIGNvbnN0IE91dHB1dFR5cGUgPSBbXHJcbiAgICAgICAgICAgIFJhZG9uQXJyYXksXHJcbiAgICAgICAgICAgIFJhZG9uQm9vbGVhbixcclxuICAgICAgICAgICAgUmFkb25CeXRlcyxcclxuICAgICAgICAgICAgUmFkb25GbG9hdCxcclxuICAgICAgICAgICAgUmFkb25JbnRlZ2VyLFxyXG4gICAgICAgICAgICBSYWRvbk1hcCxcclxuICAgICAgICAgICAgUmFkb25TdHJpbmcsXHJcbiAgICAgICAgXS5maW5kKE91dHB1dFR5cGUgPT4gdGhpcy5vdXRwdXRUeXBlIGluc3RhbmNlb2YgT3V0cHV0VHlwZSk7XHJcbiAgICAgICAgaWYgKE91dHB1dFR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXRUeXBlKHRoaXMub3BzPy5zcGxpY2VXaWxkY2FyZChhcmdJbmRleCwgYXJnVmFsdWUpKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IEV2YWxFcnJvcihgQ2Fubm90IHNwbGljZSB3aWxkY2FyZHMgb24gZW1wdHkgc2NyaXB0YClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdG9CeXRlY29kZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBVdGlscy50b0hleFN0cmluZyhPYmplY3QudmFsdWVzKFVpbnQ4QXJyYXkuZnJvbShjYm9yRW5jb2RlKHRoaXMuZW5jb2RlKCkpKSksIHRydWUpXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdG9TdHJpbmcobGVmdCA9IFwiXCIsIGluZGVudCA9IDAsIGxldmVsID0gMCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgbGYgPSBsZWZ0ICE9PSBcIlwiID8gXCJcXG5cIiA6IFwiXCJcclxuICAgICAgICByZXR1cm4gYFJhZG9uT3BlcmF0b3IoJHt0aGlzLmlucHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSB8fCBcIlwifSkke2xmfSR7dGhpcy5vcHM/LnRvU3RyaW5nKGxlZnQsIGluZGVudCwgbGV2ZWwgKyAxKX1gXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSYWRvbkFueSBleHRlbmRzIFJhZG9uQ2xhc3Mge1xyXG4gICAgcHJvdGVjdGVkIF9wdXNoT3BlcmF0b3I8T3V0cHV0VHlwZSBleHRlbmRzIFJhZG9uQW55PihcclxuICAgICAgICBvdXRwdXRUeXBlOiB7IG5ldyhvcHM/OiBSYWRvbk9wZXJhdG9yKTogT3V0cHV0VHlwZTsgfSwgXHJcbiAgICAgICAgcGFyYW1zOiBhbnlbXSxcclxuICAgICk6IE91dHB1dFR5cGUge1xyXG4gICAgICAgIGxldCBuYW1lXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IChlcnIgYXMgRXJyb3IpXHJcbiAgICAgICAgICAgIG5hbWUgPSByZXN1bHQuc3RhY2s/LnNwbGl0KCcgYXQgJylbMl1cclxuICAgICAgICAgICAgICAgIC5zcGxpdCgnICcpWzBdXHJcbiAgICAgICAgICAgICAgICAuc3BsaXQoJy4nKVxyXG4gICAgICAgICAgICAgICAgLm1hcChwYXJ0ID0+IGhlbHBlcnMudG9VcHBlckNhbWVsQ2FzZShwYXJ0KSlcclxuICAgICAgICAgICAgICAgIC5qb2luKCcnKVxyXG4gICAgICAgICAgICAgICAgLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKVxyXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wY29kZSA9IFJhZG9uT3BlcmF0b3JzW25hbWUgYXMga2V5b2YgdHlwZW9mIFJhZG9uT3BlcmF0b3JzXVxyXG4gICAgICAgIGlmICghb3Bjb2RlKSB7XHJcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBGYXRhbDogdW5rbm93biBSYWRvbiBPcGVyYXRvciBvcGNvZGUgJyR7bmFtZX0nYClcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IG91dHB1dFR5cGUobmV3IFJhZG9uT3BlcmF0b3IoXHJcbiAgICAgICAgICAgICAgICBvcGNvZGUsIFxyXG4gICAgICAgICAgICAgICAgWy4uLnBhcmFtc10sIFxyXG4gICAgICAgICAgICAgICAgdGhpcz8ucHJldlxyXG4gICAgICAgICAgICApKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSYWRvbkFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55PiB7XHJcbiAgICBpdGVtc1R5cGU6IEl0ZW1zVHlwZTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uQXJyYXk8SXRlbXNUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvbkFueT4gZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIERpc2NhcmQgdGhlIGl0ZW1zIGluIHRoZSBpbnB1dCBhcnJheSB0aGF0IG1ha2UgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYGZhbHNlYCB2YWx1ZS4gXHJcbiAgICAgKiBAcGFyYW0gc2NyaXB0IEZpbHRlcmluZyBzY3JpcHQgdWx0aW1hdGVseSByZXR1cm5pbmcgYSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKiBNdXN0IGFjY2VwdCBhcyBpbnB1dCB0aGUgc2FtZSBkYXRhIHR5cGVzIGFzIHRoZSBvbmVzIG9mIHRoZSBpdGVtcyBiZWluZyBpdGVyYXRlZC4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBpdGVtcyB0aGF0IG1ha2UgdGhlIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYHRydWVgIHZhbHVlLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbHRlcihpbm5lclNjcmlwdDogUmFkb25Cb29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCEoaW5uZXJTY3JpcHQgaW5zdGFuY2VvZiBSYWRvbkJvb2xlYW4pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYElubmVyIHNjcmlwdCBtdXN0IGZldGNoIGEgUmFkb25Cb29sZWFuIHZhbHVlYClcclxuICAgICAgICB9IFxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbbmV3IFJhZG9uU2NyaXB0KGlubmVyU2NyaXB0KV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFycmF5PFN1Ykl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+KGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8U3ViSXRlbXNUeXBlPiwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCb29sZWFuKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Qnl0ZXMoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RmxvYXQoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRJbnRlZ2VyKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25NYXBgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE1hcChpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0cmluZyhpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW2luZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSm9pbiBhbGwgaXRlbXMgb2YgdGhlIGFycmF5IGludG8gYSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdHlwZS4gVGhlIGFycmF5IG11c3QgYmUgaG9tb2dlbmVvdXMsIFxyXG4gICAgICogYWxsIGl0ZW1zIGJlaW5nIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG91dHB1dFR5cGVgLCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBBcnJheSdzIGl0ZW1zVHlwZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIFNlcGFyYXRvciB0byBiZSB1c2VkIHdoZW4gam9pbmluZyBzdHJpbmdzLiBXaGVuIGpvaW5pbmcgUmFkb25NYXBzLCBpdCBjYW4gYmUgdXNlZCB0byBzZXR0bGUgYmFzZSBzY2hlbWEgb24gcmVzdWx0aW5nIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBvdXRwdXRUeXBlIFJhZG9uIHR5cGUgb2YgdGhlIG91dHB1dCB2YWx1ZS4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBqb2luPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihzZXBhcmF0b3IgPSBcIlwiLCBvdXRwdXRUeXBlPzogeyBuZXcoKTogSXRlbXNUeXBlOyB9KSB7XHJcbiAgICAgICAgaWYgKG91dHB1dFR5cGUpIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PE91dHB1dFR5cGU+LCBbc2VwYXJhdG9yXSlcclxuICAgICAgICBlbHNlIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PEl0ZW1zVHlwZT4sIFtzZXBhcmF0b3JdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGl0ZW1zLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGVuZ3RoKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTWFwIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgd2l0aCB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5uZXJTY3JpcHQgTWFwcGluZyBzY3JpcHQgcmV0dXJuaW5nIHNvbWUgYFJhZG9uQW55YCBvYmplY3QuXHJcbiAgICAgKiBNdXN0IGFjY2VwdCBhcyBpbnB1dCB0aGUgc2FtZSBkYXRhIHR5cGUgYXMgdGhlIG9uZSBvZiB0aGUgaXRlbXMgYmVpbmcgaXRlcmF0ZWQuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1hcHBlZCB2YWx1ZXMuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWFwKGlubmVyU2NyaXB0OiBSYWRvbk9wZXJhdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgfVxyXG4gICAgLy8gcHVibGljIG1hcDxPdXRwdXRJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueT4oaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3I8T3V0cHV0SXRlbXNUeXBlPikge1xyXG4gICAgLy8gICAgIC8vIHRvZG86IGNoZWNrIHNjcmlwdCdzIGlucHV0IHR5cGUgbWF0Y2hlcyBhcnJheSdzIGl0ZW1zIHR5cGUsIGlmIGFueSA/P1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxPdXRwdXRJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgLy8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWR1Y2UgYWxsIGl0ZW1zIGluIHRoZSBhcnJheSBpbnRvIGEgc2luZ2xlIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHJlZHVjdG9yIFRoZSByZWR1Y3RvciBtZXRob2QgdG8gYmUgYXBwbGllZC4gQWxsIGFycmF5IGl0ZW1zIG11c3QgYmUgXHJcbiAgICAgKiBjb252ZXJ0YWJsZSBpbnRvIGZsb2F0IHZhbHVlcy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZHVjZShyZWR1Y3RvcjogUmFkb25SZWR1Y2VyT3Bjb2Rlcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW3JlZHVjdG9yXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogT3JkZXIgdGhlIGFycmF5IGl0ZW1zIGJhc2VkIGVpdGhlciBvbiB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YCB0byBldmVyeSBpdGVtLCBvciBvbiB0aGUgXHJcbiAgICAgKiBhY3R1YWwgaXRlbSB2YWx1ZXMgKGFzIGxvbmcgYXMgdGhlc2UgYXJlIGVpdGhlciBpbnRlZ2VycyBvciBzdHJpbmdzKS5cclxuICAgICAqIEZhaWxzIGlmIGFwcGxpZWQgb24gbm9uLWhvbWVnZW5vdXMgYXJyYXlzIChpLmUuIG5vdCBhbGwgaXRlbXMgc2hhcmluZyB0aGUgc2FtZSBgUmFkb25BbnlgKS4gXHJcbiAgICAgKiBAcGFyYW0gaW5uZXJTY3JpcHQgKE9wdGlvbmFsKSBTb3J0aW5nIHNjcmlwdCByZXR1cm5pbmcgZWl0aGVyIGEgYFJhZG9uSW50ZWdlcmAgb3IgYSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgLy8gVE9ET1xyXG4gICAgLy8gcHVibGljIHNvcnQoaW5uZXJTY3JpcHQ/OiBSYWRvbk9wZXJhdG9yPFJhZG9uU3RyaW5nIHwgUmFkb25JbnRlZ2VyPikge1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgLy8gfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIGZyb20gdGhlIGlucHV0IGFycmF5LlxyXG4gICAgICogQHBhcmFtIGluZGV4ZXMgSW5kZXhlcyBvZiB0aGUgaW5wdXQgaXRlbXMgdG8gdGFrZSBpbnRvIHRoZSBvdXRwdXQgYXJyYXkuIFxyXG4gICAgICogQHJldHVybiBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrKC4uLmluZGV4ZXM6IG51bWJlcltdKSB7XHJcbiAgICAgICAgaWYgKEFycmF5KGluZGV4ZXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25BcnJheTo6cGljazogYSBub24tZW1wdHkgYXJyYXkgb2YgbnVtYmVycyBtdXN0IGJlIHByb3ZpZGVkXFx4MWJbMG1gKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgWy4uLmluZGV4ZXNdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25Cb29sZWFuIGV4dGVuZHMgUmFkb25Bbnkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXZlcnNlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZWdhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXN0IHZhbHVlIGludG8gYSBzdHJpbmcuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uQnl0ZXMgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgRW5jb2RpbmdzID0gUmFkb25FbmNvZGluZ3M7XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgYnVmZmVyIGludG8gKGJpZy1lbmRpYW4pIGludGVnZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc0ludGVnZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSB0aGUgU0hBMi0yNTYgaGFzaCBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJ5dGVzLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBieXRlcy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBzbGljZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLiBcclxuICAgICAqIEEgYHN0YXJ0SW5kZXhgIG9mIDAgcmVmZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4gSWYgbm8gYGVuZEluZGV4YCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBhc3N1bWVkIFxyXG4gICAgICogdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyLiBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgYnVmZmVyIHdoZXJlIHRoZSBvdXRwdXQgYnVmZmVyIHdpbGwgc3RhcnQuXHJcbiAgICAgKiBAcGFyYW0gZW5kSW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aWxsIGVuZFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtzdGFydEluZGV4LCBlbmRJbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBpbnRvIGEgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIG91dHB1dCBzdHJpbmcsIHN0YW5kaW5nOlxyXG4gICAgICogICAwIC0+IEhleCBzdHJpbmcgKGRlZmF1bHQsIGlmIG5vbmUgd2FzIHNwZWNpZmllZClcclxuICAgICAqICAgMSAtPiBCYXNlNjQgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RyaW5naWZ5KGVuY29kaW5nID0gUmFkb25FbmNvZGluZ3MuSGV4U3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW2VuY29kaW5nXSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uRmxvYXQgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGFic29sdXRlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWJzb2x1dGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgbG93ZXN0IGludGVnZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBmbG9hdCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNlaWxpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGdyZWF0ZXN0IGludGVnZXIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBmbG9hdCB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZmxvb3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JlYXRlclRoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC5cclxuICAgICAqIEBwYXJhbSBpbnB1dCBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGVzc1RoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSBmbG9hdCByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIHZhbHVlIGJ5IHRoZSBnaXZlbiBgaW50ZWdlcmAuXHJcbiAgICAgKiBAcGFyYW0gaW50ZWdlciBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vZHVsbyhpbnRlZ2VyOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtpbnRlZ2VyXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTXVsdGlwbHkgdGhlIGZsb2F0IHZhbHVlIGJ5IHRoZSBnaXZlbiBgZmFjdG9yYC5cclxuICAgICAqIEBwYXJhbSBmYWN0b3IgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbHkoZmFjdG9yOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtmYWN0b3JdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGUgdGhlIGZsb2F0IHZhbHVlLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5lZ2F0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSBmbG9hdCB2YWx1ZSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGdpdmVuIGBleHBvbmVudGBcclxuICAgICAqIEBwYXJhbSBleHBvbmVudFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG93ZXIoZXhwb25lbnQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2V4cG9uZW50XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUm91bmQgdG8gdGhlIGNsb3Nlc3QgaW50ZWdlciB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcm91bmQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgdGhlIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVGFrZSB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBmbG9hdCB2YWx1ZS4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRydW5jYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uSW50ZWdlciBleHRlbmRzIFJhZG9uQW55IHtcclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFic29sdXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JlYXRlclRoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGludGVnZXIgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLiBcclxuICAgICAqIEBwYXJhbSBpbnB1dFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsZXNzVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyB0aGUgdmFsdWUgYnkgdGhlIGdpdmVuIGBpbnRlZ2VyYC5cclxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW9kdWxvKGludGVnZXI6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbaW50ZWdlcl0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE11bHRpcGx5IHRoZSB2YWx1ZSBieSB0aGUgZ2l2ZW4gYGludGVnZXJgLlxyXG4gICAgICogQHBhcmFtIGludGVnZXIgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShpbnRlZ2VyOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2ludGVnZXJdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBOZWdhdGUgdGhlIGludGVnZXIgdmFsdWUuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgdmFsdWUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiBnaXZlbiBgZXhwb25lbnRgXHJcbiAgICAgKiBAcGFyYW0gZXhwb25lbnRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcG93ZXIoZXhwb25lbnQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbZXhwb25lbnRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgdGhlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FzdCBpbnRvIGEgYmlnLWVuZGlhbiBieXRlcyBidWZmZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b0J5dGVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9GbG9hdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25NYXAgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIEFsdGVyIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbShzKSBpZGVudGlmaWVkIGJ5IGBrZXlzYCwgYXBwbHlpbmcgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gZWFjaCBvbmUgb2YgdGhlbS5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcGFyYW0gaW5uZXJTY3JpcHQgXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgc2FtZSBSYWRvbk1hcCB1cG9uIHdoaWNoIHRoaXMgb3BlcmF0b3IgaXMgZXhlY3V0ZWQsIHdpdGggdGhlIHNwZWNpZmllZCBpdGVtKHMpIGFsdGVyZWRcclxuICAgICAqIGJ5IHRoZSBnaXZlbiBgaW5uZXJTY3JpcHRgLlxyXG4gICAgICovXHJcbiAgICAvLyBUT0RPXHJcbiAgICAvLyBwdWJsaWMgYWx0ZXI8QWx0ZXJlZE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueT4oaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3I8QWx0ZXJlZE91dHB1dFR5cGU+LCAuLi5rZXlzOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFtpbm5lclNjcmlwdCwgLi4ua2V5c10pXHJcbiAgICAvLyB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBhcnJheSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBcnJheTxJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihrZXk6IHN0cmluZywgX2l0ZW1zVHlwZT86IHsgbmV3KCk6IEl0ZW1zVHlwZTsgfSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBba2V5XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGJvb2xlYW4gd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuIFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJvb2xlYW4oa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBmbG9hdCB2YWx1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGbG9hdChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpbnRlZ2VyIHZhbHVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEludGVnZXIoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBtYXAgb2JqZWN0IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbk1hcGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TWFwKGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBzdHJpbmcgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0cmluZyhrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtrZXldKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeHRyYWN0IGtleSBuYW1lcyBvZiB0aGUgbWFwIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uU3RyaW5nPiwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRha2UgYSBzZWxlY3Rpb24gb2YgaXRlbXMgZnJvbSB0aGUgaW5wdXQgbWFwLiBGYWlscyBpZiB1bmV4aXN0ZW50IGl0ZW1zIGFyZSByZWZlcnJlZC5cclxuICAgICAqIEBwYXJhbSBrZXlzIEtleSBzdHJpbmcgb2YgdGhlIGlucHV0IGl0ZW1zIHRvIHRha2UgaW50byB0aGUgb3V0cHV0IG1hcC4gXHJcbiAgICAgKiBAcmV0dXJuIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrKC4uLmtleXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKEFycmF5KGtleXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25NYXA6OnBpY2s6IGEgbm9uLWVtcHR5IGFycmF5IG9mIGtleSBzdHJpbmdzIG11c3QgYmUgcHJvdmlkZWRcXHgxYlswbWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFsuLi5rZXlzXSlcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhY3QgdGhlIG1hcCB2YWx1ZXMgaW50byBhbiBhcnJheS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXksIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgaW5wdXQgYFJhZG9uTWFwYCBvYmplY3QgaW50byBhIEpTT04gc3RyaW5nLlxyXG4gICAgICogQHJldHVybiBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RyaW5naWZ5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25TdHJpbmcgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGJvb2xlYW4gdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzQm9vbGVhbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgdGhlIGlucHV0IHN0cmluZyBpbnRvIGEgYnl0ZXMgYnVmZmVyLlxyXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIGlucHV0IHN0cmluZywgc3RhbmRpbmc6XHJcbiAgICAgKiAgIDAgLT4gSGV4IHN0cmluZyAoZGVmYXVsdCwgaWYgbm9uZSB3YXMgc3BlY2lmaWVkKVxyXG4gICAgICogICAxIC0+IEJhc2U2NCBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzQnl0ZXMoZW5jb2RpbmcgPSBSYWRvbkVuY29kaW5ncy5IZXhTdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtlbmNvZGluZ10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IG51bWJlci5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzRmxvYXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBjaGFycy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2UgdGhlIHN0cmluZyBieSBhIHZhbHVlIG9mIHR5cGUgYG91dHB1dFR5cGVgLCBkZXRlcm1pbmVkIG9uIHdoZXRoZXIgdGhlIHN0cmluZyB2YWx1ZSBtYXRjaGVzIFxyXG4gICAgICogYW55IG9mIHRoZSBrZXlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgYG1hdGNoaW5nTWFwYCwgb3Igc2V0IHRvIGEgYGRlZmF1bHRWYWx1ZWAgaWYgbm8gbWF0Y2ggaXMgZm91bmQuXHJcbiAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSBSYWRvbiB0eXBlIG9mIHRoZSBvdXRwdXQgdmFsdWUuIFxyXG4gICAgICogQHBhcmFtIG1hdGNoaW5nTWFwIE1hcCBkZXRlcm1pbmluZyB0aGUgb3V0cHV0IHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgc3RyaW5nIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBWYWx1ZSByZXR1cm5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZC4gXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1hdGNoPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uU3RyaW5nPihcclxuICAgICAgICBvdXRwdXRUeXBlOiB7IG5ldyhwcmV2PzogUmFkb25PcGVyYXRvcik6IE91dHB1dFR5cGU7IH0sIFxyXG4gICAgICAgIG1hdGNoaW5nTWFwOiBNYXA8c3RyaW5nLCBhbnk+LCBcclxuICAgICAgICBkZWZhdWx0VmFsdWU6IGFueVxyXG4gICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihvdXRwdXRUeXBlLCBbbWF0Y2hpbmdNYXAsIGRlZmF1bHRWYWx1ZV0pXHJcbiAgICAgICAgLy8gdGhpcy5fYnl0ZWNvZGUgPSBbIFxyXG4gICAgICAgIC8vICAgICAweDc1LCAgXHJcbiAgICAgICAgLy8gICAgIG1hdGNoaW5nTWFwLFxyXG4gICAgICAgIC8vICAgICBkZWZhdWx0VmFsdWVcclxuICAgICAgICAvLyBdXHJcbiAgICAgICAgLy8gdGhpcy5fbWV0aG9kID0gXCJtYXRjaFwiXHJcbiAgICAgICAgLy8gdGhpcy5fcGFyYW1zID0gYHsgJHtPYmplY3QuZW50cmllcyhtYXRjaGluZ01hcCkubWFwKChlbnRyeTogW3N0cmluZywgYW55XSkgPT4gYFxcXCIke2VudHJ5WzBdfVxcXCI6ICR7ZW50cnlbMV19LCBgKX19LCAke2RlZmF1bHRWYWx1ZX1gXHJcbiAgICAgICAgLy8gbGV0IGtleXM6IHN0cmluZyA9IFwiXCJcclxuICAgICAgICAvLyBPYmplY3Qua2V5cyhtYXRjaGluZ01hcCkubWFwKChrZXk6IHN0cmluZykgPT4ga2V5cyArPSBrZXkgKyBcIjtcIilcclxuICAgICAgICAvLyByZXR1cm4gbmV3IG91dHB1dFR5cGUodGhpcywga2V5cylcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2UgaW5wdXQgc3RyaW5nIGFzIGFuIGFycmF5IG9mIEpTT04gaXRlbXMuIFxyXG4gICAgICogQHBhcmFtIGpzb25QYXRocyAob3B0aW9uYWwpIEFycmF5IG9mIEpTT04gcGF0aHMgd2l0aGluIGlucHV0IGBSYWRvblN0cmluZ2AgZnJvbSB3aGVyZSB0byBmZXRjaCBpdGVtcyB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIG91dHB1dCBgUmFkb25BcnJheWAuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGFyc2VKU09OQXJyYXkoLi4uanNvblBhdGhzOiBzdHJpbmdbXSk6IFJhZG9uQXJyYXk8UmFkb25Bbnk+IHsgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uQW55PiwgWy4uLmpzb25QYXRoc10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlIHN0cmluZyBhcyBhIEpTT04tZW5jb2RlZCBtYXAuIFxyXG4gICAgICogQHBhcmFtIGpzb25QYXRoIChvcHRpb25hbCkgSlNPTiBwYXRoIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZXh0cmFjdCB0aGUgb3V0cHV0IGBSYWRvbk1hcGAuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25NYXBgIG9iamVjdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXJzZUpTT05NYXAoanNvblBhdGg/OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbanNvblBhdGhdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZSBzdHJpbmcgYXMgYW4gWE1MLWVuY29kZWQgbWFwLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwYXJzZVhNTE1hcCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZSB3aXRoIGdpdmVuIGByZXBsYWNlbWVudGAgc3RyaW5nLCBhbGwgcGFydHMgb2YgdGhlIGlucHV0IHN0cmluZyB0aGF0IG1hdGNoIHdpdGggZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLiBcclxuICAgICAqIEBwYXJhbSByZWdleCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgbWF0Y2hlZC5cclxuICAgICAqIEBwYXJhbSByZXBsYWNlbWVudCBUZXh0IHRoYXQgd2lsbCByZXBsYWNlIGFsbCBvY2N1cmVuY2VzLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZXBsYWNlKHJlZ2V4OiBzdHJpbmcgPSBcIlwiLCByZXBsYWNlbWVudDogc3RyaW5nID0gXCJcIikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtyZWdleCwgcmVwbGFjZW1lbnRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGEgc2xpY2UgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IHN0cmluZy4gXHJcbiAgICAgKiBBIGBzdGFydEluZGV4YCBvZiAwIHJlZmVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBzdHJpbmcuIElmIG5vIGBlbmRJbmRleGAgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYXNzdW1lZCBcclxuICAgICAqIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHN0cmluZy4gTmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIHN0YXJ0SW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IHN0cmluZyB3aGVyZSB0aGUgb3V0cHV0IHN0cmluZyB3aWxsIHN0YXJ0LlxyXG4gICAgICogQHBhcmFtIGVuZEluZGV4IFBvc2l0aW9uIHdpdGhpbiBpbnB1dCBzdHJpbmcgd2hlcmUgdGhlIG91dHB1dCBzdHJpbmcgd2lsbCBlbmQuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbc3RhcnRJbmRleCwgZW5kSW5kZXhdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBEaXZpZGVzIGlucHV0IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN1YnN0cmluZ3MsIFxyXG4gICAgICogQHBhcmFtIHJlZ2V4IFRoZSBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uIHRvIHVzZSBmb3Igc3BsaXR0aW5nLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3BsaXQocmVnZXg6IHN0cmluZyA9IFwiXFxyXCIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25TdHJpbmc+LCBbcmVnZXhdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBMb3dlciBjYXNlIGFsbCBjaGFyYWN0ZXJzLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvTG93ZXJjYXNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBVcHBlciBjYXNlIGFsbCBjaGFyYWN0ZXJzLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvVXBwZXJDYXNlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
978
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JhZG9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUEyQztBQUMzQywyREFBNEM7QUFHNUMsZ0RBQWlDO0FBSWpDLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN0Qiw2REFBYSxDQUFBO0lBQ2IsdURBQVUsQ0FBQTtJQUNWLG1EQUFRLENBQUE7QUFDWixDQUFDLEVBSlcsY0FBYyw4QkFBZCxjQUFjLFFBSXpCO0FBRUQsSUFBSyxrQkFtQko7QUFuQkQsV0FBSyxrQkFBa0I7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG9FQUFlLENBQUE7SUFDZixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQix1QkFBdUI7QUFDM0IsQ0FBQyxFQW5CSSxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBbUJ0QjtBQUVELElBQVksY0FxRVg7QUFyRUQsV0FBWSxjQUFjO0lBQ3RCLGtFQUFrQixDQUFBO0lBQ2xCLGtFQUFrQixDQUFBO0lBQ2xCLG9CQUFvQjtJQUNwQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixzRUFBb0IsQ0FBQTtJQUNwQixzRUFBb0IsQ0FBQTtJQUNwQiwwRUFBc0IsQ0FBQTtJQUN0QixrRUFBa0IsQ0FBQTtJQUNsQix3RUFBcUIsQ0FBQTtJQUNyQiw0REFBZSxDQUFBO0lBQ2Ysa0VBQWtCLENBQUE7SUFDbEIsOERBQWdCLENBQUE7SUFDaEIsb0JBQW9CO0lB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QUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFDRDs7O09BR0c7SUFDSSxXQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksV0FBVztRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztDQUNKO0FBaklELGtDQWlJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuY29kZSBhcyBjYm9yRW5jb2RlIH0gZnJvbSBcImNib3JcIlxyXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gXCIuLi8uLi9iaW4vaGVscGVyc1wiXHJcblxyXG5pbXBvcnQgeyBPcGNvZGVzIGFzIFJhZG9uUmVkdWNlck9wY29kZXMgfSBmcm9tICcuL3JlZHVjZXJzJ1xyXG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuLi91dGlscydcclxuXHJcbmV4cG9ydCB7IEhleFN0cmluZyBhcyBSYWRvbkJ5dGVjb2RlIH0gZnJvbSBcIi4uL3R5cGVzXCJcclxuXHJcbmV4cG9ydCBlbnVtIFJhZG9uRW5jb2RpbmdzIHtcclxuICAgIEhleFN0cmluZyA9IDAsXHJcbiAgICBCYXNlNjQgPSAxLFxyXG4gICAgVXRmOCA9IDIsXHJcbn1cclxuXHJcbmVudW0gUmFkb25IYXNoRnVuY3Rpb25zIHtcclxuICAgIC8vIEJsYWtlMjU2ID0gMHgwMCxcclxuICAgIC8vIEJsYWtlNTEyID0gMHgwMSxcclxuICAgIC8vIEJsYWtlMnMyNTYgPSAweDAyLFxyXG4gICAgLy8gQmxha2UyYjUxMiA9IDB4MDMsXHJcbiAgICAvLyBNRDVfMTI4ID0gMHgwNCxcclxuICAgIC8vIFJpcGVtZDEyOCA9IDB4MDUsXHJcbiAgICAvLyBSaXBlbWQxNjAgPSAweDA2LFxyXG4gICAgLy8gUmlwZW1kMzIwID0gMHgwNyxcclxuICAgIC8vIFNIQTFfMTYwID0gMHgwOCxcclxuICAgIC8vIFNIQTJfMjI0ID0gMHgwOSxcclxuICAgIFNIQTJfMjU2ID0gMHgwQSxcclxuICAgIC8vIFNIQTJfMzg0ID0gMHgwQixcclxuICAgIC8vIFNIQTJfNTEyID0gMHgwQyxcclxuICAgIC8vIFNIQTNfMjI0ID0gMHgwRCxcclxuICAgIC8vIFNIQTNfMjU2ID0gMHgwRSxcclxuICAgIC8vIFNIQTNfMzg0ID0gMHgwRixcclxuICAgIC8vIFNIQTNfNTEyID0gMHgxMCxcclxuICAgIC8vIFdoaXJscG9vbDUxMiA9IDB4MTEsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFJhZG9uT3BlcmF0b3JzIHtcclxuICAgIEFycmF5TGVuZ3RoID0gMHgxMCxcclxuICAgIEFycmF5RmlsdGVyID0gMHgxMSxcclxuICAgIC8vIEFycmF5Sm9pbiA9IDB4MTIsXHJcbiAgICBBcnJheUdldEFycmF5ID0gMHgxMyxcclxuICAgIEFycmF5R2V0Qm9vbGVhbiA9IDB4MTQsXHJcbiAgICBBcnJheUdldEJ5dGVzID0gMHgxNSxcclxuICAgIEFycmF5R2V0RmxvYXQgPSAweDE2LFxyXG4gICAgQXJyYXlHZXRJbnRlZ2VyID0gMHgxNyxcclxuICAgIEFycmF5R2V0TWFwID0gMHgxOCxcclxuICAgIEFycmF5R2V0U3RyaW5nID0gMHgxOSxcclxuICAgIEFycmF5TWFwID0gMHgxYSxcclxuICAgIEFycmF5UmVkdWNlID0gMHgxYixcclxuICAgIEFycmF5U29ydCA9IDB4MWQsXHJcbiAgICAvLyBBcnJheVBpY2sgPSAweDFlLFxyXG4gICAgQm9vbGVhblRvU3RyaW5nID0gMHgyMCxcclxuICAgIEJvb2xlYW5OZWdhdGUgPSAweDIyLFxyXG4gICAgQnl0ZXNUb1N0cmluZyA9IDB4MzAsXHJcbiAgICBCeXRlc0hhc2ggPSAweDMxLFxyXG4gICAgQnl0ZXNBc0ludGVnZXIgPSAweDMyLFxyXG4gICAgQnl0ZXNMZW5ndGggPSAweDM0LFxyXG4gICAgQnl0ZXNTbGljZSA9IDB4M2MsXHJcbiAgICBGbG9hdEFic29sdXRlID0gMHg1MCxcclxuICAgIEZsb2F0VG9TdHJpbmcgPSAweDUxLFxyXG4gICAgRmxvYXRDZWlsaW5nID0gMHg1MixcclxuICAgIEZsb2F0R3JlYXRlclRoYW4gPSAweDUzLFxyXG4gICAgRmxvYXRGbG9vciA9IDB4NTQsXHJcbiAgICBGbG9hdExlc3NUaGFuID0gMHg1NSxcclxuICAgIEZsb2F0TW9kdWxlID0gMHg1NixcclxuICAgIEZsb2F0TXVsdGlwbHkgPSAweDU3LFxyXG4gICAgRmxvYXROZWdhdGUgPSAweDU4LFxyXG4gICAgRmxvYXRQb3dlciA9IDB4NTksXHJcbiAgICBGbG9hdFJvdW5kID0gMHg1YixcclxuICAgIEZsb2F0VHJ1bmNhdGUgPSAweDVkLFxyXG4gICAgSW50ZWdlckFic29sdXRlID0gMHg0MCxcclxuICAgIEludGVnZXJUb0Zsb2F0ID0gMHg0MSxcclxuICAgIEludGVnZXJUb1N0cmluZyA9IDB4NDIsXHJcbiAgICBJbnRlZ2VyR3JlYXRlclRoYW4gPSAweDQzLFxyXG4gICAgSW50ZWdlckxlc3NUaGFuID0gMHg0NCxcclxuICAgIEludGVnZXJNb2R1bG8gPSAweDQ2LFxyXG4gICAgSW50ZWdlck11bHRpcGx5ID0gMHg0NyxcclxuICAgIEludGVnZXJOZWdhdGUgPSAweDQ4LFxyXG4gICAgSW50ZWdlclBvd2VyID0gMHg0OSxcclxuICAgIEludGVnZXJUb0J5dGVzID0gMHg0YSxcclxuICAgIE1hcFRvU3RyaW5nID0gMHg2MCxcclxuICAgIE1hcEdldEFycmF5ID0gMHg2MSxcclxuICAgIE1hcEdldEJvb2xlYW4gPSAweDYyLFxyXG4gICAgTWFwR2V0RmxvYXQgPSAweDY0LFxyXG4gICAgTWFwR2V0SW50ZWdlciA9IDB4NjUsXHJcbiAgICBNYXBHZXRNYXAgPSAweDY2LFxyXG4gICAgTWFwR2V0U3RyaW5nID0gMHg2NyxcclxuICAgIE1hcEtleXMgPSAweDY4LFxyXG4gICAgTWFwVmFsdWVzID0gMHg2OSxcclxuICAgIE1hcEFsdGVyID0gMHg2YixcclxuICAgIE1hcFBpY2sgPSAweDZlLCAgIFxyXG4gICAgU3RyaW5nQXNCb29sZWFuID0gMHg3MCxcclxuICAgIFN0cmluZ0FzQnl0ZXMgPSAweDcxLFxyXG4gICAgU3RyaW5nQXNGbG9hdCA9IDB4NzIsXHJcbiAgICBTdHJpbmdBc0ludGVnZXIgPSAweDczLFxyXG4gICAgU3RyaW5nTGVuZ3RoID0gMHg3NCxcclxuICAgIFN0cmluZ01hdGNoID0gMHg3NSxcclxuICAgIFN0cmluZ1BhcnNlSlNPTkFycmF5ID0gMHg3NixcclxuICAgIFN0cmluZ1BhcnNlSlNPTk1hcCA9IDB4NzcsXHJcbiAgICBTdHJpbmdQYXJzZVhNTE1hcCA9IDB4NzgsXHJcbiAgICBTdHJpbmdUb0xvd2VyQ2FzZSA9IDB4NzksXHJcbiAgICBTdHJpbmdUb1VwcHNlckNhc2UgPSAweDdhLFxyXG4gICAgU3RyaW5nUmVwbGFjZSA9IDB4N2IsXHJcbiAgICBTdHJpbmdTbGljZSA9IDB4N2MsXHJcbiAgICBTdHJpbmdTcGxpdCA9IDB4N2QsXHJcbn1cclxuXHJcbmFic3RyYWN0IGNsYXNzIFJhZG9uQ2xhc3Mge1xyXG4gICAgcmVhZG9ubHkgcHJldj86IFJhZG9uT3BlcmF0b3I7XHJcbiAgICBjb25zdHJ1Y3RvcihwcmV2PzogUmFkb25PcGVyYXRvcikge1xyXG4gICAgICAgIHRoaXMucHJldiA9IHByZXZcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uT3BlcmF0b3IgZXh0ZW5kcyBSYWRvbkNsYXNzIHtcclxuICAgIHJlYWRvbmx5IG9wY29kZTogUmFkb25PcGVyYXRvcnNcclxuICAgIHJlYWRvbmx5IHBhcmFtcz86IGFueVtdXHJcbiAgICBjb25zdHJ1Y3RvcihvcGNvZGU6IFJhZG9uT3BlcmF0b3JzLCBwYXJhbXM/OiBhbnlbXSwgb3BzPzogUmFkb25PcGVyYXRvcikge1xyXG4gICAgICAgIHN1cGVyKG9wcylcclxuICAgICAgICB0aGlzLm9wY29kZSA9IG9wY29kZVxyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zIHx8IFtdXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXJnc0NvdW50KCk6IG51bWJlciB7IFxyXG4gICAgICAgIGxldCBtYXhDb3VudDogbnVtYmVyID0gMFxyXG4gICAgICAgIHRoaXMucGFyYW1zPy5mb3JFYWNoKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gaGVscGVycy5nZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcocGFyYW0pXHJcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBtYXhDb3VudCkgbWF4Q291bnQgPSBjb3VudFxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcgJiYgcGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBwYXJhbS5hcmdzQ291bnQoKVxyXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gbWF4Q291bnQpIG1heENvdW50ID0gY291bnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KFxyXG4gICAgICAgICAgICBtYXhDb3VudCxcclxuICAgICAgICAgICAgdGhpcy5wcmV2Py5hcmdzQ291bnQoKSB8fCAwXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG4gICAgcHVibGljIGRpc2VjdChsZXZlbCA9IDApOiBbbnVtYmVyLCBzdHJpbmcsIHN0cmluZ11bXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcz8ucHJldj8uZGlzZWN0KGxldmVsKSB8fCBbXVxyXG4gICAgICAgIGNvbnN0IG9wZXJhdG9yID0gUmFkb25PcGVyYXRvcnNbdGhpcy5vcGNvZGVdXHJcbiAgICAgICAgY29uc3QgaW5wdXRUeXBlID0gYFJhZG9uJHtvcGVyYXRvci5zcGxpdCgvKD89W0EtWl0pLylbMF19YFxyXG4gICAgICAgIGxldCByYWRvbkNhbGwgPSBvcGVyYXRvci5zcGxpdCgvKD89W0EtWl0pLykuc2xpY2UoMSkuam9pbignJylcclxuICAgICAgICByYWRvbkNhbGwgPSByYWRvbkNhbGwuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyByYWRvbkNhbGwuc2xpY2UoMSlcclxuICAgICAgICBsZXQgYXJncyA9IFwiXCJcclxuICAgICAgICBsZXQgc2NyaXB0XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gIT09ICdvYmplY3QnIHx8ICEocGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBhcmdzICs9ICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnID8gIGBcIiR7cGFyYW19XCJgIDogSlNPTi5zdHJpbmdpZnkocGFyYW0pKSArIFwiLCBcIlxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzY3JpcHQgPSBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZiAoc2NyaXB0KSBhcmdzICs9IFwiUmFkb25PcGVyYXRvciB7XCJcclxuICAgICAgICAgICAgZWxzZSBhcmdzID0gYXJncy5zbGljZSgwLCAtMilcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjcmlwdCkge1xyXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gYCR7KHNjcmlwdCBhcyBSYWRvblNjcmlwdCkub3V0cHV0VHlwZT8uY29uc3RydWN0b3IubmFtZSB8fCBcIlJhZG9uQW55XCJ9YFxyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9YFxyXG4gICAgICAgICAgICByZXN1bHQucHVzaChbbGV2ZWwsIGlucHV0VHlwZSwgcmFkb25DYWxsXSlcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uKHNjcmlwdCBhcyBSYWRvblNjcmlwdCkuZGlzZWN0KGxldmVsICsgMSkpXHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtsZXZlbCwgb3V0cHV0VHlwZSwgXCJ9KVwiXSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9KWBcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgIH1cclxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10geyBcclxuICAgICAgICBsZXQgZW5jb2RlZFxyXG4gICAgICAgIGlmICh0aGlzPy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5wYXJhbXMubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25BbnkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnByZXY/LmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uT3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmVuY29kZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5lbmNvZGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGVuY29kZWQgPSBbdGhpcy5vcGNvZGUsIC4uLmFyZ3NdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZW5jb2RlZCA9IHRoaXMub3Bjb2RlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnByZXYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFsuLi50aGlzLnByZXYuZW5jb2RlKCksIGVuY29kZWRdXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtlbmNvZGVkXVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyByZXBsYWNlV2lsZGNhcmRzKGFyZ3M6IHN0cmluZ1tdKTogUmFkb25PcGVyYXRvciB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgdGhpcy5hcmdzQ291bnQoKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYEluc3VmZmljZW50IGFyZ3Mgd2VyZSBwcm92aWRlZCAoJHthcmdzLmxlbmd0aH0gPCAke3RoaXMuYXJnc0NvdW50KCl9KWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcclxuICAgICAgICAgICAgdGhpcy5vcGNvZGUsIFxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcz8ubWFwKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMucmVwbGFjZVdpbGRjYXJkcyhwYXJhbSwgYXJncylcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5yZXBsYWNlV2lsZGNhcmRzKC4uLmFyZ3MpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMucmVwbGFjZVdpbGRjYXJkcyhwYXJhbSwgYXJncylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSwgXHJcbiAgICAgICAgICAgIHRoaXM/LnByZXY/LnJlcGxhY2VXaWxkY2FyZHMoYXJncylcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXg6IG51bWJlciwgYXJnVmFsdWU6IHN0cmluZyk6IFJhZG9uT3BlcmF0b3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcclxuICAgICAgICAgICAgdGhpcy5vcGNvZGUsXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zPy5tYXAocGFyYW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGVscGVycy5zcGxpY2VXaWxkY2FyZChwYXJhbSwgYXJnSW5kZXgsIGFyZ1ZhbHVlLCB0aGlzLmFyZ3NDb3VudCgpKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnICYmIHBhcmFtIGluc3RhbmNlb2YgUmFkb25TY3JpcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW0uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHRoaXM/LnByZXY/LnNwbGljZVdpbGRjYXJkKGFyZ0luZGV4LCBhcmdWYWx1ZSlcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdG9TdHJpbmcobGVmdCA9IFwiXCIsIGluZGVudCA9IDQsIGxldmVsID0gMCk6IHN0cmluZyB7IFxyXG4gICAgICAgIGNvbnN0IGxmID0gbGVmdCAhPT0gXCJcIiA/IFwiXFxuXCIgOiBcIlwiXHJcbiAgICAgICAgbGV0IHN0ciA9IHRoaXM/LnByZXY/LnRvU3RyaW5nKGxlZnQsIGluZGVudCwgbGV2ZWwpIHx8IFwiXCJcclxuICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IFJhZG9uT3BlcmF0b3JzW3RoaXMub3Bjb2RlXS5zcGxpdCgvKD89W0EtWl0pLykuc2xpY2UoMSkuam9pbignJylcclxuICAgICAgICBtZXRob2ROYW1lID0gbWV0aG9kTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG1ldGhvZE5hbWUuc2xpY2UoMSlcclxuICAgICAgICBzdHIgKz0gYCR7bGVmdH0ke1wiIFwiLnJlcGVhdChpbmRlbnQgKiBsZXZlbCl9LiR7bWV0aG9kTmFtZX0oYFxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcyAmJiB0aGlzLnBhcmFtc1swXSAhPT0gdW5kZWZpbmVkKSB7IFxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IGBcIiR7cGFyYW19XCIsIGBcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9IGAke3BhcmFtLnRvU3RyaW5nKGxlZnQsIGluZGVudCwgbGV2ZWwgKyAxKX0ke2xlZnR9JHtcIiBcIi5yZXBlYXQoaW5kZW50ICogbGV2ZWwpfSwgYFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gcGFyYW0udG9TdHJpbmcoKSArIFwiLCBcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0ciArPSBgKSR7bGZ9YFxyXG4gICAgICAgIHJldHVybiBzdHJcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJhZG9uU2NyaXB0IHtcclxuICAgIHByb3RlY3RlZCByZWFkb25seSBvcHM/OiBSYWRvbk9wZXJhdG9yO1xyXG4gICAgcHVibGljIHJlYWRvbmx5IGlucHV0VHlwZT86IFJhZG9uQW55O1xyXG4gICAgcHVibGljIHJlYWRvbmx5IG91dHB1dFR5cGU/OiBSYWRvbkFueTtcclxuICAgIGNvbnN0cnVjdG9yIChvdXRwdXQ6IFJhZG9uQW55KSB7XHJcbiAgICAgICAgdGhpcy5vcHMgPSBvdXRwdXQ/LnByZXY7XHJcbiAgICAgICAgY29uc3QgcmFkb25UeXBlcyA9IHtcclxuICAgICAgICAgICAgXCJBcnJheVwiOiBSYWRvbkFycmF5LFxyXG4gICAgICAgICAgICBcIkJvb2xlYW5cIjogUmFkb25Cb29sZWFuLFxyXG4gICAgICAgICAgICBcIkJ5dGVzXCI6IFJhZG9uQnl0ZXMsXHJcbiAgICAgICAgICAgIFwiRmxvYXRcIjogUmFkb25GbG9hdCxcclxuICAgICAgICAgICAgXCJJbnRlZ2VyXCI6IFJhZG9uSW50ZWdlcixcclxuICAgICAgICAgICAgXCJNYXBcIjogUmFkb25NYXAsXHJcbiAgICAgICAgICAgIFwiU3RyaW5nXCI6IFJhZG9uU3RyaW5nLFxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW5wdXQgPSBvdXRwdXQ/LnByZXZcclxuICAgICAgICB3aGlsZSAoaW5wdXQ/LnByZXYpIGlucHV0ID0gaW5wdXQ/LnByZXZcclxuICAgICAgICBjb25zdCBpbnB1dFR5cGUgPSBPYmplY3QuZW50cmllcyhyYWRvblR5cGVzKS5maW5kKChbcHJlZml4LCBfXSkgPT4gaW5wdXQgJiYgUmFkb25PcGVyYXRvcnNbaW5wdXQub3Bjb2RlXS5zdGFydHNXaXRoKHByZWZpeCkpXHJcbiAgICAgICAgaWYgKGlucHV0VHlwZSAmJiBpbnB1dFR5cGVbMV0pIHRoaXMuaW5wdXRUeXBlID0gbmV3IGlucHV0VHlwZVsxXSgpXHJcbiAgICAgICAgY29uc3Qgb3V0cHV0VHlwZSA9IE9iamVjdC52YWx1ZXMocmFkb25UeXBlcykuZmluZChvdXRwdXRUeXBlID0+IG91dHB1dCBpbnN0YW5jZW9mIG91dHB1dFR5cGUpO1xyXG4gICAgICAgIGlmIChvdXRwdXRUeXBlKSB0aGlzLm91dHB1dFR5cGUgPSBuZXcgb3V0cHV0VHlwZSgpXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYXJnc0NvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BzPy5hcmdzQ291bnQoKSB8fCAwO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGNsb25lKCk6IFJhZG9uQW55IHtcclxuICAgICAgICBjb25zdCBPdXRwdXRUeXBlID0gW1xyXG4gICAgICAgICAgICBSYWRvbkFycmF5LFxyXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFJhZG9uQnl0ZXMsXHJcbiAgICAgICAgICAgIFJhZG9uRmxvYXQsXHJcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcclxuICAgICAgICAgICAgUmFkb25NYXAsXHJcbiAgICAgICAgICAgIFJhZG9uU3RyaW5nLFxyXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xyXG4gICAgICAgIGlmIChPdXRwdXRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3V0cHV0VHlwZSh0aGlzLm9wcylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYENhbm5vdCBjbG9uZSBmcm9tIGVtcHR5IHNjcmlwdGApXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIGRpc2VjdChsZXZlbCA9IDApOiBbbnVtYmVyLCBzdHJpbmcsIHN0cmluZ11bXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BzPy5kaXNlY3QobGV2ZWwpIHx8IFtbbGV2ZWwsIFwiUmFkb25BbnlcIiwgXCJcIl1dXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZW5jb2RlKCk6IGFueVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmVuY29kZSgpIHx8IFtdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHJlcGxhY2VXaWxkY2FyZHMoLi4uYXJnczogc3RyaW5nW10pOiBSYWRvbkFueSB7XHJcbiAgICAgICAgY29uc3QgT3V0cHV0VHlwZSA9IFtcclxuICAgICAgICAgICAgUmFkb25BcnJheSxcclxuICAgICAgICAgICAgUmFkb25Cb29sZWFuLFxyXG4gICAgICAgICAgICBSYWRvbkJ5dGVzLFxyXG4gICAgICAgICAgICBSYWRvbkZsb2F0LFxyXG4gICAgICAgICAgICBSYWRvbkludGVnZXIsXHJcbiAgICAgICAgICAgIFJhZG9uTWFwLFxyXG4gICAgICAgICAgICBSYWRvblN0cmluZyxcclxuICAgICAgICBdLmZpbmQoT3V0cHV0VHlwZSA9PiB0aGlzLm91dHB1dFR5cGUgaW5zdGFuY2VvZiBPdXRwdXRUeXBlKTtcclxuICAgICAgICBpZiAoT3V0cHV0VHlwZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IE91dHB1dFR5cGUodGhpcy5vcHM/LnJlcGxhY2VXaWxkY2FyZHMoYXJncykpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgRXZhbEVycm9yKGBDYW5ub3QgcmVwbGFjZSB3aWxkY2FyZHMgb24gZW1wdHkgc2NyaXB0YClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXg6IG51bWJlciwgYXJnVmFsdWU6IHN0cmluZyk6IFJhZG9uQW55IHtcclxuICAgICAgICBjb25zdCBPdXRwdXRUeXBlID0gW1xyXG4gICAgICAgICAgICBSYWRvbkFycmF5LFxyXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXHJcbiAgICAgICAgICAgIFJhZG9uQnl0ZXMsXHJcbiAgICAgICAgICAgIFJhZG9uRmxvYXQsXHJcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcclxuICAgICAgICAgICAgUmFkb25NYXAsXHJcbiAgICAgICAgICAgIFJhZG9uU3RyaW5nLFxyXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xyXG4gICAgICAgIGlmIChPdXRwdXRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3V0cHV0VHlwZSh0aGlzLm9wcz8uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBFdmFsRXJyb3IoYENhbm5vdCBzcGxpY2Ugd2lsZGNhcmRzIG9uIGVtcHR5IHNjcmlwdGApXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIHRvQnl0ZWNvZGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gVXRpbHMudG9IZXhTdHJpbmcoT2JqZWN0LnZhbHVlcyhVaW50OEFycmF5LmZyb20oY2JvckVuY29kZSh0aGlzLmVuY29kZSgpKSkpLCB0cnVlKVxyXG4gICAgfVxyXG4gICAgcHVibGljIHRvU3RyaW5nKGxlZnQgPSBcIlwiLCBpbmRlbnQgPSAwLCBsZXZlbCA9IDApOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGxmID0gbGVmdCAhPT0gXCJcIiA/IFwiXFxuXCIgOiBcIlwiXHJcbiAgICAgICAgcmV0dXJuIGBSYWRvbk9wZXJhdG9yKCR7dGhpcy5pbnB1dFR5cGU/LmNvbnN0cnVjdG9yLm5hbWUgfHwgXCJcIn0pJHtsZn0ke3RoaXMub3BzPy50b1N0cmluZyhsZWZ0LCBpbmRlbnQsIGxldmVsICsgMSl9YFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmFkb25BbnkgZXh0ZW5kcyBSYWRvbkNsYXNzIHtcclxuICAgIHByb3RlY3RlZCBfcHVzaE9wZXJhdG9yPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueT4oXHJcbiAgICAgICAgb3V0cHV0VHlwZTogeyBuZXcob3BzPzogUmFkb25PcGVyYXRvcik6IE91dHB1dFR5cGU7IH0sIFxyXG4gICAgICAgIHBhcmFtczogYW55W10sXHJcbiAgICApOiBPdXRwdXRUeXBlIHtcclxuICAgICAgICBsZXQgbmFtZVxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSAoZXJyIGFzIEVycm9yKVxyXG4gICAgICAgICAgICBuYW1lID0gcmVzdWx0LnN0YWNrPy5zcGxpdCgnIGF0ICcpWzJdXHJcbiAgICAgICAgICAgICAgICAuc3BsaXQoJyAnKVswXVxyXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcuJylcclxuICAgICAgICAgICAgICAgIC5tYXAocGFydCA9PiBoZWxwZXJzLnRvVXBwZXJDYW1lbENhc2UocGFydCkpXHJcbiAgICAgICAgICAgICAgICAuam9pbignJylcclxuICAgICAgICAgICAgICAgIC5zcGxpdCgvKD89W0EtWl0pLykuc2xpY2UoMSlcclxuICAgICAgICAgICAgICAgIC5qb2luKCcnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcGNvZGUgPSBSYWRvbk9wZXJhdG9yc1tuYW1lIGFzIGtleW9mIHR5cGVvZiBSYWRvbk9wZXJhdG9yc11cclxuICAgICAgICBpZiAoIW9wY29kZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgRmF0YWw6IHVua25vd24gUmFkb24gT3BlcmF0b3Igb3Bjb2RlICcke25hbWV9J2ApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBvdXRwdXRUeXBlKG5ldyBSYWRvbk9wZXJhdG9yKFxyXG4gICAgICAgICAgICAgICAgb3Bjb2RlLCBcclxuICAgICAgICAgICAgICAgIFsuLi5wYXJhbXNdLCBcclxuICAgICAgICAgICAgICAgIHRoaXM/LnByZXZcclxuICAgICAgICAgICAgKSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFkb25BcnJheTxJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueT4ge1xyXG4gICAgaXRlbXNUeXBlOiBJdGVtc1R5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbkFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+IGV4dGVuZHMgUmFkb25Bbnkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBEaXNjYXJkIHRoZSBpdGVtcyBpbiB0aGUgaW5wdXQgYXJyYXkgdGhhdCBtYWtlIHRoZSBnaXZlbiBgaW5uZXJTY3JpcHRgIHRvIHJldHVybiBhIGBmYWxzZWAgdmFsdWUuIFxyXG4gICAgICogQHBhcmFtIHNjcmlwdCBGaWx0ZXJpbmcgc2NyaXB0IHVsdGltYXRlbHkgcmV0dXJuaW5nIGEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICogTXVzdCBhY2NlcHQgYXMgaW5wdXQgdGhlIHNhbWUgZGF0YSB0eXBlcyBhcyB0aGUgb25lcyBvZiB0aGUgaXRlbXMgYmVpbmcgaXRlcmF0ZWQuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUgaXRlbXMgdGhhdCBtYWtlIHRoZSBgaW5uZXJTY3JpcHRgIHRvIHJldHVybiBhIGB0cnVlYCB2YWx1ZS4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmaWx0ZXIoaW5uZXJTY3JpcHQ6IFJhZG9uQm9vbGVhbikge1xyXG4gICAgICAgIGlmICghKGlubmVyU2NyaXB0IGluc3RhbmNlb2YgUmFkb25Cb29sZWFuKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXZhbEVycm9yKGBJbm5lciBzY3JpcHQgbXVzdCBmZXRjaCBhIFJhZG9uQm9vbGVhbiB2YWx1ZWApXHJcbiAgICAgICAgfSBcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgW25ldyBSYWRvblNjcmlwdChpbm5lclNjcmlwdCldKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGZXRjaCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBhcyBhIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBcnJheTxTdWJJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFN1Ykl0ZW1zVHlwZT4sIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Qm9vbGVhbihpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ5dGVzKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSBpbmRleCBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEZsb2F0KGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIGluZGV4IFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SW50ZWdlcihpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRNYXAoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTdHJpbmcoaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtpbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEpvaW4gYWxsIGl0ZW1zIG9mIHRoZSBhcnJheSBpbnRvIGEgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUuIFRoZSBhcnJheSBtdXN0IGJlIGhvbW9nZW5lb3VzLCBcclxuICAgICAqIGFsbCBpdGVtcyBiZWluZyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvdXRwdXRUeXBlYCwgaWYgc3BlY2lmaWVkLCBvciB0aGUgQXJyYXkncyBpdGVtc1R5cGUgb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHNlcGFyYXRvciBTZXBhcmF0b3IgdG8gYmUgdXNlZCB3aGVuIGpvaW5pbmcgc3RyaW5ncy4gV2hlbiBqb2luaW5nIFJhZG9uTWFwcywgaXQgY2FuIGJlIHVzZWQgdG8gc2V0dGxlIGJhc2Ugc2NoZW1hIG9uIHJlc3VsdGluZyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSBSYWRvbiB0eXBlIG9mIHRoZSBvdXRwdXQgdmFsdWUuIFxyXG4gICAgICovXHJcbiAgICAvLyBwdWJsaWMgam9pbjxPdXRwdXRUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvbkFueT4oc2VwYXJhdG9yID0gXCJcIiwgb3V0cHV0VHlwZT86IHsgbmV3KCk6IEl0ZW1zVHlwZTsgfSkge1xyXG4gICAgLy8gICAgIGlmIChvdXRwdXRUeXBlKSB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxPdXRwdXRUeXBlPiwgW3NlcGFyYXRvcl0pXHJcbiAgICAvLyAgICAgZWxzZSB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbc2VwYXJhdG9yXSlcclxuICAgIC8vIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBpdGVtcy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1hcCBhbGwgaXRlbXMgaW4gdGhlIGFycmF5IHdpdGggdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAuIFxyXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IE1hcHBpbmcgc2NyaXB0IHJldHVybmluZyBzb21lIGBSYWRvbkFueWAgb2JqZWN0LlxyXG4gICAgICogTXVzdCBhY2NlcHQgYXMgaW5wdXQgdGhlIHNhbWUgZGF0YSB0eXBlIGFzIHRoZSBvbmUgb2YgdGhlIGl0ZW1zIGJlaW5nIGl0ZXJhdGVkLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdCBjb250YWluaW5nIHRoZSBtYXBwZWQgdmFsdWVzLiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG1hcChpbm5lclNjcmlwdDogUmFkb25PcGVyYXRvcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheSwgW2lubmVyU2NyaXB0XSlcclxuICAgIH1cclxuICAgIC8vIHB1YmxpYyBtYXA8T3V0cHV0SXRlbXNUeXBlIGV4dGVuZHMgUmFkb25Bbnk+KGlubmVyU2NyaXB0OiBSYWRvbk9wZXJhdG9yPE91dHB1dEl0ZW1zVHlwZT4pIHtcclxuICAgIC8vICAgICAvLyB0b2RvOiBjaGVjayBzY3JpcHQncyBpbnB1dCB0eXBlIG1hdGNoZXMgYXJyYXkncyBpdGVtcyB0eXBlLCBpZiBhbnkgPz9cclxuICAgIC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8T3V0cHV0SXRlbXNUeXBlPiwgW2lubmVyU2NyaXB0XSlcclxuICAgIC8vIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVkdWNlIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgaW50byBhIHNpbmdsZSB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSByZWR1Y3RvciBUaGUgcmVkdWN0b3IgbWV0aG9kIHRvIGJlIGFwcGxpZWQuIEFsbCBhcnJheSBpdGVtcyBtdXN0IGJlIFxyXG4gICAgICogY29udmVydGFibGUgaW50byBmbG9hdCB2YWx1ZXMuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWR1Y2UocmVkdWN0b3I6IFJhZG9uUmVkdWNlck9wY29kZXMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtyZWR1Y3Rvcl0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE9yZGVyIHRoZSBhcnJheSBpdGVtcyBiYXNlZCBlaXRoZXIgb24gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gZXZlcnkgaXRlbSwgb3Igb24gdGhlIFxyXG4gICAgICogYWN0dWFsIGl0ZW0gdmFsdWVzIChhcyBsb25nIGFzIHRoZXNlIGFyZSBlaXRoZXIgaW50ZWdlcnMgb3Igc3RyaW5ncykuXHJcbiAgICAgKiBGYWlscyBpZiBhcHBsaWVkIG9uIG5vbi1ob21lZ2Vub3VzIGFycmF5cyAoaS5lLiBub3QgYWxsIGl0ZW1zIHNoYXJpbmcgdGhlIHNhbWUgYFJhZG9uQW55YCkuIFxyXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IChPcHRpb25hbCkgU29ydGluZyBzY3JpcHQgcmV0dXJuaW5nIGVpdGhlciBhIGBSYWRvbkludGVnZXJgIG9yIGEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzb3J0KGlubmVyU2NyaXB0PzogUmFkb25PcGVyYXRvcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIGZyb20gdGhlIGlucHV0IGFycmF5LlxyXG4gICAgICogQHBhcmFtIGluZGV4ZXMgSW5kZXhlcyBvZiB0aGUgaW5wdXQgaXRlbXMgdG8gdGFrZSBpbnRvIHRoZSBvdXRwdXQgYXJyYXkuIFxyXG4gICAgICogQHJldHVybiBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIC8vIHB1YmxpYyBwaWNrKC4uLmluZGV4ZXM6IG51bWJlcltdKSB7XHJcbiAgICAvLyAgICAgaWYgKEFycmF5KGluZGV4ZXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAvLyAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25BcnJheTo6cGljazogYSBub24tZW1wdHkgYXJyYXkgb2YgbnVtYmVycyBtdXN0IGJlIHByb3ZpZGVkXFx4MWJbMG1gKVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgWy4uLmluZGV4ZXNdKVxyXG4gICAgLy8gfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25Cb29sZWFuIGV4dGVuZHMgUmFkb25Bbnkge1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZXZlcnNlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZWdhdGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXN0IHZhbHVlIGludG8gYSBzdHJpbmcuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHRvU3RyaW5nKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25CeXRlcyBleHRlbmRzIFJhZG9uQW55IHtcclxuICAgIHN0YXRpYyByZWFkb25seSBFbmNvZGluZ3MgPSBSYWRvbkVuY29kaW5ncztcclxuICAgIHN0YXRpYyByZWFkb25seSBIYXNoZXJzID0gUmFkb25IYXNoRnVuY3Rpb25zO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0IGJ1ZmZlciBpbnRvIChiaWctZW5kaWFuKSBpbnRlZ2VyLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc0ludGVnZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBcHBseSB0aGUgU0hBMi0yNTYgaGFzaCBmdW5jdGlvbi5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhc2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJ5dGVzLCBbUmFkb25CeXRlcy5IYXNoZXJzLlNIQTJfMjU2XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ291bnQgdGhlIG51bWJlciBvZiBieXRlcy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGxlbmd0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBzbGljZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLiBcclxuICAgICAqIEEgYHN0YXJ0SW5kZXhgIG9mIDAgcmVmZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4gSWYgbm8gYGVuZEluZGV4YCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBhc3N1bWVkIFxyXG4gICAgICogdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyLiBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgYnVmZmVyIHdoZXJlIHRoZSBvdXRwdXQgYnVmZmVyIHdpbGwgc3RhcnQuXHJcbiAgICAgKiBAcGFyYW0gZW5kSW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aWxsIGVuZFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtzdGFydEluZGV4LCBlbmRJbmRleF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgdGhlIGlucHV0IGJ1ZmZlciBpbnRvIGEgc3RyaW5nLlxyXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIG91dHB1dCBzdHJpbmcsIHN0YW5kaW5nOlxyXG4gICAgICogICAwIC0+IEhleCBzdHJpbmcgKGRlZmF1bHQsIGlmIG5vbmUgd2FzIHNwZWNpZmllZClcclxuICAgICAqICAgMSAtPiBCYXNlNjQgc3RyaW5nXHJcbiAgICAgKiAgIDIgLT4gVXRmLTggc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoZW5jb2RpbmcgPSBSYWRvbkVuY29kaW5ncy5IZXhTdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbZW5jb2RpbmddKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25GbG9hdCBleHRlbmRzIFJhZG9uQW55IHtcclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnNvbHV0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSBsb3dlc3QgaW50ZWdlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2VpbGluZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG5cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29tcHV0ZSB0aGUgZ3JlYXRlc3QgaW50ZWdlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBmbG9vcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZSBpZiB0aGUgZmxvYXQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLiBcclxuICAgICAqIEBwYXJhbSBpbnB1dFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBncmVhdGVyVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZSBpZiB0aGUgZmxvYXQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLlxyXG4gICAgICogQHBhcmFtIGlucHV0IFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsZXNzVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGZsb2F0IHJlbWFpbmRlciBvZiBkaXZpZGluZyB0aGUgdmFsdWUgYnkgdGhlIGdpdmVuIGBpbnRlZ2VyYC5cclxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbW9kdWxvKGludGVnZXI6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2ludGVnZXJdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWx0aXBseSB0aGUgZmxvYXQgdmFsdWUgYnkgdGhlIGdpdmVuIGBmYWN0b3JgLlxyXG4gICAgICogQHBhcmFtIGZhY3RvciBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC4gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtdWx0aXBseShmYWN0b3I6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2ZhY3Rvcl0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE5lZ2F0ZSB0aGUgZmxvYXQgdmFsdWUuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmVnYXRlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGZsb2F0IHZhbHVlIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgZ2l2ZW4gYGV4cG9uZW50YFxyXG4gICAgICogQHBhcmFtIGV4cG9uZW50XHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwb3dlcihleHBvbmVudDogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbZXhwb25lbnRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSb3VuZCB0byB0aGUgY2xvc2VzdCBpbnRlZ2VyIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByb3VuZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN0cmluZ2lmeSB0aGUgZmxvYXQgdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRha2UgdGhlIGludGVnZXIgcGFydCBvZiB0aGUgZmxvYXQgdmFsdWUuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cnVuY2F0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvbkludGVnZXIgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIGFic29sdXRlIHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhYnNvbHV0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZSBpZiB0aGUgaW50ZWdlciB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIGBpbnB1dGAuIFxyXG4gICAgICogQHBhcmFtIGlucHV0XHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdyZWF0ZXJUaGFuKGlucHV0OiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2lucHV0XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXHJcbiAgICAgKiBAcGFyYW0gaW5wdXRcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbGVzc1RoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb21wdXRlIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIHZhbHVlIGJ5IHRoZSBnaXZlbiBgaW50ZWdlcmAuXHJcbiAgICAgKiBAcGFyYW0gaW50ZWdlciBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vZHVsbyhpbnRlZ2VyOiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2ludGVnZXJdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBNdWx0aXBseSB0aGUgdmFsdWUgYnkgdGhlIGdpdmVuIGBpbnRlZ2VyYC5cclxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbXVsdGlwbHkoaW50ZWdlcjogbnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtpbnRlZ2VyXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTmVnYXRlIHRoZSBpbnRlZ2VyIHZhbHVlLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5lZ2F0ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvbXB1dGUgdGhlIHZhbHVlIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgZ2l2ZW4gYGV4cG9uZW50YFxyXG4gICAgICogQHBhcmFtIGV4cG9uZW50XHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHBvd2VyKGV4cG9uZW50OiBudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2V4cG9uZW50XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU3RyaW5naWZ5IHRoZSB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FzdCBpbnRvIGEgYmlnLWVuZGlhbiBieXRlcyBidWZmZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b0J5dGVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IHZhbHVlLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9GbG9hdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmFkb25NYXAgZXh0ZW5kcyBSYWRvbkFueSB7XHJcbiAgICAvKipcclxuICAgICAqIEFsdGVyIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbShzKSBpZGVudGlmaWVkIGJ5IGBrZXlzYCwgYXBwbHlpbmcgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gZWFjaCBvbmUgb2YgdGhlbS5cclxuICAgICAqIEBwYXJhbSBrZXlzICBcclxuICAgICAqIEBwYXJhbSBpbm5lclNjcmlwdCBcclxuICAgICAqIEByZXR1cm5zIFRoZSBzYW1lIFJhZG9uTWFwIHVwb24gd2hpY2ggdGhpcyBvcGVyYXRvciBpcyBleGVjdXRlZCwgd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZW0ocykgYWx0ZXJlZFxyXG4gICAgICogYnkgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhbHRlcihpbm5lclNjcmlwdDogUmFkb25PcGVyYXRvciwgLi4ua2V5czogc3RyaW5nW10pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbWy4uLmtleXNdLCBpbm5lclNjcmlwdF0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBhcnJheSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBcnJheTxJdGVtc1R5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihrZXk6IHN0cmluZywgX2l0ZW1zVHlwZT86IHsgbmV3KCk6IEl0ZW1zVHlwZTsgfSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBba2V5XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmV0Y2ggdGhlIGJvb2xlYW4gd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuIFxyXG4gICAgICogQHBhcmFtIGtleSBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJvb2xlYW4oa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBmbG9hdCB2YWx1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGbG9hdChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBpbnRlZ2VyIHZhbHVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEludGVnZXIoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBtYXAgb2JqZWN0IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcclxuICAgICAqIEBwYXJhbSBrZXkgXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbk1hcGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TWFwKGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2tleV0pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZldGNoIHRoZSBzdHJpbmcgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuXHJcbiAgICAgKiBAcGFyYW0ga2V5IFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFN0cmluZyhrZXk6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtrZXldKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeHRyYWN0IGtleSBuYW1lcyBvZiB0aGUgbWFwIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uU3RyaW5nPiwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRha2UgYSBzZWxlY3Rpb24gb2YgaXRlbXMgZnJvbSB0aGUgaW5wdXQgbWFwLiBGYWlscyBpZiB1bmV4aXN0ZW50IGl0ZW1zIGFyZSByZWZlcnJlZC5cclxuICAgICAqIEBwYXJhbSBrZXlzIEtleSBzdHJpbmcgb2YgdGhlIGlucHV0IGl0ZW1zIHRvIHRha2UgaW50byB0aGUgb3V0cHV0IG1hcC4gXHJcbiAgICAgKiBAcmV0dXJuIEEgYFJhZG9uTWFwYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwaWNrKC4uLmtleXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKEFycmF5KGtleXMpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25NYXA6OnBpY2s6IGEgbm9uLWVtcHR5IGFycmF5IG9mIGtleSBzdHJpbmdzIG11c3QgYmUgcHJvdmlkZWRcXHgxYlswbWApXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFsuLi5rZXlzXSlcclxuXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhY3QgdGhlIG1hcCB2YWx1ZXMgaW50byBhbiBhcnJheS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHZhbHVlcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXksIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBTdHJpbmdpZnkgaW5wdXQgYFJhZG9uTWFwYCBvYmplY3QgaW50byBhIEpTT04gc3RyaW5nLlxyXG4gICAgICogQHJldHVybiBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9TdHJpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYWRvblN0cmluZyBleHRlbmRzIFJhZG9uQW55IHtcclxuICAgIC8qKlxyXG4gICAgICogQ2FzdCBpbnRvIGEgYm9vbGVhbiB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXNCb29sZWFuKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydCB0aGUgaW5wdXQgc3RyaW5nIGludG8gYSBieXRlcyBidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgRW51bSBpbnRlZ2VyIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGVuY29kaW5nIHNjaGVtYSBvbiB0aGUgaW5wdXQgc3RyaW5nLCBzdGFuZGluZzpcclxuICAgICAqICAgMCAtPiBIZXggc3RyaW5nIChkZWZhdWx0LCBpZiBub25lIHdhcyBzcGVjaWZpZWQpXHJcbiAgICAgKiAgIDEgLT4gQmFzZTY0IHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXNCeXRlcyhlbmNvZGluZyA9IFJhZG9uRW5jb2RpbmdzLkhleFN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW2VuY29kaW5nXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FzdCBpbnRvIGEgZmxvYXQgbnVtYmVyLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXNGbG9hdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDYXN0IGludG8gYW4gaW50ZWdlciBudW1iZXIuXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzSW50ZWdlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hhcnMuIFxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBsZW5ndGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlIHRoZSBzdHJpbmcgYnkgYSB2YWx1ZSBvZiB0eXBlIGBvdXRwdXRUeXBlYCwgZGV0ZXJtaW5lZCBvbiB3aGV0aGVyIHRoZSBzdHJpbmcgdmFsdWUgbWF0Y2hlcyBcclxuICAgICAqIGFueSBvZiB0aGUga2V5cyB3aXRoaW4gdGhlIHByb3ZpZGVkIGBtYXRjaGluZ01hcGAsIG9yIHNldCB0byBhIGBkZWZhdWx0VmFsdWVgIGlmIG5vIG1hdGNoIGlzIGZvdW5kLlxyXG4gICAgICogQHBhcmFtIG91dHB1dFR5cGUgUmFkb24gdHlwZSBvZiB0aGUgb3V0cHV0IHZhbHVlLiBcclxuICAgICAqIEBwYXJhbSBtYXRjaGluZ01hcCBNYXAgZGV0ZXJtaW5pbmcgdGhlIG91dHB1dCB2YWx1ZSBkZXBlbmRpbmcgb24gdGhlIHN0cmluZyB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVmFsdWUgcmV0dXJuZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmQuIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYXRjaDxPdXRwdXRUeXBlIGV4dGVuZHMgUmFkb25BbnkgPSBSYWRvblN0cmluZz4oXHJcbiAgICAgICAgb3V0cHV0VHlwZTogeyBuZXcocHJldj86IFJhZG9uT3BlcmF0b3IpOiBPdXRwdXRUeXBlOyB9LCBcclxuICAgICAgICBtYXRjaGluZ01hcDogTWFwPHN0cmluZywgYW55PiwgXHJcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBhbnlcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3Iob3V0cHV0VHlwZSwgW21hdGNoaW5nTWFwLCBkZWZhdWx0VmFsdWVdKVxyXG4gICAgICAgIC8vIHRoaXMuX2J5dGVjb2RlID0gWyBcclxuICAgICAgICAvLyAgICAgMHg3NSwgIFxyXG4gICAgICAgIC8vICAgICBtYXRjaGluZ01hcCxcclxuICAgICAgICAvLyAgICAgZGVmYXVsdFZhbHVlXHJcbiAgICAgICAgLy8gXVxyXG4gICAgICAgIC8vIHRoaXMuX21ldGhvZCA9IFwibWF0Y2hcIlxyXG4gICAgICAgIC8vIHRoaXMuX3BhcmFtcyA9IGB7ICR7T2JqZWN0LmVudHJpZXMobWF0Y2hpbmdNYXApLm1hcCgoZW50cnk6IFtzdHJpbmcsIGFueV0pID0+IGBcXFwiJHtlbnRyeVswXX1cXFwiOiAke2VudHJ5WzFdfSwgYCl9fSwgJHtkZWZhdWx0VmFsdWV9YFxyXG4gICAgICAgIC8vIGxldCBrZXlzOiBzdHJpbmcgPSBcIlwiXHJcbiAgICAgICAgLy8gT2JqZWN0LmtleXMobWF0Y2hpbmdNYXApLm1hcCgoa2V5OiBzdHJpbmcpID0+IGtleXMgKz0ga2V5ICsgXCI7XCIpXHJcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBvdXRwdXRUeXBlKHRoaXMsIGtleXMpXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFBhcnNlIGlucHV0IHN0cmluZyBhcyBhbiBhcnJheSBvZiBKU09OIGl0ZW1zLiBcclxuICAgICAqIEBwYXJhbSBqc29uUGF0aHMgKG9wdGlvbmFsKSBBcnJheSBvZiBKU09OIHBhdGhzIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZmV0Y2ggaXRlbXMgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYFJhZG9uQXJyYXlgLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhcnNlSlNPTkFycmF5KC4uLmpzb25QYXRoczogc3RyaW5nW10pOiBSYWRvbkFycmF5PFJhZG9uQW55PiB7IFxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxSYWRvbkFueT4sIFsuLi5qc29uUGF0aHNdKVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZSBzdHJpbmcgYXMgYSBKU09OLWVuY29kZWQgbWFwLiBcclxuICAgICAqIEBwYXJhbSBqc29uUGF0aCAob3B0aW9uYWwpIEpTT04gcGF0aCB3aXRoaW4gaW5wdXQgYFJhZG9uU3RyaW5nYCBmcm9tIHdoZXJlIHRvIGV4dHJhY3QgdGhlIG91dHB1dCBgUmFkb25NYXBgLiBcclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGFyc2VKU09OTWFwKGpzb25QYXRoPzogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2pzb25QYXRoXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2Ugc3RyaW5nIGFzIGFuIFhNTC1lbmNvZGVkIG1hcC4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbk1hcGAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGFyc2VYTUxNYXAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW10pXHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlcGxhY2Ugd2l0aCBnaXZlbiBgcmVwbGFjZW1lbnRgIHN0cmluZywgYWxsIHBhcnRzIG9mIHRoZSBpbnB1dCBzdHJpbmcgdGhhdCBtYXRjaCB3aXRoIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4gXHJcbiAgICAgKiBAcGFyYW0gcmVnZXggUmVndWxhciBleHByZXNzaW9uIHRvIGJlIG1hdGNoZWQuXHJcbiAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQgVGV4dCB0aGF0IHdpbGwgcmVwbGFjZSBhbGwgb2NjdXJlbmNlcy4gXHJcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVwbGFjZShyZWdleDogc3RyaW5nID0gXCJcIiwgcmVwbGFjZW1lbnQ6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbcmVnZXgsIHJlcGxhY2VtZW50XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHNsaWNlIGV4dHJhY3RlZCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcuIFxyXG4gICAgICogQSBgc3RhcnRJbmRleGAgb2YgMCByZWZlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgc3RyaW5nLiBJZiBubyBgZW5kSW5kZXhgIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGFzc3VtZWQgXHJcbiAgICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBzdHJpbmcuIE5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZy5cclxuICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFBvc2l0aW9uIHdpdGhpbiBpbnB1dCBzdHJpbmcgd2hlcmUgdGhlIG91dHB1dCBzdHJpbmcgd2lsbCBzdGFydC5cclxuICAgICAqIEBwYXJhbSBlbmRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgc3RyaW5nIHdoZXJlIHRoZSBvdXRwdXQgc3RyaW5nIHdpbGwgZW5kLlxyXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNsaWNlKHN0YXJ0SW5kZXg6IG51bWJlciA9IDAsIGVuZEluZGV4PzogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW3N0YXJ0SW5kZXgsIGVuZEluZGV4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGl2aWRlcyBpbnB1dCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdWJzdHJpbmdzLCBcclxuICAgICAqIEBwYXJhbSByZWdleCBUaGUgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB1c2UgZm9yIHNwbGl0dGluZy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNwbGl0KHJlZ2V4OiBzdHJpbmcgPSBcIlxcclwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFJhZG9uU3RyaW5nPiwgW3JlZ2V4XSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTG93ZXIgY2FzZSBhbGwgY2hhcmFjdGVycy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b0xvd2VyY2FzZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBwZXIgY2FzZSBhbGwgY2hhcmFjdGVycy5cclxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b1VwcGVyQ2FzZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcclxuICAgIH1cclxufVxyXG4iXX0=
|