@oathompsonjones/mini-games 1.0.2 → 1.0.3
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.
- package/.github/workflows/lint-and-test.yml +52 -0
- package/.github/workflows/publish.yml +36 -0
- package/build/base/board.d.ts +17 -58
- package/build/base/board.js +23 -75
- package/build/base/controller.d.ts +16 -34
- package/build/base/controller.js +27 -39
- package/build/bitBoard/bitBoard.d.ts +8 -33
- package/build/bitBoard/bitBoard.js +7 -12
- package/build/bitBoard/intBitBoard.d.ts +65 -4
- package/build/bitBoard/intBitBoard.js +66 -5
- package/build/bitBoard/longInt.d.ts +2 -32
- package/build/bitBoard/longInt.js +17 -25
- package/build/bitBoard/longIntBitBoard.d.ts +65 -7
- package/build/bitBoard/longIntBitBoard.js +72 -4
- package/build/console.d.ts +1 -4
- package/build/console.js +4 -7
- package/build/games/connect4/board.d.ts +9 -0
- package/build/games/connect4/board.js +10 -1
- package/build/games/connect4/controller.d.ts +18 -0
- package/build/games/connect4/controller.js +23 -1
- package/build/games/tictactoe/board.d.ts +3 -0
- package/build/games/tictactoe/board.js +4 -1
- package/build/games/tictactoe/controller.d.ts +20 -0
- package/build/games/tictactoe/controller.js +25 -1
- package/build/index.js +1 -1
- package/eslint.config.js +3 -0
- package/package.json +6 -8
- package/.eslintrc +0 -6
|
@@ -3,72 +3,60 @@ import { EventEmitter } from "eventemitter3";
|
|
|
3
3
|
import type { Position } from "./board.js";
|
|
4
4
|
export type PlayerType = "easyCPU" | "hardCPU" | "human" | "impossibleCPU" | "mediumCPU";
|
|
5
5
|
export type Algorithm = "alphabeta" | "minimax";
|
|
6
|
-
export
|
|
6
|
+
export type GameConstructorOptions = {
|
|
7
7
|
id?: string;
|
|
8
8
|
onEnd?: (winner: number | null) => Promise<void> | void;
|
|
9
9
|
onInvalidInput?: (position: Position) => Promise<void> | void;
|
|
10
10
|
renderer?: (controller: Controller) => Promise<void> | void;
|
|
11
|
-
}
|
|
12
|
-
export
|
|
11
|
+
};
|
|
12
|
+
export type GameConstructor = {
|
|
13
13
|
new (playerOneType: PlayerType, playerTwoType: PlayerType, options?: GameConstructorOptions): Controller;
|
|
14
|
-
}
|
|
15
|
-
export declare function Game(constructor: GameConstructor): void;
|
|
14
|
+
};
|
|
16
15
|
/**
|
|
17
|
-
*
|
|
16
|
+
* Decorator to check that the constructor type for the given class is correct.
|
|
17
|
+
* @param constructor The class to check.
|
|
18
18
|
*/
|
|
19
|
+
export declare function Game(constructor: GameConstructor): void;
|
|
20
|
+
/** Represents a game controller. */
|
|
19
21
|
export default abstract class Controller extends EventEmitter<{
|
|
20
22
|
end: GameConstructorOptions["onEnd"];
|
|
21
23
|
input: GameConstructorOptions["onInvalidInput"];
|
|
22
24
|
invalidInput: GameConstructorOptions["onInvalidInput"];
|
|
23
25
|
}> {
|
|
24
|
-
/**
|
|
25
|
-
* Contains the ID of the game.
|
|
26
|
-
*/
|
|
26
|
+
/** Contains the ID of the game. */
|
|
27
27
|
readonly gameID: string;
|
|
28
|
-
/**
|
|
29
|
-
* Contains the board.
|
|
30
|
-
*/
|
|
28
|
+
/** Contains the board. */
|
|
31
29
|
readonly board: Board;
|
|
32
|
-
/**
|
|
33
|
-
* Contains the view object.
|
|
34
|
-
*/
|
|
30
|
+
/** Contains the view object. */
|
|
35
31
|
readonly render: Required<GameConstructorOptions>["renderer"];
|
|
36
|
-
/**
|
|
37
|
-
* Contains the player objects.
|
|
38
|
-
*/
|
|
32
|
+
/** Contains the player objects. */
|
|
39
33
|
protected readonly players: Array<{
|
|
40
34
|
id: number;
|
|
41
35
|
playerType: PlayerType;
|
|
42
36
|
}>;
|
|
43
|
-
/**
|
|
44
|
-
* Contains the ID of the current player.
|
|
45
|
-
*/
|
|
37
|
+
/** Contains the ID of the current player. */
|
|
46
38
|
private currentPlayerId;
|
|
47
39
|
/**
|
|
48
40
|
* Creates an instance of Controller.
|
|
49
|
-
*
|
|
50
41
|
* @param playerTypes The types of player.
|
|
51
42
|
* @param view The view object.
|
|
52
43
|
* @param gameID The ID of the game.
|
|
53
44
|
* @param board The board.
|
|
54
45
|
*/
|
|
55
46
|
protected constructor(playerTypes: PlayerType[], board: Board, render: Controller["render"], gameID: string | undefined, onEnd?: GameConstructorOptions["onEnd"], onInvalidInput?: GameConstructorOptions["onInvalidInput"]);
|
|
56
|
-
/**
|
|
57
|
-
* Gets the current player object.
|
|
58
|
-
*/
|
|
47
|
+
/** Gets the current player object. */
|
|
59
48
|
get currentPlayer(): {
|
|
60
49
|
id: number;
|
|
61
50
|
playerType: PlayerType;
|
|
62
51
|
};
|
|
63
52
|
/**
|
|
64
53
|
* Controls the main game flow.
|
|
65
|
-
*
|
|
54
|
+
* @param algorithm The algorithm to use.
|
|
66
55
|
* @returns The winner or null in the event of a tie.
|
|
67
56
|
*/
|
|
68
57
|
play(algorithm?: Algorithm): Promise<void>;
|
|
69
58
|
/**
|
|
70
59
|
* The bog standard minimax algorithm. Left in for reference.
|
|
71
|
-
*
|
|
72
60
|
* @link https://en.wikipedia.org/wiki/Minimax
|
|
73
61
|
* @param depth The depth of the algorithm.
|
|
74
62
|
* @param maximisingPlayer Whether or not the current player is the maximising player.
|
|
@@ -80,7 +68,6 @@ export default abstract class Controller extends EventEmitter<{
|
|
|
80
68
|
};
|
|
81
69
|
/**
|
|
82
70
|
* The minimax algorithm with alpha-beta pruning.
|
|
83
|
-
*
|
|
84
71
|
* @link https://en.wikipedia.org/wiki/Minimax
|
|
85
72
|
* @param depth The depth of the algorithm.
|
|
86
73
|
* @param alpha The bounds for the alpha-beta variation of the algorithm.
|
|
@@ -92,19 +79,15 @@ export default abstract class Controller extends EventEmitter<{
|
|
|
92
79
|
move: Position;
|
|
93
80
|
score: number;
|
|
94
81
|
};
|
|
95
|
-
/**
|
|
96
|
-
* Changes which player's turn it is.
|
|
97
|
-
*/
|
|
82
|
+
/** Changes which player's turn it is. */
|
|
98
83
|
private nextTurn;
|
|
99
84
|
/**
|
|
100
85
|
* Makes a move.
|
|
101
|
-
*
|
|
102
86
|
* @param input Either the algorithm to use to calculate the move or the move itself.
|
|
103
87
|
*/
|
|
104
88
|
private makeMove;
|
|
105
89
|
/**
|
|
106
90
|
* Determines the CPU move.
|
|
107
|
-
*
|
|
108
91
|
* @param difficulty The difficulty of the AI.
|
|
109
92
|
* @param algorithm The algorithm to use.
|
|
110
93
|
* @returns The move.
|
|
@@ -112,7 +95,6 @@ export default abstract class Controller extends EventEmitter<{
|
|
|
112
95
|
abstract determineCPUMove(difficulty: Omit<PlayerType, "human">, algorithm?: Algorithm): Position;
|
|
113
96
|
/**
|
|
114
97
|
* Finds the optimal move.
|
|
115
|
-
*
|
|
116
98
|
* @param options The options.
|
|
117
99
|
* @returns The optimal move.
|
|
118
100
|
*/
|
package/build/base/controller.js
CHANGED
|
@@ -1,40 +1,31 @@
|
|
|
1
1
|
import { EventEmitter } from "eventemitter3";
|
|
2
|
+
/**
|
|
3
|
+
* Decorator to check that the constructor type for the given class is correct.
|
|
4
|
+
* @param constructor The class to check.
|
|
5
|
+
*/
|
|
2
6
|
export function Game(constructor) {
|
|
3
7
|
void constructor;
|
|
4
8
|
}
|
|
5
|
-
/**
|
|
6
|
-
* Represents a game controller.
|
|
7
|
-
*/
|
|
9
|
+
/** Represents a game controller. */
|
|
8
10
|
export default class Controller extends EventEmitter {
|
|
9
|
-
/**
|
|
10
|
-
* Contains the ID of the game.
|
|
11
|
-
*/
|
|
11
|
+
/** Contains the ID of the game. */
|
|
12
12
|
gameID;
|
|
13
|
-
/**
|
|
14
|
-
* Contains the board.
|
|
15
|
-
*/
|
|
13
|
+
/** Contains the board. */
|
|
16
14
|
board;
|
|
17
|
-
/**
|
|
18
|
-
* Contains the view object.
|
|
19
|
-
*/
|
|
15
|
+
/** Contains the view object. */
|
|
20
16
|
render;
|
|
21
|
-
/**
|
|
22
|
-
* Contains the player objects.
|
|
23
|
-
*/
|
|
17
|
+
/** Contains the player objects. */
|
|
24
18
|
players;
|
|
25
|
-
/**
|
|
26
|
-
* Contains the ID of the current player.
|
|
27
|
-
*/
|
|
19
|
+
/** Contains the ID of the current player. */
|
|
28
20
|
currentPlayerId = 0;
|
|
29
21
|
/**
|
|
30
22
|
* Creates an instance of Controller.
|
|
31
|
-
*
|
|
32
23
|
* @param playerTypes The types of player.
|
|
33
24
|
* @param view The view object.
|
|
34
25
|
* @param gameID The ID of the game.
|
|
35
26
|
* @param board The board.
|
|
36
27
|
*/
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/max-params
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/max-params, require-jsdoc
|
|
38
29
|
constructor(playerTypes, board, render, gameID, onEnd, onInvalidInput) {
|
|
39
30
|
super();
|
|
40
31
|
this.gameID = gameID ?? Date.now().toString(16);
|
|
@@ -47,15 +38,13 @@ export default class Controller extends EventEmitter {
|
|
|
47
38
|
if (onInvalidInput !== undefined)
|
|
48
39
|
this.on("invalidInput", onInvalidInput);
|
|
49
40
|
}
|
|
50
|
-
/**
|
|
51
|
-
* Gets the current player object.
|
|
52
|
-
*/
|
|
41
|
+
/** Gets the current player object. */
|
|
53
42
|
get currentPlayer() {
|
|
54
43
|
return this.players[this.currentPlayerId];
|
|
55
44
|
}
|
|
56
45
|
/**
|
|
57
46
|
* Controls the main game flow.
|
|
58
|
-
*
|
|
47
|
+
* @param algorithm The algorithm to use.
|
|
59
48
|
* @returns The winner or null in the event of a tie.
|
|
60
49
|
*/
|
|
61
50
|
async play(algorithm = "alphabeta") {
|
|
@@ -71,7 +60,6 @@ export default class Controller extends EventEmitter {
|
|
|
71
60
|
}
|
|
72
61
|
/**
|
|
73
62
|
* The bog standard minimax algorithm. Left in for reference.
|
|
74
|
-
*
|
|
75
63
|
* @link https://en.wikipedia.org/wiki/Minimax
|
|
76
64
|
* @param depth The depth of the algorithm.
|
|
77
65
|
* @param maximisingPlayer Whether or not the current player is the maximising player.
|
|
@@ -82,12 +70,12 @@ export default class Controller extends EventEmitter {
|
|
|
82
70
|
if (depth === 0 || this.board.winner !== false) {
|
|
83
71
|
return {
|
|
84
72
|
move: { x: NaN, y: NaN },
|
|
85
|
-
score: this.board.heuristic * (this.currentPlayerId === 0 ? 1 : -1)
|
|
73
|
+
score: this.board.heuristic * (this.currentPlayerId === 0 ? 1 : -1),
|
|
86
74
|
};
|
|
87
75
|
}
|
|
88
76
|
let bestMove = {
|
|
89
77
|
move: { x: NaN, y: NaN },
|
|
90
|
-
score: maximisingPlayer ? -Infinity : Infinity
|
|
78
|
+
score: maximisingPlayer ? -Infinity : Infinity,
|
|
91
79
|
};
|
|
92
80
|
const { emptyCells } = this.board;
|
|
93
81
|
for (const move of emptyCells) {
|
|
@@ -109,7 +97,6 @@ export default class Controller extends EventEmitter {
|
|
|
109
97
|
}
|
|
110
98
|
/**
|
|
111
99
|
* The minimax algorithm with alpha-beta pruning.
|
|
112
|
-
*
|
|
113
100
|
* @link https://en.wikipedia.org/wiki/Minimax
|
|
114
101
|
* @param depth The depth of the algorithm.
|
|
115
102
|
* @param alpha The bounds for the alpha-beta variation of the algorithm.
|
|
@@ -122,12 +109,12 @@ export default class Controller extends EventEmitter {
|
|
|
122
109
|
if (depth === 0 || this.board.winner !== false) {
|
|
123
110
|
return {
|
|
124
111
|
move: { x: NaN, y: NaN },
|
|
125
|
-
score: this.board.heuristic * (this.currentPlayerId === 0 ? 1 : -1)
|
|
112
|
+
score: this.board.heuristic * (this.currentPlayerId === 0 ? 1 : -1),
|
|
126
113
|
};
|
|
127
114
|
}
|
|
128
115
|
let bestMove = {
|
|
129
116
|
move: { x: NaN, y: NaN },
|
|
130
|
-
score: maximisingPlayer ? -Infinity : Infinity
|
|
117
|
+
score: maximisingPlayer ? -Infinity : Infinity,
|
|
131
118
|
};
|
|
132
119
|
const { emptyCells } = this.board;
|
|
133
120
|
for (const move of emptyCells) {
|
|
@@ -155,15 +142,12 @@ export default class Controller extends EventEmitter {
|
|
|
155
142
|
}
|
|
156
143
|
return bestMove;
|
|
157
144
|
}
|
|
158
|
-
/**
|
|
159
|
-
* Changes which player's turn it is.
|
|
160
|
-
*/
|
|
145
|
+
/** Changes which player's turn it is. */
|
|
161
146
|
nextTurn() {
|
|
162
147
|
this.currentPlayerId = (this.currentPlayerId + 1) % this.players.length;
|
|
163
148
|
}
|
|
164
149
|
/**
|
|
165
150
|
* Makes a move.
|
|
166
|
-
*
|
|
167
151
|
* @param input Either the algorithm to use to calculate the move or the move itself.
|
|
168
152
|
*/
|
|
169
153
|
async makeMove(input) {
|
|
@@ -171,15 +155,19 @@ export default class Controller extends EventEmitter {
|
|
|
171
155
|
this.board.makeMove(this.determineCPUMove(this.currentPlayer.playerType, input), this.currentPlayer.id);
|
|
172
156
|
}
|
|
173
157
|
else {
|
|
174
|
-
if (this.currentPlayer.playerType !== "human" || !this.board.moveIsValid(input))
|
|
175
|
-
|
|
158
|
+
if (this.currentPlayer.playerType !== "human" || !this.board.moveIsValid(input)) {
|
|
159
|
+
this.emit("invalidInput", input);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
176
162
|
this.board.makeMove(input, this.currentPlayer.id);
|
|
177
163
|
}
|
|
178
164
|
await this.render(this);
|
|
179
165
|
const { winner } = this.board;
|
|
180
|
-
if (winner !== false)
|
|
181
|
-
|
|
166
|
+
if (winner !== false) {
|
|
167
|
+
this.emit("end", winner);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
182
170
|
this.nextTurn();
|
|
183
171
|
}
|
|
184
172
|
}
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3QyxNQUFNLFVBQVUsSUFBSSxDQUFDLFdBQTRCO0lBQzdDLEtBQUssV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFHRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQVcsU0FBUSxZQUkvQztJQUNFOztPQUVHO0lBQ2EsTUFBTSxDQUFTO0lBRS9COztPQUVHO0lBQ2EsS0FBSyxDQUFRO0lBRTdCOztPQUVHO0lBQ2EsTUFBTSxDQUErQztJQUVyRTs7T0FFRztJQUNnQixPQUFPLENBQWlEO0lBRTNFOztPQUVHO0lBQ0ssZUFBZSxHQUFXLENBQUMsQ0FBQztJQUVwQzs7Ozs7OztPQU9HO0lBQ0gseURBQXlEO0lBQ3pELFlBQ0ksV0FBeUIsRUFDekIsS0FBWSxFQUNaLE1BQTRCLEVBQzVCLE1BQTBCLEVBQzFCLEtBQXVDLEVBQ3ZDLGNBQXlEO1FBRXpELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFB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TSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDOUIsSUFBSSxNQUFNLEtBQUssS0FBSztZQUNoQixPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7Q0FrQkoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUeXBlID0gXCJlYXN5Q1BVXCIgfCBcImhhcmRDUFVcIiB8IFwiaHVtYW5cIiB8IFwiaW1wb3NzaWJsZUNQVVwiIHwgXCJtZWRpdW1DUFVcIjtcbmV4cG9ydCB0eXBlIEFsZ29yaXRobSA9IFwiYWxwaGFiZXRhXCIgfCBcIm1pbmltYXhcIjtcbmV4cG9ydCBpbnRlcmZhY2UgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgb25FbmQ/OiAod2lubmVyOiBudW1iZXIgfCBudWxsKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICBvbkludmFsaWRJbnB1dD86IChwb3NpdGlvbjogUG9zaXRpb24pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIHJlbmRlcmVyPzogKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBHYW1lQ29uc3RydWN0b3Ige1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZ1bmN0aW9uLXR5cGVcbiAgICBuZXcgKHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zKTogQ29udHJvbGxlcjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBHYW1lKGNvbnN0cnVjdG9yOiBHYW1lQ29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICB2b2lkIGNvbnN0cnVjdG9yO1xufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGdhbWUgY29udHJvbGxlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIEV2ZW50RW1pdHRlcjx7XG4gICAgZW5kOiBHYW1lQ29uc3RydWN0b3JPcHRpb25zW1wib25FbmRcIl07XG4gICAgaW5wdXQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnNbXCJvbkludmFsaWRJbnB1dFwiXTtcbiAgICBpbnZhbGlkSW5wdXQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnNbXCJvbkludmFsaWRJbnB1dFwiXTtcbn0+IHtcbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGdhbWUuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGdhbWVJRDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIGJvYXJkLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBib2FyZDogQm9hcmQ7XG5cbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgdmlldyBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHJlbmRlcjogUmVxdWlyZWQ8R2FtZUNvbnN0cnVjdG9yT3B0aW9ucz5bXCJyZW5kZXJlclwiXTtcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBwbGF5ZXIgb2JqZWN0cy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyczogQXJyYXk8eyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9PjtcblxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBJRCBvZiB0aGUgY3VycmVudCBwbGF5ZXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjdXJyZW50UGxheWVySWQ6IG51bWJlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbnRyb2xsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxheWVyVHlwZXMgVGhlIHR5cGVzIG9mIHBsYXllci5cbiAgICAgKiBAcGFyYW0gdmlldyBUaGUgdmlldyBvYmplY3QuXG4gICAgICogQHBhcmFtIGdhbWVJRCBUaGUgSUQgb2YgdGhlIGdhbWUuXG4gICAgICogQHBhcmFtIGJvYXJkIFRoZSBib2FyZC5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21heC1wYXJhbXNcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllclR5cGVzOiBQbGF5ZXJUeXBlW10sXG4gICAgICAgIGJvYXJkOiBCb2FyZCxcbiAgICAgICAgcmVuZGVyOiBDb250cm9sbGVyW1wicmVuZGVyXCJdLFxuICAgICAgICBnYW1lSUQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgb25FbmQ/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zW1wib25FbmRcIl0sXG4gICAgICAgIG9uSW52YWxpZElucHV0PzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uc1tcIm9uSW52YWxpZElucHV0XCJdXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZ2FtZUlEID0gZ2FtZUlEID8/IERhdGUubm93KCkudG9TdHJpbmcoMTYpO1xuICAgICAgICB0aGlzLmJvYXJkID0gYm9hcmQ7XG4gICAgICAgIHRoaXMuYm9hcmQuc2V0R2FtZUlEKHRoaXMuZ2FtZUlEKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJzID0gcGxheWVyVHlwZXMubWFwKChwbGF5ZXJUeXBlLCBpZCkgPT4gKHsgaWQsIHBsYXllclR5cGUgfSkpO1xuICAgICAgICB0aGlzLnJlbmRlciA9IHJlbmRlcjtcbiAgICAgICAgaWYgKG9uRW5kICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLm9uKFwiZW5kXCIsIG9uRW5kKTtcbiAgICAgICAgaWYgKG9uSW52YWxpZElucHV0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLm9uKFwiaW52YWxpZElucHV0XCIsIG9uSW52YWxpZElucHV0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHBsYXllciBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50UGxheWVyKCk6IHsgaWQ6IG51bWJlcjsgcGxheWVyVHlwZTogUGxheWVyVHlwZTsgfSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllcnNbdGhpcy5jdXJyZW50UGxheWVySWRdITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgbWFpbiBnYW1lIGZsb3cuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgd2lubmVyIG9yIG51bGwgaW4gdGhlIGV2ZW50IG9mIGEgdGllLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KGFsZ29yaXRobTogQWxnb3JpdGhtID0gXCJhbHBoYWJldGFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5vbihcImlucHV0XCIsIGFzeW5jIChtb3ZlOiBQb3NpdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZShtb3ZlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZU1vdmUoYWxnb3JpdGhtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiICYmIHRoaXMuYm9hcmQud2lubmVyID09PSBmYWxzZSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJvZyBzdGFuZGFyZCBtaW5pbWF4IGFsZ29yaXRobS4gTGVmdCBpbiBmb3IgcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWluaW1heFxuICAgICAqIEBwYXJhbSBkZXB0aCBUaGUgZGVwdGggb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciBXaGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBwbGF5ZXIgaXMgdGhlIG1heGltaXNpbmcgcGxheWVyLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1pbmltYXgoZGVwdGg6IG51bWJlciA9IEluZmluaXR5LCBtYXhpbWlzaW5nUGxheWVyOiBib29sZWFuID0gdHJ1ZSk6IHsgbW92ZTogUG9zaXRpb247IHNjb3JlOiBudW1iZXI7IH0ge1xuICAgICAgICBjb25zdCBwbGF5ZXJJZHMgPSBbKHRoaXMuY3VycmVudFBsYXllcklkICsgMSkgJSAyLCB0aGlzLmN1cnJlbnRQbGF5ZXJJZF0gYXMgY29uc3Q7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLm1pbmltYXg+ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9ICg5IC0gZW1wdHlDZWxscy5sZW5ndGgpICogdGhpcy5taW5pbWF4KGRlcHRoIC0gMSwgIW1heGltaXNpbmdQbGF5ZXIpLnNjb3JlO1xuICAgICAgICAgICAgdGhpcy5ib2FyZC51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWluKHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJlc3RTY29yZSAhPT0gYmVzdE1vdmUuc2NvcmUpXG4gICAgICAgICAgICAgICAgICAgIGJlc3RNb3ZlID0geyBtb3ZlLCBzY29yZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0TW92ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW1heCBhbGdvcml0aG0gd2l0aCBhbHBoYS1iZXRhIHBydW5pbmcuXG4gICAgICpcbiAgICAgKiBAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NaW5pbWF4XG4gICAgICogQHBhcmFtIGRlcHRoIFRoZSBkZXB0aCBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBhbHBoYSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gYmV0YSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciBXaGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBwbGF5ZXIgaXMgdGhlIG1heGltaXNpbmcgcGxheWVyLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFscGhhYmV0YShcbiAgICAgICAgZGVwdGg6IG51bWJlciA9IEluZmluaXR5LFxuICAgICAgICBhbHBoYTogbnVtYmVyID0gLUluZmluaXR5LFxuICAgICAgICBiZXRhOiBudW1iZXIgPSBJbmZpbml0eSxcbiAgICAgICAgbWF4aW1pc2luZ1BsYXllcjogYm9vbGVhbiA9IHRydWVcbiAgICApOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdIGFzIGNvbnN0O1xuICAgICAgICBpZiAoZGVwdGggPT09IDAgfHwgdGhpcy5ib2FyZC53aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vdmU6IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgICAgICBzY29yZTogdGhpcy5ib2FyZC5oZXVyaXN0aWMgKiAodGhpcy5jdXJyZW50UGxheWVySWQgPT09IDAgPyAxIDogLTEpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBiZXN0TW92ZTogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5hbHBoYWJldGE+ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9ICg5IC0gZW1wdHlDZWxscy5sZW5ndGgpICogdGhpcy5hbHBoYWJldGEoZGVwdGggLSAxLCBhbHBoYSwgYmV0YSwgIW1heGltaXNpbmdQbGF5ZXIpLnNjb3JlO1xuICAgICAgICAgICAgdGhpcy5ib2FyZC51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICAgICAgaWYgKGJlc3RNb3ZlLnNjb3JlID4gYmV0YSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1heChhbHBoYSwgYmVzdFNjb3JlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5taW4oc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICAgICAgaWYgKGJlc3RNb3ZlLnNjb3JlIDwgYWxwaGEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGJldGEgPSBNYXRoLm1pbihiZXRhLCBiZXN0U2NvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0TW92ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlucHV0IEVpdGhlciB0aGUgYWxnb3JpdGhtIHRvIHVzZSB0byBjYWxjdWxhdGUgdGhlIG1vdmUgb3IgdGhlIG1vdmUgaXRzZWxmLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbWFrZU1vdmUoaW5wdXQ6IEFsZ29yaXRobSB8IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUodGhpcy5kZXRlcm1pbmVDUFVNb3ZlKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlLCBpbnB1dCksIHRoaXMuY3VycmVudFBsYXllci5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIiB8fCAhdGhpcy5ib2FyZC5tb3ZlSXNWYWxpZChpbnB1dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5lbWl0KFwiaW52YWxpZElucHV0XCIsIGlucHV0KTtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUoaW5wdXQsIHRoaXMuY3VycmVudFBsYXllci5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXIodGhpcyk7XG4gICAgICAgIGNvbnN0IHsgd2lubmVyIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBpZiAod2lubmVyICE9PSBmYWxzZSlcbiAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdChcImVuZFwiLCB3aW5uZXIpO1xuICAgICAgICB0aGlzLm5leHRUdXJuKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB0aGUgQ1BVIG1vdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGlmZmljdWx0eSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQUkuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4sIGFsZ29yaXRobT86IEFsZ29yaXRobSk6IFBvc2l0aW9uO1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGZpbmRPcHRpbWFsTW92ZShvcHRpb25zPzogeyBhbGdvcml0aG0/OiBBbGdvcml0aG07IG1heERlcHRoPzogbnVtYmVyOyByYW5kb21Nb3ZlPzogUG9zaXRpb247IH0pOiBQb3NpdGlvbjtcbn1cbiJdfQ==
|
|
173
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLFdBQTRCO0lBQzdDLEtBQUssV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxvQ0FBb0M7QUFDcEMsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsVUFBVyxTQUFRLFlBSS9DO0lBQ0UsbUNBQW1DO0lBQ25CLE1BQU0sQ0FBUztJQUUvQiwwQkFBMEI7SUFDVixLQUFLLENBQVE7SUFFN0IsZ0NBQWdDO0lBQ2hCLE1BQU0sQ0FBK0M7SUFFckUsbUNBQW1DO0lBQ2hCLE9BQU8sQ0FBaUQ7SUFFM0UsNkNBQTZDO0lBQ3JDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFFcEM7Ozs7OztPQU1HO0lBQ0gsd0VBQXdFO0lBQ3hFLFlBQ0ksV0FBeUIsRUFDekIsS0FBWSxFQUNaLE1BQTRCLEVBQzVCLE1BQTBCLEVBQzFCLEtBQXVDLEVBQ3ZDLGNBQXlEO1FBRXpELEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLE1BQU0sR0FB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QUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTlCLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRXpCLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7Q0FnQkoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUeXBlID0gXCJlYXN5Q1BVXCIgfCBcImhhcmRDUFVcIiB8IFwiaHVtYW5cIiB8IFwiaW1wb3NzaWJsZUNQVVwiIHwgXCJtZWRpdW1DUFVcIjtcbmV4cG9ydCB0eXBlIEFsZ29yaXRobSA9IFwiYWxwaGFiZXRhXCIgfCBcIm1pbmltYXhcIjtcbmV4cG9ydCB0eXBlIEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnMgPSB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgb25FbmQ/OiAod2lubmVyOiBudW1iZXIgfCBudWxsKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICBvbkludmFsaWRJbnB1dD86IChwb3NpdGlvbjogUG9zaXRpb24pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIHJlbmRlcmVyPzogKGNvbnRyb2xsZXI6IENvbnRyb2xsZXIpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufTtcbmV4cG9ydCB0eXBlIEdhbWVDb25zdHJ1Y3RvciA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mdW5jdGlvbi10eXBlXG4gICAgbmV3IChwbGF5ZXJPbmVUeXBlOiBQbGF5ZXJUeXBlLCBwbGF5ZXJUd29UeXBlOiBQbGF5ZXJUeXBlLCBvcHRpb25zPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9ucyk6IENvbnRyb2xsZXI7XG59O1xuLyoqXG4gKiBEZWNvcmF0b3IgdG8gY2hlY2sgdGhhdCB0aGUgY29uc3RydWN0b3IgdHlwZSBmb3IgdGhlIGdpdmVuIGNsYXNzIGlzIGNvcnJlY3QuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgVGhlIGNsYXNzIHRvIGNoZWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2FtZShjb25zdHJ1Y3RvcjogR2FtZUNvbnN0cnVjdG9yKTogdm9pZCB7XG4gICAgdm9pZCBjb25zdHJ1Y3Rvcjtcbn1cblxuLyoqIFJlcHJlc2VudHMgYSBnYW1lIGNvbnRyb2xsZXIuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPHtcbiAgICBlbmQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnNbXCJvbkVuZFwiXTtcbiAgICBpbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uc1tcIm9uSW52YWxpZElucHV0XCJdO1xuICAgIGludmFsaWRJbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uc1tcIm9uSW52YWxpZElucHV0XCJdO1xufT4ge1xuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGdhbWUuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGdhbWVJRDogc3RyaW5nO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBib2FyZC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYm9hcmQ6IEJvYXJkO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSB2aWV3IG9iamVjdC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVuZGVyOiBSZXF1aXJlZDxHYW1lQ29uc3RydWN0b3JPcHRpb25zPltcInJlbmRlcmVyXCJdO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBwbGF5ZXIgb2JqZWN0cy4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyczogQXJyYXk8eyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9PjtcblxuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgcGxheWVyLiAqL1xuICAgIHByaXZhdGUgY3VycmVudFBsYXllcklkOiBudW1iZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb250cm9sbGVyLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUeXBlcyBUaGUgdHlwZXMgb2YgcGxheWVyLlxuICAgICAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gZ2FtZUlEIFRoZSBJRCBvZiB0aGUgZ2FtZS5cbiAgICAgKiBAcGFyYW0gYm9hcmQgVGhlIGJvYXJkLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbWF4LXBhcmFtcywgcmVxdWlyZS1qc2RvY1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAgICAgcGxheWVyVHlwZXM6IFBsYXllclR5cGVbXSxcbiAgICAgICAgYm9hcmQ6IEJvYXJkLFxuICAgICAgICByZW5kZXI6IENvbnRyb2xsZXJbXCJyZW5kZXJcIl0sXG4gICAgICAgIGdhbWVJRDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBvbkVuZD86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnNbXCJvbkVuZFwiXSxcbiAgICAgICAgb25JbnZhbGlkSW5wdXQ/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zW1wib25JbnZhbGlkSW5wdXRcIl0sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZ2FtZUlEID0gZ2FtZUlEID8/IERhdGUubm93KCkudG9TdHJpbmcoMTYpO1xuICAgICAgICB0aGlzLmJvYXJkID0gYm9hcmQ7XG4gICAgICAgIHRoaXMuYm9hcmQuc2V0R2FtZUlEKHRoaXMuZ2FtZUlEKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJzID0gcGxheWVyVHlwZXMubWFwKChwbGF5ZXJUeXBlLCBpZCkgPT4gKHsgaWQsIHBsYXllclR5cGUgfSkpO1xuICAgICAgICB0aGlzLnJlbmRlciA9IHJlbmRlcjtcblxuICAgICAgICBpZiAob25FbmQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMub24oXCJlbmRcIiwgb25FbmQpO1xuXG4gICAgICAgIGlmIChvbkludmFsaWRJbnB1dCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5vbihcImludmFsaWRJbnB1dFwiLCBvbkludmFsaWRJbnB1dCk7XG4gICAgfVxuXG4gICAgLyoqIEdldHMgdGhlIGN1cnJlbnQgcGxheWVyIG9iamVjdC4gKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRQbGF5ZXIoKTogeyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyc1t0aGlzLmN1cnJlbnRQbGF5ZXJJZF0hO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBtYWluIGdhbWUgZmxvdy5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIFRoZSBhbGdvcml0aG0gdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSB3aW5uZXIgb3IgbnVsbCBpbiB0aGUgZXZlbnQgb2YgYSB0aWUuXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHBsYXkoYWxnb3JpdGhtOiBBbGdvcml0aG0gPSBcImFscGhhYmV0YVwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLm9uKFwiaW5wdXRcIiwgYXN5bmMgKG1vdmU6IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKG1vdmUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIilcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiICYmIHRoaXMuYm9hcmQud2lubmVyID09PSBmYWxzZSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKGFsZ29yaXRobSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJvZyBzdGFuZGFyZCBtaW5pbWF4IGFsZ29yaXRobS4gTGVmdCBpbiBmb3IgcmVmZXJlbmNlLlxuICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01pbmltYXhcbiAgICAgKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIG1heGltaXNpbmdQbGF5ZXIgV2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgcGxheWVyIGlzIHRoZSBtYXhpbWlzaW5nIHBsYXllci5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtaW5pbWF4KGRlcHRoOiBudW1iZXIgPSBJbmZpbml0eSwgbWF4aW1pc2luZ1BsYXllcjogYm9vbGVhbiA9IHRydWUpOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdIGFzIGNvbnN0O1xuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLm1pbmltYXg+ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9ICg5IC0gZW1wdHlDZWxscy5sZW5ndGgpICogdGhpcy5taW5pbWF4KGRlcHRoIC0gMSwgIW1heGltaXNpbmdQbGF5ZXIpLnNjb3JlO1xuXG4gICAgICAgICAgICB0aGlzLmJvYXJkLnVuZG9MYXN0TW92ZSgpO1xuXG4gICAgICAgICAgICBpZiAobWF4aW1pc2luZ1BsYXllcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWF4KHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJlc3RTY29yZSA9IE1hdGgubWluKHNjb3JlLCBiZXN0TW92ZS5zY29yZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmVzdFNjb3JlICE9PSBiZXN0TW92ZS5zY29yZSlcbiAgICAgICAgICAgICAgICAgICAgYmVzdE1vdmUgPSB7IG1vdmUsIHNjb3JlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmVzdE1vdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltYXggYWxnb3JpdGhtIHdpdGggYWxwaGEtYmV0YSBwcnVuaW5nLlxuICAgICAqIEBsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01pbmltYXhcbiAgICAgKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGFscGhhIFRoZSBib3VuZHMgZm9yIHRoZSBhbHBoYS1iZXRhIHZhcmlhdGlvbiBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBiZXRhIFRoZSBib3VuZHMgZm9yIHRoZSBhbHBoYS1iZXRhIHZhcmlhdGlvbiBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBtYXhpbWlzaW5nUGxheWVyIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHBsYXllciBpcyB0aGUgbWF4aW1pc2luZyBwbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWxwaGFiZXRhKFxuICAgICAgICBkZXB0aDogbnVtYmVyID0gSW5maW5pdHksXG4gICAgICAgIGFscGhhOiBudW1iZXIgPSAtSW5maW5pdHksXG4gICAgICAgIGJldGE6IG51bWJlciA9IEluZmluaXR5LFxuICAgICAgICBtYXhpbWlzaW5nUGxheWVyOiBib29sZWFuID0gdHJ1ZSxcbiAgICApOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdIGFzIGNvbnN0O1xuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmFscGhhYmV0YT4gPSB7XG4gICAgICAgICAgICBtb3ZlOiB7IHg6IE5hTiwgeTogTmFOIH0sXG4gICAgICAgICAgICBzY29yZTogbWF4aW1pc2luZ1BsYXllciA/IC1JbmZpbml0eSA6IEluZmluaXR5LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGVtcHR5Q2VsbHMgfSA9IHRoaXMuYm9hcmQ7XG5cbiAgICAgICAgZm9yIChjb25zdCBtb3ZlIG9mIGVtcHR5Q2VsbHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm9hcmQubWFrZU1vdmUobW92ZSwgcGxheWVySWRzW051bWJlcihtYXhpbWlzaW5nUGxheWVyKV0hKTtcbiAgICAgICAgICAgIGNvbnN0IHNjb3JlID0gKDkgLSBlbXB0eUNlbGxzLmxlbmd0aCkgKiB0aGlzLmFscGhhYmV0YShkZXB0aCAtIDEsIGFscGhhLCBiZXRhLCAhbWF4aW1pc2luZ1BsYXllcikuc2NvcmU7XG5cbiAgICAgICAgICAgIHRoaXMuYm9hcmQudW5kb0xhc3RNb3ZlKCk7XG5cbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA+IGJldGEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1heChhbHBoYSwgYmVzdFNjb3JlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5taW4oc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA8IGFscGhhKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGJldGEgPSBNYXRoLm1pbihiZXRhLCBiZXN0U2NvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNb3ZlO1xuICAgIH1cblxuICAgIC8qKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqIEBwYXJhbSBpbnB1dCBFaXRoZXIgdGhlIGFsZ29yaXRobSB0byB1c2UgdG8gY2FsY3VsYXRlIHRoZSBtb3ZlIG9yIHRoZSBtb3ZlIGl0c2VsZi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIG1ha2VNb3ZlKGlucHV0OiBBbGdvcml0aG0gfCBQb3NpdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKHRoaXMuZGV0ZXJtaW5lQ1BVTW92ZSh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSwgaW5wdXQpLCB0aGlzLmN1cnJlbnRQbGF5ZXIuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIgfHwgIXRoaXMuYm9hcmQubW92ZUlzVmFsaWQoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiaW52YWxpZElucHV0XCIsIGlucHV0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShpbnB1dCwgdGhpcy5jdXJyZW50UGxheWVyLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyKHRoaXMpO1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcy5ib2FyZDtcblxuICAgICAgICBpZiAod2lubmVyICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZW5kXCIsIHdpbm5lcik7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmV4dFR1cm4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHRoZSBDUFUgbW92ZS5cbiAgICAgKiBAcGFyYW0gZGlmZmljdWx0eSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQUkuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4sIGFsZ29yaXRobT86IEFsZ29yaXRobSk6IFBvc2l0aW9uO1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBmaW5kT3B0aW1hbE1vdmUob3B0aW9ucz86IHsgYWxnb3JpdGhtPzogQWxnb3JpdGhtOyBtYXhEZXB0aD86IG51bWJlcjsgcmFuZG9tTW92ZT86IFBvc2l0aW9uOyB9KTogUG9zaXRpb247XG59XG4iXX0=
|
|
@@ -2,74 +2,57 @@
|
|
|
2
2
|
import type { StringType } from "./longInt.js";
|
|
3
3
|
/**
|
|
4
4
|
* Represents a BitBoard.
|
|
5
|
-
*
|
|
6
5
|
* @link https://en.wikipedia.org/wiki/Bitboard
|
|
7
6
|
*/
|
|
8
7
|
export default abstract class BitBoard<T extends LongInt | number = LongInt | number> {
|
|
9
|
-
/**
|
|
10
|
-
* The numeric data.
|
|
11
|
-
*/
|
|
8
|
+
/** The numeric data. */
|
|
12
9
|
protected _data: T;
|
|
13
10
|
/**
|
|
14
11
|
* Creates an instance of BitBoard.
|
|
15
|
-
*
|
|
16
12
|
* @param data The data to assign to the BitBoard.
|
|
17
13
|
*/
|
|
18
14
|
protected constructor(data: T);
|
|
19
|
-
/**
|
|
20
|
-
* Gets the numeric data.
|
|
21
|
-
*/
|
|
15
|
+
/** Gets the numeric data. */
|
|
22
16
|
get data(): T;
|
|
23
17
|
/**
|
|
24
18
|
* Returns a string representation of the BitBoard.
|
|
25
|
-
*
|
|
26
19
|
* @param type The base of the string to print.
|
|
27
20
|
* @returns The string representation.
|
|
28
21
|
*/
|
|
29
22
|
toString(type?: StringType): string;
|
|
30
23
|
/**
|
|
31
24
|
* Assigns a given bit a given value.
|
|
32
|
-
*
|
|
33
25
|
* @param bit The x coordinate.
|
|
34
26
|
* @param value The value to assign to the bit.
|
|
35
27
|
*/
|
|
36
28
|
assignBit(bit: number, value: 0 | 1): void;
|
|
37
29
|
/**
|
|
38
|
-
* Gets a given bit
|
|
39
|
-
*
|
|
30
|
+
* Gets a given bit
|
|
40
31
|
* @param bit The index of the bit to get, 0 = LSB.
|
|
41
32
|
* @returns The bit.
|
|
42
33
|
*/
|
|
43
34
|
abstract getBit(bit: number): 0 | 1;
|
|
44
35
|
/**
|
|
45
|
-
* Sets a given bit (changes the value to 1)
|
|
46
|
-
*
|
|
36
|
+
* Sets a given bit (changes the value to 1)
|
|
47
37
|
* @param bit The index of the bit to get, 0 = LSB.
|
|
48
38
|
*/
|
|
49
39
|
abstract setBit(bit: number): void;
|
|
50
40
|
/**
|
|
51
|
-
* Clears a given bit (changes the value to 0)
|
|
52
|
-
*
|
|
41
|
+
* Clears a given bit (changes the value to 0)
|
|
53
42
|
* @param bit The index of the bit to get, 0 = LSB.
|
|
54
43
|
*/
|
|
55
44
|
abstract clearBit(bit: number): void;
|
|
56
45
|
/**
|
|
57
|
-
* Toggles a given bit (changes the value from 0 to 1 or 1 to 0)
|
|
58
|
-
*
|
|
46
|
+
* Toggles a given bit (changes the value from 0 to 1 or 1 to 0)
|
|
59
47
|
* @param bit The index of the bit to get, 0 = LSB.
|
|
60
48
|
*/
|
|
61
49
|
abstract toggleBit(bit: number): void;
|
|
62
|
-
/**
|
|
63
|
-
* Clears the whole BitBoard (sets all values to 0).
|
|
64
|
-
*/
|
|
50
|
+
/** Clears the whole BitBoard (sets all values to 0). */
|
|
65
51
|
abstract clearAll(): void;
|
|
66
|
-
/**
|
|
67
|
-
* Set the whole BitBoard (sets all values to 1).
|
|
68
|
-
*/
|
|
52
|
+
/** Set the whole BitBoard (sets all values to 1). */
|
|
69
53
|
abstract setAll(): void;
|
|
70
54
|
/**
|
|
71
55
|
* Gets a range of bits.
|
|
72
|
-
*
|
|
73
56
|
* @param LSB The least significant bit.
|
|
74
57
|
* @param numberOfBits The number of bits to get.
|
|
75
58
|
* @returns The range of bits.
|
|
@@ -77,55 +60,47 @@ export default abstract class BitBoard<T extends LongInt | number = LongInt | nu
|
|
|
77
60
|
abstract getBits(LSB: number, numberOfBits: number): T;
|
|
78
61
|
/**
|
|
79
62
|
* Carries out a bitwise and (&) operation.
|
|
80
|
-
*
|
|
81
63
|
* @param right The right value.
|
|
82
64
|
* @returns The result.
|
|
83
65
|
*/
|
|
84
66
|
abstract and(right: BitBoard<T> | T | number): this;
|
|
85
67
|
/**
|
|
86
68
|
* Carries out a bitwise or (|) operation.
|
|
87
|
-
*
|
|
88
69
|
* @param right The right value.
|
|
89
70
|
* @returns The result.
|
|
90
71
|
*/
|
|
91
72
|
abstract or(right: BitBoard<T> | T | number): this;
|
|
92
73
|
/**
|
|
93
74
|
* Carries out a bitwise xor (^) operation.
|
|
94
|
-
*
|
|
95
75
|
* @param right The right value.
|
|
96
76
|
* @returns The result.
|
|
97
77
|
*/
|
|
98
78
|
abstract xor(right: BitBoard<T> | T | number): this;
|
|
99
79
|
/**
|
|
100
80
|
* Carries out a bitwise not (~) operation.
|
|
101
|
-
*
|
|
102
81
|
* @returns The result.
|
|
103
82
|
*/
|
|
104
83
|
abstract not(): this;
|
|
105
84
|
/**
|
|
106
85
|
* Carries out a bitwise left shift (<<) operation.
|
|
107
|
-
*
|
|
108
86
|
* @param shiftAmount How much to shift it by.
|
|
109
87
|
* @returns The result.
|
|
110
88
|
*/
|
|
111
89
|
abstract leftShift(shiftAmount: number): this;
|
|
112
90
|
/**
|
|
113
91
|
* Carries out a bitwise logical right shift (>>>) operation.
|
|
114
|
-
*
|
|
115
92
|
* @param shiftAmount How much to shift it by.
|
|
116
93
|
* @returns The result.
|
|
117
94
|
*/
|
|
118
95
|
abstract rightShift(shiftAmount: number): this;
|
|
119
96
|
/**
|
|
120
97
|
* Carries out a bitwise arithmetic right shift (>>) operation.
|
|
121
|
-
*
|
|
122
98
|
* @param shiftAmount How much to shift it by.
|
|
123
99
|
* @returns The result.
|
|
124
100
|
*/
|
|
125
101
|
abstract arithmeticRightShift(shiftAmount: number): this;
|
|
126
102
|
/**
|
|
127
103
|
* Checks if two BitBoards have equal data values.
|
|
128
|
-
*
|
|
129
104
|
* @param value The value to compare against.
|
|
130
105
|
* @returns Whether or not the two BitBoard have the same data value.
|
|
131
106
|
*/
|
|
@@ -1,30 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Represents a BitBoard.
|
|
3
|
-
*
|
|
4
3
|
* @link https://en.wikipedia.org/wiki/Bitboard
|
|
5
4
|
*/
|
|
6
5
|
export default class BitBoard {
|
|
7
|
-
/**
|
|
8
|
-
* The numeric data.
|
|
9
|
-
*/
|
|
6
|
+
/** The numeric data. */
|
|
10
7
|
_data;
|
|
11
8
|
/**
|
|
12
9
|
* Creates an instance of BitBoard.
|
|
13
|
-
*
|
|
14
10
|
* @param data The data to assign to the BitBoard.
|
|
15
11
|
*/
|
|
16
12
|
constructor(data) {
|
|
17
13
|
this._data = data;
|
|
18
14
|
}
|
|
19
|
-
/**
|
|
20
|
-
* Gets the numeric data.
|
|
21
|
-
*/
|
|
15
|
+
/** Gets the numeric data. */
|
|
22
16
|
get data() {
|
|
23
17
|
return this._data;
|
|
24
18
|
}
|
|
25
19
|
/**
|
|
26
20
|
* Returns a string representation of the BitBoard.
|
|
27
|
-
*
|
|
28
21
|
* @param type The base of the string to print.
|
|
29
22
|
* @returns The string representation.
|
|
30
23
|
*/
|
|
@@ -45,12 +38,14 @@ export default class BitBoard {
|
|
|
45
38
|
}
|
|
46
39
|
/**
|
|
47
40
|
* Assigns a given bit a given value.
|
|
48
|
-
*
|
|
49
41
|
* @param bit The x coordinate.
|
|
50
42
|
* @param value The value to assign to the bit.
|
|
51
43
|
*/
|
|
52
44
|
assignBit(bit, value) {
|
|
53
|
-
|
|
45
|
+
if (value === 0)
|
|
46
|
+
this.clearBit(bit);
|
|
47
|
+
else
|
|
48
|
+
this.setBit(bit);
|
|
54
49
|
}
|
|
55
50
|
}
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Qm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYml0Qm9hcmQvYml0Qm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0E7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsUUFBUTtJQUNsQyx3QkFBd0I7SUFDZCxLQUFLLENBQUk7SUFFbkI7OztPQUdHO0lBQ0gsWUFBc0IsSUFBTztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBRUQsNkJBQTZCO0lBQzdCLElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBQyxPQUFtQixFQUFFO1FBQ2pDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUVsQixRQUFRLElBQUksRUFBRSxDQUFDO1lBQ1gsS0FBSyxDQUFDO2dCQUNGLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ2YsTUFBTTtZQUNWLEtBQUssRUFBRTtnQkFDSCxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUNmLE1BQU07WUFDVixLQUFLLEVBQUU7Z0JBQ0gsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDZCxNQUFNO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBWTtRQUN0QyxJQUFJLEtBQUssS0FBSyxDQUFDO1lBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7WUFFbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBK0ZKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgTG9uZ0ludCBmcm9tIFwiLi9sb25nSW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1R5cGUgfSBmcm9tIFwiLi9sb25nSW50LmpzXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIEJpdEJvYXJkLlxuICogQGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQml0Ym9hcmRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQml0Qm9hcmQ8VCBleHRlbmRzIExvbmdJbnQgfCBudW1iZXIgPSBMb25nSW50IHwgbnVtYmVyPiB7XG4gICAgLyoqIFRoZSBudW1lcmljIGRhdGEuICovXG4gICAgcHJvdGVjdGVkIF9kYXRhOiBUO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCaXRCb2FyZC5cbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBhc3NpZ24gdG8gdGhlIEJpdEJvYXJkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihkYXRhOiBUKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIC8qKiBHZXRzIHRoZSBudW1lcmljIGRhdGEuICovXG4gICAgcHVibGljIGdldCBkYXRhKCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBCaXRCb2FyZC5cbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgYmFzZSBvZiB0aGUgc3RyaW5nIHRvIHByaW50LlxuICAgICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKHR5cGU6IFN0cmluZ1R5cGUgPSAxNik6IHN0cmluZyB7XG4gICAgICAgIGxldCBwYWRMZW5ndGggPSAwO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHBhZExlbmd0aCA9IDMyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICBwYWRMZW5ndGggPSAxMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgcGFkTGVuZ3RoID0gODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnRvU3RyaW5nKHR5cGUpLnBhZFN0YXJ0KHBhZExlbmd0aCwgXCIwXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgYSBnaXZlbiBiaXQgYSBnaXZlbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gYml0IFRoZSB4IGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIGJpdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzaWduQml0KGJpdDogbnVtYmVyLCB2YWx1ZTogMCB8IDEpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgdGhpcy5jbGVhckJpdChiaXQpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnNldEJpdChiaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBnaXZlbiBiaXRcbiAgICAgKiBAcGFyYW0gYml0IFRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGdldCwgMCA9IExTQi5cbiAgICAgKiBAcmV0dXJucyBUaGUgYml0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXRCaXQoYml0OiBudW1iZXIpOiAwIHwgMTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBnaXZlbiBiaXQgKGNoYW5nZXMgdGhlIHZhbHVlIHRvIDEpXG4gICAgICogQHBhcmFtIGJpdCBUaGUgaW5kZXggb2YgdGhlIGJpdCB0byBnZXQsIDAgPSBMU0IuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IHNldEJpdChiaXQ6IG51bWJlcik6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYSBnaXZlbiBiaXQgKGNoYW5nZXMgdGhlIHZhbHVlIHRvIDApXG4gICAgICogQHBhcmFtIGJpdCBUaGUgaW5kZXggb2YgdGhlIGJpdCB0byBnZXQsIDAgPSBMU0IuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGNsZWFyQml0KGJpdDogbnVtYmVyKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgYSBnaXZlbiBiaXQgKGNoYW5nZXMgdGhlIHZhbHVlIGZyb20gMCB0byAxIG9yIDEgdG8gMClcbiAgICAgKiBAcGFyYW0gYml0IFRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGdldCwgMCA9IExTQi5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgdG9nZ2xlQml0KGJpdDogbnVtYmVyKTogdm9pZDtcblxuICAgIC8qKiBDbGVhcnMgdGhlIHdob2xlIEJpdEJvYXJkIChzZXRzIGFsbCB2YWx1ZXMgdG8gMCkuICovXG4gICAgcHVibGljIGFic3RyYWN0IGNsZWFyQWxsKCk6IHZvaWQ7XG5cbiAgICAvKiogU2V0IHRoZSB3aG9sZSBCaXRCb2FyZCAoc2V0cyBhbGwgdmFsdWVzIHRvIDEpLiAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBzZXRBbGwoKTogdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgYSByYW5nZSBvZiBiaXRzLlxuICAgICAqIEBwYXJhbSBMU0IgVGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC5cbiAgICAgKiBAcGFyYW0gbnVtYmVyT2ZCaXRzIFRoZSBudW1iZXIgb2YgYml0cyB0byBnZXQuXG4gICAgICogQHJldHVybnMgVGhlIHJhbmdlIG9mIGJpdHMuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGdldEJpdHMoTFNCOiBudW1iZXIsIG51bWJlck9mQml0czogbnVtYmVyKTogVDtcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBhbmQgKCYpIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGFuZChyaWdodDogQml0Qm9hcmQ8VD4gfCBUIHwgbnVtYmVyKTogdGhpcztcblxuICAgIC8qKlxuICAgICAqIENhcnJpZXMgb3V0IGEgYml0d2lzZSBvciAofCkgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgdmFsdWUuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3Qgb3IocmlnaHQ6IEJpdEJvYXJkPFQ+IHwgVCB8IG51bWJlcik6IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgeG9yICheKSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCB4b3IocmlnaHQ6IEJpdEJvYXJkPFQ+IHwgVCB8IG51bWJlcik6IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2Ugbm90ICh+KSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3Qgbm90KCk6IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiBDYXJyaWVzIG91dCBhIGJpdHdpc2UgbGVmdCBzaGlmdCAoPDwpIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gc2hpZnRBbW91bnQgSG93IG11Y2ggdG8gc2hpZnQgaXQgYnkuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgbGVmdFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIGxvZ2ljYWwgcmlnaHQgc2hpZnQgKD4+Pikgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBzaGlmdEFtb3VudCBIb3cgbXVjaCB0byBzaGlmdCBpdCBieS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCByaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogQ2FycmllcyBvdXQgYSBiaXR3aXNlIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgKD4+KSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHNoaWZ0QW1vdW50IEhvdyBtdWNoIHRvIHNoaWZ0IGl0IGJ5LlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQuXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGFyaXRobWV0aWNSaWdodFNoaWZ0KHNoaWZ0QW1vdW50OiBudW1iZXIpOiB0aGlzO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHR3byBCaXRCb2FyZHMgaGF2ZSBlcXVhbCBkYXRhIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgdHdvIEJpdEJvYXJkIGhhdmUgdGhlIHNhbWUgZGF0YSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZXF1YWxzKHZhbHVlOiBCaXRCb2FyZDxUPiB8IFQgfCBudW1iZXIpOiBib29sZWFuO1xufVxuIl19
|