@bitgo-beta/sdk-core 8.2.1-beta.2031 → 8.2.1-beta.2033

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 (39) hide show
  1. package/dist/src/api/types.d.ts +6 -0
  2. package/dist/src/api/types.d.ts.map +1 -1
  3. package/dist/src/api/types.js +8 -1
  4. package/dist/src/bitgo/internal/keycard.d.ts +2 -1
  5. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  6. package/dist/src/bitgo/internal/keycard.js +6 -3
  7. package/dist/src/bitgo/keychain/iKeychains.d.ts +4 -0
  8. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  9. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  10. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  11. package/dist/src/bitgo/keychain/keychains.js +17 -10
  12. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +8 -5
  13. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  14. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1 -1
  15. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +33 -0
  16. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
  17. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +260 -0
  18. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +1 -0
  19. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  20. package/dist/src/bitgo/utils/tss/eddsa/index.js +2 -1
  21. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +15 -2
  22. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -1
  23. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +13 -2
  24. package/dist/src/bitgo/wallet/iWallet.d.ts +2 -0
  25. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  26. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  27. package/dist/src/bitgo/wallet/wallet.d.ts +10 -4
  28. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  29. package/dist/src/bitgo/wallet/wallet.js +19 -6
  30. package/dist/src/bitgo/wallet/wallets.d.ts +6 -0
  31. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  32. package/dist/src/bitgo/wallet/wallets.js +35 -36
  33. package/dist/test/unit/bitgo/keychain/keychains.js +26 -1
  34. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +2 -0
  35. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
  36. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +173 -0
  37. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +51 -40
  38. package/dist/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +8 -8
@@ -151,5 +151,30 @@ describe('Keychains.createBackup', function () {
151
151
  body.provider.should.equal('krs-provider');
152
152
  });
153
153
  });
154
+ describe('password rotation encryption session', function () {
155
+ it('uses the supplied session for the new encrypted private key', async function () {
156
+ mockBitGo.decrypt = sinon.stub().resolves('decrypted-prv');
157
+ const sessionEncrypt = sinon.stub().resolves('session-encrypted');
158
+ const session = {
159
+ encrypt: sessionEncrypt,
160
+ decrypt: sinon.stub().resolves('decrypted-prv'),
161
+ destroy: sinon.stub(),
162
+ };
163
+ const updatedKeychain = await keychains.updateSingleKeychainPassword({
164
+ keychain: {
165
+ id: 'key-id',
166
+ encryptedPrv: 'legacy-encrypted-prv',
167
+ type: 'independent',
168
+ },
169
+ oldPassword: 'old-password',
170
+ newPassword: 'new-password',
171
+ encryptionVersion: 2,
172
+ encryptionSession: session,
173
+ });
174
+ sessionEncrypt.calledOnceWithExactly('decrypted-prv').should.equal(true);
175
+ mockBitGo.encrypt.called.should.equal(false);
176
+ updatedKeychain.encryptedPrv.should.equal('session-encrypted');
177
+ });
178
+ });
154
179
  });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixrQkFBZ0I7QUFDaEIseUNBQXVFO0FBRXZFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxHQUFHLDBEQUEwRCxDQUFDO0FBRTlFLDBGQUEwRjtBQUMxRixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFFekIsZ0dBQWdHO0FBQ2hHLE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0FBRXBILFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtJQUNqQyxJQUFJLFNBQW9CLENBQUM7SUFDekIsSUFBSSxJQUFxQixDQUFDO0lBQzFCLElBQUksU0FBYyxDQUFDO0lBRW5CLDBFQUEwRTtJQUMxRSxTQUFTLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFHLEdBQUcsVUFBVTtRQUN0QyxNQUFNLFlBQVksR0FBRztZQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ25ELGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUNqRSxDQUFDO1FBQ0YsT0FBTyxJQUFJLGVBQVMsQ0FBQyxTQUFTLEVBQUUsWUFBbUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxVQUFVLENBQUM7UUFDVCxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9B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QUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDckQsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSztZQUNwRCxNQUFNLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBLZXljaGFpbnMsIGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG4vKipcbiAqIFNsb3Qt4pGjIHJvb3Qga2V5cyBhcmUgZ2VuZXJhdGVkIGFzIFhMTSBrZXljaGFpbnMsIHNvIGBjcmVhdGUoKWAgeWllbGRzIGEgNTYtY2hhciBTdHJLZXkgcHViLlxuICogVGFrZW4gZnJvbSB0aGUgY3Jvc3MtcmVwbyBmaXh0dXJlIHBpbm5lZCBpbiBXQ04tMjQ4NS5cbiAqL1xuY29uc3QgU1RSS0VZX1BVQiA9ICdHQTVXVUo1NFoyM0tJTExDVU9VTkFLVFBCVlpXS01RVk80TzZFUTVHSExBRVJJTUxMSE5DU0tZSCc7XG5cbi8qKiBNYXJrcyB0aGUga2V5IGFzIGEgc2FmZSByb290OyBjb21iaW5lZCB3aXRoIHRoZSBwdWIncyBzaGFwZSB0aGlzIGlkZW50aWZpZXMgc2xvdCDikaMuICovXG5jb25zdCBTQUZFX0lEID0gJ3NhZmUtMSc7XG5cbi8qKiBBbiB4cHViLCBhcyB0aGUgc2VjcDI1NmsxTXVsdGlzaWcgKHNsb3Qg4pGgKSByb290IGNvaW4gZ2VuZXJhdGVzLiBBbHJlYWR5IGhhcyBhIGNoYWluIGNvZGUuICovXG5jb25zdCBYUFVCID1cbiAgJ3hwdWI2NjFNeU13QXFSYmNGdFhnUzVzWUpBQnFxRzlZTG1DNFExUmRhcDlnU0U4TnF0d3liR2hlUFkyZ1oyOUVTRmpxSm9DdTFSdXBqZThZdEdxc2VmRDI2NVRNZzd1c1VERmRwNlcxRUdNY2V0OCc7XG5cbmRlc2NyaWJlKCdLZXljaGFpbnMuY3JlYXRlQmFja3VwJywgZnVuY3Rpb24gKCkge1xuICBsZXQga2V5Y2hhaW5zOiBLZXljaGFpbnM7XG4gIGxldCBzZW5kOiBzaW5vbi5TaW5vblN0dWI7XG4gIGxldCBtb2NrQml0R286IGFueTtcblxuICAvKiogVGhlIGJvZHkgYWN0dWFsbHkgaGFuZGVkIHRvIGAuc2VuZCgpYCDigJQgaS5lLiB3aGF0IGdvZXMgb24gdGhlIHdpcmUuICovXG4gIGZ1bmN0aW9uIHNlbnRCb2R5KCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gc2VuZC5maXJzdENhbGwuYXJnc1swXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkS2V5Y2hhaW5zKHB1YiA9IFNUUktFWV9QVUIpOiBLZXljaGFpbnMge1xuICAgIGNvbnN0IG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nKSA9PiBwYXRoKSxcbiAgICAgIGdlbmVyYXRlS2V5UGFpcjogc2lub24uc3R1YigpLnJldHVybnMoeyBwdWIsIHBydjogJ1NPTUVfU0VFRCcgfSksXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEtleWNoYWlucyhtb2NrQml0R28sIG1vY2tCYXNlQ29pbiBhcyBhbnkpO1xuICB9XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2VuZCA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ2JhY2t1cC1rZXktaWQnIH0pIH0pO1xuICAgIG1vY2tCaXRHbyA9IHtcbiAgICAgIHBvc3Q6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgc2VuZCB9KSxcbiAgICAgIGVuY3J5cHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZW5jcnlwdGVkLXBydicpLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgIH07XG4gICAga2V5Y2hhaW5zID0gYnVpbGRLZXljaGFpbnMoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NhZmUgY2hpbGQga2V5IHJlZ2lzdHJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2VyaWFsaXplcyB0aGUgaGFyZGVuZWQgZGVyaXZhdGlvbiBwYXRoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmFkZCh7XG4gICAgICAgIHB1YjogWFBVQixcbiAgICAgICAgc291cmNlOiAndXNlcicsXG4gICAgICAgIGtleVR5cGU6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgIHBhcmVudDogJ3VzZXItcm9vdC1pZCcsXG4gICAgICAgIHNhZmVJZDogU0FGRV9JRCxcbiAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aDogXCJtLzcnXCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGVyaXZlZFBhdGggPSBzZW50Qm9keSgpLmRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGg7XG4gICAgICBpZiAodHlwZW9mIGRlcml2ZWRQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGRlcml2ZWRGcm9tUGFyZW50V2l0aFBhdGggdG8gYmUgc2VyaWFsaXplZCcpO1xuICAgICAgfVxuICAgICAgZGVyaXZlZFBhdGguc2hvdWxkLmVxdWFsKFwibS83J1wiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NhZmUgZWQyNTUxOU11bHRpc2lnIHJvb3QgKHNsb3Qg4pGjKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncG9zdHMgYSAxMDgtY2hhciBjb21wb3NpdGUgcHViIGJ1aWx0IGZyb20gdGhlIGdlbmVyYXRlZCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBwdWIgPSBzZW50Qm9keSgpLnB1YiBhcyBzdHJpbmc7XG4gICAgICBwdWIubGVuZ3RoLnNob3VsZC5lcXVhbCgxMDgpO1xuICAgICAgZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihwdWIpLnB1Yi5zaG91bGQuZXF1YWwoU1RSS0VZX1BVQik7XG4gICAgfSk7XG5cbiAgICBpdCgnbWludHMgYSBjaGFpbiBjb2RlIHRoYXQgcm91bmQtdHJpcHMgb3V0IG9mIHRoZSBwdWInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICAvLyBUaGUgY2hhaW4gY29kZSBoYXMgbm8gZmllbGQgb2YgaXRzIG93bjsgdGhpcyBkZWNvZGUgaXMgaG93IGNhbGxlcnMgKGUuZy4gdGhlIGtleWNhcmQnc1xuICAgICAgLy8gYm94IEIpIHJlY292ZXIgaXQuXG4gICAgICBjb25zdCB7IGNoYWluQ29kZSB9ID0gZGVjb2RlRGVyaXZhYmxlRWQyNTUxOVB1YihzZW50Qm9keSgpLnB1YiBhcyBzdHJpbmcpO1xuICAgICAgY2hhaW5Db2RlLnNob3VsZC5tYXRjaCgvXltBLVoyLTddezUyfSQvKTtcbiAgICB9KTtcblxuICAgIGl0KCdtaW50cyBhIGRpZmZlcmVudCBjaGFpbiBjb2RlIGZvciBlYWNoIGJhY2t1cCBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgY29uc3QgZmlyc3QgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHNlbmQuZmlyc3RDYWxsLmFyZ3NbMF0ucHViKS5jaGFpbkNvZGU7XG4gICAgICBjb25zdCBzZWNvbmQgPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHNlbmQuc2Vjb25kQ2FsbC5hcmdzWzBdLnB1YikuY2hhaW5Db2RlO1xuICAgICAgZmlyc3Quc2hvdWxkLm5vdC5lcXVhbChzZWNvbmQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NlbmRzIG5vIGNoYWluQ29kZSBmaWVsZCBvZiBpdHMgb3duJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgc2VudEJvZHkoKS5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2NoYWluQ29kZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N0aWxsIGVuY3J5cHRzIGFuZCByZXR1cm5zIHRoZSB1bi1jb21wb3NlZCBwcnYnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBzZW50Qm9keSgpLmVuY3J5cHRlZFBydiEuc2hvdWxkLmVxdWFsKCdlbmNyeXB0ZWQtcHJ2Jyk7XG4gICAgICByZXN1bHQucHJ2IS5zaG91bGQuZXF1YWwoJ1NPTUVfU0VFRCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGVhdmVzIGV2ZXJ5IG90aGVyIGtleSB1bnRvdWNoZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2RvZXMgbm90IGNvbXBvc2Ugd2l0aG91dCBhIHNhZmVJZCwgZXZlbiBmb3IgYW4gZWQyNTUxOSBjb2luJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycgfSk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBzZW50Qm9keSgpO1xuICAgICAgYm9keS5wdWIhLnNob3VsZC5lcXVhbChTVFJLRVlfUFVCKTtcbiAgICAgIChib2R5LnB1YiBhcyBzdHJpbmcpLmxlbmd0aC5zaG91bGQuZXF1YWwoNTYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IGNvbXBvc2UgYSBzYWZlIHNlY3AyNTZrMU11bHRpc2lnIHJvb3QgKHNsb3Qg4pGgKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEFuIHhwdWIgYWxyZWFkeSBjYXJyaWVzIGl0cyBvd24gY2hhaW4gY29kZTsgY29tcG9zaW5nIG9udG8gaXQgd291bGQgY29ycnVwdCB0aGUgcHViLlxuICAgICAgY29uc3QgYnRjS2V5Y2hhaW5zID0gYnVpbGRLZXljaGFpbnMoWFBVQik7XG5cbiAgICAgIGF3YWl0IGJ0Y0tleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG5cbiAgICAgIHNlbnRCb2R5KCkucHViIS5zaG91bGQuZXF1YWwoWFBVQik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VuZHMgYSBib2R5IHdpdGggbm8gY2hhaW5Db2RlIGFuZCBzb3VyY2UgYmFja3VwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycgfSk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBzZW50Qm9keSgpO1xuICAgICAgYm9keS5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ2NoYWluQ29kZScpO1xuICAgICAgYm9keS5zb3VyY2UhLnNob3VsZC5lcXVhbCgnYmFja3VwJyk7XG4gICAgICBib2R5LmVuY3J5cHRlZFBydiEuc2hvdWxkLmVxdWFsKCdlbmNyeXB0ZWQtcHJ2Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGVhdmVzIGEgVFNTIGJhY2t1cCBrZXkgdW50b3VjaGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTm8gbG9jYWwga2V5cGFpciBpcyBnZW5lcmF0ZWQgb24gdGhlIFRTUyBwYXRoLCBzbyB0aGVyZSBpcyBubyBwdWIgdG8gaW5zcGVjdCBvciBjb21wb3NlLlxuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBydjogJ3Rzcy1wcnYnLCBjb21tb25LZXljaGFpbjogJ2NvbW1vbi1rZXljaGFpbicsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgY29uc3QgYm9keSA9IHNlbnRCb2R5KCk7XG4gICAgICBib2R5LmNvbW1vbktleWNoYWluIS5zaG91bGQuZXF1YWwoJ2NvbW1vbi1rZXljaGFpbicpO1xuICAgICAgKGJvZHkucHViID09PSB1bmRlZmluZWQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbGVhdmVzIGEgS1JTLXByb3ZpZGVyIGJhY2t1cCBrZXkgdW50b3VjaGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQga2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHByb3ZpZGVyOiAna3JzLXByb3ZpZGVyJywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBib2R5ID0gc2VudEJvZHkoKTtcbiAgICAgIChib2R5LnB1YiA9PT0gdW5kZWZpbmVkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgYm9keS5wcm92aWRlciEuc2hvdWxkLmVxdWFsKCdrcnMtcHJvdmlkZXInKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2tleWNoYWluL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUMvQixrQkFBZ0I7QUFDaEIseUNBQXVFO0FBR3ZFOzs7R0FHRztBQUNILE1BQU0sVUFBVSxHQUFHLDBEQUEwRCxDQUFDO0FBRTlFLDBGQUEwRjtBQUMxRixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUM7QUFFekIsZ0dBQWdHO0FBQ2hHLE1BQU0sSUFBSSxHQUNSLGlIQUFpSCxDQUFDO0FBRXBILFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtJQUNqQyxJQUFJLFNBQW9CLENBQUM7SUFDekIsSUFBSSxJQUFxQixDQUFDO0lBQzFCLElBQUksU0FBYyxDQUFDO0lBRW5CLDBFQUEwRTtJQUMxRSxTQUFTLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFHLEdBQUcsVUFBVTtRQUN0QyxNQUFNLFlBQVksR0FBRztZQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ25ELGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUNqRSxDQUFDO1FBQ0YsT0FBTyxJQUFJLGVBQVMsQ0FBQyxTQUFTLEVBQUUsWUFBbUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxVQUFVLENBQUM7UUFDVCxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9B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QUFTLENBQUMsNEJBQTRCLENBQUM7Z0JBQ25FLFFBQVEsRUFBRTtvQkFDUixFQUFFLEVBQUUsUUFBUTtvQkFDWixZQUFZLEVBQUUsc0JBQXNCO29CQUNwQyxJQUFJLEVBQUUsYUFBYTtpQkFDcEI7Z0JBQ0QsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixpQkFBaUIsRUFBRSxDQUFDO2dCQUNwQixpQkFBaUIsRUFBRSxPQUFPO2FBQzNCLENBQUMsQ0FBQztZQUVILGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pFLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsZUFBZSxDQUFDLFlBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zLCBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB0eXBlIHsgSUVuY3J5cHRpb25TZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2FwaSc7XG5cbi8qKlxuICogU2xvdC3ikaMgcm9vdCBrZXlzIGFyZSBnZW5lcmF0ZWQgYXMgWExNIGtleWNoYWlucywgc28gYGNyZWF0ZSgpYCB5aWVsZHMgYSA1Ni1jaGFyIFN0cktleSBwdWIuXG4gKiBUYWtlbiBmcm9tIHRoZSBjcm9zcy1yZXBvIGZpeHR1cmUgcGlubmVkIGluIFdDTi0yNDg1LlxuICovXG5jb25zdCBTVFJLRVlfUFVCID0gJ0dBNVdVSjU0WjIzS0lMTENVT1VOQUtUUEJWWldLTVFWTzRPNkVRNUdITEFFUklNTExITkNTS1lIJztcblxuLyoqIE1hcmtzIHRoZSBrZXkgYXMgYSBzYWZlIHJvb3Q7IGNvbWJpbmVkIHdpdGggdGhlIHB1YidzIHNoYXBlIHRoaXMgaWRlbnRpZmllcyBzbG90IOKRoy4gKi9cbmNvbnN0IFNBRkVfSUQgPSAnc2FmZS0xJztcblxuLyoqIEFuIHhwdWIsIGFzIHRoZSBzZWNwMjU2azFNdWx0aXNpZyAoc2xvdCDikaApIHJvb3QgY29pbiBnZW5lcmF0ZXMuIEFscmVhZHkgaGFzIGEgY2hhaW4gY29kZS4gKi9cbmNvbnN0IFhQVUIgPVxuICAneHB1YjY2MU15TXdBcVJiY0Z0WGdTNXNZSkFCcXFHOVlMbUM0UTFSZGFwOWdTRThOcXR3eWJHaGVQWTJnWjI5RVNGanFKb0N1MVJ1cGplOFl0R3FzZWZEMjY1VE1nN3VzVURGZHA2VzFFR01jZXQ4JztcblxuZGVzY3JpYmUoJ0tleWNoYWlucy5jcmVhdGVCYWNrdXAnLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBrZXljaGFpbnM6IEtleWNoYWlucztcbiAgbGV0IHNlbmQ6IHNpbm9uLlNpbm9uU3R1YjtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuXG4gIC8qKiBUaGUgYm9keSBhY3R1YWxseSBoYW5kZWQgdG8gYC5zZW5kKClgIOKAlCBpLmUuIHdoYXQgZ29lcyBvbiB0aGUgd2lyZS4gKi9cbiAgZnVuY3Rpb24gc2VudEJvZHkoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiBzZW5kLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRLZXljaGFpbnMocHViID0gU1RSS0VZX1BVQik6IEtleWNoYWlucyB7XG4gICAgY29uc3QgbW9ja0Jhc2VDb2luID0ge1xuICAgICAgdXJsOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXRoOiBzdHJpbmcpID0+IHBhdGgpLFxuICAgICAgZ2VuZXJhdGVLZXlQYWlyOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHB1YiwgcHJ2OiAnU09NRV9TRUVEJyB9KSxcbiAgICB9O1xuICAgIHJldHVybiBuZXcgS2V5Y2hhaW5zKG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luIGFzIGFueSk7XG4gIH1cblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzZW5kID0gc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAnYmFja3VwLWtleS1pZCcgfSkgfSk7XG4gICAgbW9ja0JpdEdvID0ge1xuICAgICAgcG9zdDogc2lub24uc3R1YigpLnJldHVybnMoeyBzZW5kIH0pLFxuICAgICAgZW5jcnlwdDogc2lub24uc3R1YigpLnJlc29sdmVzKCdlbmNyeXB0ZWQtcHJ2JyksXG4gICAgICBzZXRSZXF1ZXN0VHJhY2VyOiBzaW5vbi5zdHViKCksXG4gICAgfTtcbiAgICBrZXljaGFpbnMgPSBidWlsZEtleWNoYWlucygpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2FmZSBjaGlsZCBrZXkgcmVnaXN0cmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzZXJpYWxpemVzIHRoZSBoYXJkZW5lZCBkZXJpdmF0aW9uIHBhdGgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuYWRkKHtcbiAgICAgICAgcHViOiBYUFVCLFxuICAgICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgICAga2V5VHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgcGFyZW50OiAndXNlci1yb290LWlkJyxcbiAgICAgICAgc2FmZUlkOiBTQUZFX0lELFxuICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhQYXRoOiBcIm0vNydcIixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkZXJpdmVkUGF0aCA9IHNlbnRCb2R5KCkuZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aDtcbiAgICAgIGlmICh0eXBlb2YgZGVyaXZlZFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgZGVyaXZlZEZyb21QYXJlbnRXaXRoUGF0aCB0byBiZSBzZXJpYWxpemVkJyk7XG4gICAgICB9XG4gICAgICBkZXJpdmVkUGF0aC5zaG91bGQuZXF1YWwoXCJtLzcnXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2FmZSBlZDI1NTE5TXVsdGlzaWcgcm9vdCAoc2xvdCDikaMpJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdwb3N0cyBhIDEwOC1jaGFyIGNvbXBvc2l0ZSBwdWIgYnVpbHQgZnJvbSB0aGUgZ2VuZXJhdGVkIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG5cbiAgICAgIGNvbnN0IHB1YiA9IHNlbnRCb2R5KCkucHViIGFzIHN0cmluZztcbiAgICAgIHB1Yi5sZW5ndGguc2hvdWxkLmVxdWFsKDEwOCk7XG4gICAgICBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHB1YikucHViLnNob3VsZC5lcXVhbChTVFJLRVlfUFVCKTtcbiAgICB9KTtcblxuICAgIGl0KCdtaW50cyBhIGNoYWluIGNvZGUgdGhhdCByb3VuZC10cmlwcyBvdXQgb2YgdGhlIHB1YicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG5cbiAgICAgIC8vIFRoZSBjaGFpbiBjb2RlIGhhcyBubyBmaWVsZCBvZiBpdHMgb3duOyB0aGlzIGRlY29kZSBpcyBob3cgY2FsbGVycyAoZS5nLiB0aGUga2V5Y2FyZCdzXG4gICAgICAvLyBib3ggQikgcmVjb3ZlciBpdC5cbiAgICAgIGNvbnN0IHsgY2hhaW5Db2RlIH0gPSBkZWNvZGVEZXJpdmFibGVFZDI1NTE5UHViKHNlbnRCb2R5KCkucHViIGFzIHN0cmluZyk7XG4gICAgICBjaGFpbkNvZGUuc2hvdWxkLm1hdGNoKC9eW0EtWjItN117NTJ9JC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ21pbnRzIGEgZGlmZmVyZW50IGNoYWluIGNvZGUgZm9yIGVhY2ggYmFja3VwIGtleScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBmaXJzdCA9IGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIoc2VuZC5maXJzdENhbGwuYXJnc1swXS5wdWIpLmNoYWluQ29kZTtcbiAgICAgIGNvbnN0IHNlY29uZCA9IGRlY29kZURlcml2YWJsZUVkMjU1MTlQdWIoc2VuZC5zZWNvbmRDYWxsLmFyZ3NbMF0ucHViKS5jaGFpbkNvZGU7XG4gICAgICBmaXJzdC5zaG91bGQubm90LmVxdWFsKHNlY29uZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VuZHMgbm8gY2hhaW5Db2RlIGZpZWxkIG9mIGl0cyBvd24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3Jywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBzZW50Qm9keSgpLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnY2hhaW5Db2RlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RpbGwgZW5jcnlwdHMgYW5kIHJldHVybnMgdGhlIHVuLWNvbXBvc2VkIHBydicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGtleWNoYWlucy5jcmVhdGVCYWNrdXAoeyBwYXNzcGhyYXNlOiAncHcnLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG5cbiAgICAgIHNlbnRCb2R5KCkuZW5jcnlwdGVkUHJ2IS5zaG91bGQuZXF1YWwoJ2VuY3J5cHRlZC1wcnYnKTtcbiAgICAgIHJlc3VsdC5wcnYhLnNob3VsZC5lcXVhbCgnU09NRV9TRUVEJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsZWF2ZXMgZXZlcnkgb3RoZXIga2V5IHVudG91Y2hlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnZG9lcyBub3QgY29tcG9zZSB3aXRob3V0IGEgc2FmZUlkLCBldmVuIGZvciBhbiBlZDI1NTE5IGNvaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3JyB9KTtcblxuICAgICAgY29uc3QgYm9keSA9IHNlbnRCb2R5KCk7XG4gICAgICBib2R5LnB1YiEuc2hvdWxkLmVxdWFsKFNUUktFWV9QVUIpO1xuICAgICAgKGJvZHkucHViIGFzIHN0cmluZykubGVuZ3RoLnNob3VsZC5lcXVhbCg1Nik7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgY29tcG9zZSBhIHNhZmUgc2VjcDI1NmsxTXVsdGlzaWcgcm9vdCAoc2xvdCDikaApJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQW4geHB1YiBhbHJlYWR5IGNhcnJpZXMgaXRzIG93biBjaGFpbiBjb2RlOyBjb21wb3Npbmcgb250byBpdCB3b3VsZCBjb3JydXB0IHRoZSBwdWIuXG4gICAgICBjb25zdCBidGNLZXljaGFpbnMgPSBidWlsZEtleWNoYWlucyhYUFVCKTtcblxuICAgICAgYXdhaXQgYnRjS2V5Y2hhaW5zLmNyZWF0ZUJhY2t1cCh7IHBhc3NwaHJhc2U6ICdwdycsIHNhZmVJZDogU0FGRV9JRCB9KTtcblxuICAgICAgc2VudEJvZHkoKS5wdWIhLnNob3VsZC5lcXVhbChYUFVCKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZW5kcyBhIGJvZHkgd2l0aCBubyBjaGFpbkNvZGUgYW5kIHNvdXJjZSBiYWNrdXAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcGFzc3BocmFzZTogJ3B3JyB9KTtcblxuICAgICAgY29uc3QgYm9keSA9IHNlbnRCb2R5KCk7XG4gICAgICBib2R5LnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnY2hhaW5Db2RlJyk7XG4gICAgICBib2R5LnNvdXJjZSEuc2hvdWxkLmVxdWFsKCdiYWNrdXAnKTtcbiAgICAgIGJvZHkuZW5jcnlwdGVkUHJ2IS5zaG91bGQuZXF1YWwoJ2VuY3J5cHRlZC1wcnYnKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgYSBUU1MgYmFja3VwIGtleSB1bnRvdWNoZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBObyBsb2NhbCBrZXlwYWlyIGlzIGdlbmVyYXRlZCBvbiB0aGUgVFNTIHBhdGgsIHNvIHRoZXJlIGlzIG5vIHB1YiB0byBpbnNwZWN0IG9yIGNvbXBvc2UuXG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcHJ2OiAndHNzLXBydicsIGNvbW1vbktleWNoYWluOiAnY29tbW9uLWtleWNoYWluJywgc2FmZUlkOiBTQUZFX0lEIH0pO1xuXG4gICAgICBjb25zdCBib2R5ID0gc2VudEJvZHkoKTtcbiAgICAgIGJvZHkuY29tbW9uS2V5Y2hhaW4hLnNob3VsZC5lcXVhbCgnY29tbW9uLWtleWNoYWluJyk7XG4gICAgICAoYm9keS5wdWIgPT09IHVuZGVmaW5lZCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZWF2ZXMgYSBLUlMtcHJvdmlkZXIgYmFja3VwIGtleSB1bnRvdWNoZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBrZXljaGFpbnMuY3JlYXRlQmFja3VwKHsgcHJvdmlkZXI6ICdrcnMtcHJvdmlkZXInLCBzYWZlSWQ6IFNBRkVfSUQgfSk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBzZW50Qm9keSgpO1xuICAgICAgKGJvZHkucHViID09PSB1bmRlZmluZWQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBib2R5LnByb3ZpZGVyIS5zaG91bGQuZXF1YWwoJ2tycy1wcm92aWRlcicpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ3Bhc3N3b3JkIHJvdGF0aW9uIGVuY3J5cHRpb24gc2Vzc2lvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgndXNlcyB0aGUgc3VwcGxpZWQgc2Vzc2lvbiBmb3IgdGhlIG5ldyBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28uZGVjcnlwdCA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcygnZGVjcnlwdGVkLXBydicpO1xuICAgICAgY29uc3Qgc2Vzc2lvbkVuY3J5cHQgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ3Nlc3Npb24tZW5jcnlwdGVkJyk7XG4gICAgICBjb25zdCBzZXNzaW9uOiBJRW5jcnlwdGlvblNlc3Npb24gPSB7XG4gICAgICAgIGVuY3J5cHQ6IHNlc3Npb25FbmNyeXB0LFxuICAgICAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ2RlY3J5cHRlZC1wcnYnKSxcbiAgICAgICAgZGVzdHJveTogc2lub24uc3R1YigpLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgdXBkYXRlZEtleWNoYWluID0gYXdhaXQga2V5Y2hhaW5zLnVwZGF0ZVNpbmdsZUtleWNoYWluUGFzc3dvcmQoe1xuICAgICAgICBrZXljaGFpbjoge1xuICAgICAgICAgIGlkOiAna2V5LWlkJyxcbiAgICAgICAgICBlbmNyeXB0ZWRQcnY6ICdsZWdhY3ktZW5jcnlwdGVkLXBydicsXG4gICAgICAgICAgdHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgb2xkUGFzc3dvcmQ6ICdvbGQtcGFzc3dvcmQnLFxuICAgICAgICBuZXdQYXNzd29yZDogJ25ldy1wYXNzd29yZCcsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAyLFxuICAgICAgICBlbmNyeXB0aW9uU2Vzc2lvbjogc2Vzc2lvbixcbiAgICAgIH0pO1xuXG4gICAgICBzZXNzaW9uRW5jcnlwdC5jYWxsZWRPbmNlV2l0aEV4YWN0bHkoJ2RlY3J5cHRlZC1wcnYnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICBtb2NrQml0R28uZW5jcnlwdC5jYWxsZWQuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICAgIHVwZGF0ZWRLZXljaGFpbi5lbmNyeXB0ZWRQcnYhLnNob3VsZC5lcXVhbCgnc2Vzc2lvbi1lbmNyeXB0ZWQnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=eddsaVrfMPCv2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eddsaVrfMPCv2.d.ts","sourceRoot":"","sources":["../../../../../../../test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.ts"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const cbor_x_1 = require("cbor-x");
