@bitgo-beta/sdk-coin-sol 7.6.4-beta.613 → 7.6.4-beta.615

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 (76) hide show
  1. package/dist/cjs/src/lib/constants.d.ts +21 -2
  2. package/dist/cjs/src/lib/constants.d.ts.map +1 -1
  3. package/dist/cjs/src/lib/constants.js +22 -2
  4. package/dist/cjs/src/lib/iface.d.ts +59 -2
  5. package/dist/cjs/src/lib/iface.d.ts.map +1 -1
  6. package/dist/cjs/src/lib/iface.js +1 -1
  7. package/dist/cjs/src/lib/index.d.ts +1 -0
  8. package/dist/cjs/src/lib/index.d.ts.map +1 -1
  9. package/dist/cjs/src/lib/index.js +6 -2
  10. package/dist/cjs/src/lib/instructionParamsFactory.d.ts +2 -1
  11. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -1
  12. package/dist/cjs/src/lib/instructionParamsFactory.js +42 -1
  13. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -1
  14. package/dist/cjs/src/lib/solInstructionFactory.js +60 -20
  15. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  16. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  17. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  18. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts +27 -1
  19. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -1
  20. package/dist/cjs/src/lib/tokenTransferBuilder.js +44 -3
  21. package/dist/cjs/src/lib/transferBuilderV2.d.ts +27 -1
  22. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -1
  23. package/dist/cjs/src/lib/transferBuilderV2.js +44 -3
  24. package/dist/cjs/src/lib/utils.d.ts.map +1 -1
  25. package/dist/cjs/src/lib/utils.js +4 -1
  26. package/dist/cjs/src/sol.d.ts +58 -2
  27. package/dist/cjs/src/sol.d.ts.map +1 -1
  28. package/dist/cjs/src/sol.js +90 -1
  29. package/dist/cjs/test/unit/sol.js +248 -1
  30. package/dist/cjs/test/unit/solInstructionFactory.js +127 -17
  31. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  32. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  33. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  34. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +100 -1
  35. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  36. package/dist/esm/lib/constants.d.ts +21 -2
  37. package/dist/esm/lib/constants.d.ts.map +1 -1
  38. package/dist/esm/lib/constants.js +21 -1
  39. package/dist/esm/lib/iface.d.ts +59 -2
  40. package/dist/esm/lib/iface.d.ts.map +1 -1
  41. package/dist/esm/lib/iface.js +1 -1
  42. package/dist/esm/lib/index.d.ts +1 -0
  43. package/dist/esm/lib/index.d.ts.map +1 -1
  44. package/dist/esm/lib/index.js +2 -1
  45. package/dist/esm/lib/instructionParamsFactory.d.ts +2 -1
  46. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -1
  47. package/dist/esm/lib/instructionParamsFactory.js +41 -1
  48. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -1
  49. package/dist/esm/lib/solInstructionFactory.js +61 -21
  50. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  51. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  52. package/dist/esm/lib/token2022Resolve.js +194 -0
  53. package/dist/esm/lib/tokenTransferBuilder.d.ts +27 -1
  54. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -1
  55. package/dist/esm/lib/tokenTransferBuilder.js +44 -3
  56. package/dist/esm/lib/transferBuilderV2.d.ts +27 -1
  57. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -1
  58. package/dist/esm/lib/transferBuilderV2.js +44 -3
  59. package/dist/esm/lib/utils.d.ts.map +1 -1
  60. package/dist/esm/lib/utils.js +5 -2
  61. package/dist/esm/sol.d.ts +58 -2
  62. package/dist/esm/sol.d.ts.map +1 -1
  63. package/dist/esm/sol.js +90 -1
  64. package/package.json +7 -7
  65. package/dist/cjs/src/config/token2022StaticConfig.d.ts +0 -3
  66. package/dist/cjs/src/config/token2022StaticConfig.d.ts.map +0 -1
  67. package/dist/cjs/src/config/token2022StaticConfig.js +0 -50
  68. package/dist/cjs/src/lib/token2022Config.d.ts +0 -44
  69. package/dist/cjs/src/lib/token2022Config.d.ts.map +0 -1
  70. package/dist/cjs/src/lib/token2022Config.js +0 -27
  71. package/dist/esm/config/token2022StaticConfig.d.ts +0 -3
  72. package/dist/esm/config/token2022StaticConfig.d.ts.map +0 -1
  73. package/dist/esm/config/token2022StaticConfig.js +0 -47
  74. package/dist/esm/lib/token2022Config.d.ts +0 -44
  75. package/dist/esm/lib/token2022Config.d.ts.map +0 -1
  76. package/dist/esm/lib/token2022Config.js +0 -23
