@1upmonster/duel 0.1.8 → 0.2.2

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 (186) hide show
  1. package/README.md +110 -59
  2. package/dist/admin.d.ts +25 -40
  3. package/dist/admin.js +93 -114
  4. package/dist/encryption.js +1 -2
  5. package/dist/generated/duel/accounts/index.d.ts +10 -0
  6. package/dist/generated/duel/accounts/index.js +11 -0
  7. package/dist/generated/duel/accounts/matchTicket.d.ts +38 -0
  8. package/dist/generated/duel/accounts/matchTicket.js +45 -0
  9. package/dist/generated/duel/accounts/queue.d.ts +42 -0
  10. package/dist/generated/duel/accounts/queue.js +45 -0
  11. package/dist/generated/duel/accounts/tenant.d.ts +41 -0
  12. package/dist/generated/duel/accounts/tenant.js +44 -0
  13. package/dist/generated/duel/errors/duel.d.ts +31 -0
  14. package/dist/generated/duel/errors/duel.js +35 -0
  15. package/dist/generated/duel/errors/index.d.ts +8 -0
  16. package/dist/generated/duel/errors/index.js +9 -0
  17. package/dist/generated/duel/index.d.ts +12 -0
  18. package/dist/generated/duel/index.js +13 -0
  19. package/dist/generated/duel/instructions/cancelTicket.d.ts +45 -0
  20. package/dist/generated/duel/instructions/cancelTicket.js +56 -0
  21. package/dist/generated/duel/instructions/closeTicket.d.ts +45 -0
  22. package/dist/generated/duel/instructions/closeTicket.js +56 -0
  23. package/dist/generated/duel/instructions/commitTickets.d.ts +39 -0
  24. package/dist/generated/duel/instructions/commitTickets.js +50 -0
  25. package/dist/generated/duel/instructions/createTicket.d.ts +48 -0
  26. package/dist/generated/duel/instructions/createTicket.js +63 -0
  27. package/dist/generated/duel/instructions/delegateQueue.d.ts +69 -0
  28. package/dist/generated/duel/instructions/delegateQueue.js +90 -0
  29. package/dist/generated/duel/instructions/delegateTicket.d.ts +69 -0
  30. package/dist/generated/duel/instructions/delegateTicket.js +90 -0
  31. package/dist/generated/duel/instructions/flushMatches.d.ts +37 -0
  32. package/dist/generated/duel/instructions/flushMatches.js +43 -0
  33. package/dist/generated/duel/instructions/index.d.ts +19 -0
  34. package/dist/generated/duel/instructions/index.js +20 -0
  35. package/dist/generated/duel/instructions/initializeQueue.d.ts +48 -0
  36. package/dist/generated/duel/instructions/initializeQueue.js +63 -0
  37. package/dist/generated/duel/instructions/initializeTenant.d.ts +70 -0
  38. package/dist/generated/duel/instructions/initializeTenant.js +67 -0
  39. package/dist/generated/duel/instructions/joinQueue.d.ts +51 -0
  40. package/dist/generated/duel/instructions/joinQueue.js +56 -0
  41. package/dist/generated/duel/instructions/processUndelegation.d.ts +43 -0
  42. package/dist/generated/duel/instructions/processUndelegation.js +49 -0
  43. package/dist/generated/duel/instructions/setupTicketPermission.d.ts +54 -0
  44. package/dist/generated/duel/instructions/setupTicketPermission.js +63 -0
  45. package/dist/generated/duel/programs/duel.d.ts +92 -0
  46. package/dist/generated/duel/programs/duel.js +146 -0
  47. package/dist/generated/duel/programs/index.d.ts +8 -0
  48. package/dist/generated/duel/programs/index.js +9 -0
  49. package/dist/generated/duel/types/accountType.d.ts +25 -0
  50. package/dist/generated/duel/types/accountType.js +25 -0
  51. package/dist/generated/duel/types/index.d.ts +13 -0
  52. package/dist/generated/duel/types/index.js +14 -0
  53. package/dist/generated/duel/types/matchEntry.d.ts +23 -0
  54. package/dist/generated/duel/types/matchEntry.js +18 -0
  55. package/dist/generated/duel/types/matchFound.d.ts +23 -0
  56. package/dist/generated/duel/types/matchFound.js +18 -0
  57. package/dist/generated/duel/types/pendingMatch.d.ts +21 -0
  58. package/dist/generated/duel/types/pendingMatch.js +18 -0
  59. package/dist/generated/duel/types/queueEntry.d.ts +19 -0
  60. package/dist/generated/duel/types/queueEntry.js +18 -0
  61. package/dist/generated/duel/types/ticketStatus.d.ts +40 -0
  62. package/dist/generated/duel/types/ticketStatus.js +25 -0
  63. package/dist/generated/rps-game/accounts/gameSession.d.ts +40 -0
  64. package/dist/generated/rps-game/accounts/gameSession.js +45 -0
  65. package/dist/generated/rps-game/accounts/index.d.ts +9 -0
  66. package/dist/generated/rps-game/accounts/index.js +10 -0
  67. package/dist/generated/rps-game/accounts/playerProfile.d.ts +36 -0
  68. package/dist/generated/rps-game/accounts/playerProfile.js +47 -0
  69. package/dist/generated/rps-game/errors/index.d.ts +8 -0
  70. package/dist/generated/rps-game/errors/index.js +9 -0
  71. package/dist/generated/rps-game/errors/rpsGame.d.ts +25 -0
  72. package/dist/generated/rps-game/errors/rpsGame.js +29 -0
  73. package/dist/generated/rps-game/index.d.ts +12 -0
  74. package/dist/generated/rps-game/index.js +13 -0
  75. package/dist/generated/rps-game/instructions/closePlayer.d.ts +45 -0
  76. package/dist/generated/rps-game/instructions/closePlayer.js +56 -0
  77. package/dist/generated/rps-game/instructions/delegatePda.d.ts +69 -0
  78. package/dist/generated/rps-game/instructions/delegatePda.js +90 -0
  79. package/dist/generated/rps-game/instructions/index.d.ts +16 -0
  80. package/dist/generated/rps-game/instructions/index.js +17 -0
  81. package/dist/generated/rps-game/instructions/initializePlayer.d.ts +48 -0
  82. package/dist/generated/rps-game/instructions/initializePlayer.js +63 -0
  83. package/dist/generated/rps-game/instructions/makeChoice.d.ts +44 -0
  84. package/dist/generated/rps-game/instructions/makeChoice.js +46 -0
  85. package/dist/generated/rps-game/instructions/onMatchFound.d.ts +43 -0
  86. package/dist/generated/rps-game/instructions/onMatchFound.js +45 -0
  87. package/dist/generated/rps-game/instructions/persistResults.d.ts +43 -0
  88. package/dist/generated/rps-game/instructions/persistResults.js +50 -0
  89. package/dist/generated/rps-game/instructions/processUndelegation.d.ts +43 -0
  90. package/dist/generated/rps-game/instructions/processUndelegation.js +49 -0
  91. package/dist/generated/rps-game/instructions/startGame.d.ts +54 -0
  92. package/dist/generated/rps-game/instructions/startGame.js +67 -0
  93. package/dist/generated/rps-game/instructions/startGameWithTicket.d.ts +57 -0
  94. package/dist/generated/rps-game/instructions/startGameWithTicket.js +67 -0
  95. package/dist/generated/rps-game/programs/index.d.ts +8 -0
  96. package/dist/generated/rps-game/programs/index.js +9 -0
  97. package/dist/generated/rps-game/programs/rpsGame.d.ts +78 -0
  98. package/dist/generated/rps-game/programs/rpsGame.js +118 -0
  99. package/dist/generated/rps-game/types/accountType.d.ts +34 -0
  100. package/dist/generated/rps-game/types/accountType.js +25 -0
  101. package/dist/generated/rps-game/types/choice.d.ts +17 -0
  102. package/dist/generated/rps-game/types/choice.js +25 -0
  103. package/dist/generated/rps-game/types/gameResult.d.ts +26 -0
  104. package/dist/generated/rps-game/types/gameResult.js +25 -0
  105. package/dist/generated/rps-game/types/index.d.ts +10 -0
  106. package/dist/generated/rps-game/types/index.js +11 -0
  107. package/dist/index.d.ts +2 -1
  108. package/dist/index.js +3 -2
  109. package/dist/player.d.ts +25 -46
  110. package/dist/player.js +81 -140
  111. package/dist/tee.d.ts +14 -0
  112. package/dist/tee.js +62 -0
  113. package/dist/transaction.d.ts +11 -0
  114. package/dist/transaction.js +50 -0
  115. package/dist/utils.d.ts +4 -4
  116. package/dist/utils.js +23 -8
  117. package/package.json +3 -6
  118. package/src/admin.ts +151 -161
  119. package/src/duel.json +66 -7
  120. package/src/encryption.ts +0 -3
  121. package/src/generated/duel/accounts/index.ts +11 -0
  122. package/src/generated/duel/accounts/matchTicket.ts +77 -0
  123. package/src/generated/duel/accounts/queue.ts +77 -0
  124. package/src/generated/duel/accounts/tenant.ts +76 -0
  125. package/src/generated/duel/errors/duel.ts +46 -0
  126. package/src/generated/duel/errors/index.ts +9 -0
  127. package/src/generated/duel/index.ts +13 -0
  128. package/src/generated/duel/instructions/cancelTicket.ts +100 -0
  129. package/src/generated/duel/instructions/closeTicket.ts +100 -0
  130. package/src/generated/duel/instructions/commitTickets.ts +84 -0
  131. package/src/generated/duel/instructions/createTicket.ts +109 -0
  132. package/src/generated/duel/instructions/delegateQueue.ts +157 -0
  133. package/src/generated/duel/instructions/delegateTicket.ts +157 -0
  134. package/src/generated/duel/instructions/flushMatches.ts +76 -0
  135. package/src/generated/duel/instructions/index.ts +20 -0
  136. package/src/generated/duel/instructions/initializeQueue.ts +109 -0
  137. package/src/generated/duel/instructions/initializeTenant.ts +126 -0
  138. package/src/generated/duel/instructions/joinQueue.ts +106 -0
  139. package/src/generated/duel/instructions/processUndelegation.ts +86 -0
  140. package/src/generated/duel/instructions/setupTicketPermission.ts +115 -0
  141. package/src/generated/duel/programs/duel.ts +108 -0
  142. package/src/generated/duel/programs/index.ts +9 -0
  143. package/src/generated/duel/types/accountType.ts +36 -0
  144. package/src/generated/duel/types/index.ts +14 -0
  145. package/src/generated/duel/types/matchEntry.ts +25 -0
  146. package/src/generated/duel/types/matchFound.ts +25 -0
  147. package/src/generated/duel/types/pendingMatch.ts +25 -0
  148. package/src/generated/duel/types/queueEntry.ts +25 -0
  149. package/src/generated/duel/types/ticketStatus.ts +38 -0
  150. package/src/generated/rps-game/accounts/gameSession.ts +77 -0
  151. package/src/generated/rps-game/accounts/index.ts +10 -0
  152. package/src/generated/rps-game/accounts/playerProfile.ts +80 -0
  153. package/src/generated/rps-game/errors/index.ts +9 -0
  154. package/src/generated/rps-game/errors/rpsGame.ts +40 -0
  155. package/src/generated/rps-game/index.ts +13 -0
  156. package/src/generated/rps-game/instructions/closePlayer.ts +100 -0
  157. package/src/generated/rps-game/instructions/delegatePda.ts +157 -0
  158. package/src/generated/rps-game/instructions/index.ts +17 -0
  159. package/src/generated/rps-game/instructions/initializePlayer.ts +109 -0
  160. package/src/generated/rps-game/instructions/makeChoice.ts +84 -0
  161. package/src/generated/rps-game/instructions/onMatchFound.ts +79 -0
  162. package/src/generated/rps-game/instructions/persistResults.ts +88 -0
  163. package/src/generated/rps-game/instructions/processUndelegation.ts +86 -0
  164. package/src/generated/rps-game/instructions/startGame.ts +118 -0
  165. package/src/generated/rps-game/instructions/startGameWithTicket.ts +121 -0
  166. package/src/generated/rps-game/programs/index.ts +9 -0
  167. package/src/generated/rps-game/programs/rpsGame.ts +95 -0
  168. package/src/generated/rps-game/types/accountType.ts +36 -0
  169. package/src/generated/rps-game/types/choice.ts +25 -0
  170. package/src/generated/rps-game/types/gameResult.ts +37 -0
  171. package/src/generated/rps-game/types/index.ts +11 -0
  172. package/src/index.ts +2 -1
  173. package/src/player.ts +129 -192
  174. package/src/{idl/private_matchmaking.json → rps_game.json} +547 -583
  175. package/src/tee.ts +79 -0
  176. package/src/transaction.ts +90 -0
  177. package/src/utils.ts +35 -20
  178. package/tsconfig.json +2 -2
  179. package/dist/client.d.ts +0 -54
  180. package/dist/client.js +0 -265
  181. package/dist/duel.json +0 -1207
  182. package/dist/private_matchmaking.json +0 -534
  183. package/dist/types.d.ts +0 -635
  184. package/dist/types.js +0 -2
  185. package/src/idl/private_matchmaking.ts +0 -1033
  186. package/src/types.ts +0 -300
package/README.md CHANGED
@@ -1,13 +1,8 @@
1
1
  # @1upmonster/duel
2
2
 
3
- TypeScript SDK for **Duel** - a privacy-focused matchmaking protocol on Solana using MagicBlock's Ephemeral Rollups (TEE).
3
+ TypeScript SDK for **Duel** a privacy-preserving matchmaking protocol on Solana using MagicBlock Ephemeral Rollups (TEE).
4
4
 
5
- ## Features
6
-
7
- - **Privacy-First**: Player ELO and queue status hidden in TEE
8
- - **Client-Side**: Players join queues directly from their wallets (no CPI required)
9
- - **Automatic Matching**: TEE processes matches based on ELO windows
10
- - **Easy Integration**: Simple SDK for both game owners and players
5
+ Built on [`@solana/kit`](https://github.com/anza-xyz/kit). No `@coral-xyz/anchor` or legacy `web3.js` dependency.
11
6
 
12
7
  ## Installation
13
8
 
@@ -17,85 +12,141 @@ npm install @1upmonster/duel
17
12
 
18
13
  ## Quick Start
19
14
 
20
- ### For Game Owners
21
-
22
- Initialize matchmaking infrastructure for your game:
15
+ ### For Game Owners (`MatchmakingAdmin`)
23
16
 
24
17
  ```typescript
25
18
  import { MatchmakingAdmin } from "@1upmonster/duel";
26
- import { AnchorProvider } from "@coral-xyz/anchor";
27
-
28
- const admin = new MatchmakingAdmin(provider);
29
-
30
- // 1. Initialize Tenant for your Game Program
31
- await admin.initializeTenant(gameProgramId, {
32
- authority, // optional, defaults to gameProgramId
33
- eloWindow: 200, // optional, default 100
34
- eloOffset: 40, // optional, default 40
35
- eloDataType: 'u16' // optional, default 'u16' (u8/u16/u32/u64)
19
+ import { createSolanaRpc, createKeyPairSignerFromBytes } from "@solana/kit";
20
+ import * as crypto from "crypto";
21
+
22
+ const rpc = createSolanaRpc("https://api.devnet.solana.com");
23
+ const signer = await createKeyPairSignerFromBytes(/* your keypair bytes */);
24
+ const admin = new MatchmakingAdmin(rpc, signer);
25
+
26
+ // 1. Initialize Tenant stores callback config on L1
27
+ const callbackDiscriminator = Array.from(
28
+ crypto.createHash("sha256").update("global:on_match_found").digest().slice(0, 8)
29
+ );
30
+ await admin.initializeTenant(YOUR_GAME_PROGRAM_ID, {
31
+ eloWindow: 100n, // max ELO diff for a match
32
+ eloOffset: 40, // byte offset of ELO in player account
33
+ eloDataType: "u64", // u8 | u16 | u32 | u64
34
+ callbackProgramId: YOUR_GAME_PROGRAM_ID,
35
+ callbackDiscriminator,
36
36
  });
37
37
 
38
- // 2. Initialize a Matchmaking Queue
39
- const tenantPda = admin.getTenantPda(authority);
38
+ // 2. Create and delegate queue to TEE
39
+ const authority = signer.address;
40
40
  await admin.initializeQueue(authority, tenantPda);
41
-
42
- // 3. Delegate to TEE Validator
43
41
  await admin.delegateQueue(authority, validatorPubkey);
44
- ```
45
-
46
- ### ELO Data Types
47
-
48
- The SDK supports different ELO data types to optimize storage:
49
- - `'u8'`: 0-255 (1 byte)
50
- - `'u16'`: 0-65,535 (2 bytes) **[DEFAULT]**
51
- - `'u32'`: 0-4,294,967,295 (4 bytes)
52
- - `'u64'`: 0-18,446,744,073,709,551,615 (8 bytes)
53
42
 
54
- ### For Players
43
+ // 3. After players have matched, flush opponent tickets + commit all to L1
44
+ await admin.resolveMatches(queuePda, tenantPda, [p1TicketPda, p2TicketPda]);
45
+ ```
55
46
 
56
- Join the private matchmaking queue:
47
+ ### For Players (`MatchmakingPlayer`)
57
48
 
58
49
  ```typescript
59
50
  import { MatchmakingPlayer } from "@1upmonster/duel";
60
-
61
- const player = new MatchmakingPlayer(provider);
62
-
63
- // Join queue (matching happens automatically in TEE)
64
- await player.joinQueue(queuePda, tenantPda, playerProfilePda);
51
+ import { getAuthToken } from "@1upmonster/duel";
52
+ import { createSolanaRpc } from "@solana/kit";
53
+
54
+ const l1Rpc = createSolanaRpc("https://api.devnet.solana.com");
55
+ const player = new MatchmakingPlayer(l1Rpc, signer);
56
+
57
+ // High-level: creates ticket on L1, delegates to TEE, joins queue in one call
58
+ const { token } = await getAuthToken("https://tee.magicblock.app", signer);
59
+ const teeRpc = createSolanaRpc(`https://tee.magicblock.app?token=${token}`);
60
+
61
+ const ticketPda = await player.enterQueue(
62
+ tenantPda,
63
+ queuePda,
64
+ playerProfilePda,
65
+ teeRpc,
66
+ `https://tee.magicblock.app?token=${token}`,
67
+ validatorPubkey, // optional TEE validator
68
+ YOUR_GAME_PROGRAM_ID, // optional: callback fires via Tenant PDA when matched
69
+ );
70
+
71
+ // Poll L1 until the ticket shows Matched status
72
+ const match = await player.pollForMatch(ticketPda);
73
+ // match = { opponent: Address, matchId: bigint }
65
74
  ```
66
75
 
67
76
  ## API Reference
68
77
 
69
78
  ### `MatchmakingAdmin`
70
79
 
71
- **Constructor**
72
- - `new MatchmakingAdmin(provider: AnchorProvider, programId?: PublicKey)`
80
+ **Constructor:** `new MatchmakingAdmin(rpc, signer, programId?)`
73
81
 
74
- **Methods**
75
- - `initializeTenant(authority, tenantProgramId, eloWindow?, eloOffset?)` - Set up game tenant
76
- - `initializeQueue(authority, tenant)` - Create matchmaking queue
77
- - `delegateQueue(authority, validator?)` - Delegate to TEE validator
78
- - `getTenantPda(authority)` - Derive tenant PDA
79
- - `getQueuePda(authority)` - Derive queue PDA
82
+ | Method | Description |
83
+ |---|---|
84
+ | `initializeTenant(tenantProgramId, options?)` | Create Tenant PDA with ELO config and optional callback |
85
+ | `initializeQueue(authority, tenant)` | Create Queue PDA linked to tenant |
86
+ | `delegateQueue(authority, validator?)` | Delegate queue to TEE (makes it private) |
87
+ | `flushMatches(queue, tenant, ticketPdas)` | Update opponent tickets from pending matches |
88
+ | `commitTickets(tenant, ticketPdas)` | Push matched ticket state back to L1 |
89
+ | `resolveMatches(queue, tenant, ticketPdas, settlementDelayMs?)` | High-level: flush + wait + commit |
90
+ | `getQueue(queuePda)` | Fetch queue account |
91
+ | `getQueuePda(authority)` | Derive queue PDA |
92
+ | `getTenantPda(authority)` | Derive tenant PDA |
80
93
 
81
94
  ### `MatchmakingPlayer`
82
95
 
83
- **Constructor**
84
- - `new MatchmakingPlayer(provider: AnchorProvider, programId?: PublicKey)`
96
+ **Constructor:** `new MatchmakingPlayer(rpc, signer, programId?)`
97
+
98
+ | Method | Description |
99
+ |---|---|
100
+ | `enterQueue(tenant, queue, playerData, teeRpc, teeUrlWithToken, validator?, callbackProgram?)` | High-level: create ticket → delegate → join queue |
101
+ | `createTicket(tenant)` | Create MatchTicket PDA on L1 |
102
+ | `delegateTicket(player, tenant, validator?)` | Delegate ticket to TEE |
103
+ | `joinQueue(queue, tenant, playerData, callbackProgram?)` | Join queue in TEE; callback fires via Tenant PDA on match |
104
+ | `cancelTicket(tenant)` | Cancel search (sets ticket to Cancelled) |
105
+ | `closeTicket(tenant)` | Reclaim rent after match or cancel |
106
+ | `pollForMatch(ticketPda, maxAttempts?, pollInterval?)` | Poll L1 until ticket is Matched |
107
+ | `getTicket(ticketPda)` | Fetch ticket account |
108
+ | `withRpc(teeUrl)` | Return a new client pointing at a different RPC |
109
+
110
+ ### `getAuthToken(rpcUrl, signer)`
111
+
112
+ Authenticate with the MagicBlock TEE. Returns `{ token, expiresAt }`. The token is passed as `?token=<jwt>` in the TEE RPC URL.
113
+
114
+ ### `waitUntilPermissionActive(teeUrlWithToken, pda)`
85
115
 
86
- **Methods**
87
- - `joinQueue(queue, tenant, playerData)` - Join matchmaking queue
116
+ Poll the TEE until a delegated PDA is active (authorized users list is non-empty).
88
117
 
89
- ## How It Works
118
+ ## How the Callback Works
119
+
120
+ When a match is found during `join_queue`, the duel program fires a CPI callback **signed by the Tenant PDA** via `invoke_signed`. This is cryptographically unforgeable — game programs can verify the signer is the Tenant PDA without any additional access control:
121
+
122
+ ```rust
123
+ pub fn on_match_found(
124
+ ctx: Context<OnMatchFound>,
125
+ player1: Pubkey,
126
+ player2: Pubkey,
127
+ match_id: u64,
128
+ ) -> Result<()> {
129
+ // ctx.accounts.signer.key() == Tenant PDA — verified by the runtime
130
+ // Only the duel program can produce this signer
131
+ Ok(())
132
+ }
133
+
134
+ #[derive(Accounts)]
135
+ pub struct OnMatchFound<'info> {
136
+ pub signer: Signer<'info>, // will be the Tenant PDA
137
+ }
138
+ ```
90
139
 
91
- 1. **Queue Joining**: Players call `joinQueue` directly via SDK
92
- 2. **Matching**: TEE automatically processes matches based on ELO windows
93
- 3. **Privacy**: Queue state is only visible within the TEE, not on L1
140
+ Pass the callback program as `remaining_accounts` in `joinQueue` (or via `callbackProgram` param in the SDK) for the callback to fire.
94
141
 
95
- ## Links
142
+ ## ELO Data Types
96
143
 
97
- - [GitHub Repository](https://github.com/val-samonte/private-matchmaking)
98
- - [Full Documentation](https://github.com/val-samonte/private-matchmaking#readme)
144
+ | Type | Bytes | Range |
145
+ |---|---|---|
146
+ | `"u8"` | 1 | 0–255 |
147
+ | `"u16"` | 2 | 0–65,535 |
148
+ | `"u32"` | 4 | 0–4,294,967,295 |
149
+ | `"u64"` | 8 | 0–18,446,744,073,709,551,615 |
99
150
 
100
151
  ## License
101
152
 
package/dist/admin.d.ts CHANGED
@@ -1,49 +1,34 @@
1
- import * as anchor from "@coral-xyz/anchor";
2
- import * as web3 from "@solana/web3.js";
3
- import type { Duel } from "./types.js";
4
- export type EloDataType = 'u8' | 'u16' | 'u32' | 'u64';
1
+ import { type Address, type TransactionSigner, type Rpc, type SolanaRpcApi } from "@solana/kit";
2
+ export type EloDataType = "u8" | "u16" | "u32" | "u64";
5
3
  export interface InitializeTenantOptions {
6
- authority?: web3.PublicKey;
7
- eloWindow?: number;
4
+ authority?: Address;
5
+ eloWindow?: bigint;
8
6
  eloOffset?: number;
9
7
  eloDataType?: EloDataType;
10
- callbackProgramId?: web3.PublicKey | null;
8
+ callbackProgramId?: Address | null;
11
9
  callbackDiscriminator?: number[] | null;
12
10
  }
13
11
  export declare class MatchmakingAdmin {
14
- program: anchor.Program<Duel>;
15
- provider: anchor.AnchorProvider;
16
- constructor(provider: anchor.AnchorProvider, programId: web3.PublicKey | string);
17
- getQueuePda(authority: web3.PublicKey): web3.PublicKey;
18
- getTenantPda(authority: web3.PublicKey): web3.PublicKey;
19
- getTicketPda(player: web3.PublicKey, tenant: web3.PublicKey): web3.PublicKey;
12
+ rpc: Rpc<SolanaRpcApi>;
13
+ signer: TransactionSigner;
14
+ programId: Address;
15
+ constructor(rpc: Rpc<SolanaRpcApi>, signer: TransactionSigner, programId?: Address);
16
+ getQueuePda(authority: Address): Promise<Address>;
17
+ getTenantPda(authority: Address): Promise<Address>;
18
+ getTicketPda(player: Address, tenant: Address): Promise<Address>;
19
+ getQueue(queuePda: Address): Promise<import("@solana/accounts").Account<import("./generated/duel/index.js").Queue, string>>;
20
+ initializeTenant(tenantProgramId: Address, options?: InitializeTenantOptions): Promise<string>;
21
+ initializeQueue(_authority: Address, tenant: Address): Promise<string>;
22
+ delegateQueue(authority: Address, validator?: Address): Promise<string>;
23
+ flushMatches(queue: Address, tenant: Address, ticketPdas: Address[]): Promise<string>;
24
+ commitTickets(tenant: Address, ticketPdas: Address[]): Promise<string>;
20
25
  /**
21
- * Fetch Queue account data
26
+ * High-level: full match resolution flow (runs on TEE).
27
+ * Reads the queue's pending matches, flushes them (updating opponent tickets),
28
+ * waits for TEE settlement, then commits all tickets back to L1.
29
+ * Use individual methods (flushMatches, commitTickets) as escape hatches if needed.
22
30
  */
23
- getQueue(queuePda: web3.PublicKey): Promise<any>;
24
- /**
25
- * Fetch Tenant account data
26
- */
27
- getTenant(tenantPda: web3.PublicKey): Promise<any>;
28
- /**
29
- * Initialize a Tenant (with optional callback config)
30
- */
31
- initializeTenant(tenantProgramId: web3.PublicKey, options?: InitializeTenantOptions, confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
32
- /**
33
- * Initialize a Queue
34
- */
35
- initializeQueue(authority: web3.PublicKey, tenant: web3.PublicKey, confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
36
- /**
37
- * Delegate Queue to TEE
38
- */
39
- delegateQueue(authority: web3.PublicKey, validator?: web3.PublicKey, confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
40
- /**
41
- * Flush pending matches - crank instruction to update opponent tickets
42
- * Can be called by any TEE-authenticated wallet (permissionless)
43
- */
44
- flushMatches(queue: web3.PublicKey, tenant: web3.PublicKey, ticketPdas: web3.PublicKey[], callbackProgram?: web3.PublicKey, confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
45
- /**
46
- * Commit matched tickets back to L1 (runs in TEE)
47
- */
48
- commitTickets(tenant: web3.PublicKey, ticketPdas: web3.PublicKey[], confirmOptions?: web3.ConfirmOptions, signers?: web3.Keypair[]): Promise<web3.TransactionSignature>;
31
+ resolveMatches(queue: Address, tenant: Address, ticketPdas: Address[], settlementDelayMs?: number): Promise<void>;
32
+ /** Create a new MatchmakingAdmin pointing at a TEE RPC endpoint. */
33
+ withRpc(teeUrl: string): MatchmakingAdmin;
49
34
  }
package/dist/admin.js CHANGED
@@ -1,137 +1,116 @@
1
- import * as anchor from "@coral-xyz/anchor";
2
- import { BN } from "bn.js";
3
- import * as web3 from "@solana/web3.js";
4
- import IDL from "./duel.json" with { type: "json" };
1
+ import { createSolanaRpc, } from "@solana/kit";
2
+ import { getInitializeTenantInstructionAsync, getInitializeQueueInstructionAsync, getDelegateQueueInstructionAsync, getFlushMatchesInstruction, getCommitTicketsInstruction, fetchQueue, accountType, } from "./generated/duel/index.js";
3
+ import { sendInstruction } from "./transaction.js";
5
4
  import * as utils from "./utils.js";
6
- const TICKET_SEED = "ticket";
7
5
  function getEloSize(dataType) {
8
6
  switch (dataType) {
9
- case 'u8': return 1;
10
- case 'u16': return 2;
11
- case 'u32': return 4;
12
- case 'u64': return 8;
7
+ case "u8": return 1;
8
+ case "u16": return 2;
9
+ case "u32": return 4;
10
+ case "u64": return 8;
13
11
  }
14
12
  }
13
+ const DUEL_PROGRAM_ID = "EdZzUwKd1X2ZWjxLPpz1cpEzMF7RUZC43Pq64v1VcK5X";
15
14
  export class MatchmakingAdmin {
16
- constructor(provider, programId) {
17
- const address = typeof programId === "string" ? programId : programId.toBase58();
18
- const idl = { ...IDL, address };
19
- this.program = new anchor.Program(idl, provider);
20
- this.provider = provider;
15
+ constructor(rpc, signer, programId = DUEL_PROGRAM_ID) {
16
+ this.rpc = rpc;
17
+ this.signer = signer;
18
+ this.programId = programId;
21
19
  }
22
- // Derive PDAs Helpers
23
- getQueuePda(authority) {
24
- return utils.deriveQueuePda(this.program.programId, authority);
20
+ async getQueuePda(authority) {
21
+ return utils.deriveQueuePda(this.programId, authority);
25
22
  }
26
- getTenantPda(authority) {
27
- return utils.deriveTenantPda(this.program.programId, authority);
23
+ async getTenantPda(authority) {
24
+ return utils.deriveTenantPda(this.programId, authority);
28
25
  }
29
- getTicketPda(player, tenant) {
30
- return utils.deriveTicketPda(this.program.programId, player, tenant);
26
+ async getTicketPda(player, tenant) {
27
+ return utils.deriveTicketPda(this.programId, player, tenant);
31
28
  }
32
- /**
33
- * Fetch Queue account data
34
- */
35
29
  async getQueue(queuePda) {
36
- return await this.program.account.queue.fetch(queuePda);
37
- }
38
- /**
39
- * Fetch Tenant account data
40
- */
41
- async getTenant(tenantPda) {
42
- return await this.program.account.tenant.fetch(tenantPda);
30
+ return fetchQueue(this.rpc, queuePda);
43
31
  }
44
- /**
45
- * Initialize a Tenant (with optional callback config)
46
- */
47
- async initializeTenant(tenantProgramId, options, confirmOptions, signers = []) {
48
- const { authority = tenantProgramId, eloWindow = 100, eloOffset = 40, eloDataType = 'u16', callbackProgramId = null, callbackDiscriminator = null, } = options || {};
32
+ async initializeTenant(tenantProgramId, options) {
33
+ const { eloWindow = 100n, eloOffset = 40, eloDataType = "u16", callbackProgramId = null, callbackDiscriminator = null, } = options || {};
49
34
  const eloSize = getEloSize(eloDataType);
50
- const tenantPda = this.getTenantPda(authority);
51
- return await this.program.methods
52
- .initializeTenant(tenantProgramId, eloOffset, eloSize, new BN(eloWindow), callbackProgramId || null, callbackDiscriminator ? Array.from(Buffer.from(callbackDiscriminator)) : null)
53
- .accountsPartial({
54
- tenant: tenantPda,
55
- authority: authority,
56
- })
57
- .signers(signers)
58
- .rpc(confirmOptions);
35
+ const ix = await getInitializeTenantInstructionAsync({
36
+ authority: this.signer,
37
+ tenantProgramId,
38
+ eloOffset,
39
+ eloSize,
40
+ eloWindow,
41
+ callbackProgramId: callbackProgramId ? { __option: "Some", value: callbackProgramId } : { __option: "None" },
42
+ callbackDiscriminator: callbackDiscriminator
43
+ ? { __option: "Some", value: new Uint8Array(callbackDiscriminator) }
44
+ : { __option: "None" },
45
+ }, { programAddress: this.programId });
46
+ return sendInstruction(this.rpc, ix, this.signer);
59
47
  }
60
- /**
61
- * Initialize a Queue
62
- */
63
- async initializeQueue(authority, tenant, confirmOptions, signers = []) {
64
- const queuePda = this.getQueuePda(authority);
65
- return await this.program.methods
66
- .initializeQueue()
67
- .accountsPartial({
68
- queue: queuePda,
69
- tenant: tenant,
70
- authority: authority,
71
- })
72
- .signers(signers)
73
- .rpc(confirmOptions);
48
+ async initializeQueue(_authority, tenant) {
49
+ const ix = await getInitializeQueueInstructionAsync({
50
+ authority: this.signer,
51
+ tenant,
52
+ }, { programAddress: this.programId });
53
+ return sendInstruction(this.rpc, ix, this.signer);
74
54
  }
75
- /**
76
- * Delegate Queue to TEE
77
- */
78
- async delegateQueue(authority, validator = new web3.PublicKey("FnE6VJT5QNZdedZPnCoLsARgBwoE6DeJNjBs2H1gySXA"), confirmOptions, signers = []) {
79
- const queuePda = this.getQueuePda(authority);
80
- return await this.program.methods
81
- .delegateQueue({ queue: { authority } })
82
- .accounts({
55
+ async delegateQueue(authority, validator) {
56
+ const queuePda = await this.getQueuePda(authority);
57
+ const ix = await getDelegateQueueInstructionAsync({
83
58
  pda: queuePda,
84
- payer: authority,
85
- validator: validator,
86
- })
87
- .signers(signers)
88
- .rpc(confirmOptions);
59
+ payer: this.signer,
60
+ validator,
61
+ accountType: accountType("Queue", { authority }),
62
+ }, { programAddress: this.programId });
63
+ return sendInstruction(this.rpc, ix, this.signer);
64
+ }
65
+ async flushMatches(queue, tenant, ticketPdas) {
66
+ const ix = getFlushMatchesInstruction({
67
+ queue,
68
+ tenant,
69
+ signer: this.signer,
70
+ }, { programAddress: this.programId });
71
+ const ixWithRemaining = {
72
+ ...ix,
73
+ accounts: [
74
+ ...ix.accounts,
75
+ ...ticketPdas.map((address) => ({ address, role: 1 })),
76
+ ],
77
+ };
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ return sendInstruction(this.rpc, ixWithRemaining, this.signer);
80
+ }
81
+ async commitTickets(tenant, ticketPdas) {
82
+ const ix = getCommitTicketsInstruction({
83
+ tenant,
84
+ payer: this.signer,
85
+ }, { programAddress: this.programId });
86
+ const ixWithRemaining = {
87
+ ...ix,
88
+ accounts: [
89
+ ...ix.accounts,
90
+ ...ticketPdas.map((address) => ({ address, role: 1 })),
91
+ ],
92
+ };
93
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
+ return sendInstruction(this.rpc, ixWithRemaining, this.signer);
89
95
  }
90
96
  /**
91
- * Flush pending matches - crank instruction to update opponent tickets
92
- * Can be called by any TEE-authenticated wallet (permissionless)
97
+ * High-level: full match resolution flow (runs on TEE).
98
+ * Reads the queue's pending matches, flushes them (updating opponent tickets),
99
+ * waits for TEE settlement, then commits all tickets back to L1.
100
+ * Use individual methods (flushMatches, commitTickets) as escape hatches if needed.
93
101
  */
94
- async flushMatches(queue, tenant, ticketPdas, callbackProgram, confirmOptions, signers = []) {
95
- const remainingAccounts = ticketPdas.map(pda => ({
96
- pubkey: pda,
97
- isSigner: false,
98
- isWritable: true,
99
- }));
100
- if (callbackProgram) {
101
- remainingAccounts.push({
102
- pubkey: callbackProgram,
103
- isSigner: false,
104
- isWritable: false,
105
- });
102
+ async resolveMatches(queue, tenant, ticketPdas, settlementDelayMs = 3000) {
103
+ const queueData = await this.getQueue(queue);
104
+ const pendingTicketPdas = await Promise.all(queueData.data.pendingMatches.map((pm) => utils.deriveTicketPda(this.programId, pm.player, tenant)));
105
+ if (pendingTicketPdas.length > 0) {
106
+ await this.flushMatches(queue, tenant, pendingTicketPdas);
107
+ await new Promise((r) => setTimeout(r, settlementDelayMs));
106
108
  }
107
- return await this.program.methods
108
- .flushMatches()
109
- .accountsPartial({
110
- queue: queue,
111
- tenant: tenant,
112
- signer: this.provider.publicKey,
113
- })
114
- .remainingAccounts(remainingAccounts)
115
- .signers(signers)
116
- .rpc(confirmOptions);
109
+ await this.commitTickets(tenant, ticketPdas);
117
110
  }
118
- /**
119
- * Commit matched tickets back to L1 (runs in TEE)
120
- */
121
- async commitTickets(tenant, ticketPdas, confirmOptions, signers = []) {
122
- return await this.program.methods
123
- .commitTickets()
124
- .accountsPartial({
125
- tenant: tenant,
126
- payer: this.provider.publicKey,
127
- })
128
- .remainingAccounts(ticketPdas.map(pda => ({
129
- pubkey: pda,
130
- isSigner: false,
131
- isWritable: true,
132
- })))
133
- .signers(signers)
134
- .rpc(confirmOptions);
111
+ /** Create a new MatchmakingAdmin pointing at a TEE RPC endpoint. */
112
+ withRpc(teeUrl) {
113
+ return new MatchmakingAdmin(createSolanaRpc(teeUrl), this.signer, this.programId);
135
114
  }
136
115
  }
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWRtaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxJQUFJLE1BQU0saUJBQWlCLENBQUM7QUFFeEMsT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQWE3QixTQUFTLFVBQVUsQ0FBQyxRQUFxQjtJQUN2QyxRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsS0FBSyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixLQUFLLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JCLEtBQUssS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLE9BQU8sZ0JBQWdCO0lBSTNCLFlBQVksUUFBK0IsRUFBRSxTQUFrQztRQUM3RSxNQUFNLE9BQU8sR0FBRyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pGLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFD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LENBQUMsU0FBUztTQUNoQyxDQUFDO2FBQ0QsaUJBQWlCLENBQUMsaUJBQWlCLENBQUM7YUFDcEMsT0FBTyxDQUFDLE9BQU8sQ0FBQzthQUNoQixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FDakIsTUFBc0IsRUFDdEIsVUFBNEIsRUFDNUIsY0FBb0MsRUFDcEMsVUFBMEIsRUFBRTtRQUU1QixPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQzlCLGFBQWEsRUFBRTthQUNmLGVBQWUsQ0FBQztZQUNmLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUztTQUMvQixDQUFDO2FBQ0QsaUJBQWlCLENBQ2hCLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsUUFBUSxFQUFFLEtBQUs7WUFDZixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUMsQ0FDSjthQUNBLE9BQU8sQ0FBQyxPQUFPLENBQUM7YUFDaEIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFuY2hvciBmcm9tIFwiQGNvcmFsLXh5ei9hbmNob3JcIjtcbmltcG9ydCB7IEJOIH0gZnJvbSBcImJuLmpzXCI7XG5pbXBvcnQgKiBhcyB3ZWIzIGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbmltcG9ydCB0eXBlIHsgRHVlbCB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5pbXBvcnQgSURMIGZyb20gXCIuL2R1ZWwuanNvblwiIHdpdGggeyB0eXBlOiBcImpzb25cIiB9O1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSBcIi4vdXRpbHMuanNcIjtcblxuY29uc3QgVElDS0VUX1NFRUQgPSBcInRpY2tldFwiO1xuXG5leHBvcnQgdHlwZSBFbG9EYXRhVHlwZSA9ICd1OCcgfCAndTE2JyB8ICd1MzInIHwgJ3U2NCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6ZVRlbmFudE9wdGlvbnMge1xuICBhdXRob3JpdHk/OiB3ZWIzLlB1YmxpY0tleTtcbiAgZWxvV2luZG93PzogbnVtYmVyO1xuICBlbG9PZmZzZXQ/OiBudW1iZXI7XG4gIGVsb0RhdGFUeXBlPzogRWxvRGF0YVR5cGU7XG4gIGNhbGxiYWNrUHJvZ3JhbUlkPzogd2ViMy5QdWJsaWNLZXkgfCBudWxsO1xuICBjYWxsYmFja0Rpc2NyaW1pbmF0b3I/OiBudW1iZXJbXSB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEVsb1NpemUoZGF0YVR5cGU6IEVsb0RhdGFUeXBlKTogbnVtYmVyIHtcbiAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgIGNhc2UgJ3U4JzogcmV0dXJuIDE7XG4gICAgY2FzZSAndTE2JzogcmV0dXJuIDI7XG4gICAgY2FzZSAndTMyJzogcmV0dXJuIDQ7XG4gICAgY2FzZSAndTY0JzogcmV0dXJuIDg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdGNobWFraW5nQWRtaW4ge1xuICBwdWJsaWMgcHJvZ3JhbTogYW5jaG9yLlByb2dyYW08RHVlbD47XG4gIHB1YmxpYyBwcm92aWRlcjogYW5jaG9yLkFuY2hvclByb3ZpZGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3ZpZGVyOiBhbmNob3IuQW5jaG9yUHJvdmlkZXIsIHByb2dyYW1JZDogd2ViMy5QdWJsaWNLZXkgfCBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRyZXNzID0gdHlwZW9mIHByb2dyYW1JZCA9PT0gXCJzdHJpbmdcIiA/IHByb2dyYW1JZCA6IHByb2dyYW1JZC50b0Jhc2U1OCgpO1xuICAgIGNvbnN0IGlkbCA9IHsgLi4uSURMLCBhZGRyZXNzIH07XG4gICAgdGhpcy5wcm9ncmFtID0gbmV3IGFuY2hvci5Qcm9ncmFtKGlkbCBhcyBhbnksIHByb3ZpZGVyKTtcbiAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gIH1cblxuICAvLyBEZXJpdmUgUERBcyBIZWxwZXJzXG4gIGdldFF1ZXVlUGRhKGF1dGhvcml0eTogd2ViMy5QdWJsaWNLZXkpOiB3ZWIzLlB1YmxpY0tleSB7XG4gICAgcmV0dXJuIHV0aWxzLmRlcml2ZVF1ZXVlUGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGF1dGhvcml0eSk7XG4gIH1cblxuICBnZXRUZW5hbnRQZGEoYXV0aG9yaXR5OiB3ZWIzLlB1YmxpY0tleSk6IHdlYjMuUHVibGljS2V5IHtcbiAgICByZXR1cm4gdXRpbHMuZGVyaXZlVGVuYW50UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIGF1dGhvcml0eSk7XG4gIH1cblxuICBnZXRUaWNrZXRQZGEocGxheWVyOiB3ZWIzLlB1YmxpY0tleSwgdGVuYW50OiB3ZWIzLlB1YmxpY0tleSk6IHdlYjMuUHVibGljS2V5IHtcbiAgICByZXR1cm4gdXRpbHMuZGVyaXZlVGlja2V0UGRhKHRoaXMucHJvZ3JhbS5wcm9ncmFtSWQsIHBsYXllciwgdGVuYW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBRdWV1ZSBhY2NvdW50IGRhdGFcbiAgICovXG4gIGFzeW5jIGdldFF1ZXVlKHF1ZXVlUGRhOiB3ZWIzLlB1YmxpY0tleSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5hY2NvdW50LnF1ZXVlLmZldGNoKHF1ZXVlUGRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBUZW5hbnQgYWNjb3VudCBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRUZW5hbnQodGVuYW50UGRhOiB3ZWIzLlB1YmxpY0tleSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5hY2NvdW50LnRlbmFudC5mZXRjaCh0ZW5hbnRQZGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBUZW5hbnQgKHdpdGggb3B0aW9uYWwgY2FsbGJhY2sgY29uZmlnKVxuICAgKi9cbiAgYXN5bmMgaW5pdGlhbGl6ZVRlbmFudChcbiAgICB0ZW5hbnRQcm9ncmFtSWQ6IHdlYjMuUHVibGljS2V5LFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXplVGVuYW50T3B0aW9ucyxcbiAgICBjb25maXJtT3B0aW9ucz86IHdlYjMuQ29uZmlybU9wdGlvbnMsXG4gICAgc2lnbmVyczogd2ViMy5LZXlwYWlyW10gPSBbXVxuICApOiBQcm9taXNlPHdlYjMuVHJhbnNhY3Rpb25TaWduYXR1cmU+IHtcbiAgICBjb25zdCB7XG4gICAgICBhdXRob3JpdHkgPSB0ZW5hbnRQcm9ncmFtSWQsXG4gICAgICBlbG9XaW5kb3cgPSAxMDAsXG4gICAgICBlbG9PZmZzZXQgPSA0MCxcbiAgICAgIGVsb0RhdGFUeXBlID0gJ3UxNicsXG4gICAgICBjYWxsYmFja1Byb2dyYW1JZCA9IG51bGwsXG4gICAgICBjYWxsYmFja0Rpc2NyaW1pbmF0b3IgPSBudWxsLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZWxvU2l6ZSA9IGdldEVsb1NpemUoZWxvRGF0YVR5cGUpO1xuICAgIGNvbnN0IHRlbmFudFBkYSA9IHRoaXMuZ2V0VGVuYW50UGRhKGF1dGhvcml0eSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgIC5pbml0aWFsaXplVGVuYW50KFxuICAgICAgICB0ZW5hbnRQcm9ncmFtSWQsXG4gICAgICAgIGVsb09mZnNldCxcbiAgICAgICAgZWxvU2l6ZSxcbiAgICAgICAgbmV3IEJOKGVsb1dpbmRvdyksXG4gICAgICAgIGNhbGxiYWNrUHJvZ3JhbUlkIHx8IG51bGwsXG4gICAgICAgIGNhbGxiYWNrRGlzY3JpbWluYXRvciA/IEFycmF5LmZyb20oQnVmZmVyLmZyb20oY2FsbGJhY2tEaXNjcmltaW5hdG9yKSkgOiBudWxsXG4gICAgICApXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRQZGEsXG4gICAgICAgIGF1dGhvcml0eTogYXV0aG9yaXR5LFxuICAgICAgfSlcbiAgICAgIC5zaWduZXJzKHNpZ25lcnMpXG4gICAgICAucnBjKGNvbmZpcm1PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgUXVldWVcbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemVRdWV1ZShcbiAgICBhdXRob3JpdHk6IHdlYjMuUHVibGljS2V5LFxuICAgIHRlbmFudDogd2ViMy5QdWJsaWNLZXksXG4gICAgY29uZmlybU9wdGlvbnM/OiB3ZWIzLkNvbmZpcm1PcHRpb25zLFxuICAgIHNpZ25lcnM6IHdlYjMuS2V5cGFpcltdID0gW11cbiAgKTogUHJvbWlzZTx3ZWIzLlRyYW5zYWN0aW9uU2lnbmF0dXJlPiB7XG4gICAgY29uc3QgcXVldWVQZGEgPSB0aGlzLmdldFF1ZXVlUGRhKGF1dGhvcml0eSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvZ3JhbS5tZXRob2RzXG4gICAgICAuaW5pdGlhbGl6ZVF1ZXVlKClcbiAgICAgIC5hY2NvdW50c1BhcnRpYWwoe1xuICAgICAgICBxdWV1ZTogcXVldWVQZGEsXG4gICAgICAgIHRlbmFudDogdGVuYW50LFxuICAgICAgICBhdXRob3JpdHk6IGF1dGhvcml0eSxcbiAgICAgIH0pXG4gICAgICAuc2lnbmVycyhzaWduZXJzKVxuICAgICAgLnJwYyhjb25maXJtT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZWdhdGUgUXVldWUgdG8gVEVFXG4gICAqL1xuICBhc3luYyBkZWxlZ2F0ZVF1ZXVlKFxuICAgIGF1dGhvcml0eTogd2ViMy5QdWJsaWNLZXksXG4gICAgdmFsaWRhdG9yOiB3ZWIzLlB1YmxpY0tleSA9IG5ldyB3ZWIzLlB1YmxpY0tleShcIkZuRTZWSlQ1UU5aZGVkWlBuQ29Mc0FSZ0J3b0U2RGVKTmpCczJIMWd5U1hBXCIpLFxuICAgIGNvbmZpcm1PcHRpb25zPzogd2ViMy5Db25maXJtT3B0aW9ucyxcbiAgICBzaWduZXJzOiB3ZWIzLktleXBhaXJbXSA9IFtdXG4gICk6IFByb21pc2U8d2ViMy5UcmFuc2FjdGlvblNpZ25hdHVyZT4ge1xuICAgICAgY29uc3QgcXVldWVQZGEgPSB0aGlzLmdldFF1ZXVlUGRhKGF1dGhvcml0eSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9ncmFtLm1ldGhvZHNcbiAgICAgICAgLmRlbGVnYXRlUXVldWUoeyBxdWV1ZTogeyBhdXRob3JpdHkgfSB9IGFzIGFueSlcbiAgICAgICAgLmFjY291bnRzKHtcbiAgICAgICAgICAgIHBkYTogcXVldWVQZGEsXG4gICAgICAgICAgICBwYXllcjogYXV0aG9yaXR5LFxuICAgICAgICAgICAgdmFsaWRhdG9yOiB2YWxpZGF0b3IsXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBhbnkpXG4gICAgICAgIC5zaWduZXJzKHNpZ25lcnMpXG4gICAgICAgIC5ycGMoY29uZmlybU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHBlbmRpbmcgbWF0Y2hlcyAtIGNyYW5rIGluc3RydWN0aW9uIHRvIHVwZGF0ZSBvcHBvbmVudCB0aWNrZXRzXG4gICAqIENhbiBiZSBjYWxsZWQgYnkgYW55IFRFRS1hdXRoZW50aWNhdGVkIHdhbGxldCAocGVybWlzc2lvbmxlc3MpXG4gICAqL1xuICBhc3luYyBmbHVzaE1hdGNoZXMoXG4gICAgcXVldWU6IHdlYjMuUHVibGljS2V5LFxuICAgIHRlbmFudDogd2ViMy5QdWJsaWNLZXksXG4gICAgdGlja2V0UGRhczogd2ViMy5QdWJsaWNLZXlbXSxcbiAgICBjYWxsYmFja1Byb2dyYW0/OiB3ZWIzLlB1YmxpY0tleSxcbiAgICBjb25maXJtT3B0aW9ucz86IHdlYjMuQ29uZmlybU9wdGlvbnMsXG4gICAgc2lnbmVyczogd2ViMy5LZXlwYWlyW10gPSBbXVxuICApOiBQcm9taXNlPHdlYjMuVHJhbnNhY3Rpb25TaWduYXR1cmU+IHtcbiAgICBjb25zdCByZW1haW5pbmdBY2NvdW50cyA9IHRpY2tldFBkYXMubWFwKHBkYSA9PiAoe1xuICAgICAgcHVia2V5OiBwZGEsXG4gICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICBpc1dyaXRhYmxlOiB0cnVlLFxuICAgIH0pKTtcblxuICAgIGlmIChjYWxsYmFja1Byb2dyYW0pIHtcbiAgICAgIHJlbWFpbmluZ0FjY291bnRzLnB1c2goe1xuICAgICAgICBwdWJrZXk6IGNhbGxiYWNrUHJvZ3JhbSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmZsdXNoTWF0Y2hlcygpXG4gICAgICAuYWNjb3VudHNQYXJ0aWFsKHtcbiAgICAgICAgcXVldWU6IHF1ZXVlLFxuICAgICAgICB0ZW5hbnQ6IHRlbmFudCxcbiAgICAgICAgc2lnbmVyOiB0aGlzLnByb3ZpZGVyLnB1YmxpY0tleSxcbiAgICAgIH0pXG4gICAgICAucmVtYWluaW5nQWNjb3VudHMocmVtYWluaW5nQWNjb3VudHMpXG4gICAgICAuc2lnbmVycyhzaWduZXJzKVxuICAgICAgLnJwYyhjb25maXJtT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IG1hdGNoZWQgdGlja2V0cyBiYWNrIHRvIEwxIChydW5zIGluIFRFRSlcbiAgICovXG4gIGFzeW5jIGNvbW1pdFRpY2tldHMoXG4gICAgdGVuYW50OiB3ZWIzLlB1YmxpY0tleSxcbiAgICB0aWNrZXRQZGFzOiB3ZWIzLlB1YmxpY0tleVtdLFxuICAgIGNvbmZpcm1PcHRpb25zPzogd2ViMy5Db25maXJtT3B0aW9ucyxcbiAgICBzaWduZXJzOiB3ZWIzLktleXBhaXJbXSA9IFtdXG4gICk6IFByb21pc2U8d2ViMy5UcmFuc2FjdGlvblNpZ25hdHVyZT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2dyYW0ubWV0aG9kc1xuICAgICAgLmNvbW1pdFRpY2tldHMoKVxuICAgICAgLmFjY291bnRzUGFydGlhbCh7XG4gICAgICAgIHRlbmFudDogdGVuYW50LFxuICAgICAgICBwYXllcjogdGhpcy5wcm92aWRlci5wdWJsaWNLZXksXG4gICAgICB9KVxuICAgICAgLnJlbWFpbmluZ0FjY291bnRzKFxuICAgICAgICB0aWNrZXRQZGFzLm1hcChwZGEgPT4gKHtcbiAgICAgICAgICBwdWJrZXk6IHBkYSxcbiAgICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgICAgaXNXcml0YWJsZTogdHJ1ZSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgICAuc2lnbmVycyhzaWduZXJzKVxuICAgICAgLnJwYyhjb25maXJtT3B0aW9ucyk7XG4gIH1cbn1cbiJdfQ==
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYWRtaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGVBQWUsR0FLaEIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxrQ0FBa0MsRUFDbEMsZ0NBQWdDLEVBQ2hDLDBCQUEwQixFQUMxQiwyQkFBMkIsRUFDM0IsVUFBVSxFQUNWLFdBQVcsR0FDWixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQWFwQyxTQUFTLFVBQVUsQ0FBQyxRQUFxQjtJQUN2QyxRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsS0FBSyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQixLQUFLLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JCLEtBQUssS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBRyw4Q0FBeUQsQ0FBQztBQUVsRixNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLFlBQ0UsR0FBc0IsRUFDdEIsTUFBeUIsRUFDekIsWUFBcUIsZUFBZTtRQUVwQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQWtCO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENB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RSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FDbEIsS0FBYyxFQUNkLE1BQWUsRUFDZixVQUFxQixFQUNyQixpQkFBaUIsR0FBRyxJQUFJO1FBRXhCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDekMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDdkMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQ3pELENBQ0YsQ0FBQztRQUVGLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDMUQsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSxPQUFPLENBQUMsTUFBYztRQUNwQixPQUFPLElBQUksZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZVNvbGFuYVJwYyxcbiAgdHlwZSBBZGRyZXNzLFxuICB0eXBlIFRyYW5zYWN0aW9uU2lnbmVyLFxuICB0eXBlIFJwYyxcbiAgdHlwZSBTb2xhbmFScGNBcGksXG59IGZyb20gXCJAc29sYW5hL2tpdFwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZVRlbmFudEluc3RydWN0aW9uQXN5bmMsXG4gIGdldEluaXRpYWxpemVRdWV1ZUluc3RydWN0aW9uQXN5bmMsXG4gIGdldERlbGVnYXRlUXVldWVJbnN0cnVjdGlvbkFzeW5jLFxuICBnZXRGbHVzaE1hdGNoZXNJbnN0cnVjdGlvbixcbiAgZ2V0Q29tbWl0VGlja2V0c0luc3RydWN0aW9uLFxuICBmZXRjaFF1ZXVlLFxuICBhY2NvdW50VHlwZSxcbn0gZnJvbSBcIi4vZ2VuZXJhdGVkL2R1ZWwvaW5kZXguanNcIjtcbmltcG9ydCB7IHNlbmRJbnN0cnVjdGlvbiB9IGZyb20gXCIuL3RyYW5zYWN0aW9uLmpzXCI7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi91dGlscy5qc1wiO1xuXG5leHBvcnQgdHlwZSBFbG9EYXRhVHlwZSA9IFwidThcIiB8IFwidTE2XCIgfCBcInUzMlwiIHwgXCJ1NjRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsaXplVGVuYW50T3B0aW9ucyB7XG4gIGF1dGhvcml0eT86IEFkZHJlc3M7XG4gIGVsb1dpbmRvdz86IGJpZ2ludDtcbiAgZWxvT2Zmc2V0PzogbnVtYmVyO1xuICBlbG9EYXRhVHlwZT86IEVsb0RhdGFUeXBlO1xuICBjYWxsYmFja1Byb2dyYW1JZD86IEFkZHJlc3MgfCBudWxsO1xuICBjYWxsYmFja0Rpc2NyaW1pbmF0b3I/OiBudW1iZXJbXSB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEVsb1NpemUoZGF0YVR5cGU6IEVsb0RhdGFUeXBlKTogbnVtYmVyIHtcbiAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgIGNhc2UgXCJ1OFwiOiByZXR1cm4gMTtcbiAgICBjYXNlIFwidTE2XCI6IHJldHVybiAyO1xuICAgIGNhc2UgXCJ1MzJcIjogcmV0dXJuIDQ7XG4gICAgY2FzZSBcInU2NFwiOiByZXR1cm4gODtcbiAgfVxufVxuXG5jb25zdCBEVUVMX1BST0dSQU1fSUQgPSBcIkVkWnpVd0tkMVgyWldqeExQcHoxY3BFek1GN1JVWkM0M1BxNjR2MVZjSzVYXCIgYXMgQWRkcmVzcztcblxuZXhwb3J0IGNsYXNzIE1hdGNobWFraW5nQWRtaW4ge1xuICBwdWJsaWMgcnBjOiBScGM8U29sYW5hUnBjQXBpPjtcbiAgcHVibGljIHNpZ25lcjogVHJhbnNhY3Rpb25TaWduZXI7XG4gIHB1YmxpYyBwcm9ncmFtSWQ6IEFkZHJlc3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnBjOiBScGM8U29sYW5hUnBjQXBpPixcbiAgICBzaWduZXI6IFRyYW5zYWN0aW9uU2lnbmVyLFxuICAgIHByb2dyYW1JZDogQWRkcmVzcyA9IERVRUxfUFJPR1JBTV9JRCxcbiAgKSB7XG4gICAgdGhpcy5ycGMgPSBycGM7XG4gICAgdGhpcy5zaWduZXIgPSBzaWduZXI7XG4gICAgdGhpcy5wcm9ncmFtSWQgPSBwcm9ncmFtSWQ7XG4gIH1cblxuICBhc3luYyBnZXRRdWV1ZVBkYShhdXRob3JpdHk6IEFkZHJlc3MpOiBQcm9taXNlPEFkZHJlc3M+IHtcbiAgICByZXR1cm4gdXRpbHMuZGVyaXZlUXVldWVQZGEodGhpcy5wcm9ncmFtSWQsIGF1dGhvcml0eSk7XG4gIH1cblxuICBhc3luYyBnZXRUZW5hbnRQZGEoYXV0aG9yaXR5OiBBZGRyZXNzKTogUHJvbWlzZTxBZGRyZXNzPiB7XG4gICAgcmV0dXJuIHV0aWxzLmRlcml2ZVRlbmFudFBkYSh0aGlzLnByb2dyYW1JZCwgYXV0aG9yaXR5KTtcbiAgfVxuXG4gIGFzeW5jIGdldFRpY2tldFBkYShwbGF5ZXI6IEFkZHJlc3MsIHRlbmFudDogQWRkcmVzcyk6IFByb21pc2U8QWRkcmVzcz4ge1xuICAgIHJldHVybiB1dGlscy5kZXJpdmVUaWNrZXRQZGEodGhpcy5wcm9ncmFtSWQsIHBsYXllciwgdGVuYW50KTtcbiAgfVxuXG4gIGFzeW5jIGdldFF1ZXVlKHF1ZXVlUGRhOiBBZGRyZXNzKSB7XG4gICAgcmV0dXJuIGZldGNoUXVldWUodGhpcy5ycGMsIHF1ZXVlUGRhKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemVUZW5hbnQoXG4gICAgdGVuYW50UHJvZ3JhbUlkOiBBZGRyZXNzLFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXplVGVuYW50T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbG9XaW5kb3cgPSAxMDBuLFxuICAgICAgZWxvT2Zmc2V0ID0gNDAsXG4gICAgICBlbG9EYXRhVHlwZSA9IFwidTE2XCIsXG4gICAgICBjYWxsYmFja1Byb2dyYW1JZCA9IG51bGwsXG4gICAgICBjYWxsYmFja0Rpc2NyaW1pbmF0b3IgPSBudWxsLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgZWxvU2l6ZSA9IGdldEVsb1NpemUoZWxvRGF0YVR5cGUpO1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgZ2V0SW5pdGlhbGl6ZVRlbmFudEluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgYXV0aG9yaXR5OiB0aGlzLnNpZ25lcixcbiAgICAgIHRlbmFudFByb2dyYW1JZCxcbiAgICAgIGVsb09mZnNldCxcbiAgICAgIGVsb1NpemUsXG4gICAgICBlbG9XaW5kb3csXG4gICAgICBjYWxsYmFja1Byb2dyYW1JZDogY2FsbGJhY2tQcm9ncmFtSWQgPyB7IF9fb3B0aW9uOiBcIlNvbWVcIiwgdmFsdWU6IGNhbGxiYWNrUHJvZ3JhbUlkIH0gOiB7IF9fb3B0aW9uOiBcIk5vbmVcIiB9LFxuICAgICAgY2FsbGJhY2tEaXNjcmltaW5hdG9yOiBjYWxsYmFja0Rpc2NyaW1pbmF0b3JcbiAgICAgICAgPyB7IF9fb3B0aW9uOiBcIlNvbWVcIiwgdmFsdWU6IG5ldyBVaW50OEFycmF5KGNhbGxiYWNrRGlzY3JpbWluYXRvcikgfVxuICAgICAgICA6IHsgX19vcHRpb246IFwiTm9uZVwiIH0sXG4gICAgfSwgeyBwcm9ncmFtQWRkcmVzczogdGhpcy5wcm9ncmFtSWQgfSk7XG5cbiAgICByZXR1cm4gc2VuZEluc3RydWN0aW9uKHRoaXMucnBjLCBpeCwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZVF1ZXVlKFxuICAgIF9hdXRob3JpdHk6IEFkZHJlc3MsXG4gICAgdGVuYW50OiBBZGRyZXNzLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgZ2V0SW5pdGlhbGl6ZVF1ZXVlSW5zdHJ1Y3Rpb25Bc3luYyh7XG4gICAgICBhdXRob3JpdHk6IHRoaXMuc2lnbmVyLFxuICAgICAgdGVuYW50LFxuICAgIH0sIHsgcHJvZ3JhbUFkZHJlc3M6IHRoaXMucHJvZ3JhbUlkIH0pO1xuICAgIHJldHVybiBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIGl4LCB0aGlzLnNpZ25lcik7XG4gIH1cblxuICBhc3luYyBkZWxlZ2F0ZVF1ZXVlKFxuICAgIGF1dGhvcml0eTogQWRkcmVzcyxcbiAgICB2YWxpZGF0b3I/OiBBZGRyZXNzLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHF1ZXVlUGRhID0gYXdhaXQgdGhpcy5nZXRRdWV1ZVBkYShhdXRob3JpdHkpO1xuICAgIGNvbnN0IGl4ID0gYXdhaXQgZ2V0RGVsZWdhdGVRdWV1ZUluc3RydWN0aW9uQXN5bmMoe1xuICAgICAgcGRhOiBxdWV1ZVBkYSxcbiAgICAgIHBheWVyOiB0aGlzLnNpZ25lcixcbiAgICAgIHZhbGlkYXRvcixcbiAgICAgIGFjY291bnRUeXBlOiBhY2NvdW50VHlwZShcIlF1ZXVlXCIsIHsgYXV0aG9yaXR5IH0pLFxuICAgIH0sIHsgcHJvZ3JhbUFkZHJlc3M6IHRoaXMucHJvZ3JhbUlkIH0pO1xuICAgIHJldHVybiBzZW5kSW5zdHJ1Y3Rpb24odGhpcy5ycGMsIGl4LCB0aGlzLnNpZ25lcik7XG4gIH1cblxuICBhc3luYyBmbHVzaE1hdGNoZXMoXG4gICAgcXVldWU6IEFkZHJlc3MsXG4gICAgdGVuYW50OiBBZGRyZXNzLFxuICAgIHRpY2tldFBkYXM6IEFkZHJlc3NbXSxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpeCA9IGdldEZsdXNoTWF0Y2hlc0luc3RydWN0aW9uKHtcbiAgICAgIHF1ZXVlLFxuICAgICAgdGVuYW50LFxuICAgICAgc2lnbmVyOiB0aGlzLnNpZ25lcixcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcblxuICAgIGNvbnN0IGl4V2l0aFJlbWFpbmluZyA9IHtcbiAgICAgIC4uLml4LFxuICAgICAgYWNjb3VudHM6IFtcbiAgICAgICAgLi4uaXguYWNjb3VudHMsXG4gICAgICAgIC4uLnRpY2tldFBkYXMubWFwKChhZGRyZXNzKSA9PiAoeyBhZGRyZXNzLCByb2xlOiAxIGFzIGNvbnN0IH0pKSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIHNlbmRJbnN0cnVjdGlvbih0aGlzLnJwYywgaXhXaXRoUmVtYWluaW5nIGFzIGFueSwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgYXN5bmMgY29tbWl0VGlja2V0cyhcbiAgICB0ZW5hbnQ6IEFkZHJlc3MsXG4gICAgdGlja2V0UGRhczogQWRkcmVzc1tdLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGl4ID0gZ2V0Q29tbWl0VGlja2V0c0luc3RydWN0aW9uKHtcbiAgICAgIHRlbmFudCxcbiAgICAgIHBheWVyOiB0aGlzLnNpZ25lcixcbiAgICB9LCB7IHByb2dyYW1BZGRyZXNzOiB0aGlzLnByb2dyYW1JZCB9KTtcblxuICAgIGNvbnN0IGl4V2l0aFJlbWFpbmluZyA9IHtcbiAgICAgIC4uLml4LFxuICAgICAgYWNjb3VudHM6IFtcbiAgICAgICAgLi4uaXguYWNjb3VudHMsXG4gICAgICAgIC4uLnRpY2tldFBkYXMubWFwKChhZGRyZXNzKSA9PiAoeyBhZGRyZXNzLCByb2xlOiAxIGFzIGNvbnN0IH0pKSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmV0dXJuIHNlbmRJbnN0cnVjdGlvbih0aGlzLnJwYywgaXhXaXRoUmVtYWluaW5nIGFzIGFueSwgdGhpcy5zaWduZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZ2gtbGV2ZWw6IGZ1bGwgbWF0Y2ggcmVzb2x1dGlvbiBmbG93IChydW5zIG9uIFRFRSkuXG4gICAqIFJlYWRzIHRoZSBxdWV1ZSdzIHBlbmRpbmcgbWF0Y2hlcywgZmx1c2hlcyB0aGVtICh1cGRhdGluZyBvcHBvbmVudCB0aWNrZXRzKSxcbiAgICogd2FpdHMgZm9yIFRFRSBzZXR0bGVtZW50LCB0aGVuIGNvbW1pdHMgYWxsIHRpY2tldHMgYmFjayB0byBMMS5cbiAgICogVXNlIGluZGl2aWR1YWwgbWV0aG9kcyAoZmx1c2hNYXRjaGVzLCBjb21taXRUaWNrZXRzKSBhcyBlc2NhcGUgaGF0Y2hlcyBpZiBuZWVkZWQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlTWF0Y2hlcyhcbiAgICBxdWV1ZTogQWRkcmVzcyxcbiAgICB0ZW5hbnQ6IEFkZHJlc3MsXG4gICAgdGlja2V0UGRhczogQWRkcmVzc1tdLFxuICAgIHNldHRsZW1lbnREZWxheU1zID0gMzAwMCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcXVldWVEYXRhID0gYXdhaXQgdGhpcy5nZXRRdWV1ZShxdWV1ZSk7XG4gICAgY29uc3QgcGVuZGluZ1RpY2tldFBkYXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHF1ZXVlRGF0YS5kYXRhLnBlbmRpbmdNYXRjaGVzLm1hcCgocG0pID0+XG4gICAgICAgIHV0aWxzLmRlcml2ZVRpY2tldFBkYSh0aGlzLnByb2dyYW1JZCwgcG0ucGxheWVyLCB0ZW5hbnQpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgaWYgKHBlbmRpbmdUaWNrZXRQZGFzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmx1c2hNYXRjaGVzKHF1ZXVlLCB0ZW5hbnQsIHBlbmRpbmdUaWNrZXRQZGFzKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIHNldHRsZW1lbnREZWxheU1zKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jb21taXRUaWNrZXRzKHRlbmFudCwgdGlja2V0UGRhcyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IE1hdGNobWFraW5nQWRtaW4gcG9pbnRpbmcgYXQgYSBURUUgUlBDIGVuZHBvaW50LiAqL1xuICB3aXRoUnBjKHRlZVVybDogc3RyaW5nKTogTWF0Y2htYWtpbmdBZG1pbiB7XG4gICAgcmV0dXJuIG5ldyBNYXRjaG1ha2luZ0FkbWluKGNyZWF0ZVNvbGFuYVJwYyh0ZWVVcmwpLCB0aGlzLnNpZ25lciwgdGhpcy5wcm9ncmFtSWQpO1xuICB9XG59XG4iXX0=
@@ -1,4 +1,3 @@
1
- // import { x25519 } from "@noble/curves/ed25519";
2
1
  export class EncryptionProvider {
3
2
  constructor() {
4
3
  this.keyPair = null;
@@ -94,4 +93,4 @@ export class EncryptionProvider {
94
93
  return new Uint8Array(raw);
95
94
  }
96
95
  }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLG1EQUFtRDtBQUVuRCxNQUFNLE9BQU8sa0JBQWtCO0lBQS9CO1FBQ1ksWUFBTyxHQUF5QixJQUFJLENBQUM7SUF3SmpELENBQUM7SUF0SkcsZ0NBQWdDO0lBQ2hDLElBQVksTUFBTTtRQUNkLElBQUksT0FBTyxVQUFVLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzNDLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUM3QixDQUFDO1FBQ0QsMEZBQTBGO1FBQzFGLElBQUksQ0FBQztZQUNELE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN2QyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQjtRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUMvQztZQUNJLElBQUksRUFBRSxNQUFNO1lBQ1osVUFBVSxFQUFFLE9BQU87U0FDdEIsRUFDRCxJQUFJLEVBQ0osQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQ2IsQ0FBQztRQUVuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQ2hCLElBQWdCLEVBQ2hCLGlCQUE2QjtRQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDcEMsQ0FBQztRQUVELHdCQUF3QjtRQUN4Qix3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LElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDOUM7WUFDSSxJQUFJLEVBQUUsU0FBUztZQUNmLEVBQUUsRUFBRSxFQUFFO1NBQ1QsRUFDRCxTQUFTLEVBQ1QsVUFBcUMsQ0FDeEMsQ0FBQztRQUVGLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQjtRQUN4QixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDN0MsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFDckMsSUFBSSxFQUNKLENBQUMsV0FBVyxDQUFDLENBQ0MsQ0FBQztRQUNuQixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHVibGljS2V5IH0gZnJvbSBcIkBzb2xhbmEvd2ViMy5qc1wiO1xuLy8gaW1wb3J0IHsgeDI1NTE5IH0gZnJvbSBcIkBub2JsZS9jdXJ2ZXMvZWQyNTUxOVwiOyBcblxuZXhwb3J0IGNsYXNzIEVuY3J5cHRpb25Qcm92aWRlciB7XG4gICAgcHJpdmF0ZSBrZXlQYWlyOiBDcnlwdG9LZXlQYWlyIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGNyeXB0byBhdmFpbGFiaWxpdHlcbiAgICBwcml2YXRlIGdldCBjcnlwdG8oKTogQ3J5cHRvIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzLmNyeXB0byAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0bztcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxsYmFjayBmb3IgTm9kZSA8IDE5IGlmIGdsb2JhbCBjcnlwdG8gbm90IHNldCAodGhvdWdoIFNESyBsaWtlbHkgdGFyZ2V0cyBtb2Rlcm4gZW52cylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlKCdjcnlwdG8nKS53ZWJjcnlwdG87XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldlYkNyeXB0byBBUEkgbm90IGF2YWlsYWJsZS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIGZyZXNoIGVwaGVtZXJhbCBrZXlwYWlyIGZvciB0aGUgc2Vzc2lvbiAoWDI1NTE5L1AtMjU2KS5cbiAgICAgKi9cbiAgICBhc3luYyBnZW5lcmF0ZVNlc3Npb25LZXkoKTogUHJvbWlzZTxDcnlwdG9LZXk+IHtcbiAgICAgICAgdGhpcy5rZXlQYWlyID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiRUNESFwiLFxuICAgICAgICAgICAgICAgIG5hbWVkQ3VydmU6IFwiUC0yNTZcIiwgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIFtcImRlcml2ZUtleVwiLCBcImRlcml2ZUJpdHNcIl1cbiAgICAgICAgKSBhcyBDcnlwdG9LZXlQYWlyO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5UGFpci5wdWJsaWNLZXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVyaXZlIHNoYXJlZCBzZWNyZXQgYW5kIGVuY3J5cHQgcGF5bG9hZC5cbiAgICAgKi9cbiAgICBhc3luYyBlbmNyeXB0UGF5bG9hZChcbiAgICAgICAgZGF0YTogVWludDhBcnJheSwgXG4gICAgICAgIHRlZVB1YmxpY0tleUJ5dGVzOiBVaW50OEFycmF5XG4gICAgKTogUHJvbWlzZTx7IGVuY3J5cHRlZDogVWludDhBcnJheSwgY2xpZW50UHVibGljS2V5OiBVaW50OEFycmF5IH0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmtleVBhaXIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVTZXNzaW9uS2V5KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvcnQgVEVFIFB1YmxpYyBLZXlcbiAgICAgICAgLy8gRml4OiBFeHBsaWNpdGx5IGNhc3QgdG8gQnVmZmVyU291cmNlL2FueSBiZWNhdXNlIFRTIGdldHMgY29uZnVzZWQgd2l0aCBTaGFyZWRBcnJheUJ1ZmZlciBpbiBzb21lIGVudnNcbiAgICAgICAgY29uc3QgdGVlS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgICAgIFwicmF3XCIsXG4gICAgICAgICAgICB0ZWVQdWJsaWNLZXlCeXRlcyBhcyB1bmtub3duIGFzIEJ1ZmZlclNvdXJjZSxcbiAgICAgICAgICAgIHsgbmFtZTogXCJFQ0RIXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIiB9LCBcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgW11cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZXJpdmUgU2hhcmVkIFNlY3JldCAoQUVTLUdDTSBLZXkpXG4gICAgICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJFQ0RIXCIsXG4gICAgICAgICAgICAgICAgcHVibGljOiB0ZWVLZXksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5rZXlQYWlyIS5wcml2YXRlS2V5LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMjU2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbmNyeXB0IERhdGFcbiAgICAgICAgY29uc3QgaXYgPSB0aGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkQnVmZmVyID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICAgICAgaXY6IGl2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNoYXJlZEtleSxcbiAgICAgICAgICAgIGRhdGEgYXMgdW5rbm93biBhcyBCdWZmZXJTb3VyY2VcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBDb25jYXRlbmF0ZSBJViArIENpcGhlclRleHRcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkID0gbmV3IFVpbnQ4QXJyYXkoaXYubGVuZ3RoICsgZW5jcnlwdGVkQnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICBlbmNyeXB0ZWQuc2V0KGl2KTtcbiAgICAgICAgZW5jcnlwdGVkLnNldChuZXcgVWludDhBcnJheShlbmNyeXB0ZWRCdWZmZXIpLCBpdi5sZW5ndGgpO1xuXG4gICAgICAgIC8vIEV4cG9ydCBDbGllbnQgUHVibGljIEtleVxuICAgICAgICBjb25zdCBjbGllbnRQdWJSYXcgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KFwicmF3XCIsIHRoaXMua2V5UGFpciEucHVibGljS2V5KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW5jcnlwdGVkLFxuICAgICAgICAgICAgY2xpZW50UHVibGljS2V5OiBuZXcgVWludDhBcnJheShjbGllbnRQdWJSYXcpXG4gICAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIERlY3J5cHQgYSByZXNwb25zZSBmcm9tIHRoZSBURUUuXG4gICAgICovXG4gICAgYXN5bmMgZGVjcnlwdFJlc3BvbnNlKFxuICAgICAgICBlbmNyeXB0ZWREYXRhOiBVaW50OEFycmF5LCBcbiAgICAgICAgdGVlUHVibGljS2V5Qnl0ZXM6IFVpbnQ4QXJyYXlcbiAgICApOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgICBpZiAoIXRoaXMua2V5UGFpcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gc2Vzc2lvbiBrZXlcIik7XG4gICAgICAgICAgXG4gICAgICAgICAgIC8vIEltcG9ydCBURUUgUHVibGljIEtleVxuICAgICAgICBjb25zdCB0ZWVLZXkgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAgICAgXCJyYXdcIixcbiAgICAgICAgICAgIHRlZVB1YmxpY0tleUJ5dGVzIGFzIHVua25vd24gYXMgQnVmZmVyU291cmNlLFxuICAgICAgICAgICAgeyBuYW1lOiBcIkVDREhcIiwgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiIH0sIFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERlcml2ZSBTaGFyZWQgU2VjcmV0XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJFQ0RIXCIsXG4gICAgICAgICAgICAgICAgcHVibGljOiB0ZWVLZXksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5rZXlQYWlyIS5wcml2YXRlS2V5LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogMjU2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl1cbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGl2ID0gZW5jcnlwdGVkRGF0YS5zbGljZSgwLCAxMik7XG4gICAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0ZWREYXRhLnNsaWNlKDEyKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQUVTLUdDTVwiLFxuICAgICAgICAgICAgICAgIGl2OiBpdixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaGFyZWRLZXksXG4gICAgICAgICAgICBjaXBoZXJ0ZXh0IGFzIHVua25vd24gYXMgQnVmZmVyU291cmNlXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjcnlwdGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgdG8gZ2VuZXJhdGUgYSB2YWxpZCByYW5kb20gUC0yNTYgUHVibGljIEtleSAoNjUgYnl0ZXMpIGZvciB0ZXN0aW5nLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU1vY2tWYWxpZGF0b3JLZXkoKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgICAgIGNvbnN0IHBhaXIgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAgICB7IG5hbWU6IFwiRUNESFwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCIgfSxcbiAgICAgICAgICAgIHRydWUsIFxuICAgICAgICAgICAgW1wiZGVyaXZlS2V5XCJdXG4gICAgICAgICkgYXMgQ3J5cHRvS2V5UGFpcjtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShcInJhd1wiLCBwYWlyLnB1YmxpY0tleSk7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShyYXcpO1xuICAgIH1cbn1cbiJdfQ==
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxrQkFBa0I7SUFBL0I7UUFDWSxZQUFPLEdBQXlCLElBQUksQ0FBQztJQXdKakQsQ0FBQztJQXRKRyxnQ0FBZ0M7SUFDaEMsSUFBWSxNQUFNO1FBQ2QsSUFBSSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDM0MsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzdCLENBQUM7UUFDRCwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3ZDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQy9DO1lBQ0ksSUFBSSxFQUFFLE1BQU07WUFDWixVQUFVLEVBQUUsT0FBTztTQUN0QixFQUNELElBQUksRUFDSixDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FDYixDQUFDO1FBRW5CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FDaEIsSUFBZ0IsRUFDaEIsaUJBQTZCO1FBRTdCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNwQyxDQUFDO1FBRUQsd0JBQXdCO1FBQ3hCLHdHQUF3RztRQUN4RyxN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QU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUM5QztZQUNJLElBQUksRUFBRSxTQUFTO1lBQ2YsRUFBRSxFQUFFLEVBQUU7U0FDVCxFQUNELFNBQVMsRUFDVCxVQUFxQyxDQUN4QyxDQUFDO1FBRUYsT0FBTyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsc0JBQXNCO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUM3QyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUNyQyxJQUFJLEVBQ0osQ0FBQyxXQUFXLENBQUMsQ0FDQyxDQUFDO1FBQ25CLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRW5jcnlwdGlvblByb3ZpZGVyIHtcbiAgICBwcml2YXRlIGtleVBhaXI6IENyeXB0b0tleVBhaXIgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgY3J5cHRvIGF2YWlsYWJpbGl0eVxuICAgIHByaXZhdGUgZ2V0IGNyeXB0bygpOiBDcnlwdG8ge1xuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMuY3J5cHRvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGxiYWNrIGZvciBOb2RlIDwgMTkgaWYgZ2xvYmFsIGNyeXB0byBub3Qgc2V0ICh0aG91Z2ggU0RLIGxpa2VseSB0YXJnZXRzIG1vZGVybiBlbnZzKVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUoJ2NyeXB0bycpLndlYmNyeXB0bztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2ViQ3J5cHRvIEFQSSBub3QgYXZhaWxhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgZnJlc2ggZXBoZW1lcmFsIGtleXBhaXIgZm9yIHRoZSBzZXNzaW9uIChYMjU1MTkvUC0yNTYpLlxuICAgICAqL1xuICAgIGFzeW5jIGdlbmVyYXRlU2Vzc2lvbktleSgpOiBQcm9taXNlPENyeXB0b0tleT4ge1xuICAgICAgICB0aGlzLmtleVBhaXIgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJFQ0RIXCIsXG4gICAgICAgICAgICAgICAgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiLCBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgW1wiZGVyaXZlS2V5XCIsIFwiZGVyaXZlQml0c1wiXVxuICAgICAgICApIGFzIENyeXB0b0tleVBhaXI7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGhpcy5rZXlQYWlyLnB1YmxpY0tleTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXJpdmUgc2hhcmVkIHNlY3JldCBhbmQgZW5jcnlwdCBwYXlsb2FkLlxuICAgICAqL1xuICAgIGFzeW5jIGVuY3J5cHRQYXlsb2FkKFxuICAgICAgICBkYXRhOiBVaW50OEFycmF5LCBcbiAgICAgICAgdGVlUHVibGljS2V5Qnl0ZXM6IFVpbnQ4QXJyYXlcbiAgICApOiBQcm9taXNlPHsgZW5jcnlwdGVkOiBVaW50OEFycmF5LCBjbGllbnRQdWJsaWNLZXk6IFVpbnQ4QXJyYXkgfT4ge1xuICAgICAgICBpZiAoIXRoaXMua2V5UGFpcikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZVNlc3Npb25LZXkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCBURUUgUHVibGljIEtleVxuICAgICAgICAvLyBGaXg6IEV4cGxpY2l0bHkgY2FzdCB0byBCdWZmZXJTb3VyY2UvYW55IGJlY2F1c2UgVFMgZ2V0cyBjb25mdXNlZCB3aXRoIFNoYXJlZEFycmF5QnVmZmVyIGluIHNvbWUgZW52c1xuICAgICAgICBjb25zdCB0ZWVLZXkgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAgICAgXCJyYXdcIixcbiAgICAgICAgICAgIHRlZVB1YmxpY0tleUJ5dGVzIGFzIHVua25vd24gYXMgQnVmZmVyU291cmNlLFxuICAgICAgICAgICAgeyBuYW1lOiBcIkVDREhcIiwgbmFtZWRDdXJ2ZTogXCJQLTI1NlwiIH0sIFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERlcml2ZSBTaGFyZWQgU2VjcmV0IChBRVMtR0NNIEtleSlcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkVDREhcIixcbiAgICAgICAgICAgICAgICBwdWJsaWM6IHRlZUtleSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleVBhaXIhLnByaXZhdGVLZXksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAyNTYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgRGF0YVxuICAgICAgICBjb25zdCBpdiA9IHRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxMikpO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRCdWZmZXIgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkFFUy1HQ01cIixcbiAgICAgICAgICAgICAgICBpdjogaXYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2hhcmVkS2V5LFxuICAgICAgICAgICAgZGF0YSBhcyB1bmtub3duIGFzIEJ1ZmZlclNvdXJjZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENvbmNhdGVuYXRlIElWICsgQ2lwaGVyVGV4dFxuICAgICAgICBjb25zdCBlbmNyeXB0ZWQgPSBuZXcgVWludDhBcnJheShpdi5sZW5ndGggKyBlbmNyeXB0ZWRCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGVuY3J5cHRlZC5zZXQoaXYpO1xuICAgICAgICBlbmNyeXB0ZWQuc2V0KG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZEJ1ZmZlciksIGl2Lmxlbmd0aCk7XG5cbiAgICAgICAgLy8gRXhwb3J0IENsaWVudCBQdWJsaWMgS2V5XG4gICAgICAgIGNvbnN0IGNsaWVudFB1YlJhdyA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoXCJyYXdcIiwgdGhpcy5rZXlQYWlyIS5wdWJsaWNLZXkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbmNyeXB0ZWQsXG4gICAgICAgICAgICBjbGllbnRQdWJsaWNLZXk6IG5ldyBVaW50OEFycmF5KGNsaWVudFB1YlJhdylcbiAgICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogRGVjcnlwdCBhIHJlc3BvbnNlIGZyb20gdGhlIFRFRS5cbiAgICAgKi9cbiAgICBhc3luYyBkZWNyeXB0UmVzcG9uc2UoXG4gICAgICAgIGVuY3J5cHRlZERhdGE6IFVpbnQ4QXJyYXksIFxuICAgICAgICB0ZWVQdWJsaWNLZXlCeXRlczogVWludDhBcnJheVxuICAgICk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgICAgICAgIGlmICghdGhpcy5rZXlQYWlyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBzZXNzaW9uIGtleVwiKTtcbiAgICAgICAgICBcbiAgICAgICAgICAgLy8gSW1wb3J0IFRFRSBQdWJsaWMgS2V5XG4gICAgICAgIGNvbnN0IHRlZUtleSA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAgICAgICBcInJhd1wiLFxuICAgICAgICAgICAgdGVlUHVibGljS2V5Qnl0ZXMgYXMgdW5rbm93biBhcyBCdWZmZXJTb3VyY2UsXG4gICAgICAgICAgICB7IG5hbWU6IFwiRUNESFwiLCBuYW1lZEN1cnZlOiBcIlAtMjU2XCIgfSwgXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFtdXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gRGVyaXZlIFNoYXJlZCBTZWNyZXRcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkVDREhcIixcbiAgICAgICAgICAgICAgICBwdWJsaWM6IHRlZUtleSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmtleVBhaXIhLnByaXZhdGVLZXksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAyNTYsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbXCJlbmNyeXB0XCIsIFwiZGVjcnlwdFwiXVxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgaXYgPSBlbmNyeXB0ZWREYXRhLnNsaWNlKDAsIDEyKTtcbiAgICAgICAgY29uc3QgY2lwaGVydGV4dCA9IGVuY3J5cHRlZERhdGEuc2xpY2UoMTIpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkID0gYXdhaXQgdGhpcy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJBRVMtR0NNXCIsXG4gICAgICAgICAgICAgICAgaXY6IGl2LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNoYXJlZEtleSxcbiAgICAgICAgICAgIGNpcGhlcnRleHQgYXMgdW5rbm93biBhcyBCdWZmZXJTb3VyY2VcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNyeXB0ZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciB0byBnZW5lcmF0ZSBhIHZhbGlkIHJhbmRvbSBQLTI1NiBQdWJsaWMgS2V5ICg2NSBieXRlcykgZm9yIHRlc3RpbmcuXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlTW9ja1ZhbGlkYXRvcktleSgpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgY29uc3QgcGFpciA9IGF3YWl0IHRoaXMuY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcbiAgICAgICAgICAgIHsgbmFtZTogXCJFQ0RIXCIsIG5hbWVkQ3VydmU6IFwiUC0yNTZcIiB9LFxuICAgICAgICAgICAgdHJ1ZSwgXG4gICAgICAgICAgICBbXCJkZXJpdmVLZXlcIl1cbiAgICAgICAgKSBhcyBDcnlwdG9LZXlQYWlyO1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KFwicmF3XCIsIHBhaXIucHVibGljS2V5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHJhdyk7XG4gICAgfVxufVxuIl19