41
+ const t = __importStar(require("io-ts"));
42
+ const src_1 = require("../../../../../../src");
43
+ const codecs_1 = require("../../../../../../src/bitgo/utils/codecs");
44
+ const eddsaVrfMPCv2_1 = require("../../../../../../src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2");
45
+ const typesMPCv2_1 = require("../../../../../../src/bitgo/utils/tss/ecdsa/typesMPCv2");
46
+ const Uint8ArrayCodec = new t.Type('Uint8Array', (value) => value instanceof Uint8Array, (value, context) => (value instanceof Uint8Array ? t.success(value) : t.failure(value, context)), t.identity);
47
+ const VrfEnvelope = t.type({
48
+ version: t.literal(1),
49
+ prvKeyShare: Uint8ArrayCodec,
50
+ vrf: Uint8ArrayCodec,
51
+ });
52
+ function decodeVrfEnvelope(encoded) {
53
+ return (0, codecs_1.decodeWithCodec)(VrfEnvelope, (0, cbor_x_1.decode)(encoded), 'VRF key envelope');
54
+ }
55
+ describe('EdDSA MPCv2 VRF root material', function () {
56
+ it('encodes signing and VRF shares in both full and reduced envelopes', function () {
57
+ const privateMaterial = Buffer.from('signing-share');
58
+ const reducedPrivateMaterial = Buffer.from('reduced-signing-share');
59
+ const vrfKeyShare = Buffer.from('vrf-share');
60
+ const { envelope, reducedEnvelope } = (0, eddsaVrfMPCv2_1.buildVrfKeyEnvelopes)(privateMaterial, reducedPrivateMaterial, vrfKeyShare);
61
+ const decodedEnvelope = decodeVrfEnvelope(envelope);
62
+ const decodedReducedEnvelope = decodeVrfEnvelope(reducedEnvelope);
63
+ assert_1.default.deepStrictEqual(Buffer.from(decodedEnvelope.prvKeyShare), privateMaterial);
64
+ assert_1.default.deepStrictEqual(Buffer.from(decodedEnvelope.vrf), vrfKeyShare);
65
+ assert_1.default.deepStrictEqual(Buffer.from(decodedReducedEnvelope.prvKeyShare), reducedPrivateMaterial);
66
+ assert_1.default.deepStrictEqual(Buffer.from(decodedReducedEnvelope.vrf), vrfKeyShare);
67
+ });
68
+ it('keeps ordinary MPCv2 participant material as bare base64', async function () {
69
+ const encryptedInputs = [];
70
+ const addedKeychains = [];
71
+ const bitgo = {
72
+ encrypt: async (params) => {
73
+ encryptedInputs.push(params.input);
74
+ return `encrypted:${params.input}`;
75
+ },
76
+ };
77
+ const keychains = {
78
+ add: async (params) => {
79
+ addedKeychains.push(params);
80
+ return { id: 'user-key' };
81
+ },
82
+ };
83
+ const baseCoin = {
84
+ keychains: () => keychains,
85
+ };
86
+ const utils = new src_1.EddsaMPCv2Utils(bitgo, baseCoin);
87
+ const privateMaterial = Buffer.from('signing-share');
88
+ const reducedPrivateMaterial = Buffer.from('reduced-signing-share');
89
+ await utils.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, 'common-keychain', privateMaterial, reducedPrivateMaterial, 'passphrase');
90
+ assert_1.default.deepStrictEqual(encryptedInputs, [
91
+ privateMaterial.toString('base64'),
92
+ reducedPrivateMaterial.toString('base64'),
93
+ ]);
94
+ assert_1.default.strictEqual(addedKeychains[0].encryptedPrv, `encrypted:${privateMaterial.toString('base64')}`);
95
+ assert_1.default.strictEqual(addedKeychains[0].safeId, undefined);
96
+ });
97
+ it('encrypts the VRF envelope and tags the keychain with safeId', async function () {
98
+ const encryptedInputs = [];
99
+ const addedKeychains = [];
100
+ const bitgo = {
101
+ encrypt: async (params) => {
102
+ encryptedInputs.push(params.input);
103
+ return `encrypted:${params.input}`;
104
+ },
105
+ };
106
+ const keychains = {
107
+ add: async (params) => {
108
+ addedKeychains.push(params);
109
+ return { id: 'user-key' };
110
+ },
111
+ };
112
+ const baseCoin = {
113
+ keychains: () => keychains,
114
+ };
115
+ const utils = new src_1.EddsaMPCv2Utils(bitgo, baseCoin);
116
+ const { envelope, reducedEnvelope } = (0, eddsaVrfMPCv2_1.buildVrfKeyEnvelopes)(Buffer.from('signing-share'), Buffer.from('reduced-signing-share'), Buffer.from('vrf-share'));
117
+ await utils.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, 'common-keychain', envelope, reducedEnvelope, 'passphrase', undefined, undefined, undefined, undefined, 'safe-id');
118
+ assert_1.default.deepStrictEqual(encryptedInputs[0], envelope.toString('base64'));
119
+ assert_1.default.strictEqual(addedKeychains[0].safeId, 'safe-id');
120
+ const decoded = decodeVrfEnvelope(Buffer.from(encryptedInputs[0], 'base64'));
121
+ assert_1.default.deepStrictEqual(Buffer.from(decoded.vrf), Buffer.from('vrf-share'));
122
+ });
123
+ it('tags the BitGo keychain with safeId and does not encrypt', async function () {
124
+ const encryptedInputs = [];
125
+ const addedKeychains = [];
126
+ const bitgo = {
127
+ encrypt: async (params) => {
128
+ encryptedInputs.push(params.input);
129
+ return `encrypted:${params.input}`;
130
+ },
131
+ };
132
+ const keychains = {
133
+ add: async (params) => {
134
+ addedKeychains.push(params);
135
+ return { id: 'bitgo-key' };
136
+ },
137
+ };
138
+ const baseCoin = {
139
+ keychains: () => keychains,
140
+ };
141
+ const utils = new src_1.EddsaMPCv2Utils(bitgo, baseCoin);
142
+ await utils.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, 'common-keychain', undefined, undefined, undefined, undefined, undefined, undefined, undefined, 'safe-id');
143
+ assert_1.default.deepStrictEqual(encryptedInputs, []);
144
+ assert_1.default.strictEqual(addedKeychains[0].source, 'bitgo');
145
+ assert_1.default.strictEqual(addedKeychains[0].safeId, 'safe-id');
146
+ assert_1.default.strictEqual(addedKeychains[0].encryptedPrv, undefined);
147
+ });
148
+ it('round-trips opaque VRF blobs and keeps only the recipient p2p messages', function () {
149
+ const blob = (0, eddsaVrfMPCv2_1.serializeVrfMessages)({
150
+ broadcastMessages: [{ from: typesMPCv2_1.MPCv2PartiesEnum.BITGO, payload: new Uint8Array([1, 2, 3]) }],
151
+ p2pMessages: [
152
+ { from: typesMPCv2_1.MPCv2PartiesEnum.BITGO, to: typesMPCv2_1.MPCv2PartiesEnum.USER, payload: new Uint8Array([4]) },
153
+ { from: typesMPCv2_1.MPCv2PartiesEnum.BITGO, to: typesMPCv2_1.MPCv2PartiesEnum.BACKUP, payload: new Uint8Array([5]) },
154
+ ],
155
+ });
156
+ const forUser = (0, eddsaVrfMPCv2_1.deserializeVrfMessages)(blob, typesMPCv2_1.MPCv2PartiesEnum.USER);
157
+ assert_1.default.deepStrictEqual(Buffer.from(forUser.broadcastMessages[0].payload), Buffer.from([1, 2, 3]));
158
+ assert_1.default.strictEqual(forUser.p2pMessages.length, 1);
159
+ assert_1.default.strictEqual(forUser.p2pMessages[0].to, typesMPCv2_1.MPCv2PartiesEnum.USER);
160
+ assert_1.default.deepStrictEqual(Buffer.from(forUser.p2pMessages[0].payload), Buffer.from([4]));
161
+ const forBackup = (0, eddsaVrfMPCv2_1.deserializeVrfMessages)(blob, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
162
+ assert_1.default.strictEqual(forBackup.p2pMessages.length, 1);
163
+ assert_1.default.strictEqual(forBackup.p2pMessages[0].to, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
164
+ });
165
+ it('rejects malformed VRF DKG message blobs', function () {
166
+ assert_1.default.throws(() => (0, eddsaVrfMPCv2_1.deserializeVrfMessages)('%%%', typesMPCv2_1.MPCv2PartiesEnum.USER), /Invalid VRF DKG message blob/);
167
+ const notAnArray = Buffer.from(JSON.stringify({ from: 0 })).toString('base64');
168
+ assert_1.default.throws(() => (0, eddsaVrfMPCv2_1.deserializeVrfMessages)(notAnArray, typesMPCv2_1.MPCv2PartiesEnum.USER), /VRF DKG message blob/);
169
+ const badParty = Buffer.from(JSON.stringify([{ from: 9, payload: Buffer.from([1]).toString('base64') }])).toString('base64');
170
+ assert_1.default.throws(() => (0, eddsaVrfMPCv2_1.deserializeVrfMessages)(badParty, typesMPCv2_1.MPCv2PartiesEnum.USER), /VRF DKG message blob/);
171
+ });
172
+ });
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FWcmZNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FWcmZNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixtQ0FBZ0M7QUFDaEMseUNBQTJCO0FBRTNCLCtDQUF3RjtBQUN4RixxRUFBMkU7QUFDM0UsNkZBSW1FO0FBQ25FLHVGQUEwRjtBQUUxRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ2hDLFlBQVksRUFDWixDQUFDLEtBQUssRUFBdUIsRUFBRSxDQUFDLEtBQUssWUFBWSxVQUFVLEVBQzNELENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUNoRyxDQUFDLENBQUMsUUFBUSxDQUNYLENBQUM7QUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pCLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNyQixXQUFXLEVBQUUsZUFBZTtJQUM1QixHQUFHLEVBQUUsZUFBZTtDQUNyQixDQUFDLENBQUM7QUFRSCxTQUFTLGlCQUFpQixDQUFDLE9BQWU7SUFDeEMsT0FBTyxJQUFBLHdCQUFlLEVBQUMsV0FBVyxFQUFFLElBQUEsZUFBTSxFQUFDLE9BQU8sQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVELFFBQVEsQ0FBQywrQkFBK0IsRUFBRTtJQUN4QyxFQUFFLENBQUMsbUVBQW1FLEVBQUU7UUFDdEUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNwRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLE1BQU0sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBQSxvQ0FBb0IsRUFBQyxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDakgsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsTUFBTSxzQkFBc0IsR0FBRyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVsRSxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNsRixnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN0RSxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDaEcsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMvRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRSxLQUFLO1FBQ2xFLE1BQU0sZUFBZSxHQUFhLEVBQUUsQ0FBQztRQUNyQyxNQUFNLGNBQWMsR0FBMEIsRUFBRSxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHO1lBQ1osT0FBTyxFQUFFLEtBQUssRUFBRSxNQUF5QixFQUFtQixFQUFFO2dCQUM1RCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkMsT0FBTyxhQUFhLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1NBQ3NCLENBQUM7UUFDMUIsTUFBTSxTQUFTLEdBQUc7WUFDaEIsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUEyQixFQUFxQixFQUFFO2dCQUM1RCxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBeUIsQ0FBQztZQUNuRCxDQUFDO1NBQ0YsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHO1lBQ2YsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVM7U0FDSCxDQUFDO1FBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUkscUJBQWUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUVwRSxNQUFNLEtBQUssQ0FBQyx5QkFBeUIsQ0FDbkMsNkJBQWdCLENBQUMsSUFBSSxFQUNyQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixZQUFZLENBQ2IsQ0FBQztRQUVGLGdCQUFNLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRTtZQUN0QyxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQzFDLENBQUMsQ0FBQztRQUNILGdCQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEtBQUs7UUFDckUsTUFBTSxlQUFlLEdBQWEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sY0FBYyxHQUEwQixFQUFFLENBQUM7UUFDakQsTUFBTSxLQUFLLEdBQUc7WUFDWixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQXlCLEVBQW1CLEVBQUU7Z0JBQzVELGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQyxPQUFPLGFBQWEsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3JDLENBQUM7U0FDc0IsQ0FBQztRQUMxQixNQUFNLFNBQVMsR0FBRztZQUNoQixHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQTJCLEVBQXFCLEVBQUU7Z0JBQzVELGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLE9BQU8sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUF5QixDQUFDO1lBQ25ELENBQUM7U0FDRixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUc7WUFDZixTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUztTQUNILENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxxQkFBZSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNuRCxNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUEsb0NBQW9CLEVBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDekIsQ0FBQztRQUVGLE1BQU0sS0FBSyxDQUFDLHlCQUF5QixDQUNuQyw2QkFBZ0IsQ0FBQyxJQUFJLEVBQ3JCLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsZUFBZSxFQUNmLFlBQVksRUFDWixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxDQUNWLENBQUM7UUFFRixnQkFBTSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLGdCQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM3RSxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMERBQTBELEVBQUUsS0FBSztRQUNsRSxNQUFNLGVBQWUsR0FBYSxFQUFFLENBQUM7UUFDckMsTUFBTSxjQUFjLEdBQTBCLEVBQUUsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRztZQUNaLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBeUIsRUFBbUIsRUFBRTtnQkFDNUQsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sYUFBYSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckMsQ0FBQztTQUNzQixDQUFDO1FBQzFCLE1BQU0sU0FBUyxHQUFHO1lBQ2hCLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBMkIsRUFBcUIsRUFBRTtnQkFDNUQsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQXlCLENBQUM7WUFDcEQsQ0FBQztTQUNGLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRztZQUNmLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTO1NBQ0gsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxJQUFJLHFCQUFlLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sS0FBSyxDQUFDLHlCQUF5QixDQUNuQyw2QkFBZ0IsQ0FBQyxLQUFLLEVBQ3RCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxDQUNWLENBQUM7UUFFRixnQkFBTSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELGdCQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0VBQXdFLEVBQUU7UUFDM0UsTUFBTSxJQUFJLEdBQUcsSUFBQSxvQ0FBb0IsRUFBQztZQUNoQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLDZCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6RixXQUFXLEVBQUU7Z0JBQ1gsRUFBRSxJQUFJLEVBQUUsNkJBQWdCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSw2QkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekYsRUFBRSxJQUFJLEVBQUUsNkJBQWdCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSw2QkFBZ0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTthQUM1RjtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sT0FBTyxHQUFHLElBQUEsc0NBQXNCLEVBQUMsSUFBSSxFQUFFLDZCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLGdCQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSw2QkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RixNQUFNLFNBQVMsR0FBRyxJQUFBLHNDQUFzQixFQUFDLElBQUksRUFBRSw2QkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4RSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRCxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSw2QkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtRQUM1QyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFBLHNDQUFzQixFQUFDLEtBQUssRUFBRSw2QkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO1FBQzFHLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9FLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsc0NBQXNCLEVBQUMsVUFBVSxFQUFFLDZCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDdkcsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQ2hILFFBQVEsQ0FDVCxDQUFDO1FBQ0YsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxzQ0FBc0IsRUFBQyxRQUFRLEVBQUUsNkJBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN2RyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnY2Jvci14JztcbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuXG5pbXBvcnQgeyBFZGRzYU1QQ3YyVXRpbHMsIEJpdEdvQmFzZSwgSUJhc2VDb2luLCBLZXljaGFpbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7XG4gIGJ1aWxkVnJmS2V5RW52ZWxvcGVzLFxuICBkZXNlcmlhbGl6ZVZyZk1lc3NhZ2VzLFxuICBzZXJpYWxpemVWcmZNZXNzYWdlcyxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9lZGRzYS9lZGRzYVZyZk1QQ3YyJztcbmltcG9ydCB7IE1QQ3YyUGFydGllc0VudW0gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYml0Z28vdXRpbHMvdHNzL2VjZHNhL3R5cGVzTVBDdjInO1xuXG5jb25zdCBVaW50OEFycmF5Q29kZWMgPSBuZXcgdC5UeXBlPFVpbnQ4QXJyYXksIFVpbnQ4QXJyYXksIHVua25vd24+KFxuICAnVWludDhBcnJheScsXG4gICh2YWx1ZSk6IHZhbHVlIGlzIFVpbnQ4QXJyYXkgPT4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAodmFsdWUsIGNvbnRleHQpID0+ICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyB0LnN1Y2Nlc3ModmFsdWUpIDogdC5mYWlsdXJlKHZhbHVlLCBjb250ZXh0KSksXG4gIHQuaWRlbnRpdHlcbik7XG5cbmNvbnN0IFZyZkVudmVsb3BlID0gdC50eXBlKHtcbiAgdmVyc2lvbjogdC5saXRlcmFsKDEpLFxuICBwcnZLZXlTaGFyZTogVWludDhBcnJheUNvZGVjLFxuICB2cmY6IFVpbnQ4QXJyYXlDb2RlYyxcbn0pO1xuXG50eXBlIEFkZGVkS2V5Y2hhaW5QYXJhbXMgPSB7XG4gIHNvdXJjZT86IHN0cmluZztcbiAgZW5jcnlwdGVkUHJ2Pzogc3RyaW5nO1xuICBzYWZlSWQ/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVWcmZFbnZlbG9wZShlbmNvZGVkOiBCdWZmZXIpOiB0LlR5cGVPZjx0eXBlb2YgVnJmRW52ZWxvcGU+IHtcbiAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhWcmZFbnZlbG9wZSwgZGVjb2RlKGVuY29kZWQpLCAnVlJGIGtleSBlbnZlbG9wZScpO1xufVxuXG5kZXNjcmliZSgnRWREU0EgTVBDdjIgVlJGIHJvb3QgbWF0ZXJpYWwnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdlbmNvZGVzIHNpZ25pbmcgYW5kIFZSRiBzaGFyZXMgaW4gYm90aCBmdWxsIGFuZCByZWR1Y2VkIGVudmVsb3BlcycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwcml2YXRlTWF0ZXJpYWwgPSBCdWZmZXIuZnJvbSgnc2lnbmluZy1zaGFyZScpO1xuICAgIGNvbnN0IHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwgPSBCdWZmZXIuZnJvbSgncmVkdWNlZC1zaWduaW5nLXNoYXJlJyk7XG4gICAgY29uc3QgdnJmS2V5U2hhcmUgPSBCdWZmZXIuZnJvbSgndnJmLXNoYXJlJyk7XG5cbiAgICBjb25zdCB7IGVudmVsb3BlLCByZWR1Y2VkRW52ZWxvcGUgfSA9IGJ1aWxkVnJmS2V5RW52ZWxvcGVzKHByaXZhdGVNYXRlcmlhbCwgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCwgdnJmS2V5U2hhcmUpO1xuICAgIGNvbnN0IGRlY29kZWRFbnZlbG9wZSA9IGRlY29kZVZyZkVudmVsb3BlKGVudmVsb3BlKTtcbiAgICBjb25zdCBkZWNvZGVkUmVkdWNlZEVudmVsb3BlID0gZGVjb2RlVnJmRW52ZWxvcGUocmVkdWNlZEVudmVsb3BlKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoQnVmZmVyLmZyb20oZGVjb2RlZEVudmVsb3BlLnBydktleVNoYXJlKSwgcHJpdmF0ZU1hdGVyaWFsKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGRlY29kZWRFbnZlbG9wZS52cmYpLCB2cmZLZXlTaGFyZSk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkUmVkdWNlZEVudmVsb3BlLnBydktleVNoYXJlKSwgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShkZWNvZGVkUmVkdWNlZEVudmVsb3BlLnZyZiksIHZyZktleVNoYXJlKTtcbiAgfSk7XG5cbiAgaXQoJ2tlZXBzIG9yZGluYXJ5IE1QQ3YyIHBhcnRpY2lwYW50IG1hdGVyaWFsIGFzIGJhcmUgYmFzZTY0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVuY3J5cHRlZElucHV0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhZGRlZEtleWNoYWluczogQWRkZWRLZXljaGFpblBhcmFtc1tdID0gW107XG4gICAgY29uc3QgYml0Z28gPSB7XG4gICAgICBlbmNyeXB0OiBhc3luYyAocGFyYW1zOiB7IGlucHV0OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGVuY3J5cHRlZElucHV0cy5wdXNoKHBhcmFtcy5pbnB1dCk7XG4gICAgICAgIHJldHVybiBgZW5jcnlwdGVkOiR7cGFyYW1zLmlucHV0fWA7XG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgYWRkOiBhc3luYyAocGFyYW1zOiBBZGRlZEtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBhZGRlZEtleWNoYWlucy5wdXNoKHBhcmFtcyk7XG4gICAgICAgIHJldHVybiB7IGlkOiAndXNlci1rZXknIH0gYXMgdW5rbm93biBhcyBLZXljaGFpbjtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29pbiA9IHtcbiAgICAgIGtleWNoYWluczogKCkgPT4ga2V5Y2hhaW5zLFxuICAgIH0gYXMgdW5rbm93biBhcyBJQmFzZUNvaW47XG4gICAgY29uc3QgdXRpbHMgPSBuZXcgRWRkc2FNUEN2MlV0aWxzKGJpdGdvLCBiYXNlQ29pbik7XG4gICAgY29uc3QgcHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3NpZ25pbmctc2hhcmUnKTtcbiAgICBjb25zdCByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gQnVmZmVyLmZyb20oJ3JlZHVjZWQtc2lnbmluZy1zaGFyZScpO1xuXG4gICAgYXdhaXQgdXRpbHMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgICdjb21tb24ta2V5Y2hhaW4nLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgICdwYXNzcGhyYXNlJ1xuICAgICk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0cywgW1xuICAgICAgcHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIF0pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5lbmNyeXB0ZWRQcnYsIGBlbmNyeXB0ZWQ6JHtwcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpfWApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zYWZlSWQsIHVuZGVmaW5lZCk7XG4gIH0pO1xuXG4gIGl0KCdlbmNyeXB0cyB0aGUgVlJGIGVudmVsb3BlIGFuZCB0YWdzIHRoZSBrZXljaGFpbiB3aXRoIHNhZmVJZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlbmNyeXB0ZWRJbnB1dHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWRkZWRLZXljaGFpbnM6IEFkZGVkS2V5Y2hhaW5QYXJhbXNbXSA9IFtdO1xuICAgIGNvbnN0IGJpdGdvID0ge1xuICAgICAgZW5jcnlwdDogYXN5bmMgKHBhcmFtczogeyBpbnB1dDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBlbmNyeXB0ZWRJbnB1dHMucHVzaChwYXJhbXMuaW5wdXQpO1xuICAgICAgICByZXR1cm4gYGVuY3J5cHRlZDoke3BhcmFtcy5pbnB1dH1gO1xuICAgICAgfSxcbiAgICB9IGFzIHVua25vd24gYXMgQml0R29CYXNlO1xuICAgIGNvbnN0IGtleWNoYWlucyA9IHtcbiAgICAgIGFkZDogYXN5bmMgKHBhcmFtczogQWRkZWRLZXljaGFpblBhcmFtcyk6IFByb21pc2U8S2V5Y2hhaW4+ID0+IHtcbiAgICAgICAgYWRkZWRLZXljaGFpbnMucHVzaChwYXJhbXMpO1xuICAgICAgICByZXR1cm4geyBpZDogJ3VzZXIta2V5JyB9IGFzIHVua25vd24gYXMgS2V5Y2hhaW47XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6ICgpID0+IGtleWNoYWlucyxcbiAgICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuICAgIGNvbnN0IHsgZW52ZWxvcGUsIHJlZHVjZWRFbnZlbG9wZSB9ID0gYnVpbGRWcmZLZXlFbnZlbG9wZXMoXG4gICAgICBCdWZmZXIuZnJvbSgnc2lnbmluZy1zaGFyZScpLFxuICAgICAgQnVmZmVyLmZyb20oJ3JlZHVjZWQtc2lnbmluZy1zaGFyZScpLFxuICAgICAgQnVmZmVyLmZyb20oJ3ZyZi1zaGFyZScpXG4gICAgKTtcblxuICAgIGF3YWl0IHV0aWxzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICAnY29tbW9uLWtleWNoYWluJyxcbiAgICAgIGVudmVsb3BlLFxuICAgICAgcmVkdWNlZEVudmVsb3BlLFxuICAgICAgJ3Bhc3NwaHJhc2UnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgJ3NhZmUtaWQnXG4gICAgKTtcblxuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoZW5jcnlwdGVkSW5wdXRzWzBdLCBlbnZlbG9wZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVZyZkVudmVsb3BlKEJ1ZmZlci5mcm9tKGVuY3J5cHRlZElucHV0c1swXSwgJ2Jhc2U2NCcpKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGRlY29kZWQudnJmKSwgQnVmZmVyLmZyb20oJ3ZyZi1zaGFyZScpKTtcbiAgfSk7XG5cbiAgaXQoJ3RhZ3MgdGhlIEJpdEdvIGtleWNoYWluIHdpdGggc2FmZUlkIGFuZCBkb2VzIG5vdCBlbmNyeXB0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGVuY3J5cHRlZElucHV0czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhZGRlZEtleWNoYWluczogQWRkZWRLZXljaGFpblBhcmFtc1tdID0gW107XG4gICAgY29uc3QgYml0Z28gPSB7XG4gICAgICBlbmNyeXB0OiBhc3luYyAocGFyYW1zOiB7IGlucHV0OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGVuY3J5cHRlZElucHV0cy5wdXNoKHBhcmFtcy5pbnB1dCk7XG4gICAgICAgIHJldHVybiBgZW5jcnlwdGVkOiR7cGFyYW1zLmlucHV0fWA7XG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBCaXRHb0Jhc2U7XG4gICAgY29uc3Qga2V5Y2hhaW5zID0ge1xuICAgICAgYWRkOiBhc3luYyAocGFyYW1zOiBBZGRlZEtleWNoYWluUGFyYW1zKTogUHJvbWlzZTxLZXljaGFpbj4gPT4ge1xuICAgICAgICBhZGRlZEtleWNoYWlucy5wdXNoKHBhcmFtcyk7XG4gICAgICAgIHJldHVybiB7IGlkOiAnYml0Z28ta2V5JyB9IGFzIHVua25vd24gYXMgS2V5Y2hhaW47XG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvaW4gPSB7XG4gICAgICBrZXljaGFpbnM6ICgpID0+IGtleWNoYWlucyxcbiAgICB9IGFzIHVua25vd24gYXMgSUJhc2VDb2luO1xuICAgIGNvbnN0IHV0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4pO1xuXG4gICAgYXdhaXQgdXRpbHMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICAnY29tbW9uLWtleWNoYWluJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgICdzYWZlLWlkJ1xuICAgICk7XG5cbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGVuY3J5cHRlZElucHV0cywgW10pO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zb3VyY2UsICdiaXRnbycpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChhZGRlZEtleWNoYWluc1swXS5zYWZlSWQsICdzYWZlLWlkJyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFkZGVkS2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiwgdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdW5kLXRyaXBzIG9wYXF1ZSBWUkYgYmxvYnMgYW5kIGtlZXBzIG9ubHkgdGhlIHJlY2lwaWVudCBwMnAgbWVzc2FnZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgYmxvYiA9IHNlcmlhbGl6ZVZyZk1lc3NhZ2VzKHtcbiAgICAgIGJyb2FkY2FzdE1lc3NhZ2VzOiBbeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShbMSwgMiwgM10pIH1dLFxuICAgICAgcDJwTWVzc2FnZXM6IFtcbiAgICAgICAgeyBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCB0bzogTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShbNF0pIH0sXG4gICAgICAgIHsgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTywgdG86IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCBwYXlsb2FkOiBuZXcgVWludDhBcnJheShbNV0pIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZm9yVXNlciA9IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMoYmxvYiwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKEJ1ZmZlci5mcm9tKGZvclVzZXIuYnJvYWRjYXN0TWVzc2FnZXNbMF0ucGF5bG9hZCksIEJ1ZmZlci5mcm9tKFsxLCAyLCAzXSkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChmb3JVc2VyLnAycE1lc3NhZ2VzLmxlbmd0aCwgMSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKGZvclVzZXIucDJwTWVzc2FnZXNbMF0udG8sIE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChCdWZmZXIuZnJvbShmb3JVc2VyLnAycE1lc3NhZ2VzWzBdLnBheWxvYWQpLCBCdWZmZXIuZnJvbShbNF0pKTtcblxuICAgIGNvbnN0IGZvckJhY2t1cCA9IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMoYmxvYiwgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChmb3JCYWNrdXAucDJwTWVzc2FnZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZm9yQmFja3VwLnAycE1lc3NhZ2VzWzBdLnRvLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG4gIH0pO1xuXG4gIGl0KCdyZWplY3RzIG1hbGZvcm1lZCBWUkYgREtHIG1lc3NhZ2UgYmxvYnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZXNlcmlhbGl6ZVZyZk1lc3NhZ2VzKCclJSUnLCBNUEN2MlBhcnRpZXNFbnVtLlVTRVIpLCAvSW52YWxpZCBWUkYgREtHIG1lc3NhZ2UgYmxvYi8pO1xuICAgIGNvbnN0IG5vdEFuQXJyYXkgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGZyb206IDAgfSkpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IGRlc2VyaWFsaXplVnJmTWVzc2FnZXMobm90QW5BcnJheSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKSwgL1ZSRiBES0cgbWVzc2FnZSBibG9iLyk7XG4gICAgY29uc3QgYmFkUGFydHkgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShbeyBmcm9tOiA5LCBwYXlsb2FkOiBCdWZmZXIuZnJvbShbMV0pLnRvU3RyaW5nKCdiYXNlNjQnKSB9XSkpLnRvU3RyaW5nKFxuICAgICAgJ2Jhc2U2NCdcbiAgICApO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZGVzZXJpYWxpemVWcmZNZXNzYWdlcyhiYWRQYXJ0eSwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKSwgL1ZSRiBES0cgbWVzc2FnZSBibG9iLyk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -38,6 +38,8 @@ const sinon = __importStar(require("sinon"));
38
38
  require("should");
