@pie-lib/controller-utils 0.3.0-beta.5 → 0.3.0-beta.6

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/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.3.0-beta.6](https://github.com/pie-framework/pie-lib/compare/@pie-lib/controller-utils@0.2.44...@pie-lib/controller-utils@0.3.0-beta.6) (2025-07-25)
7
+
8
+ **Note:** Version bump only for package @pie-lib/controller-utils
9
+
10
+
11
+
12
+
13
+
14
+ # [0.3.0-beta.5](https://github.com/pie-framework/pie-lib/compare/@pie-lib/controller-utils@0.2.44...@pie-lib/controller-utils@0.3.0-beta.5) (2025-07-25)
15
+
16
+ **Note:** Version bump only for package @pie-lib/controller-utils
17
+
18
+
19
+
20
+
21
+
6
22
  # [0.3.0-beta.5](https://github.com/pie-framework/pie-lib/compare/@pie-lib/controller-utils@0.2.44...@pie-lib/controller-utils@0.3.0-beta.5) (2025-07-25)
7
23
 
8
24
  **Note:** Version bump only for package @pie-lib/controller-utils
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pie-lib/controller-utils",
3
- "version": "0.3.0-beta.5",
3
+ "version": "0.3.0-beta.6",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "module": "src/index.js",
@@ -1,35 +0,0 @@
1
- "use strict";
2
-
3
- var _partialScoring = require("../partial-scoring");
4
-
5
- describe('enabled', function () {
6
- var assertEnabled = function assertEnabled(config, env, expected) {
7
- it("returns ".concat(expected, " for: config: ").concat(config.partialScoring, ", env:").concat(env.partialScoring), function () {
8
- var result = (0, _partialScoring.enabled)(config, env);
9
- expect(result).toEqual(expected);
10
- });
11
- };
12
-
13
- var config = function config(v) {
14
- return {
15
- partialScoring: v
16
- };
17
- };
18
-
19
- var env = function env(v) {
20
- return {
21
- partialScoring: v
22
- };
23
- };
24
-
25
- assertEnabled(config(undefined), env(undefined), true);
26
- assertEnabled(config(undefined), env(true), true);
27
- assertEnabled(config(undefined), env(false), false);
28
- assertEnabled(config(false), env(undefined), false);
29
- assertEnabled(config(false), env(true), false);
30
- assertEnabled(config(false), env(false), false);
31
- assertEnabled(config(true), env(undefined), true);
32
- assertEnabled(config(true), env(true), true);
33
- assertEnabled(config(true), env(false), false);
34
- });
35
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vcGFydGlhbC1zY29yaW5nLnRlc3QuanMiXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJhc3NlcnRFbmFibGVkIiwiY29uZmlnIiwiZW52IiwiZXhwZWN0ZWQiLCJpdCIsInBhcnRpYWxTY29yaW5nIiwicmVzdWx0IiwiZXhwZWN0IiwidG9FcXVhbCIsInYiLCJ1bmRlZmluZWQiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBRUFBLFFBQVEsQ0FBQyxTQUFELEVBQVksWUFBTTtBQUN4QixNQUFNQyxhQUFhLEdBQUcsU0FBaEJBLGFBQWdCLENBQUNDLE1BQUQsRUFBU0MsR0FBVCxFQUFjQyxRQUFkLEVBQTJCO0FBQy9DQyxJQUFBQSxFQUFFLG1CQUFZRCxRQUFaLDJCQUFxQ0YsTUFBTSxDQUFDSSxjQUE1QyxtQkFBbUVILEdBQUcsQ0FBQ0csY0FBdkUsR0FBeUYsWUFBTTtBQUMvRixVQUFNQyxNQUFNLEdBQUcsNkJBQVFMLE1BQVIsRUFBZ0JDLEdBQWhCLENBQWY7QUFDQUssTUFBQUEsTUFBTSxDQUFDRCxNQUFELENBQU4sQ0FBZUUsT0FBZixDQUF1QkwsUUFBdkI7QUFDRCxLQUhDLENBQUY7QUFJRCxHQUxEOztBQU9BLE1BQU1GLE1BQU0sR0FBRyxTQUFUQSxNQUFTLENBQUNRLENBQUQ7QUFBQSxXQUFRO0FBQUVKLE1BQUFBLGNBQWMsRUFBRUk7QUFBbEIsS0FBUjtBQUFBLEdBQWY7O0FBQ0EsTUFBTVAsR0FBRyxHQUFHLFNBQU5BLEdBQU0sQ0FBQ08sQ0FBRDtBQUFBLFdBQVE7QUFBRUosTUFBQUEsY0FBYyxFQUFFSTtBQUFsQixLQUFSO0FBQUEsR0FBWjs7QUFFQVQsRUFBQUEsYUFBYSxDQUFDQyxNQUFNLENBQUNTLFNBQUQsQ0FBUCxFQUFvQlIsR0FBRyxDQUFDUSxTQUFELENBQXZCLEVBQW9DLElBQXBDLENBQWI7QUFDQVYsRUFBQUEsYUFBYSxDQUFDQyxNQUFNLENBQUNTLFNBQUQsQ0FBUCxFQUFvQlIsR0FBRyxDQUFDLElBQUQsQ0FBdkIsRUFBK0IsSUFBL0IsQ0FBYjtBQUNBRixFQUFBQSxhQUFhLENBQUNDLE1BQU0sQ0FBQ1MsU0FBRCxDQUFQLEVBQW9CUixHQUFHLENBQUMsS0FBRCxDQUF2QixFQUFnQyxLQUFoQyxDQUFiO0FBRUFGLEVBQUFBLGFBQWEsQ0FBQ0MsTUFBTSxDQUFDLEtBQUQsQ0FBUCxFQUFnQkMsR0FBRyxDQUFDUSxTQUFELENBQW5CLEVBQWdDLEtBQWhDLENBQWI7QUFDQVYsRUFBQUEsYUFBYSxDQUFDQyxNQUFNLENBQUMsS0FBRCxDQUFQLEVBQWdCQyxHQUFHLENBQUMsSUFBRCxDQUFuQixFQUEyQixLQUEzQixDQUFiO0FBQ0FGLEVBQUFBLGFBQWEsQ0FBQ0MsTUFBTSxDQUFDLEtBQUQsQ0FBUCxFQUFnQkMsR0FBRyxDQUFDLEtBQUQsQ0FBbkIsRUFBNEIsS0FBNUIsQ0FBYjtBQUVBRixFQUFBQSxhQUFhLENBQUNDLE1BQU0sQ0FBQyxJQUFELENBQVAsRUFBZUMsR0FBRyxDQUFDUSxTQUFELENBQWxCLEVBQStCLElBQS9CLENBQWI7QUFDQVYsRUFBQUEsYUFBYSxDQUFDQyxNQUFNLENBQUMsSUFBRCxDQUFQLEVBQWVDLEdBQUcsQ0FBQyxJQUFELENBQWxCLEVBQTBCLElBQTFCLENBQWI7QUFDQUYsRUFBQUEsYUFBYSxDQUFDQyxNQUFNLENBQUMsSUFBRCxDQUFQLEVBQWVDLEdBQUcsQ0FBQyxLQUFELENBQWxCLEVBQTJCLEtBQTNCLENBQWI7QUFDRCxDQXRCTyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZW5hYmxlZCB9IGZyb20gJy4uL3BhcnRpYWwtc2NvcmluZyc7XG5cbmRlc2NyaWJlKCdlbmFibGVkJywgKCkgPT4ge1xuICBjb25zdCBhc3NlcnRFbmFibGVkID0gKGNvbmZpZywgZW52LCBleHBlY3RlZCkgPT4ge1xuICAgIGl0KGByZXR1cm5zICR7ZXhwZWN0ZWR9IGZvcjogY29uZmlnOiAke2NvbmZpZy5wYXJ0aWFsU2NvcmluZ30sIGVudjoke2Vudi5wYXJ0aWFsU2NvcmluZ31gLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBlbmFibGVkKGNvbmZpZywgZW52KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNvbmZpZyA9ICh2KSA9PiAoeyBwYXJ0aWFsU2NvcmluZzogdiB9KTtcbiAgY29uc3QgZW52ID0gKHYpID0+ICh7IHBhcnRpYWxTY29yaW5nOiB2IH0pO1xuXG4gIGFzc2VydEVuYWJsZWQoY29uZmlnKHVuZGVmaW5lZCksIGVudih1bmRlZmluZWQpLCB0cnVlKTtcbiAgYXNzZXJ0RW5hYmxlZChjb25maWcodW5kZWZpbmVkKSwgZW52KHRydWUpLCB0cnVlKTtcbiAgYXNzZXJ0RW5hYmxlZChjb25maWcodW5kZWZpbmVkKSwgZW52KGZhbHNlKSwgZmFsc2UpO1xuXG4gIGFzc2VydEVuYWJsZWQoY29uZmlnKGZhbHNlKSwgZW52KHVuZGVmaW5lZCksIGZhbHNlKTtcbiAgYXNzZXJ0RW5hYmxlZChjb25maWcoZmFsc2UpLCBlbnYodHJ1ZSksIGZhbHNlKTtcbiAgYXNzZXJ0RW5hYmxlZChjb25maWcoZmFsc2UpLCBlbnYoZmFsc2UpLCBmYWxzZSk7XG5cbiAgYXNzZXJ0RW5hYmxlZChjb25maWcodHJ1ZSksIGVudih1bmRlZmluZWQpLCB0cnVlKTtcbiAgYXNzZXJ0RW5hYmxlZChjb25maWcodHJ1ZSksIGVudih0cnVlKSwgdHJ1ZSk7XG4gIGFzc2VydEVuYWJsZWQoY29uZmlnKHRydWUpLCBlbnYoZmFsc2UpLCBmYWxzZSk7XG59KTtcbiJdfQ==
@@ -1,299 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
6
-
7
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
8
-
9
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
-
11
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
-
13
- var _persistence = require("../persistence");
14
-
15
- var _templateObject, _templateObject2, _templateObject3;
16
-
17
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
18
-
19
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
20
-
21
- describe('getShuffledChoices', function () {
22
- var choices, session, updateSession, key;
23
- beforeEach(function () {
24
- updateSession = jest.fn().mockResolvedValue([]);
25
- session = {
26
- id: '1',
27
- element: 'element'
28
- };
29
- choices = [{
30
- value: 1
31
- }, {
32
- value: 2
33
- }];
34
- key = 'value';
35
- });
36
- describe('0 key', function () {
37
- it('calls update session w/ 0 as a key', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
38
- var result;
39
- return _regenerator["default"].wrap(function _callee$(_context) {
40
- while (1) {
41
- switch (_context.prev = _context.next) {
42
- case 0:
43
- _context.next = 2;
44
- return (0, _persistence.getShuffledChoices)([{
45
- value: 0
46
- }, {
47
- value: 1
48
- }], session, updateSession, 'value');
49
-
50
- case 2:
51
- result = _context.sent;
52
- expect(updateSession).toHaveBeenCalledWith(session.id, session.element, {
53
- shuffledValues: expect.arrayContaining([0, 1])
54
- });
55
-
56
- case 4:
57
- case "end":
58
- return _context.stop();
59
- }
60
- }
61
- }, _callee);
62
- })));
63
- });
64
- describe('handles null values in session', function () {
65
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
66
- var result;
67
- return _regenerator["default"].wrap(function _callee2$(_context2) {
68
- while (1) {
69
- switch (_context2.prev = _context2.next) {
70
- case 0:
71
- _context2.next = 2;
72
- return (0, _persistence.getShuffledChoices)(choices, _objectSpread(_objectSpread({}, session), {}, {
73
- shuffledValues: [null]
74
- }), updateSession, 'value');
75
-
76
- case 2:
77
- result = _context2.sent;
78
-
79
- case 3:
80
- case "end":
81
- return _context2.stop();
82
- }
83
- }
84
- }, _callee2);
85
- })));
86
- it('calls updateSession w/ new shuffle cos [null] is treated as empty', function () {
87
- expect(updateSession).toHaveBeenCalledWith(session.id, session.element, {
88
- shuffledValues: expect.arrayContaining([1, 2])
89
- });
90
- });
91
- });
92
- describe('bad shuffle generation does not call updateSession', function () {
93
- beforeEach( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
94
- var result;
95
- return _regenerator["default"].wrap(function _callee3$(_context3) {
96
- while (1) {
97
- switch (_context3.prev = _context3.next) {
98
- case 0:
99
- _context3.next = 2;
100
- return (0, _persistence.getShuffledChoices)(choices, {}, updateSession, 'foo');
101
-
102
- case 2:
103
- result = _context3.sent;
104
-
105
- case 3:
106
- case "end":
107
- return _context3.stop();
108
- }
109
- }
110
- }, _callee3);
111
- })));
112
- it('does not call update session', function () {
113
- expect(updateSession).not.toHaveBeenCalled();
114
- });
115
- });
116
- describe('session does not exist', function () {
117
- it('returns undefined for empty session', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
118
- var result;
119
- return _regenerator["default"].wrap(function _callee4$(_context4) {
120
- while (1) {
121
- switch (_context4.prev = _context4.next) {
122
- case 0:
123
- _context4.next = 2;
124
- return (0, _persistence.getShuffledChoices)(choices, undefined, updateSession, key);
125
-
126
- case 2:
127
- result = _context4.sent;
128
- expect(result).toEqual(undefined);
129
-
130
- case 4:
131
- case "end":
132
- return _context4.stop();
133
- }
134
- }
135
- }, _callee4);
136
- })));
137
- });
138
- describe('session exists', function () {
139
- it('returns compact choices if session has shuffledValues', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
140
- var result;
141
- return _regenerator["default"].wrap(function _callee5$(_context5) {
142
- while (1) {
143
- switch (_context5.prev = _context5.next) {
144
- case 0:
145
- session = {
146
- shuffledValues: [2, 1]
147
- };
148
- _context5.next = 3;
149
- return (0, _persistence.getShuffledChoices)(choices, session, updateSession, key);
150
-
151
- case 3:
152
- result = _context5.sent;
153
- expect(result).toEqual(expect.arrayContaining(choices));
154
-
155
- case 5:
156
- case "end":
157
- return _context5.stop();
158
- }
159
- }
160
- }, _callee5);
161
- })));
162
- it('returns shuffled choices if updateSession is a function', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
163
- var result;
164
- return _regenerator["default"].wrap(function _callee6$(_context6) {
165
- while (1) {
166
- switch (_context6.prev = _context6.next) {
167
- case 0:
168
- session = {};
169
- updateSession = jest.fn().mockResolvedValue();
170
- _context6.next = 4;
171
- return (0, _persistence.getShuffledChoices)(choices, session, updateSession, key);
172
-
173
- case 4:
174
- result = _context6.sent;
175
- expect(result).toEqual(expect.arrayContaining(choices));
176
-
177
- case 6:
178
- case "end":
179
- return _context6.stop();
180
- }
181
- }
182
- }, _callee6);
183
- })));
184
- it('calls updateSession as expected if updateSession is a function', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
185
- return _regenerator["default"].wrap(function _callee7$(_context7) {
186
- while (1) {
187
- switch (_context7.prev = _context7.next) {
188
- case 0:
189
- session = {
190
- id: '1',
191
- element: 'pie-element'
192
- };
193
- _context7.next = 3;
194
- return (0, _persistence.getShuffledChoices)(choices, session, updateSession, key);
195
-
196
- case 3:
197
- expect(updateSession).toHaveBeenCalledWith('1', 'pie-element', {
198
- shuffledValues: expect.arrayContaining([1, 2])
199
- });
200
-
201
- case 4:
202
- case "end":
203
- return _context7.stop();
204
- }
205
- }
206
- }, _callee7);
207
- })));
208
- });
209
- });
210
- describe('lockChoices', function () {
211
- var env = function env(lockChoiceOrder) {
212
- var role = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'student';
213
- return {
214
- '@pie-element': {
215
- lockChoiceOrder: lockChoiceOrder
216
- },
217
- role: role
218
- };
219
- };
220
-
221
- var session = function session(shuffledValues) {
222
- return {
223
- shuffledValues: shuffledValues
224
- };
225
- };
226
-
227
- it.each(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n modelLock | session | env | expected\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n "])), true, session(), env(true), true, true, session(), env(false), true, false, session(), env(true), true, false, session(), env(false), false, false, session(), undefined, false, false, undefined, undefined, false, undefined, session(), env(false), false, undefined, session(), env(undefined), false, false, session(), env(false, 'instructor'), true, false, session([0, 1]), env(false, 'instructor'), true, false, undefined, env(false, 'instructor'), true)('1. model.lockChoiceOrder: $modelLock, $session, $env => $expected', function (_ref8) {
228
- var modelLock = _ref8.modelLock,
229
- session = _ref8.session,
230
- env = _ref8.env,
231
- expected = _ref8.expected;
232
- var model = {
233
- lockChoiceOrder: modelLock
234
- };
235
- var result = (0, _persistence.lockChoices)(model, session, env);
236
- expect(result).toEqual(expected);
237
- });
238
- });
239
- describe('lockChoices mod', function () {
240
- var env = function env(lockChoiceOrder) {
241
- var role = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'student';
242
- return {
243
- '@pie-element': {
244
- lockChoiceOrder: lockChoiceOrder
245
- },
246
- role: role
247
- };
248
- };
249
-
250
- var session = function session() {
251
- var answers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['foo', 'bar'];
252
- return {
253
- answers: answers
254
- };
255
- };
256
-
257
- it.each(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n modelLock | session | env | expected\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n "])), true, session(), env(true), true, true, session(), env(false), true, false, session(), env(true), true, false, session(), env(false), false, undefined, session(), env(true), true, undefined, session(), env(undefined), false, undefined, session(), env(undefined, 'instructor'), true)('2. model.lockChoiceOrder: $modelLock, $session, $env => $expected', function (_ref9) {
258
- var modelLock = _ref9.modelLock,
259
- session = _ref9.session,
260
- env = _ref9.env,
261
- expected = _ref9.expected;
262
- var model = {
263
- lockChoiceOrder: modelLock
264
- };
265
- var result = (0, _persistence.lockChoices)(model, session, env);
266
- expect(result).toEqual(expected);
267
- });
268
- });
269
- describe('lockChoices', function () {
270
- var env = function env(lockChoiceOrder) {
271
- var role = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'student';
272
- return {
273
- '@pie-element': {
274
- lockChoiceOrder: lockChoiceOrder
275
- },
276
- role: role
277
- };
278
- };
279
-
280
- var session = function session(shuffledValues) {
281
- return {
282
- shuffledValues: shuffledValues,
283
- answers: ['foo', 'bar']
284
- };
285
- };
286
-
287
- it.each(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n modelLock | session | env | expected\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n ", " | ", " | ", " | ", "\n "])), true, session(), env(true), true, true, session(), env(false), true, false, session(), env(true), true, false, session(), env(false), false, undefined, session(), env(true), true, undefined, session(), env(undefined), false, undefined, session(), env(undefined, 'instructor'), true)('3. model.lockChoiceOrder: $modelLock, $env => $expected', function (_ref10) {
288
- var modelLock = _ref10.modelLock,
289
- session = _ref10.session,
290
- env = _ref10.env,
291
- expected = _ref10.expected;
292
- var model = {
293
- lockChoiceOrder: modelLock
294
- };
295
- var result = (0, _persistence.lockChoices)(model, session, env);
296
- expect(result).toEqual(expected);
297
- });
298
- });
299
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vcGVyc2lzdGVuY2UudGVzdC5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImNob2ljZXMiLCJzZXNzaW9uIiwidXBkYXRlU2Vzc2lvbiIsImtleSIsImJlZm9yZUVhY2giLCJqZXN0IiwiZm4iLCJtb2NrUmVzb2x2ZWRWYWx1ZSIsImlkIiwiZWxlbWVudCIsInZhbHVlIiwiaXQiLCJyZXN1bHQiLCJleHBlY3QiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInNodWZmbGVkVmFsdWVzIiwiYXJyYXlDb250YWluaW5nIiwibm90IiwidG9IYXZlQmVlbkNhbGxlZCIsInVuZGVmaW5lZCIsInRvRXF1YWwiLCJlbnYiLCJsb2NrQ2hvaWNlT3JkZXIiLCJyb2xlIiwiZWFjaCIsIm1vZGVsTG9jayIsImV4cGVjdGVkIiwibW9kZWwiLCJhbnN3ZXJzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7QUFFQUEsUUFBUSxDQUFDLG9CQUFELEVBQXVCLFlBQU07QUFDbkMsTUFBSUMsT0FBSixFQUFhQyxPQUFiLEVBQXNCQyxhQUF0QixFQUFxQ0MsR0FBckM7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLFlBQU07QUFDZkYsSUFBQUEsYUFBYSxHQUFHRyxJQUFJLENBQUNDLEVBQUwsR0FBVUMsaUJBQVYsQ0FBNEIsRUFBNUIsQ0FBaEI7QUFDQU4sSUFBQUEsT0FBTyxHQUFHO0FBQ1JPLE1BQUFBLEVBQUUsRUFBRSxHQURJO0FBRVJDLE1BQUFBLE9BQU8sRUFBRTtBQUZELEtBQVY7QUFJQVQsSUFBQUEsT0FBTyxHQUFHLENBQ1I7QUFDRVUsTUFBQUEsS0FBSyxFQUFFO0FBRFQsS0FEUSxFQUlSO0FBQ0VBLE1BQUFBLEtBQUssRUFBRTtBQURULEtBSlEsQ0FBVjtBQVFBUCxJQUFBQSxHQUFHLEdBQUcsT0FBTjtBQUNELEdBZlMsQ0FBVjtBQWlCQUosRUFBQUEsUUFBUSxDQUFDLE9BQUQsRUFBVSxZQUFNO0FBQ3RCWSxJQUFBQSxF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QnBCLE9BQU8sRUFMMUIsRUFLa0NvQixHQUFHLENBQUMsS0FBRCxDQUxyQyxFQUtvRSxLQUxwRSxFQU1JRixTQU5KLEVBTW1CbEIsT0FBTyxFQU4xQixFQU1rQ29CLEdBQUcsQ0FBQyxJQUFELENBTnJDLEVBTW9FLElBTnBFLEVBT0lGLFNBUEosRUFPbUJsQixPQUFPLEVBUDFCLEVBT2tDb0IsR0FBRyxDQUFDRixTQUFELENBUHJDLEVBT29FLEtBUHBFLEVBUUlBLFNBUkosRUFRbUJsQixPQUFPLEVBUjFCLEVBUWtDb0IsR0FBRyxDQUFDRixTQUFELEVBQVksWUFBWixDQVJyQyxFQVFvRSxJQVJwRSxFQVNFLHlEQVRGLEVBUzZELGtCQUEyQztBQUFBLFFBQXhDTSxTQUF3QyxVQUF4Q0EsU0FBd0M7QUFBQSxRQUE3QnhCLE9BQTZCLFVBQTdCQSxPQUE2QjtBQUFBLFFBQXBCb0IsR0FBb0IsVUFBcEJBLEdBQW9CO0FBQUEsUUFBZkssUUFBZSxVQUFmQSxRQUFlO0FBQ3RHLFFBQU1DLEtBQUssR0FBRztBQUFFTCxNQUFBQSxlQUFlLEVBQUVHO0FBQW5CLEtBQWQ7QUFDQSxRQUFNYixNQUFNLEdBQUcsOEJBQVllLEtBQVosRUFBbUIxQixPQUFuQixFQUE0Qm9CLEdBQTVCLENBQWY7QUFDQVIsSUFBQUEsTUFBTSxDQUFDRCxNQUFELENBQU4sQ0FBZVEsT0FBZixDQUF1Qk0sUUFBdkI7QUFDRCxHQWJEO0FBY0QsQ0FwQk8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFNodWZmbGVkQ2hvaWNlcywgbG9ja0Nob2ljZXMgfSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5cbmRlc2NyaWJlKCdnZXRTaHVmZmxlZENob2ljZXMnLCAoKSA9PiB7XG4gIGxldCBjaG9pY2VzLCBzZXNzaW9uLCB1cGRhdGVTZXNzaW9uLCBrZXk7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdXBkYXRlU2Vzc2lvbiA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXSk7XG4gICAgc2Vzc2lvbiA9IHtcbiAgICAgIGlkOiAnMScsXG4gICAgICBlbGVtZW50OiAnZWxlbWVudCcsXG4gICAgfTtcbiAgICBjaG9pY2VzID0gW1xuICAgICAge1xuICAgICAgICB2YWx1ZTogMSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiAyLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGtleSA9ICd2YWx1ZSc7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcwIGtleScsICgpID0+IHtcbiAgICBpdCgnY2FsbHMgdXBkYXRlIHNlc3Npb24gdy8gMCBhcyBhIGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFNodWZmbGVkQ2hvaWNlcyhbeyB2YWx1ZTogMCB9LCB7IHZhbHVlOiAxIH1dLCBzZXNzaW9uLCB1cGRhdGVTZXNzaW9uLCAndmFsdWUnKTtcbiAgICAgIGV4cGVjdCh1cGRhdGVTZXNzaW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChzZXNzaW9uLmlkLCBzZXNzaW9uLmVsZW1lbnQsIHtcbiAgICAgICAgc2h1ZmZsZWRWYWx1ZXM6IGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoWzAsIDFdKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaGFuZGxlcyBudWxsIHZhbHVlcyBpbiBzZXNzaW9uJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U2h1ZmZsZWRDaG9pY2VzKGNob2ljZXMsIHsgLi4uc2Vzc2lvbiwgc2h1ZmZsZWRWYWx1ZXM6IFtudWxsXSB9LCB1cGRhdGVTZXNzaW9uLCAndmFsdWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyB1cGRhdGVTZXNzaW9uIHcvIG5ldyBzaHVmZmxlIGNvcyBbbnVsbF0gaXMgdHJlYXRlZCBhcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGV4cGVjdCh1cGRhdGVTZXNzaW9uKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChzZXNzaW9uLmlkLCBzZXNzaW9uLmVsZW1lbnQsIHtcbiAgICAgICAgc2h1ZmZsZWRWYWx1ZXM6IGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoWzEsIDJdKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ2JhZCBzaHVmZmxlIGdlbmVyYXRpb24gZG9lcyBub3QgY2FsbCB1cGRhdGVTZXNzaW9uJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U2h1ZmZsZWRDaG9pY2VzKGNob2ljZXMsIHt9LCB1cGRhdGVTZXNzaW9uLCAnZm9vJyk7XG4gICAgfSk7XG4gICAgaXQoJ2RvZXMgbm90IGNhbGwgdXBkYXRlIHNlc3Npb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QodXBkYXRlU2Vzc2lvbikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nlc3Npb24gZG9lcyBub3QgZXhpc3QnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgdW5kZWZpbmVkIGZvciBlbXB0eSBzZXNzaW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U2h1ZmZsZWRDaG9pY2VzKGNob2ljZXMsIHVuZGVmaW5lZCwgdXBkYXRlU2Vzc2lvbiwga2V5KTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nlc3Npb24gZXhpc3RzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGNvbXBhY3QgY2hvaWNlcyBpZiBzZXNzaW9uIGhhcyBzaHVmZmxlZFZhbHVlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIHNlc3Npb24gPSB7IHNodWZmbGVkVmFsdWVzOiBbMiwgMV0gfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFNodWZmbGVkQ2hvaWNlcyhjaG9pY2VzLCBzZXNzaW9uLCB1cGRhdGVTZXNzaW9uLCBrZXkpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbChleHBlY3QuYXJyYXlDb250YWluaW5nKGNob2ljZXMpKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIHNodWZmbGVkIGNob2ljZXMgaWYgdXBkYXRlU2Vzc2lvbiBpcyBhIGZ1bmN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2Vzc2lvbiA9IHt9O1xuICAgICAgdXBkYXRlU2Vzc2lvbiA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U2h1ZmZsZWRDaG9pY2VzKGNob2ljZXMsIHNlc3Npb24sIHVwZGF0ZVNlc3Npb24sIGtleSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoY2hvaWNlcykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIHVwZGF0ZVNlc3Npb24gYXMgZXhwZWN0ZWQgaWYgdXBkYXRlU2Vzc2lvbiBpcyBhIGZ1bmN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgc2Vzc2lvbiA9IHsgaWQ6ICcxJywgZWxlbWVudDogJ3BpZS1lbGVtZW50JyB9O1xuICAgICAgYXdhaXQgZ2V0U2h1ZmZsZWRDaG9pY2VzKGNob2ljZXMsIHNlc3Npb24sIHVwZGF0ZVNlc3Npb24sIGtleSk7XG4gICAgICBleHBlY3QodXBkYXRlU2Vzc2lvbikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJzEnLCAncGllLWVsZW1lbnQnLCB7XG4gICAgICAgIHNodWZmbGVkVmFsdWVzOiBleHBlY3QuYXJyYXlDb250YWluaW5nKFsxLCAyXSksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2xvY2tDaG9pY2VzJywgKCkgPT4ge1xuICBjb25zdCBlbnYgPSAobG9ja0Nob2ljZU9yZGVyLCByb2xlID0gJ3N0dWRlbnQnKSA9PiAoe1xuICAgICdAcGllLWVsZW1lbnQnOiB7IGxvY2tDaG9pY2VPcmRlciB9LFxuICAgIHJvbGUsXG4gIH0pO1xuICBjb25zdCBzZXNzaW9uID0gKHNodWZmbGVkVmFsdWVzKSA9PiAoeyBzaHVmZmxlZFZhbHVlcyB9KTtcbiAgaXQuZWFjaGBcbiAgICBtb2RlbExvY2sgICAgfCBzZXNzaW9uICAgICAgICAgICAgfCBlbnYgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHBlY3RlZFxuICAgICR7dHJ1ZX0gICAgICB8ICR7c2Vzc2lvbigpfSAgICAgICB8ICR7ZW52KHRydWUpfSAgICAgICAgICAgICAgICB8ICR7dHJ1ZX1cbiAgICAke3RydWV9ICAgICAgfCAke3Nlc3Npb24oKX0gICAgICAgfCAke2VudihmYWxzZSl9ICAgICAgICAgICAgICAgfCAke3RydWV9XG4gICAgJHtmYWxzZX0gICAgIHwgJHtzZXNzaW9uKCl9ICAgICAgIHwgJHtlbnYodHJ1ZSl9ICAgICAgICAgICAgICAgIHwgJHt0cnVlfVxuICAgICR7ZmFsc2V9ICAgICB8ICR7c2Vzc2lvbigpfSAgICAgICB8ICR7ZW52KGZhbHNlKX0gICAgICAgICAgICAgICB8ICR7ZmFsc2V9XG4gICAgJHtmYWxzZX0gICAgIHwgJHtzZXNzaW9uKCl9ICAgICAgIHwgJHt1bmRlZmluZWR9ICAgICAgICAgICAgICAgIHwgJHtmYWxzZX1cbiAgICAke2ZhbHNlfSAgICAgfCAke3VuZGVmaW5lZH0gICAgICAgfCAke3VuZGVmaW5lZH0gICAgICAgICAgICAgICAgfCAke2ZhbHNlfVxuICAgICR7dW5kZWZpbmVkfSB8ICR7c2Vzc2lvbigpfSAgICAgICB8ICR7ZW52KGZhbHNlKX0gICAgICAgICAgICAgICB8ICR7ZmFsc2V9XG4gICAgJHt1bmRlZmluZWR9IHwgJHtzZXNzaW9uKCl9ICAgICAgIHwgJHtlbnYodW5kZWZpbmVkKX0gICAgICAgICAgIHwgJHtmYWxzZX1cbiAgICAke2ZhbHNlfSAgICAgfCAke3Nlc3Npb24oKX0gICAgICAgfCAke2VudihmYWxzZSwgJ2luc3RydWN0b3InKX0gfCAke3RydWV9XG4gICAgJHtmYWxzZX0gICAgIHwgJHtzZXNzaW9uKFswLCAxXSl9IHwgJHtlbnYoZmFsc2UsICdpbnN0cnVjdG9yJyl9IHwgJHt0cnVlfVxuICAgICR7ZmFsc2V9ICAgICB8ICR7dW5kZWZpbmVkfSAgICAgICB8ICR7ZW52KGZhbHNlLCAnaW5zdHJ1Y3RvcicpfSB8ICR7dHJ1ZX1cbiAgYCgnMS4gbW9kZWwubG9ja0Nob2ljZU9yZGVyOiAkbW9kZWxMb2NrLCAkc2Vzc2lvbiwgJGVudiA9PiAkZXhwZWN0ZWQnLCAoeyBtb2RlbExvY2ssIHNlc3Npb24sIGVudiwgZXhwZWN0ZWQgfSkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0geyBsb2NrQ2hvaWNlT3JkZXI6IG1vZGVsTG9jayB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGxvY2tDaG9pY2VzKG1vZGVsLCBzZXNzaW9uLCBlbnYpO1xuICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbG9ja0Nob2ljZXMgbW9kJywgKCkgPT4ge1xuICBjb25zdCBlbnYgPSAobG9ja0Nob2ljZU9yZGVyLCByb2xlID0gJ3N0dWRlbnQnKSA9PiAoe1xuICAgICdAcGllLWVsZW1lbnQnOiB7IGxvY2tDaG9pY2VPcmRlciB9LFxuICAgIHJvbGUsXG4gIH0pO1xuICBjb25zdCBzZXNzaW9uID0gKGFuc3dlcnMgPSBbJ2ZvbycsICdiYXInXSkgPT4gKHsgYW5zd2VycyB9KTtcbiAgaXQuZWFjaGBcbiAgICBtb2RlbExvY2sgICAgfCBzZXNzaW9uICAgICAgfCBlbnYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXhwZWN0ZWRcbiAgICAke3RydWV9ICAgICAgfCAke3Nlc3Npb24oKX0gfCAke2Vudih0cnVlKX0gICAgICAgICAgICAgICAgICAgIHwgJHt0cnVlfVxuICAgICR7dHJ1ZX0gICAgICB8ICR7c2Vzc2lvbigpfSB8ICR7ZW52KGZhbHNlKX0gICAgICAgICAgICAgICAgICAgfCAke3RydWV9XG4gICAgJHtmYWxzZX0gICAgIHwgJHtzZXNzaW9uKCl9IHwgJHtlbnYodHJ1ZSl9ICAgICAgICAgICAgICAgICAgICB8ICR7dHJ1ZX1cbiAgICAke2ZhbHNlfSAgICAgfCAke3Nlc3Npb24oKX0gfCAke2VudihmYWxzZSl9ICAgICAgICAgICAgICAgICAgIHwgJHtmYWxzZX1cbiAgICAke3VuZGVmaW5lZH0gfCAke3Nlc3Npb24oKX0gfCAke2Vudih0cnVlKX0gICAgICAgICAgICAgICAgICAgIHwgJHt0cnVlfVxuICAgICR7dW5kZWZpbmVkfSB8ICR7c2Vzc2lvbigpfSB8ICR7ZW52KHVuZGVmaW5lZCl9ICAgICAgICAgICAgICAgfCAke2ZhbHNlfVxuICAgICR7dW5kZWZpbmVkfSB8ICR7c2Vzc2lvbigpfSB8ICR7ZW52KHVuZGVmaW5lZCwgJ2luc3RydWN0b3InKX0gfCAke3RydWV9XG4gIGAoJzIuIG1vZGVsLmxvY2tDaG9pY2VPcmRlcjogJG1vZGVsTG9jaywgJHNlc3Npb24sICRlbnYgPT4gJGV4cGVjdGVkJywgKHsgbW9kZWxMb2NrLCBzZXNzaW9uLCBlbnYsIGV4cGVjdGVkIH0pID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHsgbG9ja0Nob2ljZU9yZGVyOiBtb2RlbExvY2sgfTtcbiAgICBjb25zdCByZXN1bHQgPSBsb2NrQ2hvaWNlcyhtb2RlbCwgc2Vzc2lvbiwgZW52KTtcbiAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2xvY2tDaG9pY2VzJywgKCkgPT4ge1xuICBjb25zdCBlbnYgPSAobG9ja0Nob2ljZU9yZGVyLCByb2xlID0gJ3N0dWRlbnQnKSA9PiAoe1xuICAgICdAcGllLWVsZW1lbnQnOiB7IGxvY2tDaG9pY2VPcmRlciB9LFxuICAgIHJvbGUsXG4gIH0pO1xuICBjb25zdCBzZXNzaW9uID0gKHNodWZmbGVkVmFsdWVzKSA9PiAoeyBzaHVmZmxlZFZhbHVlcywgYW5zd2VyczogWydmb28nLCAnYmFyJ10gfSk7XG4gIGl0LmVhY2hgXG4gICAgbW9kZWxMb2NrICAgIHwgc2Vzc2lvbiAgICAgIHwgZW52ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4cGVjdGVkXG4gICAgJHt0cnVlfSAgICAgIHwgJHtzZXNzaW9uKCl9IHwgJHtlbnYodHJ1ZSl9ICAgICAgICAgICAgICAgICAgICB8ICR7dHJ1ZX1cbiAgICAke3RydWV9ICAgICAgfCAke3Nlc3Npb24oKX0gfCAke2VudihmYWxzZSl9ICAgICAgICAgICAgICAgICAgIHwgJHt0cnVlfVxuICAgICR7ZmFsc2V9ICAgICB8ICR7c2Vzc2lvbigpfSB8ICR7ZW52KHRydWUpfSAgICAgICAgICAgICAgICAgICAgfCAke3RydWV9XG4gICAgJHtmYWxzZX0gICAgIHwgJHtzZXNzaW9uKCl9IHwgJHtlbnYoZmFsc2UpfSAgICAgICAgICAgICAgICAgICB8ICR7ZmFsc2V9XG4gICAgJHt1bmRlZmluZWR9IHwgJHtzZXNzaW9uKCl9IHwgJHtlbnYodHJ1ZSl9ICAgICAgICAgICAgICAgICAgICB8ICR7dHJ1ZX1cbiAgICAke3VuZGVmaW5lZH0gfCAke3Nlc3Npb24oKX0gfCAke2Vudih1bmRlZmluZWQpfSAgICAgICAgICAgICAgIHwgJHtmYWxzZX1cbiAgICAke3VuZGVmaW5lZH0gfCAke3Nlc3Npb24oKX0gfCAke2Vudih1bmRlZmluZWQsICdpbnN0cnVjdG9yJyl9IHwgJHt0cnVlfVxuICBgKCczLiBtb2RlbC5sb2NrQ2hvaWNlT3JkZXI6ICRtb2RlbExvY2ssICRlbnYgPT4gJGV4cGVjdGVkJywgKHsgbW9kZWxMb2NrLCBzZXNzaW9uLCBlbnYsIGV4cGVjdGVkIH0pID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHsgbG9ja0Nob2ljZU9yZGVyOiBtb2RlbExvY2sgfTtcbiAgICBjb25zdCByZXN1bHQgPSBsb2NrQ2hvaWNlcyhtb2RlbCwgc2Vzc2lvbiwgZW52KTtcbiAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcbiJdfQ==