@bitgo-beta/sdk-lib-mpc 8.2.1-alpha.36 → 8.2.1-alpha.360

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +519 -0
  2. package/dist/tsconfig.tsbuildinfo +1 -1
  3. package/package.json +25 -6
  4. package/dist/src/curves/constant.d.ts +0 -2
  5. package/dist/src/curves/constant.d.ts.map +0 -1
  6. package/dist/src/curves/constant.js +0 -6
  7. package/dist/src/curves/ed25519.d.ts +0 -21
  8. package/dist/src/curves/ed25519.d.ts.map +0 -1
  9. package/dist/src/curves/ed25519.js +0 -72
  10. package/dist/src/curves/ed25519Bip32HdTree.d.ts +0 -10
  11. package/dist/src/curves/ed25519Bip32HdTree.d.ts.map +0 -1
  12. package/dist/src/curves/ed25519Bip32HdTree.js +0 -85
  13. package/dist/src/curves/index.d.ts +0 -8
  14. package/dist/src/curves/index.d.ts.map +0 -1
  15. package/dist/src/curves/index.js +0 -20
  16. package/dist/src/curves/secp256k1.d.ts +0 -19
  17. package/dist/src/curves/secp256k1.d.ts.map +0 -1
  18. package/dist/src/curves/secp256k1.js +0 -77
  19. package/dist/src/curves/secp256k1Bip32HdTree.d.ts +0 -8
  20. package/dist/src/curves/secp256k1Bip32HdTree.d.ts.map +0 -1
  21. package/dist/src/curves/secp256k1Bip32HdTree.js +0 -54
  22. package/dist/src/curves/types.d.ts +0 -36
  23. package/dist/src/curves/types.d.ts.map +0 -1
  24. package/dist/src/curves/types.js +0 -3
  25. package/dist/src/curves/util.d.ts +0 -2
  26. package/dist/src/curves/util.d.ts.map +0 -1
  27. package/dist/src/curves/util.js +0 -11
  28. package/dist/src/hashCommitment.d.ts +0 -17
  29. package/dist/src/hashCommitment.d.ts.map +0 -1
  30. package/dist/src/hashCommitment.js +0 -45
  31. package/dist/src/index.d.ts +0 -9
  32. package/dist/src/index.d.ts.map +0 -1
  33. package/dist/src/index.js +0 -34
  34. package/dist/src/openssl/index.d.ts +0 -2
  35. package/dist/src/openssl/index.d.ts.map +0 -1
  36. package/dist/src/openssl/index.js +0 -14
  37. package/dist/src/openssl/openssl.d.ts +0 -9
  38. package/dist/src/openssl/openssl.d.ts.map +0 -1
  39. package/dist/src/openssl/openssl.js +0 -45
  40. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  41. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  42. package/dist/src/openssl/opensslbytes.js +0 -20
  43. package/dist/src/schnorrProof.d.ts +0 -22
  44. package/dist/src/schnorrProof.d.ts.map +0 -1
  45. package/dist/src/schnorrProof.js +0 -62
  46. package/dist/src/shamir/index.d.ts +0 -3
  47. package/dist/src/shamir/index.d.ts.map +0 -1
  48. package/dist/src/shamir/index.js +0 -15
  49. package/dist/src/shamir/shamir.d.ts +0 -38
  50. package/dist/src/shamir/shamir.d.ts.map +0 -1
  51. package/dist/src/shamir/shamir.js +0 -136
  52. package/dist/src/shamir/types.d.ts +0 -5
  53. package/dist/src/shamir/types.d.ts.map +0 -1
  54. package/dist/src/shamir/types.js +0 -3
  55. package/dist/src/tss/ecdsa/generatePaillierKey.d.ts +0 -6
  56. package/dist/src/tss/ecdsa/generatePaillierKey.d.ts.map +0 -1
  57. package/dist/src/tss/ecdsa/generatePaillierKey.js +0 -52
  58. package/dist/src/tss/ecdsa/index.d.ts +0 -8
  59. package/dist/src/tss/ecdsa/index.d.ts.map +0 -1
  60. package/dist/src/tss/ecdsa/index.js +0 -33
  61. package/dist/src/tss/ecdsa/noSmallFactorsProof.d.ts +0 -24
  62. package/dist/src/tss/ecdsa/noSmallFactorsProof.d.ts.map +0 -1
  63. package/dist/src/tss/ecdsa/noSmallFactorsProof.js +0 -157
  64. package/dist/src/tss/ecdsa/paillierBlumProof.d.ts +0 -16
  65. package/dist/src/tss/ecdsa/paillierBlumProof.d.ts.map +0 -1
  66. package/dist/src/tss/ecdsa/paillierBlumProof.js +0 -148
  67. package/dist/src/tss/ecdsa/paillierProof.d.ts +0 -24
  68. package/dist/src/tss/ecdsa/paillierProof.d.ts.map +0 -1
  69. package/dist/src/tss/ecdsa/paillierProof.js +0 -86
  70. package/dist/src/tss/ecdsa/primes.d.ts +0 -2
  71. package/dist/src/tss/ecdsa/primes.d.ts.map +0 -1
  72. package/dist/src/tss/ecdsa/primes.js +0 -1846
  73. package/dist/src/tss/ecdsa/rangeProof.d.ts +0 -80
  74. package/dist/src/tss/ecdsa/rangeProof.d.ts.map +0 -1
  75. package/dist/src/tss/ecdsa/rangeProof.js +0 -404
  76. package/dist/src/tss/ecdsa/types.d.ts +0 -182
  77. package/dist/src/tss/ecdsa/types.d.ts.map +0 -1
  78. package/dist/src/tss/ecdsa/types.js +0 -197
  79. package/dist/src/tss/ecdsa/zkVProof.d.ts +0 -25
  80. package/dist/src/tss/ecdsa/zkVProof.d.ts.map +0 -1
  81. package/dist/src/tss/ecdsa/zkVProof.js +0 -71
  82. package/dist/src/tss/index.d.ts +0 -2
  83. package/dist/src/tss/index.d.ts.map +0 -1
  84. package/dist/src/tss/index.js +0 -14
  85. package/dist/src/types.d.ts +0 -14
  86. package/dist/src/types.d.ts.map +0 -1
  87. package/dist/src/types.js +0 -3
  88. package/dist/src/util.d.ts +0 -61
  89. package/dist/src/util.d.ts.map +0 -1
  90. package/dist/src/util.js +0 -208
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/util.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAInE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAIvF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAOtE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAsB5E;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQrE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQrE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAEvD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAIvC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAEzD;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOxE;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU9E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,UAAO,GAAG,MAAM,CAQvE"}
package/dist/src/util.js DELETED
@@ -1,208 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getDerivationPath = exports.randomBigInt = exports.randomPositiveCoPrimeLessThan = exports.randomPositiveCoPrimeTo = exports.getPaillierPublicKey = exports.clamp = exports.bigIntFromU8ABE = exports.bigIntFromBufferBE = exports.bigIntToBufferBE = exports.bigIntFromBufferLE = exports.bigIntToBufferLE = exports.signedBigIntToHex = exports.bigIntToHex = exports.hexToSignedBigInt = exports.hexToBigInt = exports.convertBigIntArrToHexArr = exports.convertHexArrToBigIntArr = void 0;
7
- const paillier_bigint_1 = require("paillier-bigint");
8
- const bigint_crypto_utils_1 = require("bigint-crypto-utils");
9
- const bigint_mod_arith_1 = require("bigint-mod-arith");
10
- const crypto_1 = __importDefault(require("crypto"));
11
- /**
12
- * Returns a bigint array from a hex string array
13
- * @param values
14
- */
15
- function convertHexArrToBigIntArr(values) {
16
- return values.map((value) => {
17
- return hexToBigInt(value);
18
- });
19
- }
20
- exports.convertHexArrToBigIntArr = convertHexArrToBigIntArr;
21
- /**
22
- * Returns a hex string array from a bigint array
23
- * @param values
24
- * @param hexLength - length to pad each big int number too
25
- */
26
- function convertBigIntArrToHexArr(values, hexLength) {
27
- return values.map((value) => {
28
- return bigIntToHex(value, hexLength);
29
- });
30
- }
31
- exports.convertBigIntArrToHexArr = convertBigIntArrToHexArr;
32
- function hexToBigInt(hex) {
33
- // Strangely bigint.toString(16) gives a hex string without 0x,
34
- // but it won't accept the same string without 0x to convert
35
- // to a bigint (BigInt(hex string)). So have to introduce this
36
- // check to convert to add 0x in case if hex string
37
- // doesn't have it.
38
- if (hex.slice(0, 2) === '0x') {
39
- return BigInt(hex);
40
- }
41
- return BigInt('0x' + hex);
42
- }
43
- exports.hexToBigInt = hexToBigInt;
44
- function hexToSignedBigInt(hex) {
45
- // Trim leading '0x' from string.
46
- if (hex.slice(0, 2) === '0x') {
47
- hex = hex.slice(2);
48
- }
49
- // Assume a number without a sign byte is always positive, or an unsigned number (ie zero).
50
- if (hex.length <= 2) {
51
- return BigInt('0x' + hex);
52
- }
53
- // Parse the number part of the string.
54
- const num = BigInt('0x' + hex.slice(2));
55
- // Interpret the first byte of the string as a sign byte.
56
- // If it's non-zero, the number is negative.
57
- if (parseInt(hex.slice(0, 2), 16)) {
58
- return -num;
59
- }
60
- return num;
61
- }
62
- exports.hexToSignedBigInt = hexToSignedBigInt;
63
- /**
64
- * Returns an hex string of the given bigint
65
- *
66
- * @param {bigint} bigint - the bigint to be converted to hex
67
- * @param hexLength
68
- * @returns {string} - the hex value
69
- */
70
- function bigIntToHex(bigint, hexLength) {
71
- let hex = bigint.toString(16);
72
- hex = '0'.slice(0, hex.length % 2) + hex;
73
- if (hexLength) {
74
- hex = hex.padStart(hexLength, '0');
75
- }
76
- return hex;
77
- }
78
- exports.bigIntToHex = bigIntToHex;
79
- function signedBigIntToHex(bigint, hexLength) {
80
- // Return zero as an unsigned string.
81
- if (bigint === BigInt(0)) {
82
- return '00';
83
- }
84
- // Store the number's sign.
85
- let neg;
86
- if (bigint < BigInt(0)) {
87
- bigint = -bigint;
88
- neg = true;
89
- }
90
- // Convert number to unsigned hex.
91
- let hex = bigint.toString(16);
92
- hex = '0'.slice(0, hex.length % 2) + hex;
93
- if (hexLength) {
94
- hex = hex.padStart(hexLength - 2, '0');
95
- }
96
- // Prefix sign byte if necessary.
97
- if (neg) {
98
- return '01' + hex;
99
- }
100
- return '00' + hex;
101
- }
102
- exports.signedBigIntToHex = signedBigIntToHex;
103
- function bigIntToBufferLE(n, minBytes) {
104
- let v = n.toString(16);
105
- v = '0'.slice(0, v.length % 2) + v;
106
- const buf = Buffer.from(v, 'hex').reverse();
107
- if (minBytes && buf.length < minBytes) {
108
- return Buffer.concat([buf, Buffer.alloc(minBytes - buf.length)]);
109
- }
110
- return buf;
111
- }
112
- exports.bigIntToBufferLE = bigIntToBufferLE;
113
- function bigIntFromBufferLE(buf) {
114
- return BigInt('0x' + Buffer.from(buf).reverse().toString('hex'));
115
- }
116
- exports.bigIntFromBufferLE = bigIntFromBufferLE;
117
- function bigIntToBufferBE(n, minBytes) {
118
- let v = n.toString(16);
119
- v = '0'.slice(0, v.length % 2) + v;
120
- const buf = Buffer.from(v, 'hex');
121
- if (minBytes && buf.length < minBytes) {
122
- return Buffer.concat([Buffer.alloc(minBytes - buf.length), buf]);
123
- }
124
- return buf;
125
- }
126
- exports.bigIntToBufferBE = bigIntToBufferBE;
127
- function bigIntFromBufferBE(buf) {
128
- return BigInt('0x' + buf.toString('hex'));
129
- }
130
- exports.bigIntFromBufferBE = bigIntFromBufferBE;
131
- function bigIntFromU8ABE(buf) {
132
- return bigIntFromBufferBE(Buffer.from(buf));
133
- }
134
- exports.bigIntFromU8ABE = bigIntFromU8ABE;
135
- function clamp(u) {
136
- u &= BigInt('0x7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8');
137
- u |= BigInt('0x4000000000000000000000000000000000000000000000000000000000000000');
138
- return u;
139
- }
140
- exports.clamp = clamp;
141
- /**
142
- * Function get paillier public key simple varient
143
- * @param {bigint} n
144
- * @returns {bigint}
145
- */
146
- function getPaillierPublicKey(n) {
147
- return new paillier_bigint_1.PublicKey(n, n + BigInt(1));
148
- }
149
- exports.getPaillierPublicKey = getPaillierPublicKey;
150
- /**
151
- * Generate a random positive integer co-prime to x
152
- * @param x
153
- * @returns {Promise<bigint>}
154
- */
155
- async function randomPositiveCoPrimeTo(x) {
156
- while (true) {
157
- const y = await randomBigInt(bigint_crypto_utils_1.bitLength(x));
158
- if (y > BigInt(0) && bigint_mod_arith_1.gcd(x, y) === BigInt(1)) {
159
- return y;
160
- }
161
- }
162
- }
163
- exports.randomPositiveCoPrimeTo = randomPositiveCoPrimeTo;
164
- /**
165
- * Generate a random positive integer coprime less than x with the same bit depth.
166
- * @param x
167
- * @returns {Promise<bigint>}
168
- */
169
- async function randomPositiveCoPrimeLessThan(x) {
170
- if (x <= BigInt(2)) {
171
- throw new Error('x must be larger than 2');
172
- }
173
- while (true) {
174
- const y = await randomBigInt(bigint_crypto_utils_1.bitLength(x));
175
- if (y > BigInt(0) && y < x && bigint_mod_arith_1.gcd(x, y) === BigInt(1)) {
176
- return y;
177
- }
178
- }
179
- }
180
- exports.randomPositiveCoPrimeLessThan = randomPositiveCoPrimeLessThan;
181
- /**
182
- * Generate a random number of a given bitlength
183
- * @param bitlength
184
- * @returns {Promise<bigint>}
185
- */
186
- async function randomBigInt(bitlength) {
187
- return bigIntFromBufferBE(Buffer.from(await bigint_crypto_utils_1.randBits(bitlength, true)));
188
- }
189
- exports.randomBigInt = randomBigInt;
190
- /**
191
- * @param seed - used to construct derivation path deterministically
192
- * @param isMaster - if set, path starts with prefix `m/`
193
- * @return path `(m/)/999999/a/b` where `a` and `b` are 7-byte pseudorandom numbers based on seed
194
- */
195
- function getDerivationPath(seed, isMaster = true) {
196
- const derivationPathInput = sha256(sha256(`${seed}`)).toString('hex');
197
- const derivationPathParts = [
198
- parseInt(derivationPathInput.slice(0, 7), 16),
199
- parseInt(derivationPathInput.slice(7, 14), 16),
200
- ];
201
- const prefix = isMaster ? 'm/' : '';
202
- return prefix + '999999/' + derivationPathParts.join('/');
203
- }
204
- exports.getDerivationPath = getDerivationPath;
205
- function sha256(input) {
206
- return crypto_1.default.createHash('sha256').update(input).digest();
207
- }
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUE0QztBQUM1Qyw2REFBMEQ7QUFDMUQsdURBQXVDO0FBQ3ZDLG9EQUE0QjtBQUU1Qjs7O0dBR0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFnQjtJQUN2RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUMxQixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFKRCw0REFJQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxNQUFnQixFQUFFLFNBQWtCO0lBQzNFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzFCLE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFKRCw0REFJQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxHQUFXO0lBQ3JDLCtEQUErRDtJQUMvRCw0REFBNEQ7SUFDNUQsOERBQThEO0lBQzlELG1EQUFtRDtJQUNuRCxtQkFBbUI7SUFDbkIsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDNUIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDcEI7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQVZELGtDQVVDO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsR0FBVztJQUMzQyxpQ0FBaUM7SUFDakMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDNUIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEI7SUFDRCwyRkFBMkY7SUFDM0YsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtRQUNuQixPQUFPLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDM0I7SUFDRCx1Q0FBdUM7SUFDdkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMseURBQXlEO0lBQ3pELDRDQUE0QztJQUM1QyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDO0tBQ2I7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFqQkQsOENBaUJDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLE1BQWMsRUFBRSxTQUFrQjtJQUM1RCxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUN6QyxJQUFJLFNBQVMsRUFBRTtRQUNiLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUNwQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQVBELGtDQU9DO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUMsTUFBYyxFQUFFLFNBQWtCO0lBQ2xFLHFDQUFxQztJQUNyQyxJQUFJLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDeEIsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELDJCQUEyQjtJQUMzQixJQUFJLEdBQUcsQ0FBQztJQUNSLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN0QixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDakIsR0FBRyxHQUFHLElBQUksQ0FBQztLQUNaO0lBQ0Qsa0NBQWtDO0lBQ2xDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3pDLElBQUksU0FBUyxFQUFFO1FBQ2IsR0FBRyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUN4QztJQUNELGlDQUFpQztJQUNqQyxJQUFJLEdBQUcsRUFBRTtRQUNQLE9BQU8sSUFBSSxHQUFHLEdBQUcsQ0FBQztLQUNuQjtJQUNELE9BQU8sSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNwQixDQUFDO0FBdEJELDhDQXNCQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLENBQVMsRUFBRSxRQUFpQjtJQUMzRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM1QyxJQUFJLFFBQVEsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLFFBQVEsRUFBRTtRQUNyQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsRTtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQVJELDRDQVFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMsR0FBVztJQUM1QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRkQsZ0RBRUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxDQUFTLEVBQUUsUUFBaUI7SUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsSUFBSSxRQUFRLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxRQUFRLEVBQUU7UUFDckMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDbEU7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFSRCw0Q0FRQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLEdBQVc7SUFDNUMsT0FBTyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRkQsZ0RBRUM7QUFFRCxTQUFnQixlQUFlLENBQUMsR0FBZTtJQUM3QyxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRkQsMENBRUM7QUFFRCxTQUFnQixLQUFLLENBQUMsQ0FBUztJQUM3QixDQUFDLElBQUksTUFBTSxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDbEYsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO0lBQ2xGLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUpELHNCQUlDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLENBQVM7SUFDNUMsT0FBTyxJQUFJLDJCQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRkQsb0RBRUM7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLHVCQUF1QixDQUFDLENBQVM7SUFDckQsT0FBTyxJQUFJLEVBQUU7UUFDWCxNQUFNLENBQUMsR0FBRyxNQUFNLFlBQVksQ0FBQywrQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLHNCQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxPQUFPLENBQUMsQ0FBQztTQUNWO0tBQ0Y7QUFDSCxDQUFDO0FBUEQsMERBT0M7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLDZCQUE2QixDQUFDLENBQVM7SUFDM0QsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztLQUM1QztJQUNELE9BQU8sSUFBSSxFQUFFO1FBQ1gsTUFBTSxDQUFDLEdBQUcsTUFBTSxZQUFZLENBQUMsK0JBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLHNCQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNyRCxPQUFPLENBQUMsQ0FBQztTQUNWO0tBQ0Y7QUFDSCxDQUFDO0FBVkQsc0VBVUM7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLFlBQVksQ0FBQyxTQUFpQjtJQUNsRCxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSw4QkFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUZELG9DQUVDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLElBQVksRUFBRSxRQUFRLEdBQUcsSUFBSTtJQUM3RCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sbUJBQW1CLEdBQUc7UUFDMUIsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUMvQyxDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwQyxPQUFPLE1BQU0sR0FBRyxTQUFTLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFSRCw4Q0FRQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQXdCO0lBQ3RDLE9BQU8sZ0JBQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQzVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICdwYWlsbGllci1iaWdpbnQnO1xuaW1wb3J0IHsgYml0TGVuZ3RoLCByYW5kQml0cyB9IGZyb20gJ2JpZ2ludC1jcnlwdG8tdXRpbHMnO1xuaW1wb3J0IHsgZ2NkIH0gZnJvbSAnYmlnaW50LW1vZC1hcml0aCc7XG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5cbi8qKlxuICogUmV0dXJucyBhIGJpZ2ludCBhcnJheSBmcm9tIGEgaGV4IHN0cmluZyBhcnJheVxuICogQHBhcmFtIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEhleEFyclRvQmlnSW50QXJyKHZhbHVlczogc3RyaW5nW10pOiBiaWdpbnRbXSB7XG4gIHJldHVybiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiBoZXhUb0JpZ0ludCh2YWx1ZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBoZXggc3RyaW5nIGFycmF5IGZyb20gYSBiaWdpbnQgYXJyYXlcbiAqIEBwYXJhbSB2YWx1ZXNcbiAqIEBwYXJhbSBoZXhMZW5ndGggLSBsZW5ndGggdG8gcGFkIGVhY2ggYmlnIGludCBudW1iZXIgdG9vXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0QmlnSW50QXJyVG9IZXhBcnIodmFsdWVzOiBiaWdpbnRbXSwgaGV4TGVuZ3RoPzogbnVtYmVyKTogc3RyaW5nW10ge1xuICByZXR1cm4gdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICByZXR1cm4gYmlnSW50VG9IZXgodmFsdWUsIGhleExlbmd0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9CaWdJbnQoaGV4OiBzdHJpbmcpOiBiaWdpbnQge1xuICAvLyBTdHJhbmdlbHkgYmlnaW50LnRvU3RyaW5nKDE2KSBnaXZlcyBhIGhleCBzdHJpbmcgd2l0aG91dCAweCxcbiAgLy8gYnV0IGl0IHdvbid0IGFjY2VwdCB0aGUgc2FtZSBzdHJpbmcgd2l0aG91dCAweCB0byBjb252ZXJ0XG4gIC8vIHRvIGEgYmlnaW50IChCaWdJbnQoaGV4IHN0cmluZykpLiBTbyBoYXZlIHRvIGludHJvZHVjZSB0aGlzXG4gIC8vIGNoZWNrIHRvIGNvbnZlcnQgdG8gYWRkIDB4IGluIGNhc2UgaWYgaGV4IHN0cmluZ1xuICAvLyBkb2Vzbid0IGhhdmUgaXQuXG4gIGlmIChoZXguc2xpY2UoMCwgMikgPT09ICcweCcpIHtcbiAgICByZXR1cm4gQmlnSW50KGhleCk7XG4gIH1cbiAgcmV0dXJuIEJpZ0ludCgnMHgnICsgaGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhleFRvU2lnbmVkQmlnSW50KGhleDogc3RyaW5nKTogYmlnaW50IHtcbiAgLy8gVHJpbSBsZWFkaW5nICcweCcgZnJvbSBzdHJpbmcuXG4gIGlmIChoZXguc2xpY2UoMCwgMikgPT09ICcweCcpIHtcbiAgICBoZXggPSBoZXguc2xpY2UoMik7XG4gIH1cbiAgLy8gQXNzdW1lIGEgbnVtYmVyIHdpdGhvdXQgYSBzaWduIGJ5dGUgaXMgYWx3YXlzIHBvc2l0aXZlLCBvciBhbiB1bnNpZ25lZCBudW1iZXIgKGllIHplcm8pLlxuICBpZiAoaGV4Lmxlbmd0aCA8PSAyKSB7XG4gICAgcmV0dXJuIEJpZ0ludCgnMHgnICsgaGV4KTtcbiAgfVxuICAvLyBQYXJzZSB0aGUgbnVtYmVyIHBhcnQgb2YgdGhlIHN0cmluZy5cbiAgY29uc3QgbnVtID0gQmlnSW50KCcweCcgKyBoZXguc2xpY2UoMikpO1xuICAvLyBJbnRlcnByZXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHN0cmluZyBhcyBhIHNpZ24gYnl0ZS5cbiAgLy8gSWYgaXQncyBub24temVybywgdGhlIG51bWJlciBpcyBuZWdhdGl2ZS5cbiAgaWYgKHBhcnNlSW50KGhleC5zbGljZSgwLCAyKSwgMTYpKSB7XG4gICAgcmV0dXJuIC1udW07XG4gIH1cbiAgcmV0dXJuIG51bTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGhleCBzdHJpbmcgb2YgdGhlIGdpdmVuIGJpZ2ludFxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBiaWdpbnQgLSB0aGUgYmlnaW50IHRvIGJlIGNvbnZlcnRlZCB0byBoZXhcbiAqIEBwYXJhbSBoZXhMZW5ndGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGhleCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmlnSW50VG9IZXgoYmlnaW50OiBiaWdpbnQsIGhleExlbmd0aD86IG51bWJlcik6IHN0cmluZyB7XG4gIGxldCBoZXggPSBiaWdpbnQudG9TdHJpbmcoMTYpO1xuICBoZXggPSAnMCcuc2xpY2UoMCwgaGV4Lmxlbmd0aCAlIDIpICsgaGV4O1xuICBpZiAoaGV4TGVuZ3RoKSB7XG4gICAgaGV4ID0gaGV4LnBhZFN0YXJ0KGhleExlbmd0aCwgJzAnKTtcbiAgfVxuICByZXR1cm4gaGV4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbmVkQmlnSW50VG9IZXgoYmlnaW50OiBiaWdpbnQsIGhleExlbmd0aD86IG51bWJlcik6IHN0cmluZyB7XG4gIC8vIFJldHVybiB6ZXJvIGFzIGFuIHVuc2lnbmVkIHN0cmluZy5cbiAgaWYgKGJpZ2ludCA9PT0gQmlnSW50KDApKSB7XG4gICAgcmV0dXJuICcwMCc7XG4gIH1cbiAgLy8gU3RvcmUgdGhlIG51bWJlcidzIHNpZ24uXG4gIGxldCBuZWc7XG4gIGlmIChiaWdpbnQgPCBCaWdJbnQoMCkpIHtcbiAgICBiaWdpbnQgPSAtYmlnaW50O1xuICAgIG5lZyA9IHRydWU7XG4gIH1cbiAgLy8gQ29udmVydCBudW1iZXIgdG8gdW5zaWduZWQgaGV4LlxuICBsZXQgaGV4ID0gYmlnaW50LnRvU3RyaW5nKDE2KTtcbiAgaGV4ID0gJzAnLnNsaWNlKDAsIGhleC5sZW5ndGggJSAyKSArIGhleDtcbiAgaWYgKGhleExlbmd0aCkge1xuICAgIGhleCA9IGhleC5wYWRTdGFydChoZXhMZW5ndGggLSAyLCAnMCcpO1xuICB9XG4gIC8vIFByZWZpeCBzaWduIGJ5dGUgaWYgbmVjZXNzYXJ5LlxuICBpZiAobmVnKSB7XG4gICAgcmV0dXJuICcwMScgKyBoZXg7XG4gIH1cbiAgcmV0dXJuICcwMCcgKyBoZXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaWdJbnRUb0J1ZmZlckxFKG46IGJpZ2ludCwgbWluQnl0ZXM/OiBudW1iZXIpOiBCdWZmZXIge1xuICBsZXQgdiA9IG4udG9TdHJpbmcoMTYpO1xuICB2ID0gJzAnLnNsaWNlKDAsIHYubGVuZ3RoICUgMikgKyB2O1xuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbSh2LCAnaGV4JykucmV2ZXJzZSgpO1xuICBpZiAobWluQnl0ZXMgJiYgYnVmLmxlbmd0aCA8IG1pbkJ5dGVzKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2J1ZiwgQnVmZmVyLmFsbG9jKG1pbkJ5dGVzIC0gYnVmLmxlbmd0aCldKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmlnSW50RnJvbUJ1ZmZlckxFKGJ1ZjogQnVmZmVyKTogYmlnaW50IHtcbiAgcmV0dXJuIEJpZ0ludCgnMHgnICsgQnVmZmVyLmZyb20oYnVmKS5yZXZlcnNlKCkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpZ0ludFRvQnVmZmVyQkUobjogYmlnaW50LCBtaW5CeXRlcz86IG51bWJlcik6IEJ1ZmZlciB7XG4gIGxldCB2ID0gbi50b1N0cmluZygxNik7XG4gIHYgPSAnMCcuc2xpY2UoMCwgdi5sZW5ndGggJSAyKSArIHY7XG4gIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHYsICdoZXgnKTtcbiAgaWYgKG1pbkJ5dGVzICYmIGJ1Zi5sZW5ndGggPCBtaW5CeXRlcykge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFtCdWZmZXIuYWxsb2MobWluQnl0ZXMgLSBidWYubGVuZ3RoKSwgYnVmXSk7XG4gIH1cbiAgcmV0dXJuIGJ1Zjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpZ0ludEZyb21CdWZmZXJCRShidWY6IEJ1ZmZlcik6IGJpZ2ludCB7XG4gIHJldHVybiBCaWdJbnQoJzB4JyArIGJ1Zi50b1N0cmluZygnaGV4JykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmlnSW50RnJvbVU4QUJFKGJ1ZjogVWludDhBcnJheSk6IGJpZ2ludCB7XG4gIHJldHVybiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oYnVmKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh1OiBiaWdpbnQpOiBiaWdpbnQge1xuICB1ICY9IEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY4Jyk7XG4gIHUgfD0gQmlnSW50KCcweDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKTtcbiAgcmV0dXJuIHU7XG59XG5cbi8qKlxuICogRnVuY3Rpb24gZ2V0IHBhaWxsaWVyIHB1YmxpYyBrZXkgc2ltcGxlIHZhcmllbnRcbiAqIEBwYXJhbSB7YmlnaW50fSBuXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFpbGxpZXJQdWJsaWNLZXkobjogYmlnaW50KTogUHVibGljS2V5IHtcbiAgcmV0dXJuIG5ldyBQdWJsaWNLZXkobiwgbiArIEJpZ0ludCgxKSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gcG9zaXRpdmUgaW50ZWdlciBjby1wcmltZSB0byB4XG4gKiBAcGFyYW0geFxuICogQHJldHVybnMge1Byb21pc2U8YmlnaW50Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHg6IGJpZ2ludCk6IFByb21pc2U8YmlnaW50PiB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgeSA9IGF3YWl0IHJhbmRvbUJpZ0ludChiaXRMZW5ndGgoeCkpO1xuICAgIGlmICh5ID4gQmlnSW50KDApICYmIGdjZCh4LCB5KSA9PT0gQmlnSW50KDEpKSB7XG4gICAgICByZXR1cm4geTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHJhbmRvbSBwb3NpdGl2ZSBpbnRlZ2VyIGNvcHJpbWUgbGVzcyB0aGFuIHggd2l0aCB0aGUgc2FtZSBiaXQgZGVwdGguXG4gKiBAcGFyYW0geFxuICogQHJldHVybnMge1Byb21pc2U8YmlnaW50Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJhbmRvbVBvc2l0aXZlQ29QcmltZUxlc3NUaGFuKHg6IGJpZ2ludCk6IFByb21pc2U8YmlnaW50PiB7XG4gIGlmICh4IDw9IEJpZ0ludCgyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigneCBtdXN0IGJlIGxhcmdlciB0aGFuIDInKTtcbiAgfVxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHkgPSBhd2FpdCByYW5kb21CaWdJbnQoYml0TGVuZ3RoKHgpKTtcbiAgICBpZiAoeSA+IEJpZ0ludCgwKSAmJiB5IDwgeCAmJiBnY2QoeCwgeSkgPT09IEJpZ0ludCgxKSkge1xuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5kb20gbnVtYmVyIG9mIGEgZ2l2ZW4gYml0bGVuZ3RoXG4gKiBAcGFyYW0gYml0bGVuZ3RoXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxiaWdpbnQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmFuZG9tQmlnSW50KGJpdGxlbmd0aDogbnVtYmVyKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgcmV0dXJuIGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShhd2FpdCByYW5kQml0cyhiaXRsZW5ndGgsIHRydWUpKSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHNlZWQgLSB1c2VkIHRvIGNvbnN0cnVjdCBkZXJpdmF0aW9uIHBhdGggZGV0ZXJtaW5pc3RpY2FsbHlcbiAqIEBwYXJhbSBpc01hc3RlciAtIGlmIHNldCwgcGF0aCBzdGFydHMgd2l0aCBwcmVmaXggYG0vYFxuICogQHJldHVybiBwYXRoIGAobS8pLzk5OTk5OS9hL2JgIHdoZXJlIGBhYCBhbmQgYGJgIGFyZSA3LWJ5dGUgcHNldWRvcmFuZG9tIG51bWJlcnMgYmFzZWQgb24gc2VlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVyaXZhdGlvblBhdGgoc2VlZDogc3RyaW5nLCBpc01hc3RlciA9IHRydWUpOiBzdHJpbmcge1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aElucHV0ID0gc2hhMjU2KHNoYTI1NihgJHtzZWVkfWApKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGRlcml2YXRpb25QYXRoUGFydHMgPSBbXG4gICAgcGFyc2VJbnQoZGVyaXZhdGlvblBhdGhJbnB1dC5zbGljZSgwLCA3KSwgMTYpLFxuICAgIHBhcnNlSW50KGRlcml2YXRpb25QYXRoSW5wdXQuc2xpY2UoNywgMTQpLCAxNiksXG4gIF07XG4gIGNvbnN0IHByZWZpeCA9IGlzTWFzdGVyID8gJ20vJyA6ICcnO1xuICByZXR1cm4gcHJlZml4ICsgJzk5OTk5OS8nICsgZGVyaXZhdGlvblBhdGhQYXJ0cy5qb2luKCcvJyk7XG59XG5cbmZ1bmN0aW9uIHNoYTI1NihpbnB1dDogY3J5cHRvLkJpbmFyeUxpa2UpOiBCdWZmZXIge1xuICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShpbnB1dCkuZGlnZXN0KCk7XG59XG4iXX0=