39
39
  const wallets_1 = require("../../../../src/bitgo/wallet/wallets");
40
40
  const wallet_1 = require("../../../../src/bitgo/wallet/wallet");
41
+ const bitcoin_1 = require("../../../../src/bitgo/bitcoin");
42
+ const api_1 = require("../../../../src/api");
41
43
  describe('Wallets - encryptionVersion threading', function () {
42
44
  let wallets;
43
45
  let mockBitGo;
@@ -218,7 +220,9 @@ describe('Wallets - encryptionVersion threading', function () {
218
220
  });
219
221
  describe('Wallet.shareWallet / createBulkWalletShare', function () {
220
222
  let wallet;
223
+ let recipientPubKey;
221
224
  beforeEach(function () {
225
+ recipientPubKey = (0, bitcoin_1.makeRandomKey)().publicKey.toString('hex');
222
226
  const mockWalletData = {
223
227
  id: 'wallet-id',
224
228
  keys: ['key-1', 'key-2', 'key-3'],
@@ -232,62 +236,69 @@ describe('Wallets - encryptionVersion threading', function () {
232
236
  mockBaseCoin.getMPCAlgorithm = sinon.stub().returns('ecdsa');
233
237
  wallet = new wallet_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
234
238
  });
235
- it('shareWallet passes encryptionVersion to prepareSharedKeychain', async function () {
236
- const prepareStub = sinon.stub(wallet, 'prepareSharedKeychain').resolves({});
237
- mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: 'recvPub', path: 'm/0' });
238
- mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) });
239
- await wallet.shareWallet({
240
- email: 'test@test.com',
241
- permissions: 'spend',
242
- walletPassphrase: 'passphrase',
243
- encryptionVersion: 2,
239
+ it('encryptPrvForUser encrypts to the ECDH secret at the high-entropy version', async function () {
240
+ await wallet.encryptPrvForUser('prv', 'pub', recipientPubKey, 'm/0', 2);
241
+ assert.ok(mockBitGo.encrypt.calledOnce, 'encrypt should have been called');
242
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION);
243
+ });
244
+ it('preserves the encryptionVersion position before a pre-decrypted keychain', async function () {
245
+ await wallet.prepareSharedKeychain(undefined, recipientPubKey, 'm/0', 2, {
246
+ prv: 'prv',
247
+ pub: 'pub',
244
248
  });
245
- assert.ok(prepareStub.calledOnce, 'prepareSharedKeychain should be called');
246
- assert.strictEqual(prepareStub.firstCall.args[3], 2, 'encryptionVersion should be forwarded');
249
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].input, 'prv');
250
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION);
247
251
  });
248
- it('shareWallet passes encryptionVersion: undefined when not set', async function () {
249
- const prepareStub = sinon.stub(wallet, 'prepareSharedKeychain').resolves({});
250
- mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: 'recvPub', path: 'm/0' });
252
+ it('shareWallet ignores a caller-supplied encryptionVersion for the shared keychain', async function () {
253
+ sinon.stub(wallet, 'getDecryptedKeychainForSharing').resolves({ prv: 'prv', pub: 'pub' });
254
+ mockBitGo.getSharingKey = sinon.stub().resolves({ userId: 'user-id', pubkey: recipientPubKey, path: 'm/0' });
251
255
  mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({}) }) });
