1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 | 1 3 21 7 24 1 1 1 1 1 1 1 1 18 18 18 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 1 1 1 1 1 1 1 1 2 2 5 2 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 | "use strict"; var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; var _prototypeProperties = function (child, staticProps, instanceProps) { if (staticProps) Object.defineProperties(child, staticProps); if (instanceProps) Object.defineProperties(child.prototype, instanceProps); }; var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); Iif (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else Eif ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _inherits = function (subClass, superClass) { Iif (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); Eif (superClass) subClass.__proto__ = superClass; }; var _classCallCheck = function (instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; var _Flux = require("../Flux"); var Store = _Flux.Store; var Flux = _Flux.Flux; var Actions = _Flux.Actions; var sinon = _interopRequire(require("sinon")); describe("Store", function () { var ExampleStore = (function (Store) { function ExampleStore() { _classCallCheck(this, ExampleStore); _get(Object.getPrototypeOf(ExampleStore.prototype), "constructor", this).call(this); this.state = { foo: "bar" }; } _inherits(ExampleStore, Store); return ExampleStore; })(Store); var actionId = "actionId"; describe("#register()", function () { it("adds handler to internal collection of handlers", function () { var _store$_handlers; var store = new ExampleStore(); var handler = sinon.spy(); store.register(actionId, handler); var mockArgs = ["foo", "bar"]; (_store$_handlers = store._handlers)[actionId].apply(_store$_handlers, mockArgs); expect(handler.calledWith.apply(handler, mockArgs)).to.be["true"]; }); it("binds handler to store", function () { var store = new ExampleStore(); store.foo = "bar"; function handler() { return this.foo; } store.register(actionId, handler); expect(store._handlers[actionId]()).to.equal("bar"); }); it("accepts actions instead of action ids", function () { var _store$_handlers; var ExampleActions = (function (Actions) { function ExampleActions() { _classCallCheck(this, ExampleActions); Eif (Actions != null) { Actions.apply(this, arguments); } } _inherits(ExampleActions, Actions); _prototypeProperties(ExampleActions, null, { getFoo: { value: function getFoo() { return "foo"; }, writable: true, configurable: true } }); return ExampleActions; })(Actions); var actions = new ExampleActions(); var store = new ExampleStore(); var handler = sinon.spy(); store.register(actions.getFoo, handler); var mockArgs = ["foo", "bar"]; (_store$_handlers = store._handlers)[actions.getFoo._id].apply(_store$_handlers, mockArgs); expect(handler.calledWith.apply(handler, mockArgs)).to.be["true"]; }); it("ignores non-function handlers", function () { var store = new ExampleStore(); expect(store.register.bind(store, null)).not.to["throw"](); }); }); it("default state is null", function () { var store = new Store(); expect(store.state).to.be["null"]; }); describe("#registerAsync()", function () { it("registers handlers for begin, success, and failure of async action", function callee$2$0() { var error, ExampleActions, ExampleFlux, flux, actions, store, handler, begin, success, failure; return regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: error = new Error(); ExampleActions = (function (Actions) { function ExampleActions() { _classCallCheck(this, ExampleActions); Eif (Actions != null) { Actions.apply(this, arguments); } } _inherits(ExampleActions, Actions); _prototypeProperties(ExampleActions, null, { getFoo: { value: function getFoo(message) { var _success = arguments[1] === undefined ? true : arguments[1]; return regeneratorRuntime.async(function getFoo$(context$5$0) { while (1) switch (context$5$0.prev = context$5$0.next) { case 0: if (_success) { context$5$0.next = 2; break; } throw error; case 2: return context$5$0.abrupt("return", message + " success"); case 3: case "end": return context$5$0.stop(); } }, null, this); }, writable: true, configurable: true }, getBar: { value: function getBar(message) { return regeneratorRuntime.async(function getBar$(context$5$0) { while (1) switch (context$5$0.prev = context$5$0.next) { case 0: return context$5$0.abrupt("return", message); case 1: case "end": return context$5$0.stop(); } }, null, this); }, writable: true, configurable: true } }); return ExampleActions; })(Actions); ExampleFlux = (function (Flux) { function ExampleFlux() { _classCallCheck(this, ExampleFlux); _get(Object.getPrototypeOf(ExampleFlux.prototype), "constructor", this).call(this); this.createActions("example", ExampleActions); this.createStore("example", ExampleStore); } _inherits(ExampleFlux, Flux); return ExampleFlux; })(Flux); flux = new ExampleFlux(); actions = flux.getActions("example"); store = flux.getStore("example"); handler = sinon.spy(); store.register(actions.getBar, handler); context$3$0.next = 10; return actions.getBar("bar"); case 10: expect(handler.calledOnce).to.be["true"]; expect(handler.firstCall.args).to.deep.equal(["bar"]); begin = sinon.spy(); success = sinon.spy(); failure = sinon.spy(); store.registerAsync(actions.getFoo, begin, success, failure); context$3$0.next = 18; return actions.getFoo("foo", true); case 18: expect(begin.calledOnce).to.be["true"]; expect(begin.firstCall.args).to.deep.equal(["foo", true]); expect(success.calledOnce).to.be["true"]; expect(success.firstCall.args[0]).to.equal("foo success"); expect(failure.called).to.be["false"]; context$3$0.next = 25; return expect(actions.getFoo("bar", false)).to.be.rejected; case 25: expect(begin.calledTwice).to.be["true"]; expect(success.calledOnce).to.be["true"]; expect(failure.calledOnce).to.be["true"]; expect(failure.firstCall.args[0]).to.equal(error); case 29: case "end": return context$3$0.stop(); } }, null, this); }); it("ignores non-function handlers", function () { var store = new ExampleStore(); expect(store.registerAsync.bind(store, null)).not.to["throw"](); }); }); describe("#handler()", function () { it("delegates dispatches to registered handlers", function () { var store = new ExampleStore(); var handler = sinon.spy(); store.register(actionId, handler); // Simulate dispatch var body = { foo: "bar" }; store.handler({ body: body, actionId: actionId }); expect(handler.calledWith(body)).to.be["true"]; }); }); describe("#waitFor()", function () { it("waits for other stores", function () { var flux = new Flux(); var result = []; var store2 = undefined; var Store1 = (function (Store) { function Store1() { _classCallCheck(this, Store1); _get(Object.getPrototypeOf(Store1.prototype), "constructor", this).call(this); this.register(actionId, function () { this.waitFor(store2); result.push(1); }); } _inherits(Store1, Store); return Store1; })(Store); var Store2 = (function (Store) { function Store2() { _classCallCheck(this, Store2); _get(Object.getPrototypeOf(Store2.prototype), "constructor", this).call(this); this.register(actionId, function () { result.push(2); }); } _inherits(Store2, Store); return Store2; })(Store); flux.createStore("store1", Store1); flux.createStore("store2", Store2); store2 = flux.getStore("store2"); flux.dispatch(actionId, "foobar"); expect(result).to.deep.equal([2, 1]); }); }); describe("#forceUpdate()", function () { it("emits change event", function () { var store = new ExampleStore(); var listener = sinon.spy(); store.addListener("change", listener); store.forceUpdate(); expect(listener.calledOnce).to.be["true"]; }); it("doesn't modify existing state", function () { var store = new ExampleStore(); var listener = sinon.spy(); store.addListener("change", listener); store.register(actionId, function () { this.replaceState({ bar: "baz" }); this.forceUpdate(); expect(this.state).to.deep.equal({ foo: "bar" }); expect(listener.called).to.be["false"]; this.setState({ foo: "bar" }); this.forceUpdate(); this.replaceState({ baz: "foo" }); }); // Simulate dispatch store.handler({ actionId: actionId, body: "foobar" }); expect(listener.calledOnce).to.be["true"]; expect(store.state).to.deep.equal({ baz: "foo" }); }); }); describe("#setState()", function () { it("shallow merges old state with new state", function () { var store = new ExampleStore(); store.setState({ bar: "baz" }); expect(store.state).to.deep.equal({ foo: "bar", bar: "baz" }); }); it("supports transactional updates", function () { var store = new Store(); store.state = { a: 1 }; store.setState(function (state) { return { a: state.a + 1 }; }); expect(store.state.a).to.equal(2); store.setState(function (state) { return { a: state.a + 1 }; }); expect(store.state.a).to.equal(3); store.setState(function (state) { return { a: state.a + 1 }; }); expect(store.state.a).to.equal(4); }); it("emits change event", function () { var store = new ExampleStore(); var listener = sinon.spy(); store.addListener("change", listener); store.setState({ foo: "bar" }); expect(listener.calledOnce).to.be["true"]; }); it("batches multiple state updates within action handler", function () { var store = new ExampleStore(); var listener = sinon.spy(); store.addListener("change", listener); store.register(actionId, function () { this.setState({ bar: "baz" }); expect(this.state).to.deep.equal({ foo: "bar" }); expect(listener.called).to.be["false"]; this.setState({ baz: "foo" }); }); // Simulate dispatch store.handler({ actionId: actionId, body: "foobar" }); expect(listener.calledOnce).to.be["true"]; expect(store.state).to.deep.equal({ foo: "bar", bar: "baz", baz: "foo" }); }); it("warns if called from outside an action handler", function () { var store = new ExampleStore(); var warn = sinon.spy(console, "warn"); store.setState({ foo: "bar" }); expect(warn.firstCall.args[0]).to.equal("Store#setState() called from outside an action handler. This is " + "likely a mistake. Flux stores should manage their own state."); console.warn.restore(); }); }); describe("#replaceState()", function () { it("replaces old state with new state", function () { var store = new ExampleStore(); store.replaceState({ bar: "baz" }); expect(store.state).to.deep.equal({ bar: "baz" }); }); it("batches multiple state updates within action handler", function () { var store = new ExampleStore(); var listener = sinon.spy(); store.addListener("change", listener); store.register(actionId, function () { this.replaceState({ bar: "baz" }); expect(this.state).to.deep.equal({ foo: "bar" }); expect(listener.called).to.be["false"]; this.setState({ foo: "bar" }); this.replaceState({ baz: "foo" }); }); // Simulate dispatch store.handler({ actionId: actionId, body: "foobar" }); expect(listener.calledOnce).to.be["true"]; expect(store.state).to.deep.equal({ baz: "foo" }); }); it("emits change event", function () { var store = new ExampleStore(); var listener = sinon.spy(); store.addListener("change", listener); store.replaceState({ foo: "bar" }); expect(listener.calledOnce).to.be["true"]; }); }); describe(".assignState", function () { it("can be overridden to enable custom state types", function () { var StringStore = (function (Store) { function StringStore() { _classCallCheck(this, StringStore); Eif (Store != null) { Store.apply(this, arguments); } } _inherits(StringStore, Store); _prototypeProperties(StringStore, { assignState: { value: function assignState(prevState, nextState) { return [prevState, nextState].filter(function (state) { return typeof state === "string"; }).join(""); }, writable: true, configurable: true } }); return StringStore; })(Store); var store = new StringStore(); expect(store.state).to.be["null"]; store.setState("a"); expect(store.state).to.equal("a"); store.setState("b"); expect(store.state).to.equal("ab"); store.replaceState("xyz"); expect(store.state).to.equal("xyz"); store.setState("zyx"); expect(store.state).to.equal("xyzzyx"); }); }); describe("#forceUpdate()", function () { it("emits change event", function () { var store = new ExampleStore(); var listener = sinon.spy(); store.addListener("change", listener); store.forceUpdate(); expect(listener.calledOnce).to.be["true"]; }); it("doesn't modify existing state", function () { var store = new ExampleStore(); var listener = sinon.spy(); store.addListener("change", listener); store.register(actionId, function () { this.replaceState({ bar: "baz" }); this.forceUpdate(); expect(this.state).to.deep.equal({ foo: "bar" }); expect(listener.called).to.be["false"]; this.setState({ foo: "bar" }); this.forceUpdate(); this.replaceState({ baz: "foo" }); }); // Simulate dispatch store.handler({ actionId: actionId, body: "foobar" }); expect(listener.calledOnce).to.be["true"]; expect(store.state).to.deep.equal({ baz: "foo" }); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9fX3Rlc3RzX18vU3RvcmUtdGVzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7b0JBQXFDLFNBQVM7O0lBQXJDLEtBQUssU0FBTCxLQUFLO0lBQUUsSUFBSSxTQUFKLElBQUk7SUFBRSxPQUFPLFNBQVAsT0FBTztJQUN0QixLQUFLLDJCQUFNLE9BQU87O0FBRXpCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsWUFBTTtNQUNoQixZQUFZLGNBQVMsS0FBSztBQUNuQixhQURQLFlBQVk7NEJBQVosWUFBWTs7QUFFZCxpQ0FGRSxZQUFZLDZDQUVOO0FBQ1IsVUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztLQUM3Qjs7Y0FKRyxZQUFZLEVBQVMsS0FBSzs7V0FBMUIsWUFBWTtLQUFTLEtBQUs7O0FBT2hDLE1BQUksUUFBUSxHQUFHLFVBQVUsQ0FBQzs7QUFFMUIsVUFBUSxDQUFDLGFBQWEsRUFBRSxZQUFNO0FBQzVCLE1BQUUsQ0FBQyxpREFBaUQsRUFBRSxZQUFNOztBQUMxRCxVQUFJLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0FBQy9CLFVBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixXQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbEMsVUFBSSxRQUFRLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUIsMEJBQUEsS0FBSyxDQUFDLFNBQVMsRUFBQyxRQUFRLE9BQUMsbUJBQUksUUFBUSxDQUFDLENBQUM7O0FBRXZDLFlBQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxNQUFBLENBQWxCLE9BQU8sRUFBZSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQUssQ0FBQztLQUNwRCxDQUFDLENBQUM7O0FBRUgsTUFBRSxDQUFDLHdCQUF3QixFQUFFLFlBQU07QUFDakMsVUFB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Q0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNuRCxDQUFDLENBQUM7R0FDSixDQUFDLENBQUM7Q0FFSixDQUFDLENBQUMiLCJmaWxlIjoibGliL19fdGVzdHNfXy9TdG9yZS10ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RvcmUsIEZsdXgsIEFjdGlvbnMgfSBmcm9tICcuLi9GbHV4JztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cbmRlc2NyaWJlKCdTdG9yZScsICgpID0+IHtcbiAgY2xhc3MgRXhhbXBsZVN0b3JlIGV4dGVuZHMgU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIHRoaXMuc3RhdGUgPSB7IGZvbzogJ2JhcicgfTtcbiAgICB9XG4gIH1cblxuICBsZXQgYWN0aW9uSWQgPSAnYWN0aW9uSWQnO1xuXG4gIGRlc2NyaWJlKCcjcmVnaXN0ZXIoKScsICgpID0+IHtcbiAgICBpdCgnYWRkcyBoYW5kbGVyIHRvIGludGVybmFsIGNvbGxlY3Rpb24gb2YgaGFuZGxlcnMnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBsZXQgaGFuZGxlciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGhhbmRsZXIpO1xuXG4gICAgICBsZXQgbW9ja0FyZ3MgPSBbJ2ZvbycsICdiYXInXTtcbiAgICAgIHN0b3JlLl9oYW5kbGVyc1thY3Rpb25JZF0oLi4ubW9ja0FyZ3MpO1xuXG4gICAgICBleHBlY3QoaGFuZGxlci5jYWxsZWRXaXRoKC4uLm1vY2tBcmdzKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdiaW5kcyBoYW5kbGVyIHRvIHN0b3JlJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgc3RvcmUuZm9vID0gJ2Jhcic7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvbztcbiAgICAgIH1cblxuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGhhbmRsZXIpO1xuXG4gICAgICBleHBlY3Qoc3RvcmUuX2hhbmRsZXJzW2FjdGlvbklkXSgpKS50by5lcXVhbCgnYmFyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYWNjZXB0cyBhY3Rpb25zIGluc3RlYWQgb2YgYWN0aW9uIGlkcycsICgpID0+IHtcbiAgICAgIGNsYXNzIEV4YW1wbGVBY3Rpb25zIGV4dGVuZHMgQWN0aW9ucyB7XG4gICAgICAgIGdldEZvbygpIHtcbiAgICAgICAgICByZXR1cm4gJ2Zvbyc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGFjdGlvbnMgPSBuZXcgRXhhbXBsZUFjdGlvbnMoKTtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBoYW5kbGVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5yZWdpc3RlcihhY3Rpb25zLmdldEZvbywgaGFuZGxlcik7XG5cbiAgICAgIGxldCBtb2NrQXJncyA9IFsnZm9vJywgJ2JhciddO1xuICAgICAgc3RvcmUuX2hhbmRsZXJzW2FjdGlvbnMuZ2V0Rm9vLl9pZF0oLi4ubW9ja0FyZ3MpO1xuXG4gICAgICBleHBlY3QoaGFuZGxlci5jYWxsZWRXaXRoKC4uLm1vY2tBcmdzKSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdpZ25vcmVzIG5vbi1mdW5jdGlvbiBoYW5kbGVycycsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGV4cGVjdChzdG9yZS5yZWdpc3Rlci5iaW5kKHN0b3JlLCBudWxsKSkubm90LnRvLnRocm93KCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgaXQoJ2RlZmF1bHQgc3RhdGUgaXMgbnVsbCcsICgpID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IG5ldyBTdG9yZSgpO1xuICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uYmUubnVsbDtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNyZWdpc3RlckFzeW5jKCknLCAoKSA9PiB7XG4gICAgaXQoJ3JlZ2lzdGVycyBoYW5kbGVycyBmb3IgYmVnaW4sIHN1Y2Nlc3MsIGFuZCBmYWlsdXJlIG9mIGFzeW5jIGFjdGlvbicsIGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKCk7XG5cbiAgICAgIGNsYXNzIEV4YW1wbGVBY3Rpb25zIGV4dGVuZHMgQWN0aW9ucyB7XG4gICAgICAgIGFzeW5jIGdldEZvbyhtZXNzYWdlLCBfc3VjY2VzcyA9IHRydWUpIHtcbiAgICAgICAgICBpZiAoIV9zdWNjZXNzKSB0aHJvdyBlcnJvcjtcblxuICAgICAgICAgIHJldHVybiBtZXNzYWdlICsgJyBzdWNjZXNzJztcbiAgICAgICAgfVxuXG4gICAgICAgIGFzeW5jIGdldEJhcihtZXNzYWdlKSB7XG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3MgRXhhbXBsZUZsdXggZXh0ZW5kcyBGbHV4IHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUFjdGlvbnMoJ2V4YW1wbGUnLCBFeGFtcGxlQWN0aW9ucyk7XG4gICAgICAgICAgdGhpcy5jcmVhdGVTdG9yZSgnZXhhbXBsZScsIEV4YW1wbGVTdG9yZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGZsdXggPSBuZXcgRXhhbXBsZUZsdXgoKTtcbiAgICAgIGxldCBhY3Rpb25zID0gZmx1eC5nZXRBY3Rpb25zKCdleGFtcGxlJyk7XG4gICAgICBsZXQgc3RvcmUgPSBmbHV4LmdldFN0b3JlKCdleGFtcGxlJyk7XG5cbiAgICAgIGxldCBoYW5kbGVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5yZWdpc3RlcihhY3Rpb25zLmdldEJhciwgaGFuZGxlcik7XG5cbiAgICAgIGF3YWl0IGFjdGlvbnMuZ2V0QmFyKCdiYXInKTtcbiAgICAgIGV4cGVjdChoYW5kbGVyLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoaGFuZGxlci5maXJzdENhbGwuYXJncykudG8uZGVlcC5lcXVhbChbJ2JhciddKTtcblxuICAgICAgbGV0IGJlZ2luID0gc2lub24uc3B5KCk7XG4gICAgICBsZXQgc3VjY2VzcyA9IHNpbm9uLnNweSgpO1xuICAgICAgbGV0IGZhaWx1cmUgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLnJlZ2lzdGVyQXN5bmMoYWN0aW9ucy5nZXRGb28sIGJlZ2luLCBzdWNjZXNzLCBmYWlsdXJlKTtcblxuICAgICAgYXdhaXQgYWN0aW9ucy5nZXRGb28oJ2ZvbycsIHRydWUpO1xuICAgICAgZXhwZWN0KGJlZ2luLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3QoYmVnaW4uZmlyc3RDYWxsLmFyZ3MpLnRvLmRlZXAuZXF1YWwoWydmb28nLCB0cnVlXSk7XG4gICAgICBleHBlY3Qoc3VjY2Vzcy5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHN1Y2Nlc3MuZmlyc3RDYWxsLmFyZ3NbMF0pLnRvLmVxdWFsKCdmb28gc3VjY2VzcycpO1xuICAgICAgZXhwZWN0KGZhaWx1cmUuY2FsbGVkKS50by5iZS5mYWxzZTtcblxuICAgICAgYXdhaXQgZXhwZWN0KGFjdGlvbnMuZ2V0Rm9vKCdiYXInLCBmYWxzZSkpLnRvLmJlLnJlamVjdGVkO1xuXG4gICAgICBleHBlY3QoYmVnaW4uY2FsbGVkVHdpY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3VjY2Vzcy5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KGZhaWx1cmUuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChmYWlsdXJlLmZpcnN0Q2FsbC5hcmdzWzBdKS50by5lcXVhbChlcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBub24tZnVuY3Rpb24gaGFuZGxlcnMnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBleHBlY3Qoc3RvcmUucmVnaXN0ZXJBc3luYy5iaW5kKHN0b3JlLCBudWxsKSkubm90LnRvLnRocm93KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjaGFuZGxlcigpJywgKCkgPT4ge1xuICAgIGl0KCdkZWxlZ2F0ZXMgZGlzcGF0Y2hlcyB0byByZWdpc3RlcmVkIGhhbmRsZXJzJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IGhhbmRsZXIgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLnJlZ2lzdGVyKGFjdGlvbklkLCBoYW5kbGVyKTtcblxuICAgICAgLy8gU2ltdWxhdGUgZGlzcGF0Y2hcbiAgICAgIGxldCBib2R5ID0geyBmb286ICdiYXInIH07XG4gICAgICBzdG9yZS5oYW5kbGVyKHsgYm9keSwgYWN0aW9uSWQgfSk7XG5cbiAgICAgIGV4cGVjdChoYW5kbGVyLmNhbGxlZFdpdGgoYm9keSkpLnRvLmJlLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcjd2FpdEZvcigpJywgKCkgPT4ge1xuICAgIGl0KCd3YWl0cyBmb3Igb3RoZXIgc3RvcmVzJywgKCkgPT4ge1xuICAgICAgbGV0IGZsdXggPSBuZXcgRmx1eCgpO1xuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuXG4gICAgICBsZXQgc3RvcmUyO1xuXG4gICAgICBjbGFzcyBTdG9yZTEgZXh0ZW5kcyBTdG9yZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGFjdGlvbklkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMud2FpdEZvcihzdG9yZTIpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goMSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2xhc3MgU3RvcmUyIGV4dGVuZHMgU3RvcmUge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcihhY3Rpb25JZCwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goMik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZmx1eC5jcmVhdGVTdG9yZSgnc3RvcmUxJywgU3RvcmUxKTtcbiAgICAgIGZsdXguY3JlYXRlU3RvcmUoJ3N0b3JlMicsIFN0b3JlMik7XG5cbiAgICAgIHN0b3JlMiA9IGZsdXguZ2V0U3RvcmUoJ3N0b3JlMicpO1xuXG4gICAgICBmbHV4LmRpc3BhdGNoKGFjdGlvbklkLCAnZm9vYmFyJyk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvLmRlZXAuZXF1YWwoWzIsIDFdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNmb3JjZVVwZGF0ZSgpJywgKCkgPT4ge1xuICAgIGl0KCdlbWl0cyBjaGFuZ2UgZXZlbnQnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLmFkZExpc3RlbmVyKCdjaGFuZ2UnLCBsaXN0ZW5lcik7XG5cbiAgICAgIHN0b3JlLmZvcmNlVXBkYXRlKCk7XG5cbiAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXNuXFwndCBtb2RpZnkgZXhpc3Rpbmcgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG4gICAgICBsZXQgbGlzdGVuZXIgPSBzaW5vbi5zcHkoKTtcbiAgICAgIHN0b3JlLmFkZExpc3RlbmVyKCdjaGFuZ2UnLCBsaXN0ZW5lcik7XG5cbiAgICAgIHN0b3JlLnJlZ2lzdGVyKGFjdGlvbklkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlU3RhdGUoeyBiYXI6ICdiYXonIH0pO1xuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG5cbiAgICAgICAgZXhwZWN0KHRoaXMuc3RhdGUpLnRvLmRlZXAuZXF1YWwoeyBmb286ICdiYXInIH0pO1xuICAgICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkKS50by5iZS5mYWxzZTtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZm9vOiAnYmFyJyB9KTtcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh7IGJhejogJ2ZvbycgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2ltdWxhdGUgZGlzcGF0Y2hcbiAgICAgIHN0b3JlLmhhbmRsZXIoeyBhY3Rpb25JZCwgYm9keTogJ2Zvb2JhcicgfSk7XG5cbiAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5kZWVwLmVxdWFsKHsgYmF6OiAnZm9vJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNzZXRTdGF0ZSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaGFsbG93IG1lcmdlcyBvbGQgc3RhdGUgd2l0aCBuZXcgc3RhdGUnLCAoKSA9PiB7XG4gICAgICBsZXQgc3RvcmUgPSBuZXcgRXhhbXBsZVN0b3JlKCk7XG5cbiAgICAgIHN0b3JlLnNldFN0YXRlKHsgYmFyOiAnYmF6JyB9KTtcblxuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5kZWVwLmVxdWFsKHtcbiAgICAgICAgZm9vOiAnYmFyJyxcbiAgICAgICAgYmFyOiAnYmF6JyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1cHBvcnRzIHRyYW5zYWN0aW9uYWwgdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICBzdG9yZS5zdGF0ZSA9IHsgYTogMSB9O1xuICAgICAgc3RvcmUuc2V0U3RhdGUoc3RhdGUgPT4gKHsgYTogc3RhdGUuYSArIDEgfSkpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlLmEpLnRvLmVxdWFsKDIpO1xuICAgICAgc3RvcmUuc2V0U3RhdGUoc3RhdGUgPT4gKHsgYTogc3RhdGUuYSArIDEgfSkpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlLmEpLnRvLmVxdWFsKDMpO1xuICAgICAgc3RvcmUuc2V0U3RhdGUoc3RhdGUgPT4gKHsgYTogc3RhdGUuYSArIDEgfSkpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlLmEpLnRvLmVxdWFsKDQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2VtaXRzIGNoYW5nZSBldmVudCcsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuXG4gICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcblxuICAgIGl0KCdiYXRjaGVzIG11bHRpcGxlIHN0YXRlIHVwZGF0ZXMgd2l0aGluIGFjdGlvbiBoYW5kbGVyJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IGxpc3RlbmVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5hZGRMaXN0ZW5lcignY2hhbmdlJywgbGlzdGVuZXIpO1xuXG4gICAgICBzdG9yZS5yZWdpc3RlcihhY3Rpb25JZCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBiYXI6ICdiYXonIH0pO1xuXG4gICAgICAgIGV4cGVjdCh0aGlzLnN0YXRlKS50by5kZWVwLmVxdWFsKHsgZm9vOiAnYmFyJyB9KTtcbiAgICAgICAgZXhwZWN0KGxpc3RlbmVyLmNhbGxlZCkudG8uYmUuZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGJhejogJ2ZvbycgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU2ltdWxhdGUgZGlzcGF0Y2hcbiAgICAgIHN0b3JlLmhhbmRsZXIoeyBhY3Rpb25JZCwgYm9keTogJ2Zvb2JhcicgfSk7XG5cbiAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWRPbmNlKS50by5iZS50cnVlO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5kZWVwLmVxdWFsKHsgZm9vOiAnYmFyJywgYmFyOiAnYmF6JywgYmF6OiAnZm9vJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd3YXJucyBpZiBjYWxsZWQgZnJvbSBvdXRzaWRlIGFuIGFjdGlvbiBoYW5kbGVyJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IHdhcm4gPSBzaW5vbi5zcHkoY29uc29sZSwgJ3dhcm4nKTtcblxuICAgICAgc3RvcmUuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuXG4gICAgICBleHBlY3Qod2Fybi5maXJzdENhbGwuYXJnc1swXSkudG8uZXF1YWwoXG4gICAgICAgICdTdG9yZSNzZXRTdGF0ZSgpIGNhbGxlZCBmcm9tIG91dHNpZGUgYW4gYWN0aW9uIGhhbmRsZXIuIFRoaXMgaXMgJ1xuICAgICAgKyAnbGlrZWx5IGEgbWlzdGFrZS4gRmx1eCBzdG9yZXMgc2hvdWxkIG1hbmFnZSB0aGVpciBvd24gc3RhdGUuJ1xuICAgICAgKTtcblxuICAgICAgY29uc29sZS53YXJuLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJyNyZXBsYWNlU3RhdGUoKScsICgpID0+IHtcbiAgICBpdCgncmVwbGFjZXMgb2xkIHN0YXRlIHdpdGggbmV3IHN0YXRlJywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuXG4gICAgICBzdG9yZS5yZXBsYWNlU3RhdGUoeyBiYXI6ICdiYXonIH0pO1xuXG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmRlZXAuZXF1YWwoe1xuICAgICAgICBiYXI6ICdiYXonLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYmF0Y2hlcyBtdWx0aXBsZSBzdGF0ZSB1cGRhdGVzIHdpdGhpbiBhY3Rpb24gaGFuZGxlcicsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh7IGJhcjogJ2JheicgfSk7XG5cbiAgICAgICAgZXhwZWN0KHRoaXMuc3RhdGUpLnRvLmRlZXAuZXF1YWwoeyBmb286ICdiYXInIH0pO1xuICAgICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkKS50by5iZS5mYWxzZTtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZm9vOiAnYmFyJyB9KTtcbiAgICAgICAgdGhpcy5yZXBsYWNlU3RhdGUoeyBiYXo6ICdmb28nIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNpbXVsYXRlIGRpc3BhdGNoXG4gICAgICBzdG9yZS5oYW5kbGVyKHsgYWN0aW9uSWQsIGJvZHk6ICdmb29iYXInIH0pO1xuXG4gICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uZGVlcC5lcXVhbCh7IGJhejogJ2ZvbycgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZW1pdHMgY2hhbmdlIGV2ZW50JywgKCkgPT4ge1xuICAgICAgbGV0IHN0b3JlID0gbmV3IEV4YW1wbGVTdG9yZSgpO1xuICAgICAgbGV0IGxpc3RlbmVyID0gc2lub24uc3B5KCk7XG4gICAgICBzdG9yZS5hZGRMaXN0ZW5lcignY2hhbmdlJywgbGlzdGVuZXIpO1xuXG4gICAgICBzdG9yZS5yZXBsYWNlU3RhdGUoeyBmb286ICdiYXInIH0pO1xuXG4gICAgICBleHBlY3QobGlzdGVuZXIuY2FsbGVkT25jZSkudG8uYmUudHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5hc3NpZ25TdGF0ZScsICgpID0+IHtcbiAgICBpdCgnY2FuIGJlIG92ZXJyaWRkZW4gdG8gZW5hYmxlIGN1c3RvbSBzdGF0ZSB0eXBlcycsICgpID0+IHtcbiAgICAgIGNsYXNzIFN0cmluZ1N0b3JlIGV4dGVuZHMgU3RvcmUge1xuICAgICAgICBzdGF0aWMgYXNzaWduU3RhdGUocHJldlN0YXRlLCBuZXh0U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4gW3ByZXZTdGF0ZSwgbmV4dFN0YXRlXVxuICAgICAgICAgICAgLmZpbHRlcihzdGF0ZSA9PiB0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JlID0gbmV3IFN0cmluZ1N0b3JlKCk7XG5cbiAgICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uYmUubnVsbDtcbiAgICAgIHN0b3JlLnNldFN0YXRlKCdhJyk7XG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmVxdWFsKCdhJyk7XG4gICAgICBzdG9yZS5zZXRTdGF0ZSgnYicpO1xuICAgICAgZXhwZWN0KHN0b3JlLnN0YXRlKS50by5lcXVhbCgnYWInKTtcbiAgICAgIHN0b3JlLnJlcGxhY2VTdGF0ZSgneHl6Jyk7XG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmVxdWFsKCd4eXonKTtcbiAgICAgIHN0b3JlLnNldFN0YXRlKCd6eXgnKTtcbiAgICAgIGV4cGVjdChzdG9yZS5zdGF0ZSkudG8uZXF1YWwoJ3h5enp5eCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnI2ZvcmNlVXBkYXRlKCknLCAoKSA9PiB7XG4gICAgaXQoJ2VtaXRzIGNoYW5nZSBldmVudCcsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUuZm9yY2VVcGRhdGUoKTtcblxuICAgICAgZXhwZWN0KGxpc3RlbmVyLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lc25cXCd0IG1vZGlmeSBleGlzdGluZyBzdGF0ZScsICgpID0+IHtcbiAgICAgIGxldCBzdG9yZSA9IG5ldyBFeGFtcGxlU3RvcmUoKTtcbiAgICAgIGxldCBsaXN0ZW5lciA9IHNpbm9uLnNweSgpO1xuICAgICAgc3RvcmUuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcblxuICAgICAgc3RvcmUucmVnaXN0ZXIoYWN0aW9uSWQsIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnJlcGxhY2VTdGF0ZSh7IGJhcjogJ2JheicgfSk7XG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcblxuICAgICAgICBleHBlY3QodGhpcy5zdGF0ZSkudG8uZGVlcC5lcXVhbCh7IGZvbzogJ2JhcicgfSk7XG4gICAgICAgIGV4cGVjdChsaXN0ZW5lci5jYWxsZWQpLnRvLmJlLmZhbHNlO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBmb286ICdiYXInIH0pO1xuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgIHRoaXMucmVwbGFjZVN0YXRlKHsgYmF6OiAnZm9vJyB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTaW11bGF0ZSBkaXNwYXRjaFxuICAgICAgc3RvcmUuaGFuZGxlcih7IGFjdGlvbklkLCBib2R5OiAnZm9vYmFyJyB9KTtcblxuICAgICAgZXhwZWN0KGxpc3RlbmVyLmNhbGxlZE9uY2UpLnRvLmJlLnRydWU7XG4gICAgICBleHBlY3Qoc3RvcmUuc3RhdGUpLnRvLmRlZXAuZXF1YWwoeyBiYXo6ICdmb28nIH0pO1xuICAgIH0pO1xuICB9KTtcblxufSk7XG4iXX0= |