@bitgo-beta/utxo-descriptors 0.0.1-beta.24 → 0.0.1-beta.241

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 (44) hide show
  1. package/dist/cjs/src/index.d.ts +1 -0
  2. package/dist/cjs/src/index.d.ts.map +1 -1
  3. package/dist/cjs/src/index.js +3 -2
  4. package/dist/cjs/src/pox5/descriptor.d.ts +22 -0
  5. package/dist/cjs/src/pox5/descriptor.d.ts.map +1 -0
  6. package/dist/cjs/src/pox5/descriptor.js +78 -0
  7. package/dist/cjs/src/pox5/index.d.ts +3 -0
  8. package/dist/cjs/src/pox5/index.d.ts.map +1 -0
  9. package/dist/cjs/src/pox5/index.js +19 -0
  10. package/dist/cjs/src/pox5/parseDescriptor.d.ts +16 -0
  11. package/dist/cjs/src/pox5/parseDescriptor.d.ts.map +1 -0
  12. package/dist/cjs/src/pox5/parseDescriptor.js +96 -0
  13. package/dist/cjs/src/sbtc/index.d.ts +1 -0
  14. package/dist/cjs/src/sbtc/index.d.ts.map +1 -1
  15. package/dist/cjs/src/sbtc/index.js +2 -1
  16. package/dist/cjs/src/sbtc/parseDescriptor.d.ts +55 -0
  17. package/dist/cjs/src/sbtc/parseDescriptor.d.ts.map +1 -0
  18. package/dist/cjs/src/sbtc/parseDescriptor.js +185 -0
  19. package/dist/cjs/test/unit/pox5/descriptor.d.ts +2 -0
  20. package/dist/cjs/test/unit/pox5/descriptor.d.ts.map +1 -0
  21. package/dist/cjs/test/unit/pox5/descriptor.js +158 -0
  22. package/dist/cjs/test/unit/sbtc/parseDescriptor.d.ts +2 -0
  23. package/dist/cjs/test/unit/sbtc/parseDescriptor.d.ts.map +1 -0
  24. package/dist/cjs/test/unit/sbtc/parseDescriptor.js +202 -0
  25. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  26. package/dist/esm/index.d.ts +1 -0
  27. package/dist/esm/index.d.ts.map +1 -1
  28. package/dist/esm/index.js +2 -1
  29. package/dist/esm/pox5/descriptor.d.ts +22 -0
  30. package/dist/esm/pox5/descriptor.d.ts.map +1 -0
  31. package/dist/esm/pox5/descriptor.js +73 -0
  32. package/dist/esm/pox5/index.d.ts +3 -0
  33. package/dist/esm/pox5/index.d.ts.map +1 -0
  34. package/dist/esm/pox5/index.js +3 -0
  35. package/dist/esm/pox5/parseDescriptor.d.ts +16 -0
  36. package/dist/esm/pox5/parseDescriptor.d.ts.map +1 -0
  37. package/dist/esm/pox5/parseDescriptor.js +93 -0
  38. package/dist/esm/sbtc/index.d.ts +1 -0
  39. package/dist/esm/sbtc/index.d.ts.map +1 -1
  40. package/dist/esm/sbtc/index.js +2 -1
  41. package/dist/esm/sbtc/parseDescriptor.d.ts +55 -0
  42. package/dist/esm/sbtc/parseDescriptor.d.ts.map +1 -0
  43. package/dist/esm/sbtc/parseDescriptor.js +182 -0
  44. package/package.json +7 -4
@@ -1,2 +1,3 @@
1
1
  export * as sbtc from './sbtc';