252
256
  await wallet.shareWallet({
253
257
  email: 'test@test.com',
254
258
  permissions: 'spend',
255
259
  walletPassphrase: 'passphrase',
260
+ encryptionVersion: 2,
256
261
  });
257
- assert.ok(prepareStub.calledOnce);
258
- assert.strictEqual(prepareStub.firstCall.args[3], undefined);
262
+ assert.ok(mockBitGo.encrypt.calledOnce, 'encrypt should have been called');
263
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION, 'the ECDH-keyed share must not be encrypted at the caller-requested version');
259
264
  });
260
- it('createBulkWalletShare passes encryptionVersion to encryptPrvForUser', async function () {
261
- const encryptPrvStub = sinon
262
- .stub(wallet, 'encryptPrvForUser')
263
- .resolves({ encryptedPrv: 'enc', pub: 'pub', fromPubKey: 'fpk', toPubKey: 'tpk', path: 'm/0' });
264
- sinon
265
- .stub(wallet, 'getDecryptedKeychainForSharing')
266
- .resolves({ prv: 'prv', pub: 'pub', encryptedPrv: 'encPrv' });
265
+ it('createBulkWalletShare ignores a caller-supplied encryptionVersion for every share', async function () {
266
+ sinon.stub(wallet, 'getDecryptedKeychainForSharing').resolves({ prv: 'prv', pub: 'pub' });
267
267
  sinon.stub(wallet, 'createBulkKeyShares').resolves({ shares: [] });
268
268
  await wallet.createBulkWalletShare({
269
269
  walletPassphrase: 'passphrase',
270
- keyShareOptions: [{ userId: 'user-1', pubKey: 'pubKey', path: 'm/0', permissions: ['spend'] }],
270
+ keyShareOptions: [
271
+ { userId: 'user-1', pubKey: recipientPubKey, path: 'm/0', permissions: ['spend'] },
272
+ { userId: 'user-2', pubKey: recipientPubKey, path: 'm/1', permissions: ['spend'] },
273
+ ],
271
274
  encryptionVersion: 2,
272
275
  });
273
- assert.ok(encryptPrvStub.calledOnce);
274
- assert.strictEqual(encryptPrvStub.firstCall.args[4], 2, 'encryptionVersion should be forwarded');
276
+ assert.strictEqual(mockBitGo.encrypt.callCount, 2, 'each recipient gets its own encryption');
277
+ for (const call of mockBitGo.encrypt.getCalls()) {
278
+ assert.strictEqual(call.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION);
279
+ }
275
280
  });
276
- it('createBulkWalletShare passes encryptionVersion: undefined when not set', async function () {
277
- const encryptPrvStub = sinon
278
- .stub(wallet, 'encryptPrvForUser')
279
- .resolves({ encryptedPrv: 'enc', pub: 'pub', fromPubKey: 'fpk', toPubKey: 'tpk', path: 'm/0' });
280
- sinon
281
- .stub(wallet, 'getDecryptedKeychainForSharing')
282
- .resolves({ prv: 'prv', pub: 'pub', encryptedPrv: 'encPrv' });
283
- sinon.stub(wallet, 'createBulkKeyShares').resolves({ shares: [] });
284
- await wallet.createBulkWalletShare({
285
- walletPassphrase: 'passphrase',
286
- keyShareOptions: [{ userId: 'user-1', pubKey: 'pubKey', path: 'm/0', permissions: ['spend'] }],
281
+ });
282
+ describe('Wallets.generateWallet', function () {
283
+ it('keeps human-passphrase encryption at the requested version and pins recovery encryption', async function () {
284
+ mockKeychains.createBackup = sinon.stub().resolves({ id: 'backup-key-id', pub: 'backup-pub' });
285
+ mockKeychains.createBitGo = sinon.stub().resolves({ id: 'bitgo-key-id', pub: 'bitgo-pub' });
286
+ mockBitGo.post.returns({ send: sinon.stub().returns({ result: sinon.stub().resolves({ id: 'wallet-id' }) }) });
287
+ mockBaseCoin.getDefaultMultisigType = sinon.stub().returns('onchain');
288
+ mockBaseCoin.isEVM = sinon.stub().returns(false);
289
+ mockBaseCoin.isValidMofNSetup = sinon.stub().returns(true);
290
+ mockBaseCoin.supplementGenerateWallet = sinon.stub().callsFake(async (params) => params);
291
+ mockBaseCoin.signMessage = sinon.stub().resolves(Buffer.from('aabbcc', 'hex'));
292
+ await wallets.generateWallet({
293
+ label: 'Test Wallet',
294
+ passphrase: 'wallet-passphrase',
295
+ passcodeEncryptionCode: 'recovery-code',
296
+ encryptionVersion: 2,
287
297
  });
288
- assert.ok(encryptPrvStub.calledOnce);
289
- assert.strictEqual(encryptPrvStub.firstCall.args[4], undefined);
298
+ assert.strictEqual(mockBitGo.encrypt.callCount, 2);
299
+ assert.strictEqual(mockBitGo.encrypt.firstCall.args[0].encryptionVersion, 2);
300
+ assert.strictEqual(mockBitGo.encrypt.secondCall.args[0].encryptionVersion, api_1.HIGH_ENTROPY_ENCRYPTION_VERSION);
290
301
  });
291
302
  });
292
303
  });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c0VuY3J5cHRpb25WZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzRW5jcnlwdGlvblZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixrRUFBK0Q7QUFDL0QsZ0VBQTZEO0FBRTdELFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRTtJQUNoRCxJQUFJLE9BQWdCLENBQUM7SUFDckIsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxZQUFpQixDQUFDO0lBQ3RCLElBQUksYUFBa0IsQ0FBQztJQUV2QixNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FDWCxpSEFBaUgsQ0FBQztJQUVwSCxVQUFVLENBQUM7UUFDVCxhQUFhLEdBQUc7WUFDZCxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzVELEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsQ0FBQztTQUMvRixDQUFDO1FBRUYsU0FBUyxHQUFHO1lBQ1YsT0FBTyxFQUFFLEtBQUs7aUJBQ1gsSUFBSSxFQUFFO2lCQUNOLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUF1QyxFQUFFLEVBQUUsQ0FBQyxPQUFPLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUM1RyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFD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QUksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IFdhbGxldHMgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vd2FsbGV0L3dhbGxldHMnO1xuaW1wb3J0IHsgV2FsbGV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQnO1xuXG5kZXNjcmliZSgnV2FsbGV0cyAtIGVuY3J5cHRpb25WZXJzaW9uIHRocmVhZGluZycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldHM6IFdhbGxldHM7XG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IG1vY2tCYXNlQ29pbjogYW55O1xuICBsZXQgbW9ja0tleWNoYWluczogYW55O1xuXG4gIGNvbnN0IHVzZXJQcnYgPSAneHBydlNvbWVVc2VyUHJpdmF0ZUtleSc7XG4gIGNvbnN0IHVzZXJQdWIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRnRYZ1M1c1lKQUJxcUc5WUxtQzRRMVJkYXA5Z1NFOE5xdHd5YkdoZVBZMmdaMjlFU0ZqcUpvQ3UxUnVwamU4WXRHcXNlZkQyNjVUTWc3dXNVREZkcDZXMUVHTWNldDgnO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tLZXljaGFpbnMgPSB7XG4gICAgICBjcmVhdGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcHViOiB1c2VyUHViLCBwcnY6IHVzZXJQcnYgfSksXG4gICAgICBhZGQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAndXNlci1rZXktaWQnLCBwdWI6IHVzZXJQdWIsIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1wcnYnIH0pLFxuICAgIH07XG5cbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBlbmNyeXB0OiBzaW5vblxuICAgICAgICAuc3R1YigpXG4gICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKHsgcGFzc3dvcmQsIGlucHV0IH06IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBgZW5jOiR7cGFzc3dvcmR9OiR7aW5wdXR9YCksXG4gICAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ2RlY3J5cHRlZFBydicpLFxuICAgICAgY3JlYXRlRW5jcnlwdGlvblNlc3Npb246IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKHBhc3N3b3JkOiBzdHJpbmcsIGVuY3J5cHRpb25WZXJzaW9uPzogMSB8IDIpID0+ICh7XG4gICAgICAgIGVuY3J5cHQ6IHNpbm9uXG4gICAgICAgICAgLnN0dWIoKVxuICAgICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKGlucHV0OiBzdHJpbmcpID0+IGBzZXNzaW9uLWVuYzoke3Bhc3N3b3JkfToke2VuY3J5cHRpb25WZXJzaW9ufToke2lucHV0fWApLFxuICAgICAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ3Nlc3Npb24tZGVjcnlwdGVkJyksXG4gICAgICAgIGRlc3Ryb3k6IHNpbm9uLnN0dWIoKSxcbiAgICAgIH0pKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKSwgcXVlcnk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpIH0pLFxuICAgICAgcG9zdDogc2lub24uc3R1YigpLnJldHVybnMoeyBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHt9KSB9KSB9KSxcbiAgICAgIHB1dDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICBzZW5kOiBzaW5vblxuICAgICAgICAgIC5zdHViKClcbiAgICAgICAgICAucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgYWNjZXB0ZWRXYWxsZXRTaGFyZXM6IFtdLCB3YWxsZXRTaGFyZVVwZGF0ZUVycm9yczogW10gfSkgfSksXG4gICAgICB9KSxcbiAgICAgIGdldEVDREhLZXljaGFpbjogc2lub24uc3R1YigpLnJlc29sdmVzKHsgZW5jcnlwdGVkWHBydjogJ2VuY1hwcnYnIH0pLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL3Rlc3QvdXJsJyksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLnJldHVybnMobW9ja0tleWNoYWlucyksXG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZykgPT4gcGF0aCksXG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdidGMnKSxcbiAgICAgIGdldENoYWluOiBzaW5vbi5zdHViKCkucmV0dXJucygnYnRjJyksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKSxcbiAgICB9O1xuXG4gICAgd2FsbGV0cyA9IG5ldyBXYWxsZXRzKG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY2NlcHRTaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiAyIHRvIGVuY3J5cHQgb24gdGhlIG11bHRpVXNlcktleVJvdGF0aW9uUmVxdWlyZWQgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10sXG4gICAgICAgICAgd2FsbGV0OiAnd2FsbGV0LWlkJyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5hY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6ICdzaGFyZS1pZCcsXG4gICAgICAgIHVzZXJQYXNzd29yZDogJ215LXBhc3N3b3JkJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZCwgJ2VuY3J5cHQgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQnKTtcbiAgICAgIGNvbnN0IGNhbGwgPSBtb2NrQml0R28uZW5jcnlwdC5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgZW5jcnlwdGlvblZlcnNpb246IHVuZGVmaW5lZCB3aGVuIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgICAgIHdhbGxldDogJ3dhbGxldC1pZCcsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiAnc2hhcmUtaWQnLFxuICAgICAgICB1c2VyUGFzc3dvcmQ6ICdteS1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHQuZmlyc3RDYWxsO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbiwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1bGtBY2NlcHRTaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB3YWxsZXRTaGFyZXNMaXN0ID0ge1xuICAgICAgaW5jb21pbmc6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc2hhcmUtaWQnLFxuICAgICAgICAgIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAga2V5Y2hhaW46IG51bGwsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBvdXRnb2luZzogW10sXG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMod2FsbGV0U2hhcmVzTGlzdCkgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiAyIHRvIHRoZSBlbmNyeXB0aW9uIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBbJ3NoYXJlLWlkJ10sXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2sobW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMV0sIDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHRvIHRoZSBlbmNyeXB0aW9uIHNlc3Npb24gd2hlbiBub3Qgc2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0cy5idWxrQWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkczogWydzaGFyZS1pZCddLFxuICAgICAgICB1c2VyTG9naW5QYXNzd29yZDogJ2xvZ2luLXBhc3N3b3JkJyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2sobW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMV0sIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvY2Vzc2VzIHNoYXJlcyBpbiBiYXRjaGVzIG9mIDE2IHRvIGF2b2lkIFdBU00gbWVtb3J5IGV4aGF1c3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAyMCBzaGFyZXMg4oaSIDIgYmF0Y2hlcyAoMTYgKyA0KSwgdmVyaWZ5aW5nIHRoZSBiYXRjaCBib3VuZGFyeSBpcyBjcm9zc2VkXG4gICAgICBjb25zdCBtYW55U2hhcmVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjAgfSwgKF8sIGkpID0+ICh7XG4gICAgICAgIGlkOiBgc2hhcmUtJHtpfWAsXG4gICAgICAgIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgfSkpO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHtcbiAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpbmNvbWluZzogbWFueVNoYXJlcywgb3V0Z29pbmc6IFtdIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENhcHR1cmUgdGhlIHNlc3Npb24gc28gd2UgY2FuIGluc3BlY3QgaXRzIGVuY3J5cHQgY2FsbCBjb3VudFxuICAgICAgY29uc3Qgc2Vzc2lvbkVuY3J5cHRTdHViID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoaW5wdXQ6IHN0cmluZykgPT4gYHNlc3Npb24tZW5jOiR7aW5wdXR9YCk7XG4gICAgICBtb2NrQml0R28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24gPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBlbmNyeXB0OiBzZXNzaW9uRW5jcnlwdFN0dWIsXG4gICAgICAgIGRlY3J5cHQ6IHNpbm9uLnN0dWIoKSxcbiAgICAgICAgZGVzdHJveTogc2lub24uc3R1YigpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYnVsa0FjY2VwdFNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZHM6IG1hbnlTaGFyZXMubWFwKChzKSA9PiBzLmlkKSxcbiAgICAgICAgdXNlckxvZ2luUGFzc3dvcmQ6ICdsb2dpbi1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2Vzc2lvbiBjcmVhdGVkIG9uY2UsIHNlc3Npb24uZW5jcnlwdCBjYWxsZWQgb25jZSBwZXIgc2hhcmVcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrQml0R28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24uY2FsbENvdW50LCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzZXNzaW9uRW5jcnlwdFN0dWIuY2FsbENvdW50LCAyMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbmV2ZXIgcnVucyBtb3JlIHRoYW4gMTYgc2hhcmVzIGNvbmN1cnJlbnRseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBpbkZsaWdodCA9IDA7XG4gICAgICBsZXQgbWF4SW5GbGlnaHQgPSAwO1xuXG4gICAgICBjb25zdCBzZXNzaW9uRW5jcnlwdFN0dWIgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKCgpID0+IHtcbiAgICAgICAgaW5GbGlnaHQrKztcbiAgICAgICAgbWF4SW5GbGlnaHQgPSBNYXRoLm1heChtYXhJbkZsaWdodCwgaW5GbGlnaHQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCdlbmNyeXB0ZWQnKS50aGVuKChyKSA9PiB7XG4gICAgICAgICAgaW5GbGlnaHQtLTtcbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIG1vY2tCaXRHby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgIGVuY3J5cHQ6IHNlc3Npb25FbmNyeXB0U3R1YixcbiAgICAgICAgZGVjcnlwdDogc2lub24uc3R1YigpLFxuICAgICAgICBkZXN0cm95OiBzaW5vbi5zdHViKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWFueVNoYXJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDIwIH0sIChfLCBpKSA9PiAoe1xuICAgICAgICBpZDogYHNoYXJlLSR7aX1gLFxuICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSxcbiAgICAgIH0pKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaW5jb21pbmc6IG1hbnlTaGFyZXMsIG91dGdvaW5nOiBbXSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBtYW55U2hhcmVzLm1hcCgocykgPT4gcy5pZCksXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtYXhJbkZsaWdodCA8PSAxNiwgYGV4cGVjdGVkIG1heCBjb25jdXJyZW5jeSA8PSAxNiwgZ290ICR7bWF4SW5GbGlnaHR9YCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2Vzc2lvbkVuY3J5cHRTdHViLmNhbGxDb3VudCwgMjApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2FsbGV0LnNoYXJlV2FsbGV0IC8gY3JlYXRlQnVsa1dhbGxldFNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCB3YWxsZXQ6IFdhbGxldDtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAga2V5czogWydrZXktMScsICdrZXktMicsICdrZXktMyddLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHVzZXJzOiBbXSxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgfTtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1RzcyA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5nZXRNUENBbGdvcml0aG0gPSBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKTtcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaGFyZVdhbGxldCBwYXNzZXMgZW5jcnlwdGlvblZlcnNpb24gdG8gcHJlcGFyZVNoYXJlZEtleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHJlcGFyZVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3ByZXBhcmVTaGFyZWRLZXljaGFpbicpLnJlc29sdmVzKHt9KTtcbiAgICAgIG1vY2tCaXRHby5nZXRTaGFyaW5nS2V5ID0gc2lub24uc3R1YigpLnJlc29sdmVzKHsgdXNlcklkOiAndXNlci1pZCcsIHB1YmtleTogJ3JlY3ZQdWInLCBwYXRoOiAnbS8wJyB9KTtcbiAgICAgIG1vY2tCaXRHby5wb3N0LnJldHVybnMoeyBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHt9KSB9KSB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0LnNoYXJlV2FsbGV0KHtcbiAgICAgICAgZW1haWw6ICd0ZXN0QHRlc3QuY29tJyxcbiAgICAgICAgcGVybWlzc2lvbnM6ICdzcGVuZCcsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKHByZXBhcmVTdHViLmNhbGxlZE9uY2UsICdwcmVwYXJlU2hhcmVkS2V5Y2hhaW4gc2hvdWxkIGJlIGNhbGxlZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByZXBhcmVTdHViLmZpcnN0Q2FsbC5hcmdzWzNdLCAyLCAnZW5jcnlwdGlvblZlcnNpb24gc2hvdWxkIGJlIGZvcndhcmRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NoYXJlV2FsbGV0IHBhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHdoZW4gbm90IHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdwcmVwYXJlU2hhcmVkS2V5Y2hhaW4nKS5yZXNvbHZlcyh7fSk7XG4gICAgICBtb2NrQml0R28uZ2V0U2hhcmluZ0tleSA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHVzZXJJZDogJ3VzZXItaWQnLCBwdWJrZXk6ICdyZWN2UHViJywgcGF0aDogJ20vMCcgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7fSkgfSkgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5zaGFyZVdhbGxldCh7XG4gICAgICAgIGVtYWlsOiAndGVzdEB0ZXN0LmNvbScsXG4gICAgICAgIHBlcm1pc3Npb25zOiAnc3BlbmQnLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKHByZXBhcmVTdHViLmNhbGxlZE9uY2UpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByZXBhcmVTdHViLmZpcnN0Q2FsbC5hcmdzWzNdLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWF0ZUJ1bGtXYWxsZXRTaGFyZSBwYXNzZXMgZW5jcnlwdGlvblZlcnNpb24gdG8gZW5jcnlwdFBydkZvclVzZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBlbmNyeXB0UHJ2U3R1YiA9IHNpbm9uXG4gICAgICAgIC5zdHViKHdhbGxldCwgJ2VuY3J5cHRQcnZGb3JVc2VyJylcbiAgICAgICAgLnJlc29sdmVzKHsgZW5jcnlwdGVkUHJ2OiAnZW5jJywgcHViOiAncHViJywgZnJvbVB1YktleTogJ2ZwaycsIHRvUHViS2V5OiAndHBrJywgcGF0aDogJ20vMCcgfSk7XG4gICAgICBzaW5vblxuICAgICAgICAuc3R1Yih3YWxsZXQgYXMgYW55LCAnZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nJylcbiAgICAgICAgLnJlc29sdmVzKHsgcHJ2OiAncHJ2JywgcHViOiAncHViJywgZW5jcnlwdGVkUHJ2OiAnZW5jUHJ2JyB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0IGFzIGFueSwgJ2NyZWF0ZUJ1bGtLZXlTaGFyZXMnKS5yZXNvbHZlcyh7IHNoYXJlczogW10gfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5jcmVhdGVCdWxrV2FsbGV0U2hhcmUoe1xuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICAgIGtleVNoYXJlT3B0aW9uczogW3sgdXNlcklkOiAndXNlci0xJywgcHViS2V5OiAncHViS2V5JywgcGF0aDogJ20vMCcsIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10gfV0sXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAyLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhlbmNyeXB0UHJ2U3R1Yi5jYWxsZWRPbmNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNyeXB0UHJ2U3R1Yi5maXJzdENhbGwuYXJnc1s0XSwgMiwgJ2VuY3J5cHRpb25WZXJzaW9uIHNob3VsZCBiZSBmb3J3YXJkZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVhdGVCdWxrV2FsbGV0U2hhcmUgcGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiB1bmRlZmluZWQgd2hlbiBub3Qgc2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZW5jcnlwdFBydlN0dWIgPSBzaW5vblxuICAgICAgICAuc3R1Yih3YWxsZXQsICdlbmNyeXB0UHJ2Rm9yVXNlcicpXG4gICAgICAgIC5yZXNvbHZlcyh7IGVuY3J5cHRlZFBydjogJ2VuYycsIHB1YjogJ3B1YicsIGZyb21QdWJLZXk6ICdmcGsnLCB0b1B1YktleTogJ3RwaycsIHBhdGg6ICdtLzAnIH0pO1xuICAgICAgc2lub25cbiAgICAgICAgLnN0dWIod2FsbGV0IGFzIGFueSwgJ2dldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZycpXG4gICAgICAgIC5yZXNvbHZlcyh7IHBydjogJ3BydicsIHB1YjogJ3B1YicsIGVuY3J5cHRlZFBydjogJ2VuY1BydicgfSk7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCBhcyBhbnksICdjcmVhdGVCdWxrS2V5U2hhcmVzJykucmVzb2x2ZXMoeyBzaGFyZXM6IFtdIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXQuY3JlYXRlQnVsa1dhbGxldFNoYXJlKHtcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Bhc3NwaHJhc2UnLFxuICAgICAgICBrZXlTaGFyZU9wdGlvbnM6IFt7IHVzZXJJZDogJ3VzZXItMScsIHB1YktleTogJ3B1YktleScsIHBhdGg6ICdtLzAnLCBwZXJtaXNzaW9uczogWydzcGVuZCddIH1dLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhlbmNyeXB0UHJ2U3R1Yi5jYWxsZWRPbmNlKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChlbmNyeXB0UHJ2U3R1Yi5maXJzdENhbGwuYXJnc1s0XSwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0c0VuY3J5cHRpb25WZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL3dhbGxldC93YWxsZXRzRW5jcnlwdGlvblZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLGtCQUFnQjtBQUNoQixrRUFBK0Q7QUFDL0QsZ0VBQTZEO0FBQzdELDJEQUE4RDtBQUM5RCw2Q0FBc0U7QUFFdEUsUUFBUSxDQUFDLHVDQUF1QyxFQUFFO0lBQ2hELElBQUksT0FBZ0IsQ0FBQztJQUNyQixJQUFJLFNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQWlCLENBQUM7SUFDdEIsSUFBSSxhQUFrQixDQUFDO0lBRXZCLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUNYLGlIQUFpSCxDQUFDO0lBRXBILFVBQVUsQ0FBQztRQUNULGFBQWEsR0FBRztZQUNkLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDNUQsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDO1NBQy9GLENBQUM7UUFFRixTQUFTLEdBQUc7WUFDVixPQUFPLEVBQUUsS0FBSztpQkFDWCxJQUFJLEVBQUU7aUJBQ04sU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXVDLEVBQUUsRUFBRSxDQUFDLE9BQU8sUUFBUSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzVHLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUM5Qyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFnQixFQUFFLGlCQUF5QixFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RyxPQUFPLEVBQUUsS0FBSztxQkFDWCxJQUFJLEVBQUU7cUJBQ04sU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLGVBQWUsUUFBUSxJQUFJLGlCQUFpQixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUM5RixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDbkQsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7YUFDdEIsQ0FBQyxDQUFDO1lBQ0gsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUN0RixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakcsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3hCLElBQUksRUFBRSxLQUFLO3FCQUNSLElBQUksRUFBRTtxQkFDTixPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsRUFBRSx1QkFBdUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7YUFDekcsQ0FBQztZQUNGLGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3BFLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDOUIsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1NBQ3ZDLENBQUM7UUFFRixZQUFZLEdBQUc7WUFDYixTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDOUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNuRCxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDdEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3JDLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN4QyxlQUFlLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7U0FDL0MsQ0FBQztRQUVGLE9BQU8sR0FBRyxJQUFJLGlCQUFPLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDO1FBQ1IsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMsaUZBQWlGLEVBQUUsS0FBSztZQUN6RixTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFDcEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQzVCLDRCQUE0QixFQUFFLElBQUk7b0JBQ2xDLFFBQVEsRUFBRSxJQUFJO29CQUNkLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQztvQkFDdEIsTUFBTSxFQUFFLFdBQVc7aUJBQ3BCLENBQUM7YUFDSCxDQUFDLENBQUM7WUFFSCxNQUFNLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0JBQ3hCLGFBQWEsRUFBRSxVQUFVO2dCQUN6QixZQUFZLEVBQUUsYUFBYTtnQkFDM0IsaUJBQWlCLEVBQUUsQ0FBQzthQUNyQixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGlDQUFpQyxDQUFDLENBQUM7WUFDdkUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDekMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUs7WUFDMUQsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQ3BCLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDO29CQUM1Qiw0QkFBNEIsRUFBRSxJQUFJO29CQUNsQyxRQUFRLEVBQUUsSUFBSTtvQkFDZCxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQ3RCLE1BQU0sRUFBRSxXQUFXO2lCQUNwQixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1lBRUgsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDO2dCQUN4QixhQUFhLEVBQUUsVUFBVTtnQkFDekIsWUFBWSxFQUFFLGFBQWE7YUFDNUIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1FBQzFCLE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsUUFBUSxFQUFFO2dCQUNSO29CQUNFLEVBQUUsRUFBRSxVQUFVO29CQUNkLDRCQUE0QixFQUFFLElBQUk7b0JBQ2xDLFFBQVEsRUFBRSxJQUFJO29CQUNkLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQztpQkFDdkI7YUFDRjtZQUNELFFBQVEsRUFBRSxFQUFFO1NBQ2IsQ0FBQztRQUVGLFVBQVUsQ0FBQztZQUNULFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdURBQXVELEVBQUUsS0FBSztZQUMvRCxNQUFNLE9BQU8sQ0FBQyxlQUFlLENBQUM7Z0JBQzVCLGNBQWMsRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDNUIsaUJBQWlCLEVBQUUsZ0JBQWdCO2dCQUNuQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ3JCLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUM7WUFDekQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRFQUE0RSxFQUFFLEtBQUs7WUFDcEYsTUFBTSxPQUFPLENBQUMsZUFBZSxDQUFDO2dCQUM1QixjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzVCLGlCQUFpQixFQUFFLGdCQUFnQjthQUNwQyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDO1lBQ3pELE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtRUFBbUUsRUFBRSxLQUFLO1lBQzNFLDBFQUEwRTtZQUMxRSxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkQsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dCQUNoQiw0QkFBNEIsRUFBRSxJQUFJO2dCQUNsQyxRQUFRLEVBQUUsSUFBSTtnQkFDZCxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUM7YUFDdkIsQ0FBQyxDQUFDLENBQUM7WUFDSixTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFDcEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUN0RSxDQUFDLENBQUM7WUFFSCwrREFBK0Q7WUFDL0QsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLGVBQWUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNuRyxTQUFTLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEQsT0FBTyxFQUFFLGtCQUFrQjtnQkFDM0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ3JCLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFO2FBQ3RCLENBQUMsQ0FBQztZQUVILE1BQU0sT0FBTyxDQUFDLGVBQWUsQ0FBQztnQkFDNUIsY0FBYyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNDLGlCQUFpQixFQUFFLGdCQUFnQjthQUNwQyxDQUFDLENBQUM7WUFFSCw4REFBOEQ7WUFDOUQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUs7WUFDckQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztZQUVwQixNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNyRCxRQUFRLEVBQUUsQ0FBQztnQkFDWCxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzlDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDN0MsUUFBUSxFQUFFLENBQUM7b0JBQ1gsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4RCxPQUFPLEVBQUUsa0JBQWtCO2dCQUMzQixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRTtnQkFDckIsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7YUFDdEIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZELEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDaEIsNEJBQTRCLEVBQUUsSUFBSTtnQkFDbEMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDO2FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1lBQ0osU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQ3BCLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7YUFDdEUsQ0FBQyxDQUFDO1lBRUgsTUFBTSxPQUFPLENBQUMsZUFBZSxDQUFDO2dCQUM1QixjQUFjLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0MsaUJBQWlCLEVBQUUsZ0JBQWdCO2FBQ3BDLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxJQUFJLEVBQUUsRUFBRSx1Q0FBdUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNuRixNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDRDQUE0QyxFQUFFO1FBQ3JELElBQUksTUFBYyxDQUFDO1FBQ25CLElBQUksZUFBdUIsQ0FBQztRQUU1QixVQUFVLENBQUM7WUFDVCxlQUFlLEdBQUcsSUFBQSx1QkFBYSxHQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RCxNQUFNLGNBQWMsR0FBRztnQkFDckIsRUFBRSxFQUFFLFdBQVc7Z0JBQ2YsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7Z0JBQ2pDLElBQUksRUFBRSxLQUFLO2dCQUNYLEtBQUssRUFBRSxhQUFhO2dCQUNwQixLQUFLLEVBQUUsRUFBRTtnQkFDVCxZQUFZLEVBQUUsU0FBUztnQkFDdkIsSUFBSSxFQUFFLEtBQUs7YUFDWixDQUFDO1lBQ0YsWUFBWSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELFlBQVksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RCxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyRUFBMkUsRUFBRSxLQUFLO1lBQ25GLE1BQU0sTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV4RSxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGlDQUFpQyxDQUFDLENBQUM7WUFDM0UsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUscUNBQStCLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwRUFBMEUsRUFBRSxLQUFLO1lBQ2xGLE1BQU0sTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtnQkFDdkUsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLEtBQUs7YUFDWCxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUscUNBQStCLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpRkFBaUYsRUFBRSxLQUFLO1lBQ3pGLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGdDQUFnQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMxRixTQUFTLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDN0csU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFOUYsTUFBTSxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUN2QixLQUFLLEVBQUUsZUFBZTtnQkFDdEIsV0FBVyxFQUFFLE9BQU87Z0JBQ3BCLGdCQUFnQixFQUFFLFlBQVk7Z0JBQzlCLGlCQUFpQixFQUFFLENBQUM7YUFDckIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sQ0FBQyxXQUFXLENBQ2hCLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFDckQscUNBQStCLEVBQy9CLDRFQUE0RSxDQUM3RSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUZBQW1GLEVBQUUsS0FBSztZQUMzRixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUYsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVuRSxNQUFNLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztnQkFDakMsZ0JBQWdCLEVBQUUsWUFBWTtnQkFDOUIsZUFBZSxFQUFFO29CQUNmLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ2xGLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUU7aUJBQ25GO2dCQUNELGlCQUFpQixFQUFFLENBQUM7YUFDckIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsd0NBQXdDLENBQUMsQ0FBQztZQUM3RixLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLHFDQUErQixDQUFDLENBQUM7WUFDdEYsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsd0JBQXdCLEVBQUU7UUFDakMsRUFBRSxDQUFDLHlGQUF5RixFQUFFLEtBQUs7WUFDakcsYUFBYSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUMvRixhQUFhLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzVGLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0csWUFBWSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEUsWUFBWSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pELFlBQVksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNELFlBQVksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFlLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xHLFlBQVksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRS9FLE1BQU0sT0FBTyxDQUFDLGNBQWMsQ0FBQztnQkFDM0IsS0FBSyxFQUFFLGFBQWE7Z0JBQ3BCLFVBQVUsRUFBRSxtQkFBbUI7Z0JBQy9CLHNCQUFzQixFQUFFLGVBQWU7Z0JBQ3ZDLGlCQUFpQixFQUFFLENBQUM7YUFDckIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM3RSxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxxQ0FBK0IsQ0FBQyxDQUFDO1FBQzlHLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgV2FsbGV0cyB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9iaXRnby93YWxsZXQvd2FsbGV0cyc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvYml0Z28vd2FsbGV0L3dhbGxldCc7XG5pbXBvcnQgeyBtYWtlUmFuZG9tS2V5IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2JpdGNvaW4nO1xuaW1wb3J0IHsgSElHSF9FTlRST1BZX0VOQ1JZUFRJT05fVkVSU0lPTiB9IGZyb20gJy4uLy4uLy4uLy4uL3NyYy9hcGknO1xuXG5kZXNjcmliZSgnV2FsbGV0cyAtIGVuY3J5cHRpb25WZXJzaW9uIHRocmVhZGluZycsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldHM6IFdhbGxldHM7XG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IG1vY2tCYXNlQ29pbjogYW55O1xuICBsZXQgbW9ja0tleWNoYWluczogYW55O1xuXG4gIGNvbnN0IHVzZXJQcnYgPSAneHBydlNvbWVVc2VyUHJpdmF0ZUtleSc7XG4gIGNvbnN0IHVzZXJQdWIgPVxuICAgICd4cHViNjYxTXlNd0FxUmJjRnRYZ1M1c1lKQUJxcUc5WUxtQzRRMVJkYXA5Z1NFOE5xdHd5YkdoZVBZMmdaMjlFU0ZqcUpvQ3UxUnVwamU4WXRHcXNlZkQyNjVUTWc3dXNVREZkcDZXMUVHTWNldDgnO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIG1vY2tLZXljaGFpbnMgPSB7XG4gICAgICBjcmVhdGU6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgcHViOiB1c2VyUHViLCBwcnY6IHVzZXJQcnYgfSksXG4gICAgICBhZGQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAndXNlci1rZXktaWQnLCBwdWI6IHVzZXJQdWIsIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1wcnYnIH0pLFxuICAgIH07XG5cbiAgICBtb2NrQml0R28gPSB7XG4gICAgICBlbmNyeXB0OiBzaW5vblxuICAgICAgICAuc3R1YigpXG4gICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKHsgcGFzc3dvcmQsIGlucHV0IH06IHsgcGFzc3dvcmQ6IHN0cmluZzsgaW5wdXQ6IHN0cmluZyB9KSA9PiBgZW5jOiR7cGFzc3dvcmR9OiR7aW5wdXR9YCksXG4gICAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ2RlY3J5cHRlZFBydicpLFxuICAgICAgY3JlYXRlRW5jcnlwdGlvblNlc3Npb246IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoYXN5bmMgKHBhc3N3b3JkOiBzdHJpbmcsIGVuY3J5cHRpb25WZXJzaW9uPzogMSB8IDIpID0+ICh7XG4gICAgICAgIGVuY3J5cHQ6IHNpbm9uXG4gICAgICAgICAgLnN0dWIoKVxuICAgICAgICAgIC5jYWxsc0Zha2UoYXN5bmMgKGlucHV0OiBzdHJpbmcpID0+IGBzZXNzaW9uLWVuYzoke3Bhc3N3b3JkfToke2VuY3J5cHRpb25WZXJzaW9ufToke2lucHV0fWApLFxuICAgICAgICBkZWNyeXB0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoJ3Nlc3Npb24tZGVjcnlwdGVkJyksXG4gICAgICAgIGRlc3Ryb3k6IHNpbm9uLnN0dWIoKSxcbiAgICAgIH0pKSxcbiAgICAgIGdldDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKSwgcXVlcnk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpIH0pLFxuICAgICAgcG9zdDogc2lub24uc3R1YigpLnJldHVybnMoeyBzZW5kOiBzaW5vbi5zdHViKCkucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHt9KSB9KSB9KSxcbiAgICAgIHB1dDogc2lub24uc3R1YigpLnJldHVybnMoe1xuICAgICAgICBzZW5kOiBzaW5vblxuICAgICAgICAgIC5zdHViKClcbiAgICAgICAgICAucmV0dXJucyh7IHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgYWNjZXB0ZWRXYWxsZXRTaGFyZXM6IFtdLCB3YWxsZXRTaGFyZVVwZGF0ZUVycm9yczogW10gfSkgfSksXG4gICAgICB9KSxcbiAgICAgIGdldEVDREhLZXljaGFpbjogc2lub24uc3R1YigpLnJlc29sdmVzKHsgZW5jcnlwdGVkWHBydjogJ2VuY1hwcnYnIH0pLFxuICAgICAgc2V0UmVxdWVzdFRyYWNlcjogc2lub24uc3R1YigpLFxuICAgICAgdXJsOiBzaW5vbi5zdHViKCkucmV0dXJucygnL3Rlc3QvdXJsJyksXG4gICAgfTtcblxuICAgIG1vY2tCYXNlQ29pbiA9IHtcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLnJldHVybnMobW9ja0tleWNoYWlucyksXG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKS5jYWxsc0Zha2UoKHBhdGg6IHN0cmluZykgPT4gcGF0aCksXG4gICAgICBnZXRGYW1pbHk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKCdidGMnKSxcbiAgICAgIGdldENoYWluOiBzaW5vbi5zdHViKCkucmV0dXJucygnYnRjJyksXG4gICAgICBzdXBwb3J0c1Rzczogc2lub24uc3R1YigpLnJldHVybnMoZmFsc2UpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKSxcbiAgICB9O1xuXG4gICAgd2FsbGV0cyA9IG5ldyBXYWxsZXRzKG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY2NlcHRTaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiAyIHRvIGVuY3J5cHQgb24gdGhlIG11bHRpVXNlcktleVJvdGF0aW9uUmVxdWlyZWQgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHtcbiAgICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10sXG4gICAgICAgICAgd2FsbGV0OiAnd2FsbGV0LWlkJyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0cy5hY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWQ6ICdzaGFyZS1pZCcsXG4gICAgICAgIHVzZXJQYXNzd29yZDogJ215LXBhc3N3b3JkJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZCwgJ2VuY3J5cHQgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQnKTtcbiAgICAgIGNvbnN0IGNhbGwgPSBtb2NrQml0R28uZW5jcnlwdC5maXJzdENhbGw7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdwYXNzZXMgZW5jcnlwdGlvblZlcnNpb246IHVuZGVmaW5lZCB3aGVuIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoe1xuICAgICAgICByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdXNlck11bHRpS2V5Um90YXRpb25SZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgICAgIHdhbGxldDogJ3dhbGxldC1pZCcsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkOiAnc2hhcmUtaWQnLFxuICAgICAgICB1c2VyUGFzc3dvcmQ6ICdteS1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0Lm9rKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmVuY3J5cHQuZmlyc3RDYWxsO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbiwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1bGtBY2NlcHRTaGFyZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB3YWxsZXRTaGFyZXNMaXN0ID0ge1xuICAgICAgaW5jb21pbmc6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc2hhcmUtaWQnLFxuICAgICAgICAgIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAga2V5Y2hhaW46IG51bGwsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBvdXRnb2luZzogW10sXG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHsgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMod2FsbGV0U2hhcmVzTGlzdCkgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncGFzc2VzIGVuY3J5cHRpb25WZXJzaW9uOiAyIHRvIHRoZSBlbmNyeXB0aW9uIHNlc3Npb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBbJ3NoYXJlLWlkJ10sXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2sobW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMV0sIDIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Bhc3NlcyBlbmNyeXB0aW9uVmVyc2lvbjogdW5kZWZpbmVkIHRvIHRoZSBlbmNyeXB0aW9uIHNlc3Npb24gd2hlbiBub3Qgc2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0cy5idWxrQWNjZXB0U2hhcmUoe1xuICAgICAgICB3YWxsZXRTaGFyZUlkczogWydzaGFyZS1pZCddLFxuICAgICAgICB1c2VyTG9naW5QYXNzd29yZDogJ2xvZ2luLXBhc3N3b3JkJyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQub2sobW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmNhbGxlZCk7XG4gICAgICBjb25zdCBjYWxsID0gbW9ja0JpdEdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uLmZpcnN0Q2FsbDtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMV0sIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJvY2Vzc2VzIHNoYXJlcyBpbiBiYXRjaGVzIG9mIDE2IHRvIGF2b2lkIFdBU00gbWVtb3J5IGV4aGF1c3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyAyMCBzaGFyZXMg4oaSIDIgYmF0Y2hlcyAoMTYgKyA0KSwgdmVyaWZ5aW5nIHRoZSBiYXRjaCBib3VuZGFyeSBpcyBjcm9zc2VkXG4gICAgICBjb25zdCBtYW55U2hhcmVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjAgfSwgKF8sIGkpID0+ICh7XG4gICAgICAgIGlkOiBgc2hhcmUtJHtpfWAsXG4gICAgICAgIHVzZXJNdWx0aUtleVJvdGF0aW9uUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGtleWNoYWluOiBudWxsLFxuICAgICAgICBwZXJtaXNzaW9uczogWydzcGVuZCddLFxuICAgICAgfSkpO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHtcbiAgICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpbmNvbWluZzogbWFueVNoYXJlcywgb3V0Z29pbmc6IFtdIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENhcHR1cmUgdGhlIHNlc3Npb24gc28gd2UgY2FuIGluc3BlY3QgaXRzIGVuY3J5cHQgY2FsbCBjb3VudFxuICAgICAgY29uc3Qgc2Vzc2lvbkVuY3J5cHRTdHViID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAoaW5wdXQ6IHN0cmluZykgPT4gYHNlc3Npb24tZW5jOiR7aW5wdXR9YCk7XG4gICAgICBtb2NrQml0R28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24gPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoe1xuICAgICAgICBlbmNyeXB0OiBzZXNzaW9uRW5jcnlwdFN0dWIsXG4gICAgICAgIGRlY3J5cHQ6IHNpbm9uLnN0dWIoKSxcbiAgICAgICAgZGVzdHJveTogc2lub24uc3R1YigpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldHMuYnVsa0FjY2VwdFNoYXJlKHtcbiAgICAgICAgd2FsbGV0U2hhcmVJZHM6IG1hbnlTaGFyZXMubWFwKChzKSA9PiBzLmlkKSxcbiAgICAgICAgdXNlckxvZ2luUGFzc3dvcmQ6ICdsb2dpbi1wYXNzd29yZCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2Vzc2lvbiBjcmVhdGVkIG9uY2UsIHNlc3Npb24uZW5jcnlwdCBjYWxsZWQgb25jZSBwZXIgc2hhcmVcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrQml0R28uY3JlYXRlRW5jcnlwdGlvblNlc3Npb24uY2FsbENvdW50LCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChzZXNzaW9uRW5jcnlwdFN0dWIuY2FsbENvdW50LCAyMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbmV2ZXIgcnVucyBtb3JlIHRoYW4gMTYgc2hhcmVzIGNvbmN1cnJlbnRseScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBpbkZsaWdodCA9IDA7XG4gICAgICBsZXQgbWF4SW5GbGlnaHQgPSAwO1xuXG4gICAgICBjb25zdCBzZXNzaW9uRW5jcnlwdFN0dWIgPSBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKCgpID0+IHtcbiAgICAgICAgaW5GbGlnaHQrKztcbiAgICAgICAgbWF4SW5GbGlnaHQgPSBNYXRoLm1heChtYXhJbkZsaWdodCwgaW5GbGlnaHQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCdlbmNyeXB0ZWQnKS50aGVuKChyKSA9PiB7XG4gICAgICAgICAgaW5GbGlnaHQtLTtcbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIG1vY2tCaXRHby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7XG4gICAgICAgIGVuY3J5cHQ6IHNlc3Npb25FbmNyeXB0U3R1YixcbiAgICAgICAgZGVjcnlwdDogc2lub24uc3R1YigpLFxuICAgICAgICBkZXN0cm95OiBzaW5vbi5zdHViKCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWFueVNoYXJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDIwIH0sIChfLCBpKSA9PiAoe1xuICAgICAgICBpZDogYHNoYXJlLSR7aX1gLFxuICAgICAgICB1c2VyTXVsdGlLZXlSb3RhdGlvblJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBrZXljaGFpbjogbnVsbCxcbiAgICAgICAgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSxcbiAgICAgIH0pKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyh7XG4gICAgICAgIHJlc3VsdDogc2lub24uc3R1YigpLnJlc29sdmVzKHsgaW5jb21pbmc6IG1hbnlTaGFyZXMsIG91dGdvaW5nOiBbXSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzLmJ1bGtBY2NlcHRTaGFyZSh7XG4gICAgICAgIHdhbGxldFNoYXJlSWRzOiBtYW55U2hhcmVzLm1hcCgocykgPT4gcy5pZCksXG4gICAgICAgIHVzZXJMb2dpblBhc3N3b3JkOiAnbG9naW4tcGFzc3dvcmQnLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtYXhJbkZsaWdodCA8PSAxNiwgYGV4cGVjdGVkIG1heCBjb25jdXJyZW5jeSA8PSAxNiwgZ290ICR7bWF4SW5GbGlnaHR9YCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoc2Vzc2lvbkVuY3J5cHRTdHViLmNhbGxDb3VudCwgMjApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2FsbGV0LnNoYXJlV2FsbGV0IC8gY3JlYXRlQnVsa1dhbGxldFNoYXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCB3YWxsZXQ6IFdhbGxldDtcbiAgICBsZXQgcmVjaXBpZW50UHViS2V5OiBzdHJpbmc7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlY2lwaWVudFB1YktleSA9IG1ha2VSYW5kb21LZXkoKS5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgbW9ja1dhbGxldERhdGEgPSB7XG4gICAgICAgIGlkOiAnd2FsbGV0LWlkJyxcbiAgICAgICAga2V5czogWydrZXktMScsICdrZXktMicsICdrZXktMyddLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHVzZXJzOiBbXSxcbiAgICAgICAgbXVsdGlzaWdUeXBlOiAnb25jaGFpbicsXG4gICAgICAgIHR5cGU6ICdob3QnLFxuICAgICAgfTtcbiAgICAgIG1vY2tCYXNlQ29pbi5zdXBwb3J0c1RzcyA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5nZXRNUENBbGdvcml0aG0gPSBzaW5vbi5zdHViKCkucmV0dXJucygnZWNkc2EnKTtcbiAgICAgIHdhbGxldCA9IG5ldyBXYWxsZXQobW9ja0JpdEdvLCBtb2NrQmFzZUNvaW4sIG1vY2tXYWxsZXREYXRhKTtcbiAgICB9KTtcblxuICAgIGl0KCdlbmNyeXB0UHJ2Rm9yVXNlciBlbmNyeXB0cyB0byB0aGUgRUNESCBzZWNyZXQgYXQgdGhlIGhpZ2gtZW50cm9weSB2ZXJzaW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgd2FsbGV0LmVuY3J5cHRQcnZGb3JVc2VyKCdwcnYnLCAncHViJywgcmVjaXBpZW50UHViS2V5LCAnbS8wJywgMik7XG5cbiAgICAgIGFzc2VydC5vayhtb2NrQml0R28uZW5jcnlwdC5jYWxsZWRPbmNlLCAnZW5jcnlwdCBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5lbmNyeXB0LmZpcnN0Q2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCBISUdIX0VOVFJPUFlfRU5DUllQVElPTl9WRVJTSU9OKTtcbiAgICB9KTtcblxuICAgIGl0KCdwcmVzZXJ2ZXMgdGhlIGVuY3J5cHRpb25WZXJzaW9uIHBvc2l0aW9uIGJlZm9yZSBhIHByZS1kZWNyeXB0ZWQga2V5Y2hhaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCB3YWxsZXQucHJlcGFyZVNoYXJlZEtleWNoYWluKHVuZGVmaW5lZCwgcmVjaXBpZW50UHViS2V5LCAnbS8wJywgMiwge1xuICAgICAgICBwcnY6ICdwcnYnLFxuICAgICAgICBwdWI6ICdwdWInLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChtb2NrQml0R28uZW5jcnlwdC5maXJzdENhbGwuYXJnc1swXS5pbnB1dCwgJ3BydicpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5lbmNyeXB0LmZpcnN0Q2FsbC5hcmdzWzBdLmVuY3J5cHRpb25WZXJzaW9uLCBISUdIX0VOVFJPUFlfRU5DUllQVElPTl9WRVJTSU9OKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaGFyZVdhbGxldCBpZ25vcmVzIGEgY2FsbGVyLXN1cHBsaWVkIGVuY3J5cHRpb25WZXJzaW9uIGZvciB0aGUgc2hhcmVkIGtleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24uc3R1Yih3YWxsZXQsICdnZXREZWNyeXB0ZWRLZXljaGFpbkZvclNoYXJpbmcnKS5yZXNvbHZlcyh7IHBydjogJ3BydicsIHB1YjogJ3B1YicgfSk7XG4gICAgICBtb2NrQml0R28uZ2V0U2hhcmluZ0tleSA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IHVzZXJJZDogJ3VzZXItaWQnLCBwdWJrZXk6IHJlY2lwaWVudFB1YktleSwgcGF0aDogJ20vMCcgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7fSkgfSkgfSk7XG5cbiAgICAgIGF3YWl0IHdhbGxldC5zaGFyZVdhbGxldCh7XG4gICAgICAgIGVtYWlsOiAndGVzdEB0ZXN0LmNvbScsXG4gICAgICAgIHBlcm1pc3Npb25zOiAnc3BlbmQnLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiAncGFzc3BocmFzZScsXG4gICAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAyLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5vayhtb2NrQml0R28uZW5jcnlwdC5jYWxsZWRPbmNlLCAnZW5jcnlwdCBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKFxuICAgICAgICBtb2NrQml0R28uZW5jcnlwdC5maXJzdENhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgSElHSF9FTlRST1BZX0VOQ1JZUFRJT05fVkVSU0lPTixcbiAgICAgICAgJ3RoZSBFQ0RILWtleWVkIHNoYXJlIG11c3Qgbm90IGJlIGVuY3J5cHRlZCBhdCB0aGUgY2FsbGVyLXJlcXVlc3RlZCB2ZXJzaW9uJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdjcmVhdGVCdWxrV2FsbGV0U2hhcmUgaWdub3JlcyBhIGNhbGxlci1zdXBwbGllZCBlbmNyeXB0aW9uVmVyc2lvbiBmb3IgZXZlcnkgc2hhcmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ2dldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZycpLnJlc29sdmVzKHsgcHJ2OiAncHJ2JywgcHViOiAncHViJyB9KTtcbiAgICAgIHNpbm9uLnN0dWIod2FsbGV0LCAnY3JlYXRlQnVsa0tleVNoYXJlcycpLnJlc29sdmVzKHsgc2hhcmVzOiBbXSB9KTtcblxuICAgICAgYXdhaXQgd2FsbGV0LmNyZWF0ZUJ1bGtXYWxsZXRTaGFyZSh7XG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICdwYXNzcGhyYXNlJyxcbiAgICAgICAga2V5U2hhcmVPcHRpb25zOiBbXG4gICAgICAgICAgeyB1c2VySWQ6ICd1c2VyLTEnLCBwdWJLZXk6IHJlY2lwaWVudFB1YktleSwgcGF0aDogJ20vMCcsIHBlcm1pc3Npb25zOiBbJ3NwZW5kJ10gfSxcbiAgICAgICAgICB7IHVzZXJJZDogJ3VzZXItMicsIHB1YktleTogcmVjaXBpZW50UHViS2V5LCBwYXRoOiAnbS8xJywgcGVybWlzc2lvbnM6IFsnc3BlbmQnXSB9LFxuICAgICAgICBdLFxuICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMixcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja0JpdEdvLmVuY3J5cHQuY2FsbENvdW50LCAyLCAnZWFjaCByZWNpcGllbnQgZ2V0cyBpdHMgb3duIGVuY3J5cHRpb24nKTtcbiAgICAgIGZvciAoY29uc3QgY2FsbCBvZiBtb2NrQml0R28uZW5jcnlwdC5nZXRDYWxscygpKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjYWxsLmFyZ3NbMF0uZW5jcnlwdGlvblZlcnNpb24sIEhJR0hfRU5UUk9QWV9FTkNSWVBUSU9OX1ZFUlNJT04pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2FsbGV0cy5nZW5lcmF0ZVdhbGxldCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgna2VlcHMgaHVtYW4tcGFzc3BocmFzZSBlbmNyeXB0aW9uIGF0IHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBhbmQgcGlucyByZWNvdmVyeSBlbmNyeXB0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0tleWNoYWlucy5jcmVhdGVCYWNrdXAgPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ2JhY2t1cC1rZXktaWQnLCBwdWI6ICdiYWNrdXAtcHViJyB9KTtcbiAgICAgIG1vY2tLZXljaGFpbnMuY3JlYXRlQml0R28gPSBzaW5vbi5zdHViKCkucmVzb2x2ZXMoeyBpZDogJ2JpdGdvLWtleS1pZCcsIHB1YjogJ2JpdGdvLXB1YicgfSk7XG4gICAgICBtb2NrQml0R28ucG9zdC5yZXR1cm5zKHsgc2VuZDogc2lub24uc3R1YigpLnJldHVybnMoeyByZXN1bHQ6IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyh7IGlkOiAnd2FsbGV0LWlkJyB9KSB9KSB9KTtcbiAgICAgIG1vY2tCYXNlQ29pbi5nZXREZWZhdWx0TXVsdGlzaWdUeXBlID0gc2lub24uc3R1YigpLnJldHVybnMoJ29uY2hhaW4nKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5pc0VWTSA9IHNpbm9uLnN0dWIoKS5yZXR1cm5zKGZhbHNlKTtcbiAgICAgIG1vY2tCYXNlQ29pbi5pc1ZhbGlkTW9mTlNldHVwID0gc2lub24uc3R1YigpLnJldHVybnModHJ1ZSk7XG4gICAgICBtb2NrQmFzZUNvaW4uc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0ID0gc2lub24uc3R1YigpLmNhbGxzRmFrZShhc3luYyAocGFyYW1zOiB1bmtub3duKSA9PiBwYXJhbXMpO1xuICAgICAgbW9ja0Jhc2VDb2luLnNpZ25NZXNzYWdlID0gc2lub24uc3R1YigpLnJlc29sdmVzKEJ1ZmZlci5mcm9tKCdhYWJiY2MnLCAnaGV4JykpO1xuXG4gICAgICBhd2FpdCB3YWxsZXRzLmdlbmVyYXRlV2FsbGV0KHtcbiAgICAgICAgbGFiZWw6ICdUZXN0IFdhbGxldCcsXG4gICAgICAgIHBhc3NwaHJhc2U6ICd3YWxsZXQtcGFzc3BocmFzZScsXG4gICAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6ICdyZWNvdmVyeS1jb2RlJyxcbiAgICAgICAgZW5jcnlwdGlvblZlcnNpb246IDIsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5lbmNyeXB0LmNhbGxDb3VudCwgMik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwobW9ja0JpdEdvLmVuY3J5cHQuZmlyc3RDYWxsLmFyZ3NbMF0uZW5jcnlwdGlvblZlcnNpb24sIDIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKG1vY2tCaXRHby5lbmNyeXB0LnNlY29uZENhbGwuYXJnc1swXS5lbmNyeXB0aW9uVmVyc2lvbiwgSElHSF9FTlRST1BZX0VOQ1JZUFRJT05fVkVSU0lPTik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=