@@ -0,0 +1,252 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ require("should");
37
+ const spl_token_1 = require("@solana/spl-token");
38
+ const web3_js_1 = require("@solana/web3.js");
39
+ const constants_1 = require("../../src/lib/constants");
40
+ const token2022Resolve_1 = require("../../src/lib/token2022Resolve");
41
+ const resources = __importStar(require("../resources/sol"));
42
+ const makeConnection = (accounts) => {
43
+ const fetch = async (address) => {
44
+ const account = accounts[address];
45
+ if (!account) {
46
+ return null;
47
+ }
48
+ return {
49
+ executable: false,
50
+ owner: new web3_js_1.PublicKey(account.owner),
51
+ lamports: 1,
52
+ data: account.data,
53
+ rentEpoch: 0,
54
+ };
55
+ };
56
+ return (0, token2022Resolve_1.buildSolAccountConnection)(fetch);
57
+ };
58
+ // Token-2022 mint account layout: 82-byte base MintLayout, padded to the 165-byte
59
+ // account size, an account-type byte (1 = Mint), then the extension TLV. TransferHook
60
+ // is extension type 14 with 64 bytes (authority + programId).
61
+ const buildMintWithTransferHook = (mintDecimals, hookProgram) => {
62
+ const data = Buffer.alloc(234);
63
+ data.writeUInt8(mintDecimals, 44); // MintLayout.decimals
64
+ data.writeUInt8(1, 45); // MintLayout.isInitialized
65
+ data.writeUInt8(1, 165); // AccountType.Mint
66
+ data.writeUInt16LE(14, 166); // extension type: TransferHook
67
+ data.writeUInt16LE(64, 168); // extension length
68
+ hookProgram.toBuffer().copy(data, 202); // programId occupies [202, 234)
69
+ return data;
70
+ };
71
+ // Plain SPL/Token-2022 mint with no extensions (base MintLayout only).
72
+ const buildBaseMint = (mintDecimals) => {
73
+ const data = Buffer.alloc(82);
74
+ data.writeUInt8(mintDecimals, 44);
75
+ data.writeUInt8(1, 45);
76
+ return data;
77
+ };
78
+ // MintConfig layout: u8 discriminator, u8 bump, bool thaw, bool freeze, pubkey mint(32),
79
+ // pubkey freezeAuthority(32), pubkey gatingProgram(32). Total 100 bytes.
80
+ const buildMintConfig = (mint, enablePermissionlessThaw, gateProgram) => {
81
+ const data = Buffer.alloc(100);
82
+ data.writeUInt8(1, 0); // discriminator
83
+ data.writeUInt8(255, 1); // bump
84
+ data.writeUInt8(enablePermissionlessThaw ? 1 : 0, 2);
85
+ data.writeUInt8(0, 3); // enablePermissionlessFreeze
86
+ mint.toBuffer().copy(data, 4);
87
+ new web3_js_1.PublicKey(constants_1.TOKEN_ACL_PROGRAM_ID).toBuffer().copy(data, 36); // freezeAuthority
88
+ gateProgram.toBuffer().copy(data, 68);
89
+ return data;
90
+ };
91
+ // ExtraAccountMetaList account: u64 discriminator + u32 length + u32 count, then 35-byte
92
+ // ExtraAccountMeta entries (discriminator 0 = fixed address).
93
+ const buildExtraAccountMetaList = (metas) => {
94
+ const headerSize = 16;
95
+ const data = Buffer.alloc(headerSize + metas.length * 35);
96
+ data.writeUInt32LE(4 + metas.length * 35, 8); // length
97
+ data.writeUInt32LE(metas.length, 12); // count
98
+ let offset = headerSize;
99
+ for (const meta of metas) {
100
+ data.writeUInt8(0, offset); // discriminator: fixed address
101
+ new web3_js_1.PublicKey(meta.pubkey).toBuffer().copy(data, offset + 1); // addressConfig
102
+ data.writeUInt8(meta.isSigner ? 1 : 0, offset + 33);
103
+ data.writeUInt8(meta.isWritable ? 1 : 0, offset + 34);
104
+ offset += 35;
105
+ }
106
+ return data;
107
+ };
108
+ describe('token2022Resolve (standalone)', () => {
109
+ const mintAddress = resources.sol2022TokenTransfers.mint;
110
+ const sourceAddress = resources.associatedTokenAccountsForSol2022.accounts[0].ata;
111
+ const destinationAddress = resources.sol2022TokenTransfers.source;
112
+ const ownerAddress = resources.sol2022TokenTransfers.owner;
113
+ const decimals = 6;
114
+ // Arbitrary but valid base58 pubkeys used purely as fixtures.
115
+ const hookProgramId = new web3_js_1.PublicKey('GbQ8ZiEFzGGTeYoXwtZtcoxwPcMyUcmZDduMVNdUPKpX');
116
+ describe('resolveTransferHookAccounts', () => {
117
+ const extraMetas = [
118
+ { pubkey: '98wFF5MpMjMQbfDF2MPzo8LCGX37unZR1ohRA1mU9GmJ', isSigner: false, isWritable: true },
119
+ { pubkey: '48n7YGEww7fKMfJ5gJ3sQC3rM6RWGjpUsghqVfXVkR5A', isSigner: false, isWritable: false },
120
+ { pubkey: '9sQhAH7vV3RKTCK13VY4EiNjs3qBq1srSYxdNufdAAXm', isSigner: false, isWritable: false },
121
+ ];
122
+ it('resolves the ordered extra accounts for a mint with a transfer hook', async function () {
123
+ const validationStatePubkey = (0, spl_token_1.getExtraAccountMetaAddress)(new web3_js_1.PublicKey(mintAddress), hookProgramId);
124
+ const connection = makeConnection({
125
+ [mintAddress]: {
126
+ data: buildMintWithTransferHook(decimals, hookProgramId),
127
+ owner: spl_token_1.TOKEN_2022_PROGRAM_ID.toBase58(),
128
+ },
129
+ [validationStatePubkey.toBase58()]: {
130
+ data: buildExtraAccountMetaList(extraMetas),
131
+ owner: hookProgramId.toBase58(),
132
+ },
133
+ });
134
+ const result = await (0, token2022Resolve_1.resolveTransferHookAccounts)(connection, {
135
+ mint: mintAddress,
136
+ source: sourceAddress,
137
+ destination: destinationAddress,
138
+ owner: ownerAddress,
139
+ amount: '500000',
140
+ });
141
+ // extra accounts, then the hook program, then the validation state account
142
+ result.should.have.length(extraMetas.length + 2);
143
+ result.slice(0, extraMetas.length).should.deepEqual(extraMetas);
144
+ result[extraMetas.length].should.deepEqual({
145
+ pubkey: hookProgramId.toBase58(),
146
+ isSigner: false,
147
+ isWritable: false,
148
+ });
149
+ result[extraMetas.length + 1].should.deepEqual({
150
+ pubkey: validationStatePubkey.toBase58(),
151
+ isSigner: false,
152
+ isWritable: false,
153
+ });
154
+ });
155
+ it('returns an empty array for a mint without a transfer hook', async function () {
156
+ const connection = makeConnection({
157
+ [mintAddress]: {
158
+ data: buildBaseMint(decimals),
159
+ owner: spl_token_1.TOKEN_2022_PROGRAM_ID.toBase58(),
160
+ },
161
+ });
162
+ const result = await (0, token2022Resolve_1.resolveTransferHookAccounts)(connection, {
163
+ mint: mintAddress,
164
+ source: sourceAddress,
165
+ destination: destinationAddress,
166
+ owner: ownerAddress,
167
+ amount: '500000',
168
+ });
169
+ result.should.deepEqual([]);
170
+ });
171
+ it('returns an empty array when the mint account is not found', async function () {
172
+ const connection = makeConnection({});
173
+ const result = await (0, token2022Resolve_1.resolveTransferHookAccounts)(connection, {
174
+ mint: mintAddress,
175
+ source: sourceAddress,
176
+ destination: destinationAddress,
177
+ owner: ownerAddress,
178
+ amount: '500000',
179
+ });
180
+ result.should.deepEqual([]);
181
+ });
182
+ });
183
+ describe('resolvePermissionlessThaw', () => {
184
+ const tokenAccount = resources.associatedTokenAccountsForSol2022.accounts[0].ata;
185
+ const tokenAccountOwner = resources.sol2022TokenTransfers.owner;
186
+ const authority = resources.sol2022TokenTransfers.source;
187
+ const gatingProgram = new web3_js_1.PublicKey('GbQ8ZiEFzGGTeYoXwtZtcoxwPcMyUcmZDduMVNdUPKpX');
188
+ const tokenAclProgramId = new web3_js_1.PublicKey(constants_1.TOKEN_ACL_PROGRAM_ID);
189
+ const extraMetas = [
190
+ { pubkey: '98wFF5MpMjMQbfDF2MPzo8LCGX37unZR1ohRA1mU9GmJ', isSigner: false, isWritable: true },
191
+ { pubkey: '9sQhAH7vV3RKTCK13VY4EiNjs3qBq1srSYxdNufdAAXm', isSigner: false, isWritable: false },
192
+ ];
193
+ const [mintConfigPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_ACL_MINT_CONFIG_SEED), new web3_js_1.PublicKey(mintAddress).toBuffer()], tokenAclProgramId);
194
+ const [flagAccountPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_ACL_FLAG_ACCOUNT_SEED), new web3_js_1.PublicKey(tokenAccount).toBuffer()], tokenAclProgramId);
195
+ const [thawExtraMetasPda] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.TOKEN_ACL_THAW_EXTRA_METAS_SEED), new web3_js_1.PublicKey(mintAddress).toBuffer()], gatingProgram);
196
+ it('resolves the thaw params for a Token ACL mint with permissionless thaw enabled', async function () {
197
+ const connection = makeConnection({
198
+ [mintConfigPda.toBase58()]: {
199
+ data: buildMintConfig(new web3_js_1.PublicKey(mintAddress), true, gatingProgram),
200
+ owner: constants_1.TOKEN_ACL_PROGRAM_ID,
201
+ },
202
+ [thawExtraMetasPda.toBase58()]: {
203
+ data: buildExtraAccountMetaList(extraMetas),
204
+ owner: gatingProgram.toBase58(),
205
+ },
206
+ });
207
+ const result = await (0, token2022Resolve_1.resolvePermissionlessThaw)(connection, {
208
+ mint: mintAddress,
209
+ tokenAccount,
210
+ tokenAccountOwner,
211
+ authority,
212
+ });
213
+ result.applicable.should.be.true();
214
+ result.gatingProgram.should.equal(gatingProgram.toBase58());
215
+ result.flagAccount.should.equal(flagAccountPda.toBase58());
216
+ result.mintConfig.should.equal(mintConfigPda.toBase58());
217
+ result.tokenProgram.should.equal(spl_token_1.TOKEN_2022_PROGRAM_ID.toBase58());
218
+ result.systemProgram.should.equal(web3_js_1.SystemProgram.programId.toBase58());
219
+ // extra accounts = [thawExtraMetas, ...resolved fixed-address extras]
220
+ result.extraAccounts.should.deepEqual([
221
+ { pubkey: thawExtraMetasPda.toBase58(), isSigner: false, isWritable: false },
222
+ ...extraMetas,
223
+ ]);
224
+ });
225
+ it('returns applicable:false for a mint with no Token ACL MintConfig', async function () {
226
+ const connection = makeConnection({});
227
+ const result = await (0, token2022Resolve_1.resolvePermissionlessThaw)(connection, {
228
+ mint: mintAddress,
229
+ tokenAccount,
230
+ tokenAccountOwner,
231
+ authority,
232
+ });
233
+ result.should.deepEqual({ applicable: false });
234
+ });
235
+ it('returns applicable:false when permissionless thaw is disabled', async function () {
236
+ const connection = makeConnection({
237
+ [mintConfigPda.toBase58()]: {
238
+ data: buildMintConfig(new web3_js_1.PublicKey(mintAddress), false, gatingProgram),
239
+ owner: constants_1.TOKEN_ACL_PROGRAM_ID,
240
+ },
241
+ });
242
+ const result = await (0, token2022Resolve_1.resolvePermissionlessThaw)(connection, {
243
+ mint: mintAddress,
244
+ tokenAccount,
245
+ tokenAccountOwner,
246
+ authority,
247
+ });
248
+ result.should.deepEqual({ applicable: false });
249
+ });
250
+ });
251
+ });
252
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4yMDIyUmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90b2tlbjIwMjJSZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0JBQWdCO0FBRWhCLGlEQUFzRjtBQUN0Riw2Q0FBdUU7QUFFdkUsdURBS2lDO0FBRWpDLHFFQUt3QztBQUN4Qyw0REFBOEM7QUFLOUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxRQUFxQyxFQUFjLEVBQUU7SUFDM0UsTUFBTSxLQUFLLEdBQXNCLEtBQUssRUFBRSxPQUFlLEVBQUUsRUFBRTtRQUN6RCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTztZQUNMLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLEtBQUssRUFBRSxJQUFJLG1CQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNuQyxRQUFRLEVBQUUsQ0FBQztZQUNYLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixTQUFTLEVBQUUsQ0FBQztTQUNiLENBQUM7SUFDSixDQUFDLENBQUM7SUFDRixPQUFPLElBQUEsNENBQXlCLEVBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBRUYsa0ZBQWtGO0FBQ2xGLHNGQUFzRjtBQUN0Riw4REFBOEQ7QUFDOUQsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLFlBQW9CLEVBQUUsV0FBc0IsRUFBVSxFQUFFO0lBQ3pGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7SUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQywyQkFBMkI7SUFDbkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7SUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQywrQkFBK0I7SUFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7SUFDaEQsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7SUFDeEUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRix1RUFBdUU7QUFDdkUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxZQUFvQixFQUFVLEVBQUU7SUFDckQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGLHlGQUF5RjtBQUN6Rix5RUFBeUU7QUFDekUsTUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFlLEVBQUUsd0JBQWlDLEVBQUUsV0FBc0IsRUFBVSxFQUFFO0lBQzdHLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0I7SUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO0lBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCO0lBQ3BELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLElBQUksbUJBQVMsQ0FBQyxnQ0FBb0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7SUFDakYsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEMsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRix5RkFBeUY7QUFDekYsOERBQThEO0FBQzlELE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxLQUF5QixFQUFVLEVBQUU7SUFDdEUsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0lBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVE7SUFDOUMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDO0lBQ3hCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywrQkFBK0I7UUFDM0QsSUFBSSxtQkFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtRQUM5RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0RCxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUYsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtJQUM3QyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDO0lBQ3pELE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2xGLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQztJQUNsRSxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDO0lBQzNELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNuQiw4REFBOEQ7SUFDOUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBUyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFFcEYsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtRQUMzQyxNQUFNLFVBQVUsR0FBdUI7WUFDckMsRUFBRSxNQUFNLEVBQUUsOENBQThDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1lBQzdGLEVBQUUsTUFBTSxFQUFFLDhDQUE4QyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRTtZQUM5RixFQUFFLE1BQU0sRUFBRSw4Q0FBOEMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUU7U0FDL0YsQ0FBQztRQUVGLEVBQUUsQ0FBQyxxRUFBcUUsRUFBRSxLQUFLO1lBQzdFLE1BQU0scUJBQXFCLEdBQUcsSUFBQSxzQ0FBMEIsRUFBQyxJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDcEcsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDO2dCQUNoQyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUNiLElBQUksRUFBRSx5QkFBeUIsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDO29CQUN4RCxLQUFLLEVBQUUsaUNBQXFCLENBQUMsUUFBUSxFQUFFO2lCQUN4QztnQkFDRCxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7b0JBQ2xDLElBQUksRUFBRSx5QkFBeUIsQ0FBQyxVQUFVLENBQUM7b0JBQzNDLEtBQUssRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFO2lCQUNoQzthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSw4Q0FBMkIsRUFBQyxVQUFVLEVBQUU7Z0JBQzNELElBQUksRUFBRSxXQUFXO2dCQUNqQixNQUFNLEVBQUUsYUFBYTtnQkFDckIsV0FBVyxFQUFFLGtCQUFrQjtnQkFDL0IsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLE1BQU0sRUFBRSxRQUFRO2FBQ2pCLENBQUMsQ0FBQztZQUVILDJFQUEyRTtZQUMzRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3pDLE1BQU0sRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFO2dCQUNoQyxRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsS0FBSzthQUNsQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM3QyxNQUFNLEVBQUUscUJBQXFCLENBQUMsUUFBUSxFQUFFO2dCQUN4QyxRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsS0FBSzthQUNsQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyREFBMkQsRUFBRSxLQUFLO1lBQ25FLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQztnQkFDaEMsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDYixJQUFJLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQztvQkFDN0IsS0FBSyxFQUFFLGlDQUFxQixDQUFDLFFBQVEsRUFBRTtpQkFDeEM7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsOENBQTJCLEVBQUMsVUFBVSxFQUFFO2dCQUMzRCxJQUFJLEVBQUUsV0FBVztnQkFDakIsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLFdBQVcsRUFBRSxrQkFBa0I7Z0JBQy9CLEtBQUssRUFBRSxZQUFZO2dCQUNuQixNQUFNLEVBQUUsUUFBUTthQUNqQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyREFBMkQsRUFBRSxLQUFLO1lBQ25FLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUV0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsOENBQTJCLEVBQUMsVUFBVSxFQUFFO2dCQUMzRCxJQUFJLEVBQUUsV0FBVztnQkFDakIsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLFdBQVcsRUFBRSxrQkFBa0I7Z0JBQy9CLEtBQUssRUFBRSxZQUFZO2dCQUNuQixNQUFNLEVBQUUsUUFBUTthQUNqQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtRQUN6QyxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqRixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUM7UUFDaEUsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQztRQUN6RCxNQUFNLGFBQWEsR0FBRyxJQUFJLG1CQUFTLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNwRixNQUFNLGlCQUFpQixHQUFHLElBQUksbUJBQVMsQ0FBQyxnQ0FBb0IsQ0FBQyxDQUFDO1FBRTlELE1BQU0sVUFBVSxHQUF1QjtZQUNyQyxFQUFFLE1BQU0sRUFBRSw4Q0FBOEMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7WUFDN0YsRUFBRSxNQUFNLEVBQUUsOENBQThDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFO1NBQy9GLENBQUM7UUFFRixNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsbUJBQVMsQ0FBQyxzQkFBc0IsQ0FDdEQsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUEwQixDQUFDLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQ2hGLGlCQUFpQixDQUNsQixDQUFDO1FBQ0YsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLG1CQUFTLENBQUMsc0JBQXNCLENBQ3ZELENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBMkIsQ0FBQyxFQUFFLElBQUksbUJBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUNsRixpQkFBaUIsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLG1CQUFTLENBQUMsc0JBQXNCLENBQzFELENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywyQ0FBK0IsQ0FBQyxFQUFFLElBQUksbUJBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUNyRixhQUFhLENBQ2QsQ0FBQztRQUVGLEVBQUUsQ0FBQyxnRkFBZ0YsRUFBRSxLQUFLO1lBQ3hGLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQztnQkFDaEMsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRTtvQkFDMUIsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLG1CQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQztvQkFDdEUsS0FBSyxFQUFFLGdDQUFvQjtpQkFDNUI7Z0JBQ0QsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO29CQUM5QixJQUFJLEVBQUUseUJBQXlCLENBQUMsVUFBVSxDQUFDO29CQUMzQyxLQUFLLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRTtpQkFDaEM7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsNENBQXlCLEVBQUMsVUFBVSxFQUFFO2dCQUN6RCxJQUFJLEVBQUUsV0FBVztnQkFDakIsWUFBWTtnQkFDWixpQkFBaUI7Z0JBQ2pCLFNBQVM7YUFDVixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkMsTUFBTSxDQUFDLGFBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzdELE1BQU0sQ0FBQyxXQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUM1RCxNQUFNLENBQUMsVUFBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLFlBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFxQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDcEUsTUFBTSxDQUFDLGFBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDdkUsc0VBQXNFO1lBQ3RFLE1BQU0sQ0FBQyxhQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDckMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFO2dCQUM1RSxHQUFHLFVBQVU7YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrRUFBa0UsRUFBRSxLQUFLO1lBQzFFLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUV0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsNENBQXlCLEVBQUMsVUFBVSxFQUFFO2dCQUN6RCxJQUFJLEVBQUUsV0FBVztnQkFDakIsWUFBWTtnQkFDWixpQkFBaUI7Z0JBQ2pCLFNBQVM7YUFDVixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEtBQUs7WUFDdkUsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDO2dCQUNoQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO29CQUMxQixJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksbUJBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDO29CQUN2RSxLQUFLLEVBQUUsZ0NBQW9CO2lCQUM1QjthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSw0Q0FBeUIsRUFBQyxVQUFVLEVBQUU7Z0JBQ3pELElBQUksRUFBRSxXQUFXO2dCQUNqQixZQUFZO2dCQUNaLGlCQUFpQjtnQkFDakIsU0FBUzthQUNWLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzaG91bGQnO1xuXG5pbXBvcnQgeyBnZXRFeHRyYUFjY291bnRNZXRhQWRkcmVzcywgVE9LRU5fMjAyMl9QUk9HUkFNX0lEIH0gZnJvbSAnQHNvbGFuYS9zcGwtdG9rZW4nO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiwgUHVibGljS2V5LCBTeXN0ZW1Qcm9ncmFtIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcblxuaW1wb3J0IHtcbiAgVE9LRU5fQUNMX0ZMQUdfQUNDT1VOVF9TRUVELFxuICBUT0tFTl9BQ0xfTUlOVF9DT05GSUdfU0VFRCxcbiAgVE9LRU5fQUNMX1BST0dSQU1fSUQsXG4gIFRPS0VOX0FDTF9USEFXX0VYVFJBX01FVEFTX1NFRUQsXG59IGZyb20gJy4uLy4uL3NyYy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IEV4dHJhQWNjb3VudE1ldGEgfSBmcm9tICcuLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7XG4gIFNvbEFjY291bnRGZXRjaGVyLFxuICBidWlsZFNvbEFjY291bnRDb25uZWN0aW9uLFxuICByZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3LFxuICByZXNvbHZlVHJhbnNmZXJIb29rQWNjb3VudHMsXG59IGZyb20gJy4uLy4uL3NyYy9saWIvdG9rZW4yMDIyUmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyByZXNvdXJjZXMgZnJvbSAnLi4vcmVzb3VyY2VzL3NvbCc7XG5cbi8vIEJ1aWxkIGEgZmFrZSBgQ29ubmVjdGlvbmAgYmFja2VkIGJ5IGFuIGluLW1lbW9yeSBhZGRyZXNzLT5hY2NvdW50IG1hcCB2aWEgdGhlXG4vLyBwcm9kdWN0aW9uIGBidWlsZFNvbEFjY291bnRDb25uZWN0aW9uYCBzaGltIChhbHNvIGV4ZXJjaXNpbmcgdGhhdCBmYWN0b3J5KS5cbnR5cGUgRmFrZUFjY291bnQgPSB7IGRhdGE6IEJ1ZmZlcjsgb3duZXI6IHN0cmluZyB9O1xuY29uc3QgbWFrZUNvbm5lY3Rpb24gPSAoYWNjb3VudHM6IFJlY29yZDxzdHJpbmcsIEZha2VBY2NvdW50Pik6IENvbm5lY3Rpb24gPT4ge1xuICBjb25zdCBmZXRjaDogU29sQWNjb3VudEZldGNoZXIgPSBhc3luYyAoYWRkcmVzczogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYWNjb3VudCA9IGFjY291bnRzW2FkZHJlc3NdO1xuICAgIGlmICghYWNjb3VudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBleGVjdXRhYmxlOiBmYWxzZSxcbiAgICAgIG93bmVyOiBuZXcgUHVibGljS2V5KGFjY291bnQub3duZXIpLFxuICAgICAgbGFtcG9ydHM6IDEsXG4gICAgICBkYXRhOiBhY2NvdW50LmRhdGEsXG4gICAgICByZW50RXBvY2g6IDAsXG4gICAgfTtcbiAgfTtcbiAgcmV0dXJuIGJ1aWxkU29sQWNjb3VudENvbm5lY3Rpb24oZmV0Y2gpO1xufTtcblxuLy8gVG9rZW4tMjAyMiBtaW50IGFjY291bnQgbGF5b3V0OiA4Mi1ieXRlIGJhc2UgTWludExheW91dCwgcGFkZGVkIHRvIHRoZSAxNjUtYnl0ZVxuLy8gYWNjb3VudCBzaXplLCBhbiBhY2NvdW50LXR5cGUgYnl0ZSAoMSA9IE1pbnQpLCB0aGVuIHRoZSBleHRlbnNpb24gVExWLiBUcmFuc2Zlckhvb2tcbi8vIGlzIGV4dGVuc2lvbiB0eXBlIDE0IHdpdGggNjQgYnl0ZXMgKGF1dGhvcml0eSArIHByb2dyYW1JZCkuXG5jb25zdCBidWlsZE1pbnRXaXRoVHJhbnNmZXJIb29rID0gKG1pbnREZWNpbWFsczogbnVtYmVyLCBob29rUHJvZ3JhbTogUHVibGljS2V5KTogQnVmZmVyID0+IHtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygyMzQpO1xuICBkYXRhLndyaXRlVUludDgobWludERlY2ltYWxzLCA0NCk7IC8vIE1pbnRMYXlvdXQuZGVjaW1hbHNcbiAgZGF0YS53cml0ZVVJbnQ4KDEsIDQ1KTsgLy8gTWludExheW91dC5pc0luaXRpYWxpemVkXG4gIGRhdGEud3JpdGVVSW50OCgxLCAxNjUpOyAvLyBBY2NvdW50VHlwZS5NaW50XG4gIGRhdGEud3JpdGVVSW50MTZMRSgxNCwgMTY2KTsgLy8gZXh0ZW5zaW9uIHR5cGU6IFRyYW5zZmVySG9va1xuICBkYXRhLndyaXRlVUludDE2TEUoNjQsIDE2OCk7IC8vIGV4dGVuc2lvbiBsZW5ndGhcbiAgaG9va1Byb2dyYW0udG9CdWZmZXIoKS5jb3B5KGRhdGEsIDIwMik7IC8vIHByb2dyYW1JZCBvY2N1cGllcyBbMjAyLCAyMzQpXG4gIHJldHVybiBkYXRhO1xufTtcblxuLy8gUGxhaW4gU1BML1Rva2VuLTIwMjIgbWludCB3aXRoIG5vIGV4dGVuc2lvbnMgKGJhc2UgTWludExheW91dCBvbmx5KS5cbmNvbnN0IGJ1aWxkQmFzZU1pbnQgPSAobWludERlY2ltYWxzOiBudW1iZXIpOiBCdWZmZXIgPT4ge1xuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDgyKTtcbiAgZGF0YS53cml0ZVVJbnQ4KG1pbnREZWNpbWFscywgNDQpO1xuICBkYXRhLndyaXRlVUludDgoMSwgNDUpO1xuICByZXR1cm4gZGF0YTtcbn07XG5cbi8vIE1pbnRDb25maWcgbGF5b3V0OiB1OCBkaXNjcmltaW5hdG9yLCB1OCBidW1wLCBib29sIHRoYXcsIGJvb2wgZnJlZXplLCBwdWJrZXkgbWludCgzMiksXG4vLyBwdWJrZXkgZnJlZXplQXV0aG9yaXR5KDMyKSwgcHVia2V5IGdhdGluZ1Byb2dyYW0oMzIpLiBUb3RhbCAxMDAgYnl0ZXMuXG5jb25zdCBidWlsZE1pbnRDb25maWcgPSAobWludDogUHVibGljS2V5LCBlbmFibGVQZXJtaXNzaW9ubGVzc1RoYXc6IGJvb2xlYW4sIGdhdGVQcm9ncmFtOiBQdWJsaWNLZXkpOiBCdWZmZXIgPT4ge1xuICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEwMCk7XG4gIGRhdGEud3JpdGVVSW50OCgxLCAwKTsgLy8gZGlzY3JpbWluYXRvclxuICBkYXRhLndyaXRlVUludDgoMjU1LCAxKTsgLy8gYnVtcFxuICBkYXRhLndyaXRlVUludDgoZW5hYmxlUGVybWlzc2lvbmxlc3NUaGF3ID8gMSA6IDAsIDIpO1xuICBkYXRhLndyaXRlVUludDgoMCwgMyk7IC8vIGVuYWJsZVBlcm1pc3Npb25sZXNzRnJlZXplXG4gIG1pbnQudG9CdWZmZXIoKS5jb3B5KGRhdGEsIDQpO1xuICBuZXcgUHVibGljS2V5KFRPS0VOX0FDTF9QUk9HUkFNX0lEKS50b0J1ZmZlcigpLmNvcHkoZGF0YSwgMzYpOyAvLyBmcmVlemVBdXRob3JpdHlcbiAgZ2F0ZVByb2dyYW0udG9CdWZmZXIoKS5jb3B5KGRhdGEsIDY4KTtcbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vLyBFeHRyYUFjY291bnRNZXRhTGlzdCBhY2NvdW50OiB1NjQgZGlzY3JpbWluYXRvciArIHUzMiBsZW5ndGggKyB1MzIgY291bnQsIHRoZW4gMzUtYnl0ZVxuLy8gRXh0cmFBY2NvdW50TWV0YSBlbnRyaWVzIChkaXNjcmltaW5hdG9yIDAgPSBmaXhlZCBhZGRyZXNzKS5cbmNvbnN0IGJ1aWxkRXh0cmFBY2NvdW50TWV0YUxpc3QgPSAobWV0YXM6IEV4dHJhQWNjb3VudE1ldGFbXSk6IEJ1ZmZlciA9PiB7XG4gIGNvbnN0IGhlYWRlclNpemUgPSAxNjtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyhoZWFkZXJTaXplICsgbWV0YXMubGVuZ3RoICogMzUpO1xuICBkYXRhLndyaXRlVUludDMyTEUoNCArIG1ldGFzLmxlbmd0aCAqIDM1LCA4KTsgLy8gbGVuZ3RoXG4gIGRhdGEud3JpdGVVSW50MzJMRShtZXRhcy5sZW5ndGgsIDEyKTsgLy8gY291bnRcbiAgbGV0IG9mZnNldCA9IGhlYWRlclNpemU7XG4gIGZvciAoY29uc3QgbWV0YSBvZiBtZXRhcykge1xuICAgIGRhdGEud3JpdGVVSW50OCgwLCBvZmZzZXQpOyAvLyBkaXNjcmltaW5hdG9yOiBmaXhlZCBhZGRyZXNzXG4gICAgbmV3IFB1YmxpY0tleShtZXRhLnB1YmtleSkudG9CdWZmZXIoKS5jb3B5KGRhdGEsIG9mZnNldCArIDEpOyAvLyBhZGRyZXNzQ29uZmlnXG4gICAgZGF0YS53cml0ZVVJbnQ4KG1ldGEuaXNTaWduZXIgPyAxIDogMCwgb2Zmc2V0ICsgMzMpO1xuICAgIGRhdGEud3JpdGVVSW50OChtZXRhLmlzV3JpdGFibGUgPyAxIDogMCwgb2Zmc2V0ICsgMzQpO1xuICAgIG9mZnNldCArPSAzNTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn07XG5cbmRlc2NyaWJlKCd0b2tlbjIwMjJSZXNvbHZlIChzdGFuZGFsb25lKScsICgpID0+IHtcbiAgY29uc3QgbWludEFkZHJlc3MgPSByZXNvdXJjZXMuc29sMjAyMlRva2VuVHJhbnNmZXJzLm1pbnQ7XG4gIGNvbnN0IHNvdXJjZUFkZHJlc3MgPSByZXNvdXJjZXMuYXNzb2NpYXRlZFRva2VuQWNjb3VudHNGb3JTb2wyMDIyLmFjY291bnRzWzBdLmF0YTtcbiAgY29uc3QgZGVzdGluYXRpb25BZGRyZXNzID0gcmVzb3VyY2VzLnNvbDIwMjJUb2tlblRyYW5zZmVycy5zb3VyY2U7XG4gIGNvbnN0IG93bmVyQWRkcmVzcyA9IHJlc291cmNlcy5zb2wyMDIyVG9rZW5UcmFuc2ZlcnMub3duZXI7XG4gIGNvbnN0IGRlY2ltYWxzID0gNjtcbiAgLy8gQXJiaXRyYXJ5IGJ1dCB2YWxpZCBiYXNlNTggcHVia2V5cyB1c2VkIHB1cmVseSBhcyBmaXh0dXJlcy5cbiAgY29uc3QgaG9va1Byb2dyYW1JZCA9IG5ldyBQdWJsaWNLZXkoJ0diUThaaUVGekdHVGVZb1h3dFp0Y294d1BjTXlVY21aRGR1TVZOZFVQS3BYJyk7XG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVUcmFuc2Zlckhvb2tBY2NvdW50cycsICgpID0+IHtcbiAgICBjb25zdCBleHRyYU1ldGFzOiBFeHRyYUFjY291bnRNZXRhW10gPSBbXG4gICAgICB7IHB1YmtleTogJzk4d0ZGNU1wTWpNUWJmREYyTVB6bzhMQ0dYMzd1blpSMW9oUkExbVU5R21KJywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiB0cnVlIH0sXG4gICAgICB7IHB1YmtleTogJzQ4bjdZR0V3dzdmS01mSjVnSjNzUUMzck02UldHanBVc2docVZmWFZrUjVBJywgaXNTaWduZXI6IGZhbHNlLCBpc1dyaXRhYmxlOiBmYWxzZSB9LFxuICAgICAgeyBwdWJrZXk6ICc5c1FoQUg3dlYzUktUQ0sxM1ZZNEVpTmpzM3FCcTFzclNZeGROdWZkQUFYbScsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICBdO1xuXG4gICAgaXQoJ3Jlc29sdmVzIHRoZSBvcmRlcmVkIGV4dHJhIGFjY291bnRzIGZvciBhIG1pbnQgd2l0aCBhIHRyYW5zZmVyIGhvb2snLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uU3RhdGVQdWJrZXkgPSBnZXRFeHRyYUFjY291bnRNZXRhQWRkcmVzcyhuZXcgUHVibGljS2V5KG1pbnRBZGRyZXNzKSwgaG9va1Byb2dyYW1JZCk7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gbWFrZUNvbm5lY3Rpb24oe1xuICAgICAgICBbbWludEFkZHJlc3NdOiB7XG4gICAgICAgICAgZGF0YTogYnVpbGRNaW50V2l0aFRyYW5zZmVySG9vayhkZWNpbWFscywgaG9va1Byb2dyYW1JZCksXG4gICAgICAgICAgb3duZXI6IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b0Jhc2U1OCgpLFxuICAgICAgICB9LFxuICAgICAgICBbdmFsaWRhdGlvblN0YXRlUHVia2V5LnRvQmFzZTU4KCldOiB7XG4gICAgICAgICAgZGF0YTogYnVpbGRFeHRyYUFjY291bnRNZXRhTGlzdChleHRyYU1ldGFzKSxcbiAgICAgICAgICBvd25lcjogaG9va1Byb2dyYW1JZC50b0Jhc2U1OCgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVUcmFuc2Zlckhvb2tBY2NvdW50cyhjb25uZWN0aW9uLCB7XG4gICAgICAgIG1pbnQ6IG1pbnRBZGRyZXNzLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZUFkZHJlc3MsXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICAgIG93bmVyOiBvd25lckFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzUwMDAwMCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gZXh0cmEgYWNjb3VudHMsIHRoZW4gdGhlIGhvb2sgcHJvZ3JhbSwgdGhlbiB0aGUgdmFsaWRhdGlvbiBzdGF0ZSBhY2NvdW50XG4gICAgICByZXN1bHQuc2hvdWxkLmhhdmUubGVuZ3RoKGV4dHJhTWV0YXMubGVuZ3RoICsgMik7XG4gICAgICByZXN1bHQuc2xpY2UoMCwgZXh0cmFNZXRhcy5sZW5ndGgpLnNob3VsZC5kZWVwRXF1YWwoZXh0cmFNZXRhcyk7XG4gICAgICByZXN1bHRbZXh0cmFNZXRhcy5sZW5ndGhdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBwdWJrZXk6IGhvb2tQcm9ncmFtSWQudG9CYXNlNTgoKSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0W2V4dHJhTWV0YXMubGVuZ3RoICsgMV0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIHB1YmtleTogdmFsaWRhdGlvblN0YXRlUHVia2V5LnRvQmFzZTU4KCksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciBhIG1pbnQgd2l0aG91dCBhIHRyYW5zZmVyIGhvb2snLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gbWFrZUNvbm5lY3Rpb24oe1xuICAgICAgICBbbWludEFkZHJlc3NdOiB7XG4gICAgICAgICAgZGF0YTogYnVpbGRCYXNlTWludChkZWNpbWFscyksXG4gICAgICAgICAgb3duZXI6IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b0Jhc2U1OCgpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVUcmFuc2Zlckhvb2tBY2NvdW50cyhjb25uZWN0aW9uLCB7XG4gICAgICAgIG1pbnQ6IG1pbnRBZGRyZXNzLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZUFkZHJlc3MsXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbkFkZHJlc3MsXG4gICAgICAgIG93bmVyOiBvd25lckFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzUwMDAwMCcsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIG1pbnQgYWNjb3VudCBpcyBub3QgZm91bmQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gbWFrZUNvbm5lY3Rpb24oe30pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNvbHZlVHJhbnNmZXJIb29rQWNjb3VudHMoY29ubmVjdGlvbiwge1xuICAgICAgICBtaW50OiBtaW50QWRkcmVzcyxcbiAgICAgICAgc291cmNlOiBzb3VyY2VBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb25BZGRyZXNzLFxuICAgICAgICBvd25lcjogb3duZXJBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICc1MDAwMDAnLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbChbXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXNvbHZlUGVybWlzc2lvbmxlc3NUaGF3JywgKCkgPT4ge1xuICAgIGNvbnN0IHRva2VuQWNjb3VudCA9IHJlc291cmNlcy5hc3NvY2lhdGVkVG9rZW5BY2NvdW50c0ZvclNvbDIwMjIuYWNjb3VudHNbMF0uYXRhO1xuICAgIGNvbnN0IHRva2VuQWNjb3VudE93bmVyID0gcmVzb3VyY2VzLnNvbDIwMjJUb2tlblRyYW5zZmVycy5vd25lcjtcbiAgICBjb25zdCBhdXRob3JpdHkgPSByZXNvdXJjZXMuc29sMjAyMlRva2VuVHJhbnNmZXJzLnNvdXJjZTtcbiAgICBjb25zdCBnYXRpbmdQcm9ncmFtID0gbmV3IFB1YmxpY0tleSgnR2JROFppRUZ6R0dUZVlvWHd0WnRjb3h3UGNNeVVjbVpEZHVNVk5kVVBLcFgnKTtcbiAgICBjb25zdCB0b2tlbkFjbFByb2dyYW1JZCA9IG5ldyBQdWJsaWNLZXkoVE9LRU5fQUNMX1BST0dSQU1fSUQpO1xuXG4gICAgY29uc3QgZXh0cmFNZXRhczogRXh0cmFBY2NvdW50TWV0YVtdID0gW1xuICAgICAgeyBwdWJrZXk6ICc5OHdGRjVNcE1qTVFiZkRGMk1Qem84TENHWDM3dW5aUjFvaFJBMW1VOUdtSicsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBwdWJrZXk6ICc5c1FoQUg3dlYzUktUQ0sxM1ZZNEVpTmpzM3FCcTFzclNZeGROdWZkQUFYbScsIGlzU2lnbmVyOiBmYWxzZSwgaXNXcml0YWJsZTogZmFsc2UgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgW21pbnRDb25maWdQZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVE9LRU5fQUNMX01JTlRfQ09ORklHX1NFRUQpLCBuZXcgUHVibGljS2V5KG1pbnRBZGRyZXNzKS50b0J1ZmZlcigpXSxcbiAgICAgIHRva2VuQWNsUHJvZ3JhbUlkXG4gICAgKTtcbiAgICBjb25zdCBbZmxhZ0FjY291bnRQZGFdID0gUHVibGljS2V5LmZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoXG4gICAgICBbQnVmZmVyLmZyb20oVE9LRU5fQUNMX0ZMQUdfQUNDT1VOVF9TRUVEKSwgbmV3IFB1YmxpY0tleSh0b2tlbkFjY291bnQpLnRvQnVmZmVyKCldLFxuICAgICAgdG9rZW5BY2xQcm9ncmFtSWRcbiAgICApO1xuICAgIGNvbnN0IFt0aGF3RXh0cmFNZXRhc1BkYV0gPSBQdWJsaWNLZXkuZmluZFByb2dyYW1BZGRyZXNzU3luYyhcbiAgICAgIFtCdWZmZXIuZnJvbShUT0tFTl9BQ0xfVEhBV19FWFRSQV9NRVRBU19TRUVEKSwgbmV3IFB1YmxpY0tleShtaW50QWRkcmVzcykudG9CdWZmZXIoKV0sXG4gICAgICBnYXRpbmdQcm9ncmFtXG4gICAgKTtcblxuICAgIGl0KCdyZXNvbHZlcyB0aGUgdGhhdyBwYXJhbXMgZm9yIGEgVG9rZW4gQUNMIG1pbnQgd2l0aCBwZXJtaXNzaW9ubGVzcyB0aGF3IGVuYWJsZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gbWFrZUNvbm5lY3Rpb24oe1xuICAgICAgICBbbWludENvbmZpZ1BkYS50b0Jhc2U1OCgpXToge1xuICAgICAgICAgIGRhdGE6IGJ1aWxkTWludENvbmZpZyhuZXcgUHVibGljS2V5KG1pbnRBZGRyZXNzKSwgdHJ1ZSwgZ2F0aW5nUHJvZ3JhbSksXG4gICAgICAgICAgb3duZXI6IFRPS0VOX0FDTF9QUk9HUkFNX0lELFxuICAgICAgICB9LFxuICAgICAgICBbdGhhd0V4dHJhTWV0YXNQZGEudG9CYXNlNTgoKV06IHtcbiAgICAgICAgICBkYXRhOiBidWlsZEV4dHJhQWNjb3VudE1ldGFMaXN0KGV4dHJhTWV0YXMpLFxuICAgICAgICAgIG93bmVyOiBnYXRpbmdQcm9ncmFtLnRvQmFzZTU4KCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVBlcm1pc3Npb25sZXNzVGhhdyhjb25uZWN0aW9uLCB7XG4gICAgICAgIG1pbnQ6IG1pbnRBZGRyZXNzLFxuICAgICAgICB0b2tlbkFjY291bnQsXG4gICAgICAgIHRva2VuQWNjb3VudE93bmVyLFxuICAgICAgICBhdXRob3JpdHksXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0LmFwcGxpY2FibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJlc3VsdC5nYXRpbmdQcm9ncmFtIS5zaG91bGQuZXF1YWwoZ2F0aW5nUHJvZ3JhbS50b0Jhc2U1OCgpKTtcbiAgICAgIHJlc3VsdC5mbGFnQWNjb3VudCEuc2hvdWxkLmVxdWFsKGZsYWdBY2NvdW50UGRhLnRvQmFzZTU4KCkpO1xuICAgICAgcmVzdWx0Lm1pbnRDb25maWchLnNob3VsZC5lcXVhbChtaW50Q29uZmlnUGRhLnRvQmFzZTU4KCkpO1xuICAgICAgcmVzdWx0LnRva2VuUHJvZ3JhbSEuc2hvdWxkLmVxdWFsKFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b0Jhc2U1OCgpKTtcbiAgICAgIHJlc3VsdC5zeXN0ZW1Qcm9ncmFtIS5zaG91bGQuZXF1YWwoU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9CYXNlNTgoKSk7XG4gICAgICAvLyBleHRyYSBhY2NvdW50cyA9IFt0aGF3RXh0cmFNZXRhcywgLi4ucmVzb2x2ZWQgZml4ZWQtYWRkcmVzcyBleHRyYXNdXG4gICAgICByZXN1bHQuZXh0cmFBY2NvdW50cyEuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICAgIHsgcHVia2V5OiB0aGF3RXh0cmFNZXRhc1BkYS50b0Jhc2U1OCgpLCBpc1NpZ25lcjogZmFsc2UsIGlzV3JpdGFibGU6IGZhbHNlIH0sXG4gICAgICAgIC4uLmV4dHJhTWV0YXMsXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGFwcGxpY2FibGU6ZmFsc2UgZm9yIGEgbWludCB3aXRoIG5vIFRva2VuIEFDTCBNaW50Q29uZmlnJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IG1ha2VDb25uZWN0aW9uKHt9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVBlcm1pc3Npb25sZXNzVGhhdyhjb25uZWN0aW9uLCB7XG4gICAgICAgIG1pbnQ6IG1pbnRBZGRyZXNzLFxuICAgICAgICB0b2tlbkFjY291bnQsXG4gICAgICAgIHRva2VuQWNjb3VudE93bmVyLFxuICAgICAgICBhdXRob3JpdHksXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgYXBwbGljYWJsZTogZmFsc2UgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBhcHBsaWNhYmxlOmZhbHNlIHdoZW4gcGVybWlzc2lvbmxlc3MgdGhhdyBpcyBkaXNhYmxlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBtYWtlQ29ubmVjdGlvbih7XG4gICAgICAgIFttaW50Q29uZmlnUGRhLnRvQmFzZTU4KCldOiB7XG4gICAgICAgICAgZGF0YTogYnVpbGRNaW50Q29uZmlnKG5ldyBQdWJsaWNLZXkobWludEFkZHJlc3MpLCBmYWxzZSwgZ2F0aW5nUHJvZ3JhbSksXG4gICAgICAgICAgb3duZXI6IFRPS0VOX0FDTF9QUk9HUkFNX0lELFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmVQZXJtaXNzaW9ubGVzc1RoYXcoY29ubmVjdGlvbiwge1xuICAgICAgICBtaW50OiBtaW50QWRkcmVzcyxcbiAgICAgICAgdG9rZW5BY2NvdW50LFxuICAgICAgICB0b2tlbkFjY291bnRPd25lcixcbiAgICAgICAgYXV0aG9yaXR5LFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IGFwcGxpY2FibGU6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19