2
+ export * as pox5 from './pox5';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC"}
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.sbtc = void 0;
36
+ exports.pox5 = exports.sbtc = void 0;
37
37
  exports.sbtc = __importStar(require("./sbtc"));
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQStCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogYXMgc2J0YyBmcm9tICcuL3NidGMnO1xuIl19
38
+ exports.pox5 = __importStar(require("./pox5"));
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQStCO0FBQy9CLCtDQUErQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIHNidGMgZnJvbSAnLi9zYnRjJztcbmV4cG9ydCAqIGFzIHBveDUgZnJvbSAnLi9wb3g1JztcbiJdfQ==
@@ -0,0 +1,22 @@
1
+ import { bip32 } from '@bitgo/wasm-utxo';
2
+ type BIP32Interface = bip32.BIP32Interface;
3
+ export type Pox5StakerKey = BIP32Interface | Buffer;
4
+ export type Pox5LockupDescriptorParams = {
5
+ unlockHeight: number;
6
+ /** sha256(sha256(Clarity consensus principal bytes)). */
7
+ stakerCommitment: Buffer;
8
+ earlyExitKey: Buffer;
9
+ /** User, backup, and BitGo keys, all BIP32 or all concrete compressed keys. */
10
+ stakerKeys: [Pox5StakerKey, Pox5StakerKey, Pox5StakerKey];
11
+ };
12
+ /**
13
+ * Build the canonical PoX-5 P2WSH descriptor. The post-CLTV and early-exit
14
+ * paths share BitGo's standard 2-of-3 compressed-key multisig tail.
15
+ */
16
+ export declare function createPox5LockupDescriptor(params: Pox5LockupDescriptorParams): string;
17
+ /** Compile the PoX-5 P2WSH scriptPubKey at a BIP32 derivation index. */
18
+ export declare function createPox5LockupScriptPubKey(params: Pox5LockupDescriptorParams, derivationIndex?: number): Buffer;
19
+ /** Derive the compressed staker keys needed to prepare a witness at an index. */
20
+ export declare function derivePox5StakerKeys(stakerKeys: [BIP32Interface, BIP32Interface, BIP32Interface], index: number): [Buffer, Buffer, Buffer];
21
+ export {};
22
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../../src/pox5/descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,EAAc,MAAM,kBAAkB,CAAC;AAE1D,KAAK,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,UAAU,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;CAC3D,CAAC;AA0CF;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,0BAA0B,GAAG,MAAM,CAoBrF;AAED,wEAAwE;AACxE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,0BAA0B,EAAE,eAAe,SAAI,GAAG,MAAM,CAQ5G;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,EAC5D,KAAK,EAAE,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAG1B"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPox5LockupDescriptor = createPox5LockupDescriptor;
4
+ exports.createPox5LockupScriptPubKey = createPox5LockupScriptPubKey;
5
+ exports.derivePox5StakerKeys = derivePox5StakerKeys;
6
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
7
+ function validateCompressedKey(key, field) {
8
+ if (key.length !== 33 || (key[0] !== 0x02 && key[0] !== 0x03)) {
9
+ throw new Error(`${field} must be a 33-byte compressed public key`);
10
+ }
11
+ }
12
+ function isBip32Triple(keys) {
13
+ return keys.every((key) => !Buffer.isBuffer(key));
14
+ }
15
+ function asDescriptorKey(key, field) {
16
+ if (Buffer.isBuffer(key)) {
17
+ validateCompressedKey(key, field);
18
+ return key.toString('hex');
19
+ }
20
+ return key.neutered().toBase58() + '/*';
21
+ }
22
+ function validateParams(params) {
23
+ if (!Number.isSafeInteger(params.unlockHeight) || params.unlockHeight <= 0 || params.unlockHeight >= 500000000) {
24
+ throw new Error(`unlockHeight (${params.unlockHeight}) must be a positive block height below 500000000`);
25
+ }
26
+ if (params.stakerCommitment.length !== 32) {
27
+ throw new Error(`stakerCommitment must be 32 bytes (got ${params.stakerCommitment.length})`);
28
+ }
29
+ validateCompressedKey(params.earlyExitKey, 'earlyExitKey');
30
+ const bufferCount = params.stakerKeys.filter(Buffer.isBuffer).length;
31
+ if (bufferCount !== 0 && bufferCount !== params.stakerKeys.length) {
32
+ throw new Error('stakerKeys must contain either three BIP32 keys or three compressed public keys');
33
+ }
34
+ params.stakerKeys.forEach((key, index) => {
35
+ if (Buffer.isBuffer(key)) {
36
+ validateCompressedKey(key, `stakerKeys[${index}]`);
37
+ }
38
+ });
39
+ }
40
+ /**
41
+ * Build the canonical PoX-5 P2WSH descriptor. The post-CLTV and early-exit
42
+ * paths share BitGo's standard 2-of-3 compressed-key multisig tail.
43
+ */
44
+ function createPox5LockupDescriptor(params) {
45
+ validateParams(params);
46
+ const stakerKeys = params.stakerKeys.map((key, index) => asDescriptorKey(key, `stakerKeys[${index}]`));
47
+ const miniscript = {
48
+ and_v: [
49
+ {
50
+ 'v:or_i': [
51
+ { after: params.unlockHeight },
52
+ {
53
+ and_v: [
54
+ { 'v:sha256': params.stakerCommitment.toString('hex') },
55
+ { pk: params.earlyExitKey.toString('hex') },
56
+ ],
57
+ },
58
+ ],
59
+ },
60
+ { multi: [2, ...stakerKeys] },
61
+ ],
62
+ };
63
+ return wasm_utxo_1.ast.formatNode({ wsh: miniscript });
64
+ }
65
+ /** Compile the PoX-5 P2WSH scriptPubKey at a BIP32 derivation index. */
66
+ function createPox5LockupScriptPubKey(params, derivationIndex = 0) {
67
+ const descriptor = createPox5LockupDescriptor(params);
68
+ if (isBip32Triple(params.stakerKeys)) {
69
+ return Buffer.from(wasm_utxo_1.Descriptor.fromString(descriptor, 'derivable').atDerivationIndex(derivationIndex).scriptPubkey());
70
+ }
71
+ return Buffer.from(wasm_utxo_1.Descriptor.fromString(descriptor, 'definite').scriptPubkey());
72
+ }
73
+ /** Derive the compressed staker keys needed to prepare a witness at an index. */
74
+ function derivePox5StakerKeys(stakerKeys, index) {
75
+ const keys = stakerKeys.map((key) => Buffer.from(key.derive(index).publicKey));
76
+ return [keys[0], keys[1], keys[2]];
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wb3g1L2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyREEsZ0VBb0JDO0FBR0Qsb0VBUUM7QUFHRCxvREFNQztBQW5HRCxnREFBMEQ7QUFlMUQsU0FBUyxxQkFBcUIsQ0FBQyxHQUFXLEVBQUUsS0FBYTtJQUN2RCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSywwQ0FBMEMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ3BCLElBQThDO0lBRTlDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEdBQWtCLEVBQUUsS0FBYTtJQUN4RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QixxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDMUMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLE1BQWtDO0lBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFN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QUVELGlGQUFpRjtBQUNqRixTQUFnQixvQkFBb0IsQ0FDbEMsVUFBNEQsRUFDNUQsS0FBYTtJQUViLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3QsIGJpcDMyLCBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbnR5cGUgQklQMzJJbnRlcmZhY2UgPSBiaXAzMi5CSVAzMkludGVyZmFjZTtcblxuZXhwb3J0IHR5cGUgUG94NVN0YWtlcktleSA9IEJJUDMySW50ZXJmYWNlIHwgQnVmZmVyO1xuXG5leHBvcnQgdHlwZSBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcyA9IHtcbiAgdW5sb2NrSGVpZ2h0OiBudW1iZXI7XG4gIC8qKiBzaGEyNTYoc2hhMjU2KENsYXJpdHkgY29uc2Vuc3VzIHByaW5jaXBhbCBieXRlcykpLiAqL1xuICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXI7XG4gIGVhcmx5RXhpdEtleTogQnVmZmVyO1xuICAvKiogVXNlciwgYmFja3VwLCBhbmQgQml0R28ga2V5cywgYWxsIEJJUDMyIG9yIGFsbCBjb25jcmV0ZSBjb21wcmVzc2VkIGtleXMuICovXG4gIHN0YWtlcktleXM6IFtQb3g1U3Rha2VyS2V5LCBQb3g1U3Rha2VyS2V5LCBQb3g1U3Rha2VyS2V5XTtcbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcHJlc3NlZEtleShrZXk6IEJ1ZmZlciwgZmllbGQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoa2V5Lmxlbmd0aCAhPT0gMzMgfHwgKGtleVswXSAhPT0gMHgwMiAmJiBrZXlbMF0gIT09IDB4MDMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2ZpZWxkfSBtdXN0IGJlIGEgMzMtYnl0ZSBjb21wcmVzc2VkIHB1YmxpYyBrZXlgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0JpcDMyVHJpcGxlKFxuICBrZXlzOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtc1snc3Rha2VyS2V5cyddXG4pOiBrZXlzIGlzIFtCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2UsIEJJUDMySW50ZXJmYWNlXSB7XG4gIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+ICFCdWZmZXIuaXNCdWZmZXIoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIGFzRGVzY3JpcHRvcktleShrZXk6IFBveDVTdGFrZXJLZXksIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGtleSkpIHtcbiAgICB2YWxpZGF0ZUNvbXByZXNzZWRLZXkoa2V5LCBmaWVsZCk7XG4gICAgcmV0dXJuIGtleS50b1N0cmluZygnaGV4Jyk7XG4gIH1cbiAgcmV0dXJuIGtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgKyAnLyonO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIocGFyYW1zLnVubG9ja0hlaWdodCkgfHwgcGFyYW1zLnVubG9ja0hlaWdodCA8PSAwIHx8IHBhcmFtcy51bmxvY2tIZWlnaHQgPj0gNTAwXzAwMF8wMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVubG9ja0hlaWdodCAoJHtwYXJhbXMudW5sb2NrSGVpZ2h0fSkgbXVzdCBiZSBhIHBvc2l0aXZlIGJsb2NrIGhlaWdodCBiZWxvdyA1MDAwMDAwMDBgKTtcbiAgfVxuICBpZiAocGFyYW1zLnN0YWtlckNvbW1pdG1lbnQubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3Rha2VyQ29tbWl0bWVudCBtdXN0IGJlIDMyIGJ5dGVzIChnb3QgJHtwYXJhbXMuc3Rha2VyQ29tbWl0bWVudC5sZW5ndGh9KWApO1xuICB9XG4gIHZhbGlkYXRlQ29tcHJlc3NlZEtleShwYXJhbXMuZWFybHlFeGl0S2V5LCAnZWFybHlFeGl0S2V5Jyk7XG5cbiAgY29uc3QgYnVmZmVyQ291bnQgPSBwYXJhbXMuc3Rha2VyS2V5cy5maWx0ZXIoQnVmZmVyLmlzQnVmZmVyKS5sZW5ndGg7XG4gIGlmIChidWZmZXJDb3VudCAhPT0gMCAmJiBidWZmZXJDb3VudCAhPT0gcGFyYW1zLnN0YWtlcktleXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXJLZXlzIG11c3QgY29udGFpbiBlaXRoZXIgdGhyZWUgQklQMzIga2V5cyBvciB0aHJlZSBjb21wcmVzc2VkIHB1YmxpYyBrZXlzJyk7XG4gIH1cbiAgcGFyYW1zLnN0YWtlcktleXMuZm9yRWFjaCgoa2V5LCBpbmRleCkgPT4ge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoa2V5KSkge1xuICAgICAgdmFsaWRhdGVDb21wcmVzc2VkS2V5KGtleSwgYHN0YWtlcktleXNbJHtpbmRleH1dYCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIFBvWC01IFAyV1NIIGRlc2NyaXB0b3IuIFRoZSBwb3N0LUNMVFYgYW5kIGVhcmx5LWV4aXRcbiAqIHBhdGhzIHNoYXJlIEJpdEdvJ3Mgc3RhbmRhcmQgMi1vZi0zIGNvbXByZXNzZWQta2V5IG11bHRpc2lnIHRhaWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXM6IFBveDVMb2NrdXBEZXNjcmlwdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgdmFsaWRhdGVQYXJhbXMocGFyYW1zKTtcbiAgY29uc3Qgc3Rha2VyS2V5cyA9IHBhcmFtcy5zdGFrZXJLZXlzLm1hcCgoa2V5LCBpbmRleCkgPT4gYXNEZXNjcmlwdG9yS2V5KGtleSwgYHN0YWtlcktleXNbJHtpbmRleH1dYCkpO1xuICBjb25zdCBtaW5pc2NyaXB0OiBhc3QuTWluaXNjcmlwdE5vZGUgPSB7XG4gICAgYW5kX3Y6IFtcbiAgICAgIHtcbiAgICAgICAgJ3Y6b3JfaSc6IFtcbiAgICAgICAgICB7IGFmdGVyOiBwYXJhbXMudW5sb2NrSGVpZ2h0IH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYW5kX3Y6IFtcbiAgICAgICAgICAgICAgeyAndjpzaGEyNTYnOiBwYXJhbXMuc3Rha2VyQ29tbWl0bWVudC50b1N0cmluZygnaGV4JykgfSxcbiAgICAgICAgICAgICAgeyBwazogcGFyYW1zLmVhcmx5RXhpdEtleS50b1N0cmluZygnaGV4JykgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7IG11bHRpOiBbMiwgLi4uc3Rha2VyS2V5c10gfSxcbiAgICBdLFxuICB9O1xuICByZXR1cm4gYXN0LmZvcm1hdE5vZGUoeyB3c2g6IG1pbmlzY3JpcHQgfSk7XG59XG5cbi8qKiBDb21waWxlIHRoZSBQb1gtNSBQMldTSCBzY3JpcHRQdWJLZXkgYXQgYSBCSVAzMiBkZXJpdmF0aW9uIGluZGV4LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBveDVMb2NrdXBTY3JpcHRQdWJLZXkocGFyYW1zOiBQb3g1TG9ja3VwRGVzY3JpcHRvclBhcmFtcywgZGVyaXZhdGlvbkluZGV4ID0gMCk6IEJ1ZmZlciB7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBjcmVhdGVQb3g1TG9ja3VwRGVzY3JpcHRvcihwYXJhbXMpO1xuICBpZiAoaXNCaXAzMlRyaXBsZShwYXJhbXMuc3Rha2VyS2V5cykpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICBEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY3JpcHRvciwgJ2Rlcml2YWJsZScpLmF0RGVyaXZhdGlvbkluZGV4KGRlcml2YXRpb25JbmRleCkuc2NyaXB0UHVia2V5KClcbiAgICApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShEZXNjcmlwdG9yLmZyb21TdHJpbmcoZGVzY3JpcHRvciwgJ2RlZmluaXRlJykuc2NyaXB0UHVia2V5KCkpO1xufVxuXG4vKiogRGVyaXZlIHRoZSBjb21wcmVzc2VkIHN0YWtlciBrZXlzIG5lZWRlZCB0byBwcmVwYXJlIGEgd2l0bmVzcyBhdCBhbiBpbmRleC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVQb3g1U3Rha2VyS2V5cyhcbiAgc3Rha2VyS2V5czogW0JJUDMySW50ZXJmYWNlLCBCSVAzMkludGVyZmFjZSwgQklQMzJJbnRlcmZhY2VdLFxuICBpbmRleDogbnVtYmVyXG4pOiBbQnVmZmVyLCBCdWZmZXIsIEJ1ZmZlcl0ge1xuICBjb25zdCBrZXlzID0gc3Rha2VyS2V5cy5tYXAoKGtleSkgPT4gQnVmZmVyLmZyb20oa2V5LmRlcml2ZShpbmRleCkucHVibGljS2V5KSk7XG4gIHJldHVybiBba2V5c1swXSwga2V5c1sxXSwga2V5c1syXV07XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from './descriptor';
2
+ export * from './parseDescriptor';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/pox5/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./descriptor"), exports);
18
+ __exportStar(require("./parseDescriptor"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcG94NS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLG9EQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGVzY3JpcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL3BhcnNlRGVzY3JpcHRvcic7XG4iXX0=
@@ -0,0 +1,16 @@
1
+ import { Descriptor, ast } from '@bitgo/wasm-utxo';
2
+ export type ParsedPox5LockupDescriptor = {
3
+ unlockHeight: number;
4
+ stakerCommitment: Buffer;
5
+ earlyExitKey: Buffer;
6
+ stakerKeyStrings: [string, string, string];
7
+ stakerKeys: [Buffer, Buffer, Buffer] | undefined;
8
+ miniscriptNode: ast.MiniscriptNode;
9
+ };
10
+ /**
11
+ * Parse only the canonical PoX-5 descriptor template. Other descriptors return
12
+ * null; malformed fields within the template throw so callers cannot finalize
13
+ * a script under an ambiguous policy.
14
+ */
15
+ export declare function parsePox5LockupDescriptor(descriptor: Descriptor | ast.DescriptorNode): ParsedPox5LockupDescriptor | null;
16
+ //# sourceMappingURL=parseDescriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseDescriptor.d.ts","sourceRoot":"","sources":["../../../../src/pox5/parseDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACjD,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC;CACpC,CAAC;AA2CF;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAC1C,0BAA0B,GAAG,IAAI,CAmDnC"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePox5LockupDescriptor = parsePox5LockupDescriptor;
4
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
5
+ const descriptor_1 = require("@bitgo-beta/utxo-core/descriptor");
6
+ const COMPRESSED_KEY = /^(02|03)[0-9a-fA-F]{64}$/;
7
+ const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
8
+ function asNumber(value, field) {
9
+ if (typeof value !== 'number') {
10
+ throw new Error(`${field} must be a number`);
11
+ }
12
+ return value;
13
+ }
14
+ function asString(value, field) {
15
+ if (typeof value !== 'string') {
16
+ throw new Error(`${field} must be a string`);
17
+ }
18
+ return value;
19
+ }
20
+ function parseCompressedKey(value, field) {
21
+ if (!COMPRESSED_KEY.test(value)) {
22
+ throw new Error(`${field} must be a compressed public key`);
23
+ }
24
+ return Buffer.from(value, 'hex');
25
+ }
26
+ function resolveStakerKey(value) {
27
+ if (COMPRESSED_KEY.test(value)) {
28
+ return Buffer.from(value, 'hex');
29
+ }
30
+ const match = value.match(XPUB_WITH_INDEX);
31
+ if (!match) {
32
+ return undefined;
33
+ }
34
+ const [, xpub, indexString] = match;
35
+ const index = Number.parseInt(indexString, 10);
36
+ try {
37
+ return Buffer.from(wasm_utxo_1.BIP32.fromBase58(xpub).derive(index).publicKey);
38
+ }
39
+ catch {
40
+ return undefined;
41
+ }
42
+ }
43
+ /**
44
+ * Parse only the canonical PoX-5 descriptor template. Other descriptors return
45
+ * null; malformed fields within the template throw so callers cannot finalize
46
+ * a script under an ambiguous policy.
47
+ */
48
+ function parsePox5LockupDescriptor(descriptor) {
49
+ const matcher = new descriptor_1.PatternMatcher();
50
+ const descriptorNode = descriptor instanceof wasm_utxo_1.Descriptor ? wasm_utxo_1.ast.fromDescriptor(descriptor) : descriptor;
51
+ const matched = matcher.match(descriptorNode, { wsh: { $var: 'miniscript' } });
52
+ if (!matched) {
53
+ return null;
54
+ }
55
+ const miniscriptNode = matched.miniscript;
56
+ const pattern = {
57
+ and_v: [
58
+ {
59
+ 'v:or_i': [
60
+ { after: { $var: 'unlockHeight' } },
61
+ { and_v: [{ 'v:sha256': { $var: 'stakerCommitment' } }, { pk: { $var: 'earlyExitKey' } }] },
62
+ ],
63
+ },
64
+ { multi: { $var: 'stakerMulti' } },
65
+ ],
66
+ };
67
+ const fields = matcher.match(miniscriptNode, pattern);
68
+ if (!fields) {
69
+ return null;
70
+ }
71
+ const unlockHeight = asNumber(fields.unlockHeight, 'after argument');
72
+ if (!Number.isSafeInteger(unlockHeight) || unlockHeight <= 0 || unlockHeight >= 500000000) {
73
+ throw new Error(`unlockHeight (${unlockHeight}) must be a positive block height below 500000000`);
74
+ }
75
+ const commitmentHex = asString(fields.stakerCommitment, 'sha256 commitment');
76
+ if (!/^[0-9a-fA-F]{64}$/.test(commitmentHex)) {
77
+ throw new Error('stakerCommitment must be 32 bytes');
78
+ }
79
+ const earlyExitKey = parseCompressedKey(asString(fields.earlyExitKey, 'early exit key'), 'earlyExitKey');
80
+ if (!Array.isArray(fields.stakerMulti) || fields.stakerMulti.length !== 4 || fields.stakerMulti[0] !== 2) {
81
+ throw new Error('staker multi must be a 2-of-3 multisig');
82
+ }
83
+ const stakerKeyStrings = fields.stakerMulti.slice(1).map((key, index) => asString(key, `staker key ${index}`));
84
+ const resolvedKeys = stakerKeyStrings.map(resolveStakerKey);
85
+ return {
86
+ unlockHeight,
87
+ stakerCommitment: Buffer.from(commitmentHex, 'hex'),
88
+ earlyExitKey,
89
+ stakerKeyStrings: [stakerKeyStrings[0], stakerKeyStrings[1], stakerKeyStrings[2]],
90
+ stakerKeys: resolvedKeys.every((key) => key !== undefined)
91
+ ? [resolvedKeys[0], resolvedKeys[1], resolvedKeys[2]]
92
+ : undefined,
93
+ miniscriptNode,
94
+ };
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BveDUvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMERBLDhEQXFEQztBQS9HRCxnREFBMEQ7QUFDMUQsaUVBQTJFO0FBVzNFLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDO0FBQ2xELE1BQU0sZUFBZSxHQUFHLGtDQUFrQyxDQUFDO0FBRTNELFNBQVMsUUFBUSxDQUFDLEtBQWMsRUFBRSxLQUFhO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssbUJBQW1CLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYyxFQUFFLEtBQWE7SUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssa0NBQWtDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFhO0lBQ3JDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sTUFBTSxD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cnQgeyBCSVAzMiwgRGVzY3JpcHRvciwgYXN0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBQYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlciB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZS9kZXNjcmlwdG9yJztcblxuZXhwb3J0IHR5cGUgUGFyc2VkUG94NUxvY2t1cERlc2NyaXB0b3IgPSB7XG4gIHVubG9ja0hlaWdodDogbnVtYmVyO1xuICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXI7XG4gIGVhcmx5RXhpdEtleTogQnVmZmVyO1xuICBzdGFrZXJLZXlTdHJpbmdzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XG4gIHN0YWtlcktleXM6IFtCdWZmZXIsIEJ1ZmZlciwgQnVmZmVyXSB8IHVuZGVmaW5lZDtcbiAgbWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbn07XG5cbmNvbnN0IENPTVBSRVNTRURfS0VZID0gL14oMDJ8MDMpWzAtOWEtZkEtRl17NjR9JC87XG5jb25zdCBYUFVCX1dJVEhfSU5ERVggPSAvXihbMS05QS1ISi1OUC1aYS1rbS16XSspXFwvKFxcZCspJC87XG5cbmZ1bmN0aW9uIGFzTnVtYmVyKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlOiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmllbGR9IG11c3QgYmUgYSBzdHJpbmdgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ29tcHJlc3NlZEtleSh2YWx1ZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgaWYgKCFDT01QUkVTU0VEX0tFWS50ZXN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIGNvbXByZXNzZWQgcHVibGljIGtleWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ2hleCcpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU3Rha2VyS2V5KHZhbHVlOiBzdHJpbmcpOiBCdWZmZXIgfCB1bmRlZmluZWQge1xuICBpZiAoQ09NUFJFU1NFRF9LRVkudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsICdoZXgnKTtcbiAgfVxuICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKFhQVUJfV0lUSF9JTkRFWCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IFssIHhwdWIsIGluZGV4U3RyaW5nXSA9IG1hdGNoO1xuICBjb25zdCBpbmRleCA9IE51bWJlci5wYXJzZUludChpbmRleFN0cmluZywgMTApO1xuICB0cnkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShCSVAzMi5mcm9tQmFzZTU4KHhwdWIpLmRlcml2ZShpbmRleCkucHVibGljS2V5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIG9ubHkgdGhlIGNhbm9uaWNhbCBQb1gtNSBkZXNjcmlwdG9yIHRlbXBsYXRlLiBPdGhlciBkZXNjcmlwdG9ycyByZXR1cm5cbiAqIG51bGw7IG1hbGZvcm1lZCBmaWVsZHMgd2l0aGluIHRoZSB0ZW1wbGF0ZSB0aHJvdyBzbyBjYWxsZXJzIGNhbm5vdCBmaW5hbGl6ZVxuICogYSBzY3JpcHQgdW5kZXIgYW4gYW1iaWd1b3VzIHBvbGljeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUG94NUxvY2t1cERlc2NyaXB0b3IoXG4gIGRlc2NyaXB0b3I6IERlc2NyaXB0b3IgfCBhc3QuRGVzY3JpcHRvck5vZGVcbik6IFBhcnNlZFBveDVMb2NrdXBEZXNjcmlwdG9yIHwgbnVsbCB7XG4gIGNvbnN0IG1hdGNoZXIgPSBuZXcgUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IG1hdGNoZWQgPSBtYXRjaGVyLm1hdGNoKGRlc2NyaXB0b3JOb2RlLCB7IHdzaDogeyAkdmFyOiAnbWluaXNjcmlwdCcgfSB9KTtcbiAgaWYgKCFtYXRjaGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtaW5pc2NyaXB0Tm9kZSA9IG1hdGNoZWQubWluaXNjcmlwdCBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFtcbiAgICAgIHtcbiAgICAgICAgJ3Y6b3JfaSc6IFtcbiAgICAgICAgICB7IGFmdGVyOiB7ICR2YXI6ICd1bmxvY2tIZWlnaHQnIH0gfSxcbiAgICAgICAgICB7IGFuZF92OiBbeyAndjpzaGEyNTYnOiB7ICR2YXI6ICdzdGFrZXJDb21taXRtZW50JyB9IH0sIHsgcGs6IHsgJHZhcjogJ2Vhcmx5RXhpdEtleScgfSB9XSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHsgbXVsdGk6IHsgJHZhcjogJ3N0YWtlck11bHRpJyB9IH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgZmllbGRzID0gbWF0Y2hlci5tYXRjaChtaW5pc2NyaXB0Tm9kZSwgcGF0dGVybik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB1bmxvY2tIZWlnaHQgPSBhc051bWJlcihmaWVsZHMudW5sb2NrSGVpZ2h0LCAnYWZ0ZXIgYXJndW1lbnQnKTtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1bmxvY2tIZWlnaHQpIHx8IHVubG9ja0hlaWdodCA8PSAwIHx8IHVubG9ja0hlaWdodCA+PSA1MDBfMDAwXzAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5sb2NrSGVpZ2h0ICgke3VubG9ja0hlaWdodH0pIG11c3QgYmUgYSBwb3NpdGl2ZSBibG9jayBoZWlnaHQgYmVsb3cgNTAwMDAwMDAwYCk7XG4gIH1cbiAgY29uc3QgY29tbWl0bWVudEhleCA9IGFzU3RyaW5nKGZpZWxkcy5zdGFrZXJDb21taXRtZW50LCAnc2hhMjU2IGNvbW1pdG1lbnQnKTtcbiAgaWYgKCEvXlswLTlhLWZBLUZdezY0fSQvLnRlc3QoY29tbWl0bWVudEhleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YWtlckNvbW1pdG1lbnQgbXVzdCBiZSAzMiBieXRlcycpO1xuICB9XG4gIGNvbnN0IGVhcmx5RXhpdEtleSA9IHBhcnNlQ29tcHJlc3NlZEtleShhc1N0cmluZyhmaWVsZHMuZWFybHlFeGl0S2V5LCAnZWFybHkgZXhpdCBrZXknKSwgJ2Vhcmx5RXhpdEtleScpO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShmaWVsZHMuc3Rha2VyTXVsdGkpIHx8IGZpZWxkcy5zdGFrZXJNdWx0aS5sZW5ndGggIT09IDQgfHwgZmllbGRzLnN0YWtlck11bHRpWzBdICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFrZXIgbXVsdGkgbXVzdCBiZSBhIDItb2YtMyBtdWx0aXNpZycpO1xuICB9XG4gIGNvbnN0IHN0YWtlcktleVN0cmluZ3MgPSBmaWVsZHMuc3Rha2VyTXVsdGkuc2xpY2UoMSkubWFwKChrZXksIGluZGV4KSA9PiBhc1N0cmluZyhrZXksIGBzdGFrZXIga2V5ICR7aW5kZXh9YCkpO1xuICBjb25zdCByZXNvbHZlZEtleXMgPSBzdGFrZXJLZXlTdHJpbmdzLm1hcChyZXNvbHZlU3Rha2VyS2V5KTtcblxuICByZXR1cm4ge1xuICAgIHVubG9ja0hlaWdodCxcbiAgICBzdGFrZXJDb21taXRtZW50OiBCdWZmZXIuZnJvbShjb21taXRtZW50SGV4LCAnaGV4JyksXG4gICAgZWFybHlFeGl0S2V5LFxuICAgIHN0YWtlcktleVN0cmluZ3M6IFtzdGFrZXJLZXlTdHJpbmdzWzBdLCBzdGFrZXJLZXlTdHJpbmdzWzFdLCBzdGFrZXJLZXlTdHJpbmdzWzJdXSxcbiAgICBzdGFrZXJLZXlzOiByZXNvbHZlZEtleXMuZXZlcnkoKGtleSk6IGtleSBpcyBCdWZmZXIgPT4ga2V5ICE9PSB1bmRlZmluZWQpXG4gICAgICA/IFtyZXNvbHZlZEtleXNbMF0sIHJlc29sdmVkS2V5c1sxXSwgcmVzb2x2ZWRLZXlzWzJdXVxuICAgICAgOiB1bmRlZmluZWQsXG4gICAgbWluaXNjcmlwdE5vZGUsXG4gIH07XG59XG4iXX0=
@@ -1,4 +1,5 @@
1
1
  export * from './constants';
2
2
  export * from './descriptor';
3
3
  export * from './depositAddress';
4
+ export * from './parseDescriptor';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sbtc/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sbtc/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./constants"), exports);
18
18
  __exportStar(require("./descriptor"), exports);
19
19
  __exportStar(require("./depositAddress"), exports);
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2J0Yy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQTRCO0FBQzVCLCtDQUE2QjtBQUM3QixtREFBaUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2Rlc2NyaXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9kZXBvc2l0QWRkcmVzcyc7XG4iXX0=
20
+ __exportStar(require("./parseDescriptor"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2J0Yy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQTRCO0FBQzVCLCtDQUE2QjtBQUM3QixtREFBaUM7QUFDakMsb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9kZXNjcmlwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwb3NpdEFkZHJlc3MnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXJzZURlc2NyaXB0b3InO1xuIl19
@@ -0,0 +1,55 @@
1
+ import { Descriptor, ast } from '@bitgo/wasm-utxo';
2
+ /**
3
+ * Parsed components of an sBTC peg-in deposit descriptor.
4
+ *
5
+ * The parser returns both the high-level
6
+ * fields callers usually need (keys, lockTime, fee, recipient) and the raw
7
+ * miniscript AST nodes so the leaves can be re-compiled into a
8
+ * `Miniscript` via `ast.formatNode` + `Miniscript.fromString`.
9
+ */
10
+ export type ParsedSbtcDepositDescriptor = {
11
+ /** 32-byte x-only signers aggregate key from the deposit leaf. */
12
+ signersAggregateKey: Buffer;
13
+ /** Max signer fee parsed from the first 8 bytes of the payload_drop value. */
14
+ maxFee: bigint;
15
+ /** 22-byte Stacks recipient parsed from the trailing bytes of the payload. */
16
+ stacksRecipient: Buffer;
17
+ /** Reclaim-leaf relative timelock (number of Bitcoin blocks, OP_CSV argument). */
18
+ lockTime: number;
19
+ /**
20
+ * The three concrete x-only reclaim keys from the reclaim-leaf `multi_a`,
21
+ * in the order they appear inside the leaf (descriptor library sorts by hex).
22
+ * Only present when the descriptor is in its derived/definite form — for
23
+ * derivable descriptors the multi_a entries are xpub strings (e.g.
24
+ * `xpub.../*`), which can't be turned into 32-byte buffers without picking
25
+ * a derivation index. Callers that need raw key bytes MUST pass the
26
+ * derived descriptor (see `deriveReclaimKeys` for derivable inputs).
27
+ */
28
+ reclaimKeys: [Buffer, Buffer, Buffer] | undefined;
29
+ /** Raw miniscript AST for the deposit leaf (first tap-tree leaf). */
30
+ depositMiniscriptNode: ast.MiniscriptNode;
31
+ /** Raw miniscript AST for the reclaim leaf (second tap-tree leaf). */
32
+ reclaimMiniscriptNode: ast.MiniscriptNode;
33
+ /**
34
+ * The three raw `multi_a` key entries from the reclaim leaf, exactly as
35
+ * they appear in the descriptor — `xpub.../*` for derivable descriptors and
36
+ * 64-hex-char x-only keys for definite descriptors. Useful for callers that
37
+ * need the original xpub form (e.g. to round-trip back to a descriptor
38
+ * builder) and don't want the resolved `reclaimKeys` buffers.
39
+ */
40
+ reclaimKeyStrings: [string, string, string];
41
+ };
42
+ /**
43
+ * Parse an sBTC peg-in deposit descriptor and return its components.
44
+ *
45
+ * Returns `null` if the descriptor does not match the expected
46
+ * `tr(<UNSPENDABLE>, {<depositLeaf>, <reclaimLeaf>})` shape — same convention
47
+ * as babylon's `parseStakingDescriptor`. Throws if the shape matches but a
48
+ * sub-field is malformed (e.g. signers key isn't 32 bytes, payload isn't 30
49
+ * bytes, threshold isn't 2).
50
+ *
51
+ * Accepts both the `Descriptor` WASM object (definite or derivable) and a
52
+ * pre-extracted `ast.DescriptorNode`
53
+ */
54
+ export declare function parseSbtcDepositDescriptor(descriptor: Descriptor | ast.DescriptorNode): ParsedSbtcDepositDescriptor | null;
55
+ //# sourceMappingURL=parseDescriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseDescriptor.d.ts","sourceRoot":"","sources":["../../../../src/sbtc/parseDescriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAK1D;;;;;;;GAOG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;;;OAQG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAClD,qEAAqE;IACrE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C,sEAAsE;IACtE,qBAAqB,EAAE,GAAG,CAAC,cAAc,CAAC;IAC1C;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C,CAAC;AAwJF;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC,cAAc,GAC1C,2BAA2B,GAAG,IAAI,CA8CpC"}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSbtcDepositDescriptor = parseSbtcDepositDescriptor;
4
+ const wasm_utxo_1 = require("@bitgo/wasm-utxo");
5
+ const descriptor_1 = require("@bitgo-beta/utxo-core/descriptor");
6
+ const constants_1 = require("./constants");
7
+ function asString(v, field) {
8
+ if (typeof v !== 'string') {
9
+ throw new Error(`${field} must be a string`);
10
+ }
11
+ return v;
12
+ }
13
+ function asNumber(v, field) {
14
+ if (typeof v !== 'number') {
15
+ throw new Error(`${field} must be a number`);
16
+ }
17
+ return v;
18
+ }
19
+ /**
20
+ * Pull `[threshold, ...keys]` out of a `multi_a` AST node value, validating
21
+ * each element. The descriptor's `multi_a` is rendered with keys either as
22
+ * concrete hex (definite descriptor) or as xpub strings ending in `/*`
23
+ * (derivable descriptor) — both are strings here, so we don't try to convert
24
+ * to Buffer at this level.
25
+ */
26
+ function parseMulti(multi) {
27
+ if (!Array.isArray(multi) || multi.length < 1) {
28
+ throw new Error('Invalid multi_a structure: not an array or empty');
29
+ }
30
+ const [threshold, ...keys] = multi;
31
+ if (typeof threshold !== 'number') {
32
+ throw new Error('Invalid multi_a structure: threshold is not a number');
33
+ }
34
+ if (!keys.every((k) => typeof k === 'string')) {
35
+ throw new Error('Invalid multi_a structure: not all keys are strings');
36
+ }
37
+ return [threshold, keys];
38
+ }
39
+ function parseDepositLeaf(depositNode, matcher) {
40
+ const depositPattern = {
41
+ and_v: [{ payload_drop: { $var: 'payloadHex' } }, { pk: { $var: 'signersKey' } }],
42
+ };
43
+ const match = matcher.match(depositNode, depositPattern);
44
+ if (!match) {
45
+ throw new Error('Deposit leaf does not match expected pattern');
46
+ }
47
+ const payloadHex = asString(match.payloadHex, 'payload_drop value');
48
+ const signersKeyHex = asString(match.signersKey, 'pk_k key');
49
+ const expectedPayloadLength = constants_1.MAX_FEE_BYTE_LENGTH + constants_1.STACKS_RECIPIENT_BYTE_LENGTH;
50
+ const payload = Buffer.from(payloadHex, 'hex');
51
+ if (payload.length !== expectedPayloadLength) {
52
+ throw new Error(`payload_drop value must be ${expectedPayloadLength} bytes (${expectedPayloadLength * 2} hex chars), got ${payload.length} bytes`);
53
+ }
54
+ const maxFee = payload.readBigUInt64BE(0);
55
+ const stacksRecipient = payload.subarray(constants_1.MAX_FEE_BYTE_LENGTH);
56
+ const signersAggregateKey = Buffer.from(signersKeyHex, 'hex');
57
+ if (signersAggregateKey.length !== 32) {
58
+ throw new Error(`signersAggregateKey must be 32 bytes x-only, got ${signersAggregateKey.length}`);
59
+ }
60
+ return { signersAggregateKey, maxFee, stacksRecipient };
61
+ }
62
+ function parseReclaimLeaf(reclaimNode, matcher) {
63
+ // and_v(r:older(<lockTime>), multi_a(2, k1, k2, k3))
64
+ const reclaimPattern = {
65
+ and_v: [{ 'r:older': { $var: 'lockTime' } }, { multi_a: { $var: 'reclaimMulti' } }],
66
+ };
67
+ const match = matcher.match(reclaimNode, reclaimPattern);
68
+ if (!match) {
69
+ throw new Error('Reclaim leaf does not match expected pattern');
70
+ }
71
+ const lockTime = asNumber(match.lockTime, 'r:older argument');
72
+ if (lockTime <= 0) {
73
+ throw new Error(`reclaim lockTime must be > 0, got ${lockTime}`);
74
+ }
75
+ const [threshold, reclaimKeyStrings] = parseMulti(match.reclaimMulti);
76
+ if (threshold !== 2) {
77
+ throw new Error(`reclaim multi_a threshold must be 2, got ${threshold}`);
78
+ }
79
+ if (reclaimKeyStrings.length !== 3) {
80
+ throw new Error(`reclaim multi_a must have exactly 3 keys, got ${reclaimKeyStrings.length}`);
81
+ }
82
+ return { lockTime, reclaimKeyStrings };
83
+ }
84
+ const HEX_X_ONLY_KEY = /^[0-9a-fA-F]{64}$/;
85
+ const XPUB_WITH_INDEX = /^([1-9A-HJ-NP-Za-km-z]+)\/(\d+)$/;
86
+ /**
87
+ * Resolve a single `multi_a` key entry to a 32-byte x-only public key.
88
+ *
89
+ * Accepts:
90
+ * - 64-hex-char string → returned as-is (already x-only)
91
+ * - `xpub.../<index>` → BIP32-derive at that index and drop the prefix byte
92
+ *
93
+ * Returns null for any other shape (e.g. wildcard `xpub.../*`, malformed input).
94
+ */
95
+ function resolveReclaimKey(s) {
96
+ if (HEX_X_ONLY_KEY.test(s)) {
97
+ return Buffer.from(s, 'hex');
98
+ }
99
+ const m = s.match(XPUB_WITH_INDEX);
100
+ if (!m) {
101
+ return null;
102
+ }
103
+ const [, xpub, indexStr] = m;
104
+ const index = Number.parseInt(indexStr, 10);
105
+ if (!Number.isFinite(index) || index < 0) {
106
+ return null;
107
+ }
108
+ let node;
109
+ try {
110
+ node = wasm_utxo_1.BIP32.fromBase58(xpub);
111
+ }
112
+ catch {
113
+ return null;
114
+ }
115
+ // BIP32 public key is 33 bytes (1 prefix + 32 x-only). Drop the prefix.
116
+ return Buffer.from(node.derive(index).publicKey.subarray(1));
117
+ }
118
+ /**
119
+ * Convert reclaim-leaf key strings into 32-byte x-only buffers. Accepts both
120
+ * the definite/derived form (concrete 64-hex-char x-only keys) and the form
121
+ * produced by `Descriptor.atDerivationIndex(n)` (`xpub.../<n>`). Returns
122
+ * undefined if any entry is still wildcard (`xpub.../*`) or otherwise
123
+ * unresolvable.
124
+ */
125
+ function reclaimKeysFromStrings(keyStrings) {
126
+ const resolved = keyStrings.map(resolveReclaimKey);
127
+ if (resolved.some((b) => b === null) || resolved.length !== 3) {
128
+ return undefined;
129
+ }
130
+ return [resolved[0], resolved[1], resolved[2]];
131
+ }
132
+ /**
133
+ * Parse an sBTC peg-in deposit descriptor and return its components.
134
+ *
135
+ * Returns `null` if the descriptor does not match the expected
136
+ * `tr(<UNSPENDABLE>, {<depositLeaf>, <reclaimLeaf>})` shape — same convention
137
+ * as babylon's `parseStakingDescriptor`. Throws if the shape matches but a
138
+ * sub-field is malformed (e.g. signers key isn't 32 bytes, payload isn't 30
139
+ * bytes, threshold isn't 2).
140
+ *
141
+ * Accepts both the `Descriptor` WASM object (definite or derivable) and a
142
+ * pre-extracted `ast.DescriptorNode`
143
+ */
144
+ function parseSbtcDepositDescriptor(descriptor) {
145
+ const pattern = {
146
+ tr: [constants_1.UNSPENDABLE_INTERNAL_KEY, [{ $var: 'depositLeaf' }, { $var: 'reclaimLeaf' }]],
147
+ };
148
+ const matcher = new descriptor_1.PatternMatcher();
149
+ const descriptorNode = descriptor instanceof wasm_utxo_1.Descriptor ? wasm_utxo_1.ast.fromDescriptor(descriptor) : descriptor;
150
+ const result = matcher.match(descriptorNode, pattern);
151
+ if (!result) {
152
+ return null;
153
+ }
154
+ const depositMiniscriptNode = result.depositLeaf;
155
+ let reclaimMiniscriptNode = result.reclaimLeaf;
156
+ const { signersAggregateKey, maxFee, stacksRecipient } = parseDepositLeaf(depositMiniscriptNode, matcher);
157
+ const { lockTime, reclaimKeyStrings } = parseReclaimLeaf(reclaimMiniscriptNode, matcher);
158
+ const reclaimKeyStringsTuple = [
159
+ reclaimKeyStrings[0],
160
+ reclaimKeyStrings[1],
161
+ reclaimKeyStrings[2],
162
+ ];
163
+ const reclaimKeys = reclaimKeysFromStrings(reclaimKeyStrings);
164
+ if (reclaimKeys) {
165
+ // Rewrite the reclaim leaf with concrete hex keys when we can resolve
166
+ // them — `Miniscript.fromString(..., 'tap')` only accepts x-only hex in
167
+ // `multi_a`, not xpub-form strings. With this rewrite the formatted
168
+ // leaf is directly compilable; without it callers must do the
169
+ // resolution themselves.
170
+ reclaimMiniscriptNode = {
171
+ and_v: [{ 'r:older': lockTime }, { multi_a: [2, ...reclaimKeys.map((k) => k.toString('hex'))] }],
172
+ };
173
+ }
174
+ return {
175
+ signersAggregateKey,
176
+ maxFee,
177
+ stacksRecipient,
178
+ lockTime,
179
+ reclaimKeys,
180
+ reclaimKeyStrings: reclaimKeyStringsTuple,
181
+ depositMiniscriptNode,
182
+ reclaimMiniscriptNode,
183
+ };
184
+ }
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NidGMvcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ05BLGdFQWdEQztBQWhRRCxnREFBMEQ7QUFDMUQsaUVBQTJFO0FBRTNFLDJDQUEwRztBQTJDMUcsU0FBUyxRQUFRLENBQUMsQ0FBVSxFQUFFLEtBQWE7SUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxDQUFVLEVBQUUsS0FBYTtJQUN6QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLG1CQUFtQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQWM7SUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUNELE1BQU0sQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbkMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMs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SyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDakcsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsbUJBQW1CO1FBQ25CLE1BQU07UUFDTixlQUFlO1FBQ2YsUUFBUTtRQUNSLFdBQVc7UUFDWCxpQkFBaUIsRUFBRSxzQkFBc0I7UUFDekMscUJBQXFCO1FBQ3JCLHFCQUFxQjtLQUN0QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJJUDMyLCBEZXNjcmlwdG9yLCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFBhdHRlcm5NYXRjaGVyLCBQYXR0ZXJuIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL2Rlc2NyaXB0b3InO1xuXG5pbXBvcnQgeyBNQVhfRkVFX0JZVEVfTEVOR1RILCBTVEFDS1NfUkVDSVBJRU5UX0JZVEVfTEVOR1RILCBVTlNQRU5EQUJMRV9JTlRFUk5BTF9LRVkgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogUGFyc2VkIGNvbXBvbmVudHMgb2YgYW4gc0JUQyBwZWctaW4gZGVwb3NpdCBkZXNjcmlwdG9yLlxuICpcbiAqIFRoZSBwYXJzZXIgcmV0dXJucyBib3RoIHRoZSBoaWdoLWxldmVsXG4gKiBmaWVsZHMgY2FsbGVycyB1c3VhbGx5IG5lZWQgKGtleXMsIGxvY2tUaW1lLCBmZWUsIHJlY2lwaWVudCkgYW5kIHRoZSByYXdcbiAqIG1pbmlzY3JpcHQgQVNUIG5vZGVzIHNvIHRoZSBsZWF2ZXMgY2FuIGJlIHJlLWNvbXBpbGVkIGludG8gYVxuICogYE1pbmlzY3JpcHRgIHZpYSBgYXN0LmZvcm1hdE5vZGVgICsgYE1pbmlzY3JpcHQuZnJvbVN0cmluZ2AuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFNidGNEZXBvc2l0RGVzY3JpcHRvciA9IHtcbiAgLyoqIDMyLWJ5dGUgeC1vbmx5IHNpZ25lcnMgYWdncmVnYXRlIGtleSBmcm9tIHRoZSBkZXBvc2l0IGxlYWYuICovXG4gIHNpZ25lcnNBZ2dyZWdhdGVLZXk6IEJ1ZmZlcjtcbiAgLyoqIE1heCBzaWduZXIgZmVlIHBhcnNlZCBmcm9tIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBwYXlsb2FkX2Ryb3AgdmFsdWUuICovXG4gIG1heEZlZTogYmlnaW50O1xuICAvKiogMjItYnl0ZSBTdGFja3MgcmVjaXBpZW50IHBhcnNlZCBmcm9tIHRoZSB0cmFpbGluZyBieXRlcyBvZiB0aGUgcGF5bG9hZC4gKi9cbiAgc3RhY2tzUmVjaXBpZW50OiBCdWZmZXI7XG4gIC8qKiBSZWNsYWltLWxlYWYgcmVsYXRpdmUgdGltZWxvY2sgKG51bWJlciBvZiBCaXRjb2luIGJsb2NrcywgT1BfQ1NWIGFyZ3VtZW50KS4gKi9cbiAgbG9ja1RpbWU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0aHJlZSBjb25jcmV0ZSB4LW9ubHkgcmVjbGFpbSBrZXlzIGZyb20gdGhlIHJlY2xhaW0tbGVhZiBgbXVsdGlfYWAsXG4gICAqIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbnNpZGUgdGhlIGxlYWYgKGRlc2NyaXB0b3IgbGlicmFyeSBzb3J0cyBieSBoZXgpLlxuICAgKiBPbmx5IHByZXNlbnQgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBpbiBpdHMgZGVyaXZlZC9kZWZpbml0ZSBmb3JtIOKAlCBmb3JcbiAgICogZGVyaXZhYmxlIGRlc2NyaXB0b3JzIHRoZSBtdWx0aV9hIGVudHJpZXMgYXJlIHhwdWIgc3RyaW5ncyAoZS5nLlxuICAgKiBgeHB1Yi4uLi8qYCksIHdoaWNoIGNhbid0IGJlIHR1cm5lZCBpbnRvIDMyLWJ5dGUgYnVmZmVycyB3aXRob3V0IHBpY2tpbmdcbiAgICogYSBkZXJpdmF0aW9uIGluZGV4LiBDYWxsZXJzIHRoYXQgbmVlZCByYXcga2V5IGJ5dGVzIE1VU1QgcGFzcyB0aGVcbiAgICogZGVyaXZlZCBkZXNjcmlwdG9yIChzZWUgYGRlcml2ZVJlY2xhaW1LZXlzYCBmb3IgZGVyaXZhYmxlIGlucHV0cykuXG4gICAqL1xuICByZWNsYWltS2V5czogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdIHwgdW5kZWZpbmVkO1xuICAvKiogUmF3IG1pbmlzY3JpcHQgQVNUIGZvciB0aGUgZGVwb3NpdCBsZWFmIChmaXJzdCB0YXAtdHJlZSBsZWFmKS4gKi9cbiAgZGVwb3NpdE1pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIC8qKiBSYXcgbWluaXNjcmlwdCBBU1QgZm9yIHRoZSByZWNsYWltIGxlYWYgKHNlY29uZCB0YXAtdHJlZSBsZWFmKS4gKi9cbiAgcmVjbGFpbU1pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIC8qKlxuICAgKiBUaGUgdGhyZWUgcmF3IGBtdWx0aV9hYCBrZXkgZW50cmllcyBmcm9tIHRoZSByZWNsYWltIGxlYWYsIGV4YWN0bHkgYXNcbiAgICogdGhleSBhcHBlYXIgaW4gdGhlIGRlc2NyaXB0b3Ig4oCUIGB4cHViLi4uLypgIGZvciBkZXJpdmFibGUgZGVzY3JpcHRvcnMgYW5kXG4gICAqIDY0LWhleC1jaGFyIHgtb25seSBrZXlzIGZvciBkZWZpbml0ZSBkZXNjcmlwdG9ycy4gVXNlZnVsIGZvciBjYWxsZXJzIHRoYXRcbiAgICogbmVlZCB0aGUgb3JpZ2luYWwgeHB1YiBmb3JtIChlLmcuIHRvIHJvdW5kLXRyaXAgYmFjayB0byBhIGRlc2NyaXB0b3JcbiAgICogYnVpbGRlcikgYW5kIGRvbid0IHdhbnQgdGhlIHJlc29sdmVkIGByZWNsYWltS2V5c2AgYnVmZmVycy5cbiAgICovXG4gIHJlY2xhaW1LZXlTdHJpbmdzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ107XG59O1xuXG5mdW5jdGlvbiBhc1N0cmluZyh2OiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG5mdW5jdGlvbiBhc051bWJlcih2OiB1bmtub3duLCBmaWVsZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2ICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmaWVsZH0gbXVzdCBiZSBhIG51bWJlcmApO1xuICB9XG4gIHJldHVybiB2O1xufVxuXG4vKipcbiAqIFB1bGwgYFt0aHJlc2hvbGQsIC4uLmtleXNdYCBvdXQgb2YgYSBgbXVsdGlfYWAgQVNUIG5vZGUgdmFsdWUsIHZhbGlkYXRpbmdcbiAqIGVhY2ggZWxlbWVudC4gVGhlIGRlc2NyaXB0b3IncyBgbXVsdGlfYWAgaXMgcmVuZGVyZWQgd2l0aCBrZXlzIGVpdGhlciBhc1xuICogY29uY3JldGUgaGV4IChkZWZpbml0ZSBkZXNjcmlwdG9yKSBvciBhcyB4cHViIHN0cmluZ3MgZW5kaW5nIGluIGAvKmBcbiAqIChkZXJpdmFibGUgZGVzY3JpcHRvcikg4oCUIGJvdGggYXJlIHN0cmluZ3MgaGVyZSwgc28gd2UgZG9uJ3QgdHJ5IHRvIGNvbnZlcnRcbiAqIHRvIEJ1ZmZlciBhdCB0aGlzIGxldmVsLlxuICovXG5mdW5jdGlvbiBwYXJzZU11bHRpKG11bHRpOiB1bmtub3duKTogW251bWJlciwgc3RyaW5nW11dIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG11bHRpKSB8fCBtdWx0aS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG11bHRpX2Egc3RydWN0dXJlOiBub3QgYW4gYXJyYXkgb3IgZW1wdHknKTtcbiAgfVxuICBjb25zdCBbdGhyZXNob2xkLCAuLi5rZXlzXSA9IG11bHRpO1xuICBpZiAodHlwZW9mIHRocmVzaG9sZCAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IHRocmVzaG9sZCBpcyBub3QgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoIWtleXMuZXZlcnkoKGspID0+IHR5cGVvZiBrID09PSAnc3RyaW5nJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGlfYSBzdHJ1Y3R1cmU6IG5vdCBhbGwga2V5cyBhcmUgc3RyaW5ncycpO1xuICB9XG4gIHJldHVybiBbdGhyZXNob2xkLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VEZXBvc2l0TGVhZihcbiAgZGVwb3NpdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZSxcbiAgbWF0Y2hlcjogUGF0dGVybk1hdGNoZXJcbik6IHsgc2lnbmVyc0FnZ3JlZ2F0ZUtleTogQnVmZmVyOyBtYXhGZWU6IGJpZ2ludDsgc3RhY2tzUmVjaXBpZW50OiBCdWZmZXIgfSB7XG4gIGNvbnN0IGRlcG9zaXRQYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbeyBwYXlsb2FkX2Ryb3A6IHsgJHZhcjogJ3BheWxvYWRIZXgnIH0gfSwgeyBwazogeyAkdmFyOiAnc2lnbmVyc0tleScgfSB9XSxcbiAgfTtcbiAgY29uc3QgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKGRlcG9zaXROb2RlLCBkZXBvc2l0UGF0dGVybik7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlcG9zaXQgbGVhZiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBwYXR0ZXJuJyk7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkSGV4ID0gYXNTdHJpbmcobWF0Y2gucGF5bG9hZEhleCwgJ3BheWxvYWRfZHJvcCB2YWx1ZScpO1xuICBjb25zdCBzaWduZXJzS2V5SGV4ID0gYXNTdHJpbmcobWF0Y2guc2lnbmVyc0tleSwgJ3BrX2sga2V5Jyk7XG5cbiAgY29uc3QgZXhwZWN0ZWRQYXlsb2FkTGVuZ3RoID0gTUFYX0ZFRV9CWVRFX0xFTkdUSCArIFNUQUNLU19SRUNJUElFTlRfQllURV9MRU5HVEg7XG4gIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuZnJvbShwYXlsb2FkSGV4LCAnaGV4Jyk7XG4gIGlmIChwYXlsb2FkLmxlbmd0aCAhPT0gZXhwZWN0ZWRQYXlsb2FkTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHBheWxvYWRfZHJvcCB2YWx1ZSBtdXN0IGJlICR7ZXhwZWN0ZWRQYXlsb2FkTGVuZ3RofSBieXRlcyAoJHtleHBlY3RlZFBheWxvYWRMZW5ndGggKiAyfSBoZXggY2hhcnMpLCBnb3QgJHtcbiAgICAgICAgcGF5bG9hZC5sZW5ndGhcbiAgICAgIH0gYnl0ZXNgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IG1heEZlZSA9IHBheWxvYWQucmVhZEJpZ1VJbnQ2NEJFKDApO1xuICBjb25zdCBzdGFja3NSZWNpcGllbnQgPSBwYXlsb2FkLnN1YmFycmF5KE1BWF9GRUVfQllURV9MRU5HVEgpO1xuXG4gIGNvbnN0IHNpZ25lcnNBZ2dyZWdhdGVLZXkgPSBCdWZmZXIuZnJvbShzaWduZXJzS2V5SGV4LCAnaGV4Jyk7XG4gIGlmIChzaWduZXJzQWdncmVnYXRlS2V5Lmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNpZ25lcnNBZ2dyZWdhdGVLZXkgbXVzdCBiZSAzMiBieXRlcyB4LW9ubHksIGdvdCAke3NpZ25lcnNBZ2dyZWdhdGVLZXkubGVuZ3RofWApO1xuICB9XG5cbiAgcmV0dXJuIHsgc2lnbmVyc0FnZ3JlZ2F0ZUtleSwgbWF4RmVlLCBzdGFja3NSZWNpcGllbnQgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWNsYWltTGVhZihcbiAgcmVjbGFpbU5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZSxcbiAgbWF0Y2hlcjogUGF0dGVybk1hdGNoZXJcbik6IHsgbG9ja1RpbWU6IG51bWJlcjsgcmVjbGFpbUtleVN0cmluZ3M6IHN0cmluZ1tdIH0ge1xuICAvLyBhbmRfdihyOm9sZGVyKDxsb2NrVGltZT4pLCBtdWx0aV9hKDIsIGsxLCBrMiwgazMpKVxuICBjb25zdCByZWNsYWltUGF0dGVybjogUGF0dGVybiA9IHtcbiAgICBhbmRfdjogW3sgJ3I6b2xkZXInOiB7ICR2YXI6ICdsb2NrVGltZScgfSB9LCB7IG11bHRpX2E6IHsgJHZhcjogJ3JlY2xhaW1NdWx0aScgfSB9XSxcbiAgfTtcbiAgY29uc3QgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKHJlY2xhaW1Ob2RlLCByZWNsYWltUGF0dGVybik7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2xhaW0gbGVhZiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBwYXR0ZXJuJyk7XG4gIH1cblxuICBjb25zdCBsb2NrVGltZSA9IGFzTnVtYmVyKG1hdGNoLmxvY2tUaW1lLCAncjpvbGRlciBhcmd1bWVudCcpO1xuICBpZiAobG9ja1RpbWUgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBsb2NrVGltZSBtdXN0IGJlID4gMCwgZ290ICR7bG9ja1RpbWV9YCk7XG4gIH1cblxuICBjb25zdCBbdGhyZXNob2xkLCByZWNsYWltS2V5U3RyaW5nc10gPSBwYXJzZU11bHRpKG1hdGNoLnJlY2xhaW1NdWx0aSk7XG4gIGlmICh0aHJlc2hvbGQgIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlY2xhaW0gbXVsdGlfYSB0aHJlc2hvbGQgbXVzdCBiZSAyLCBnb3QgJHt0aHJlc2hvbGR9YCk7XG4gIH1cbiAgaWYgKHJlY2xhaW1LZXlTdHJpbmdzLmxlbmd0aCAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVjbGFpbSBtdWx0aV9hIG11c3QgaGF2ZSBleGFjdGx5IDMga2V5cywgZ290ICR7cmVjbGFpbUtleVN0cmluZ3MubGVuZ3RofWApO1xuICB9XG5cbiAgcmV0dXJuIHsgbG9ja1RpbWUsIHJlY2xhaW1LZXlTdHJpbmdzIH07XG59XG5cbmNvbnN0IEhFWF9YX09OTFlfS0VZID0gL15bMC05YS1mQS1GXXs2NH0kLztcbmNvbnN0IFhQVUJfV0lUSF9JTkRFWCA9IC9eKFsxLTlBLUhKLU5QLVphLWttLXpdKylcXC8oXFxkKykkLztcblxuLyoqXG4gKiBSZXNvbHZlIGEgc2luZ2xlIGBtdWx0aV9hYCBrZXkgZW50cnkgdG8gYSAzMi1ieXRlIHgtb25seSBwdWJsaWMga2V5LlxuICpcbiAqIEFjY2VwdHM6XG4gKiAgIC0gNjQtaGV4LWNoYXIgc3RyaW5nIOKGkiByZXR1cm5lZCBhcy1pcyAoYWxyZWFkeSB4LW9ubHkpXG4gKiAgIC0gYHhwdWIuLi4vPGluZGV4PmAg4oaSIEJJUDMyLWRlcml2ZSBhdCB0aGF0IGluZGV4IGFuZCBkcm9wIHRoZSBwcmVmaXggYnl0ZVxuICpcbiAqIFJldHVybnMgbnVsbCBmb3IgYW55IG90aGVyIHNoYXBlIChlLmcuIHdpbGRjYXJkIGB4cHViLi4uLypgLCBtYWxmb3JtZWQgaW5wdXQpLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVjbGFpbUtleShzOiBzdHJpbmcpOiBCdWZmZXIgfCBudWxsIHtcbiAgaWYgKEhFWF9YX09OTFlfS0VZLnRlc3QocykpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20ocywgJ2hleCcpO1xuICB9XG4gIGNvbnN0IG0gPSBzLm1hdGNoKFhQVUJfV0lUSF9JTkRFWCk7XG4gIGlmICghbSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IFssIHhwdWIsIGluZGV4U3RyXSA9IG07XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGluZGV4U3RyLCAxMCk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGluZGV4KSB8fCBpbmRleCA8IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsZXQgbm9kZTtcbiAgdHJ5IHtcbiAgICBub2RlID0gQklQMzIuZnJvbUJhc2U1OCh4cHViKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gQklQMzIgcHVibGljIGtleSBpcyAzMyBieXRlcyAoMSBwcmVmaXggKyAzMiB4LW9ubHkpLiBEcm9wIHRoZSBwcmVmaXguXG4gIHJldHVybiBCdWZmZXIuZnJvbShub2RlLmRlcml2ZShpbmRleCkucHVibGljS2V5LnN1YmFycmF5KDEpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHJlY2xhaW0tbGVhZiBrZXkgc3RyaW5ncyBpbnRvIDMyLWJ5dGUgeC1vbmx5IGJ1ZmZlcnMuIEFjY2VwdHMgYm90aFxuICogdGhlIGRlZmluaXRlL2Rlcml2ZWQgZm9ybSAoY29uY3JldGUgNjQtaGV4LWNoYXIgeC1vbmx5IGtleXMpIGFuZCB0aGUgZm9ybVxuICogcHJvZHVjZWQgYnkgYERlc2NyaXB0b3IuYXREZXJpdmF0aW9uSW5kZXgobilgIChgeHB1Yi4uLi88bj5gKS4gUmV0dXJuc1xuICogdW5kZWZpbmVkIGlmIGFueSBlbnRyeSBpcyBzdGlsbCB3aWxkY2FyZCAoYHhwdWIuLi4vKmApIG9yIG90aGVyd2lzZVxuICogdW5yZXNvbHZhYmxlLlxuICovXG5mdW5jdGlvbiByZWNsYWltS2V5c0Zyb21TdHJpbmdzKGtleVN0cmluZ3M6IHN0cmluZ1tdKTogW0J1ZmZlciwgQnVmZmVyLCBCdWZmZXJdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBrZXlTdHJpbmdzLm1hcChyZXNvbHZlUmVjbGFpbUtleSk7XG4gIGlmIChyZXNvbHZlZC5zb21lKChiKSA9PiBiID09PSBudWxsKSB8fCByZXNvbHZlZC5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBbcmVzb2x2ZWRbMF0gYXMgQnVmZmVyLCByZXNvbHZlZFsxXSBhcyBCdWZmZXIsIHJlc29sdmVkWzJdIGFzIEJ1ZmZlcl07XG59XG5cbi8qKlxuICogUGFyc2UgYW4gc0JUQyBwZWctaW4gZGVwb3NpdCBkZXNjcmlwdG9yIGFuZCByZXR1cm4gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIGRlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkXG4gKiBgdHIoPFVOU1BFTkRBQkxFPiwgezxkZXBvc2l0TGVhZj4sIDxyZWNsYWltTGVhZj59KWAgc2hhcGUg4oCUIHNhbWUgY29udmVudGlvblxuICogYXMgYmFieWxvbidzIGBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yYC4gVGhyb3dzIGlmIHRoZSBzaGFwZSBtYXRjaGVzIGJ1dCBhXG4gKiBzdWItZmllbGQgaXMgbWFsZm9ybWVkIChlLmcuIHNpZ25lcnMga2V5IGlzbid0IDMyIGJ5dGVzLCBwYXlsb2FkIGlzbid0IDMwXG4gKiBieXRlcywgdGhyZXNob2xkIGlzbid0IDIpLlxuICpcbiAqIEFjY2VwdHMgYm90aCB0aGUgYERlc2NyaXB0b3JgIFdBU00gb2JqZWN0IChkZWZpbml0ZSBvciBkZXJpdmFibGUpIGFuZCBhXG4gKiBwcmUtZXh0cmFjdGVkIGBhc3QuRGVzY3JpcHRvck5vZGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNidGNEZXBvc2l0RGVzY3JpcHRvcihcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvciB8IGFzdC5EZXNjcmlwdG9yTm9kZVxuKTogUGFyc2VkU2J0Y0RlcG9zaXREZXNjcmlwdG9yIHwgbnVsbCB7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgdHI6IFtVTlNQRU5EQUJMRV9JTlRFUk5BTF9LRVksIFt7ICR2YXI6ICdkZXBvc2l0TGVhZicgfSwgeyAkdmFyOiAncmVjbGFpbUxlYWYnIH1dXSxcbiAgfTtcblxuICBjb25zdCBtYXRjaGVyID0gbmV3IFBhdHRlcm5NYXRjaGVyKCk7XG4gIGNvbnN0IGRlc2NyaXB0b3JOb2RlID0gZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IgPyBhc3QuZnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikgOiBkZXNjcmlwdG9yO1xuICBjb25zdCByZXN1bHQgPSBtYXRjaGVyLm1hdGNoKGRlc2NyaXB0b3JOb2RlLCBwYXR0ZXJuKTtcblxuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGVwb3NpdE1pbmlzY3JpcHROb2RlID0gcmVzdWx0LmRlcG9zaXRMZWFmIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgbGV0IHJlY2xhaW1NaW5pc2NyaXB0Tm9kZSA9IHJlc3VsdC5yZWNsYWltTGVhZiBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG5cbiAgY29uc3QgeyBzaWduZXJzQWdncmVnYXRlS2V5LCBtYXhGZWUsIHN0YWNrc1JlY2lwaWVudCB9ID0gcGFyc2VEZXBvc2l0TGVhZihkZXBvc2l0TWluaXNjcmlwdE5vZGUsIG1hdGNoZXIpO1xuICBjb25zdCB7IGxvY2tUaW1lLCByZWNsYWltS2V5U3RyaW5ncyB9ID0gcGFyc2VSZWNsYWltTGVhZihyZWNsYWltTWluaXNjcmlwdE5vZGUsIG1hdGNoZXIpO1xuICBjb25zdCByZWNsYWltS2V5U3RyaW5nc1R1cGxlOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10gPSBbXG4gICAgcmVjbGFpbUtleVN0cmluZ3NbMF0sXG4gICAgcmVjbGFpbUtleVN0cmluZ3NbMV0sXG4gICAgcmVjbGFpbUtleVN0cmluZ3NbMl0sXG4gIF07XG5cbiAgY29uc3QgcmVjbGFpbUtleXMgPSByZWNsYWltS2V5c0Zyb21TdHJpbmdzKHJlY2xhaW1LZXlTdHJpbmdzKTtcbiAgaWYgKHJlY2xhaW1LZXlzKSB7XG4gICAgLy8gUmV3cml0ZSB0aGUgcmVjbGFpbSBsZWFmIHdpdGggY29uY3JldGUgaGV4IGtleXMgd2hlbiB3ZSBjYW4gcmVzb2x2ZVxuICAgIC8vIHRoZW0g4oCUIGBNaW5pc2NyaXB0LmZyb21TdHJpbmcoLi4uLCAndGFwJylgIG9ubHkgYWNjZXB0cyB4LW9ubHkgaGV4IGluXG4gICAgLy8gYG11bHRpX2FgLCBub3QgeHB1Yi1mb3JtIHN0cmluZ3MuIFdpdGggdGhpcyByZXdyaXRlIHRoZSBmb3JtYXR0ZWRcbiAgICAvLyBsZWFmIGlzIGRpcmVjdGx5IGNvbXBpbGFibGU7IHdpdGhvdXQgaXQgY2FsbGVycyBtdXN0IGRvIHRoZVxuICAgIC8vIHJlc29sdXRpb24gdGhlbXNlbHZlcy5cbiAgICByZWNsYWltTWluaXNjcmlwdE5vZGUgPSB7XG4gICAgICBhbmRfdjogW3sgJ3I6b2xkZXInOiBsb2NrVGltZSB9LCB7IG11bHRpX2E6IFsyLCAuLi5yZWNsYWltS2V5cy5tYXAoKGspID0+IGsudG9TdHJpbmcoJ2hleCcpKV0gfV0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2lnbmVyc0FnZ3JlZ2F0ZUtleSxcbiAgICBtYXhGZWUsXG4gICAgc3RhY2tzUmVjaXBpZW50LFxuICAgIGxvY2tUaW1lLFxuICAgIHJlY2xhaW1LZXlzLFxuICAgIHJlY2xhaW1LZXlTdHJpbmdzOiByZWNsYWltS2V5U3RyaW5nc1R1cGxlLFxuICAgIGRlcG9zaXRNaW5pc2NyaXB0Tm9kZSxcbiAgICByZWNsYWltTWluaXNjcmlwdE5vZGUsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../../../../test/unit/pox5/descriptor.ts"],"names":[],"mappings":""}