@media-quest/engine 0.0.15 → 0.0.17

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@media-quest/engine",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "description": "Rendering engine for media-quest schemas.",
5
5
  "main": "src/public-api.ts",
6
6
  "license": "MIT",
@@ -9,3 +9,27 @@ export type ButtonClickAction =
9
9
  | { kind: "submit-fact"; fact: Fact }
10
10
  | { kind: "next-page" }
11
11
  | { kind: "submit-form" };
12
+
13
+ export const ButtonClickAction = {
14
+ describe: (a: ButtonClickAction): string => {
15
+ switch (a.kind) {
16
+ case "next-page":
17
+ return "go to next page";
18
+ case "play-video":
19
+ return "VideoId = " + a.task.videoId;
20
+ case "play-audio":
21
+ return "AudioId = " + a.task.audioId;
22
+ case "pause-video":
23
+ return "";
24
+ case "pause-audio":
25
+ return "";
26
+ case "submit-fact":
27
+ return a.fact.label + " = " + a.fact.value;
28
+ case "submit-form":
29
+ return "";
30
+ default:
31
+ const _exhaustiveCheck: never = a;
32
+ return "";
33
+ }
34
+ },
35
+ };
@@ -1,10 +1,10 @@
1
1
  import { Rule } from "../rules/rule";
2
2
  import { Fact } from "../rules/fact";
3
- import { PageQueCommand } from "./DCommand";
3
+ import { RuleActionPageQue } from "./page-que-ruleengine-action";
4
4
  import { SchemaID } from "../utils/ID";
5
5
  import { PageDto } from "../page/Page";
6
6
 
7
- export type PageQueRules = Rule<PageQueCommand, never>;
7
+ export type PageQueRules = Rule<RuleActionPageQue, never>;
8
8
 
9
9
  export interface PageSequenceDto {
10
10
  readonly id: string;
@@ -1,27 +1,35 @@
1
1
  import { SchemaDto } from "./SchemaDto";
2
2
  import { DPlayer } from "./dplayer";
3
3
  import { ScaleService } from "./scale";
4
- // import { DEvent } from "../events/DEvents";
5
4
  import { Page } from "../page/Page";
6
5
  import { TaskManager } from "../page/task-manager";
7
- // import { AnsweredQuestion, PageHistory } from "./history-que";
8
6
  import { PageResult } from "../page/page-result";
9
-
7
+ import { Fact } from "../rules/fact";
8
+ import { MqEvent } from "../events/mq-events";
10
9
  export interface EngineLogger {
10
+ info(message: string): void;
11
11
  error(message: string): void;
12
12
  warn(message: string): void;
13
- // appEvent(event: DEvent): void;
14
13
  }
15
14
 
15
+ const voidLogger: EngineLogger = {
16
+ info: (message: string) => {},
17
+ error: (message: string) => {},
18
+ warn: (message: string) => {},
19
+ };
20
+
16
21
  export interface SchemaResult {
17
- readonly eventLog: ReadonlyArray<any>;
18
- readonly answers: ReadonlyArray<any>;
22
+ readonly schemaId: string;
23
+ readonly pagesLeft: number;
24
+ readonly predefinedFacts: ReadonlyArray<Fact>;
25
+ readonly eventLog: ReadonlyArray<MqEvent>;
26
+ readonly answers: ReadonlyArray<Fact>;
19
27
  }
28
+
20
29
  export interface ISchemaEngine {
21
- onComplete(handler: (result: SchemaResult) => void): void;
22
- // onCommandOrEvent(item: DEvent | DCommand): void;
23
- setSchema(schema: SchemaDto): void;
30
+ onProgress(handler: (result: SchemaResult) => void): void;
24
31
  onFatalError(handler: (error: { message: string }) => void): void;
32
+ setLogger(logger: EngineLogger): void;
25
33
  }
26
34
 
27
35
  export class SchemaEngine implements ISchemaEngine {
@@ -29,12 +37,12 @@ export class SchemaEngine implements ISchemaEngine {
29
37
  private readonly scale: ScaleService;
30
38
  private readonly hostElement: HTMLDivElement;
31
39
  private readonly taskManager: TaskManager;
40
+ private logger: EngineLogger = voidLogger;
32
41
  private readonly uiLayer: HTMLDivElement = document.createElement("div");
33
42
  private readonly mediaLayer: HTMLDivElement = document.createElement("div");
34
43
  private player: DPlayer;
35
44
  private currentPage: Page | false = false;
36
45
  private readonly tickerRef: number | false = false;
37
-
38
46
  constructor(
39
47
  hostEl: HTMLDivElement,
40
48
  private readonly height: number,
@@ -55,17 +63,35 @@ export class SchemaEngine implements ISchemaEngine {
55
63
  containerWidth: width,
56
64
  containerHeight: height,
57
65
  });
66
+ this.logger.info(this.TAG + "Scale: " + JSON.stringify(this.scale));
58
67
  this.player = new DPlayer(this.schema);
59
68
  this.taskManager = new TaskManager(this.mediaLayer, this.scale, (error) => {
60
69
  console.log(error);
61
70
  });
71
+
62
72
  this.styleSelf();
63
73
  this.handlePageCompleted = this.handlePageCompleted.bind(this);
64
74
  this.nextPage();
65
75
  }
66
76
 
67
77
  private handlePageCompleted(result: PageResult) {
78
+ // 1 Save data from last page
68
79
  this.player.saveHistory(result);
80
+
81
+ // 2 Emit progress
82
+ const currentResults = this.player.getResults();
83
+ const a: SchemaResult = {
84
+ schemaId: this.schema.id,
85
+ pagesLeft: currentResults.pagesLeft,
86
+ predefinedFacts: currentResults.predefinedFacts,
87
+ eventLog: currentResults.eventLog,
88
+ answers: currentResults.answerFacts,
89
+ };
90
+ if (this._onProgress) {
91
+ this._onProgress(a);
92
+ }
93
+
94
+ // 3. Next page
69
95
  this.nextPage();
70
96
  }
71
97
 
@@ -91,15 +117,13 @@ export class SchemaEngine implements ISchemaEngine {
91
117
  const nextPage = this.player.getNextPage();
92
118
  if (this.currentPage) {
93
119
  this.currentPage.destroy();
94
-
95
120
  this.uiLayer.innerHTML = "";
96
121
  }
97
122
 
98
123
  if (!nextPage) {
99
- // console.log("NO MORE PAGES");
100
124
  // TODO FIGURE OUT WHAQT TO DO AT END OF TEST!! Start over??
101
125
  this.player = new DPlayer(this.schema);
102
- if (this.player.pageCount > 0) {
126
+ if (this.player.pagesLeft > 0) {
103
127
  this.nextPage();
104
128
  }
105
129
  return false;
@@ -108,12 +132,7 @@ export class SchemaEngine implements ISchemaEngine {
108
132
  const newPage = new Page(nextPage, this.taskManager, this.scale, (result) => {
109
133
  this.handlePageCompleted(result);
110
134
  });
111
-
112
- // console.log("APPENDING PAGE");
113
-
114
135
  this.currentPage = newPage;
115
- // this.uiContainer.innerHTML = "";
116
-
117
136
  newPage.appendYourself(this.uiLayer);
118
137
  return true;
119
138
  }
@@ -124,17 +143,17 @@ export class SchemaEngine implements ISchemaEngine {
124
143
  this.uiLayer.innerHTML = "";
125
144
  }
126
145
  }
127
- onComplete(handler: (result: SchemaResult) => void) {
128
- console.log(handler);
146
+
147
+ private _onProgress: ((result: SchemaResult) => void) | false = false;
148
+ onProgress(handler: (result: SchemaResult) => void) {
149
+ this._onProgress = handler;
129
150
  }
130
151
 
152
+ private _onFatalError: ((error: { message: string }) => void) | false = false;
131
153
  onFatalError(handler: (error: { message: string }) => void): void {
132
- console.log(handler);
154
+ this._onFatalError = handler;
133
155
  }
134
-
135
- onCommandOrEvent(_event_or_command: any) {}
136
-
137
- setSchema(schema: SchemaDto): void {
138
- console.log(schema);
156
+ setLogger(logger: EngineLogger) {
157
+ this.logger = logger;
139
158
  }
140
159
  }
@@ -1,9 +1,8 @@
1
1
  import { DPlayer, DPlayerData } from "./dplayer";
2
2
  import { PageSequenceDto } from "./SchemaDto";
3
3
  import { Rule } from "../rules/rule";
4
- // import { PageHistory } from "./history-que";
5
4
  import { DTimestamp } from "../common/DTimestamp";
6
- import { PageQueCommand } from "./DCommand";
5
+ import { RuleActionPageQue } from "./page-que-ruleengine-action";
7
6
  import { PageDto } from "../page/Page";
8
7
  import { PageResult } from "../page/page-result";
9
8
 
@@ -32,7 +31,7 @@ const seq1: PageSequenceDto = {
32
31
  const data = (
33
32
  pages: PageDto[],
34
33
  pageSequences: PageSequenceDto[] = [],
35
- rules: Rule<PageQueCommand, never>[] = [],
34
+ rules: Rule<RuleActionPageQue, never>[] = [],
36
35
  ): DPlayerData => ({ pages: pages, pageSequences, rules });
37
36
  // const seq = (pages: PageDto[], rules: Rule[]) => {};
38
37
  beforeEach(() => {
@@ -58,33 +57,13 @@ describe("DPlayer", () => {
58
57
 
59
58
  expect(player.getNextPage()).toBe(p1);
60
59
  expect(player.getNextPage()).toBe(p2);
61
- player.handleNavigationCommand({
62
- kind: "PAGE_QUE_GO_TO_SEQUENCE_COMMAND",
63
- target: "PAGE_QUE",
64
- targetId: "PAGE_QUE",
65
- payload: {
66
- sequenceId: seq1.id,
67
- },
68
- });
60
+ player.insertSequence(seq1.id);
69
61
  expect(player.getNextPage()).toBe(Seq1.p10);
70
62
  expect(player.getNextPage()).toBe(Seq1.p11);
71
63
  expect(player.getNextPage()).toBe(Seq1.p12);
72
64
  expect(player.getNextPage()).toBe(p3);
73
65
  });
74
66
 
75
- it("Can jump forward to a pageId", () => {
76
- const player = new DPlayer(data(all));
77
-
78
- expect(player.getNextPage()).toBe(p1);
79
- player.handleNavigationCommand({
80
- kind: "PAGE_QUE_GO_TO_PAGE_COMMAND",
81
- target: "PAGE_QUE",
82
- targetId: "PAGE_QUE",
83
- payload: { pageId: p4.id },
84
- });
85
- expect(player.getNextPage()).toBe(p4);
86
- });
87
-
88
67
  it("Save history", () => {
89
68
  const player = new DPlayer(data(all));
90
69
 
@@ -92,8 +71,8 @@ describe("DPlayer", () => {
92
71
 
93
72
  const result: PageResult = {
94
73
  pageId: curr.id,
95
- pageEntered: DTimestamp.now(),
96
- pageExited: DTimestamp.now(),
74
+ pagePrefix: curr.id,
75
+ eventLog: [],
97
76
  pageTime: DTimestamp.diff(DTimestamp.now(), DTimestamp.now()),
98
77
  collectedFacts: [
99
78
  {
@@ -107,6 +86,6 @@ describe("DPlayer", () => {
107
86
  };
108
87
  player.saveHistory(result);
109
88
  expect(player.getNextPage()).toBe(p2);
110
- expect(player.getResults().length).toBe(1);
89
+ expect(player.getResults().answerFacts.length).toBe(1);
111
90
  });
112
91
  });
@@ -2,86 +2,76 @@ import { HistoryQue } from "./history-que";
2
2
  import { RuleEngine } from "../rules/rule-engine";
3
3
  import { NextQue } from "./next-que";
4
4
  import { SchemaDto } from "./SchemaDto";
5
- import { NavigationCommand, PageQueCommand } from "./DCommand";
6
- import { DUtil } from "../utils/DUtil";
5
+ import { RuleActionPageQue } from "./page-que-ruleengine-action";
7
6
  import { PageDto } from "../page/Page";
8
7
  import { PageResult } from "../page/page-result";
9
8
  import { Fact } from "../rules/fact";
9
+ import { MqEvent } from "../events/mq-events";
10
10
 
11
- export type DPlayerData = Pick<SchemaDto, "pages" | "pageSequences" | "rules">;
11
+ export type DPlayerData = Pick<SchemaDto, "pages" | "pageSequences" | "rules" | "predefinedFacts">;
12
12
  export class DPlayer {
13
+ private readonly eventLog: Array<MqEvent> = [];
13
14
  private history = new HistoryQue();
14
- private ruleEngine = new RuleEngine<PageQueCommand, never>();
15
+ private ruleEngine = new RuleEngine<RuleActionPageQue, never>();
15
16
  private nextQue = new NextQue();
16
17
  private data: DPlayerData;
18
+ private readonly predefinedFacts: ReadonlyArray<Fact>;
17
19
 
18
20
  constructor(data: DPlayerData) {
19
21
  this.data = data;
20
22
  const pages = data.pages ?? [];
23
+ this.predefinedFacts = data.predefinedFacts ? [...data.predefinedFacts] : [];
21
24
  this.nextQue.resetQue(pages);
22
25
  }
23
26
 
27
+ saveEvent(event: MqEvent) {
28
+ this.eventLog.push(event);
29
+ }
30
+
24
31
  saveHistory(pageHistory: PageResult) {
25
32
  // console.log("SAVE HISTORY", pageHistory);
26
33
  this.history.addToHistory(pageHistory);
27
- const facts = this.history.getFacts();
34
+ this.eventLog.push(...pageHistory.eventLog);
35
+ // Evaluate rules
36
+ const userGeneratedFact = this.history.getFacts();
37
+ const predefinedFacts = this.predefinedFacts;
38
+ const facts = [...userGeneratedFact, ...predefinedFacts];
28
39
  const result = this.ruleEngine.solveAll(this.data.rules, facts);
40
+
29
41
  const matchingRules = result.matching;
30
42
  const actions = matchingRules.map((r) => r.actionList).flat(1);
43
+ // Execute actions
31
44
  actions.forEach((a) => {
32
45
  // console.log(a.payload);
33
46
  switch (a.kind) {
34
- case "PAGE_QUE_JUMP_TO_PAGE_COMMAND":
35
- this.nextQue.jumpToPageById(a.payload.pageId);
47
+ case "jumpToPage":
48
+ this.nextQue.jumpToPageById(a.pageId);
36
49
  break;
37
- case "PAGE_QUE_EXCLUDE_BY_PAGE_ID_COMMAND":
38
- this.nextQue.removeByPageId(a.payload.pageIds);
50
+ case "excludeByPageId":
51
+ this.nextQue.removeByPageId(a.pageIds);
39
52
  break;
40
- case "PAGE_QUE_EXCLUDE_BY_TAG_COMMAND":
41
- this.nextQue.removeByTag(a.payload.tagIds);
53
+ case "excludeByTag":
54
+ this.nextQue.removeByTag(a.tagIds);
42
55
  break;
43
56
  default:
44
57
  console.log("UNKNOWN ACTION", a);
45
58
  const check: never = a;
46
59
  }
47
60
  });
48
- // console.log(actions);
49
61
  }
50
62
 
51
- getResults(): Fact[] {
52
- return this.history.getFacts();
63
+ getResults() {
64
+ const pagesLeft = this.nextQue.size;
65
+ const answerFacts = this.history.getFacts();
66
+ const predefinedFacts = this.predefinedFacts;
67
+ const eventLog = [...this.eventLog];
68
+ return { answerFacts, predefinedFacts, eventLog, pagesLeft };
53
69
  }
54
70
 
55
- private goToPageById(pageId: string) {
56
- this.nextQue.jumpToPageById(pageId);
57
- }
58
-
59
- handleNavigationCommand(command: NavigationCommand) {
60
- switch (command.kind) {
61
- case "PAGE_QUE_GO_TO_PAGE_COMMAND":
62
- this.goToPageById(command.payload.pageId);
63
- break;
64
- case "PAGE_QUE_GO_TO_SEQUENCE_COMMAND":
65
- this.insertSequenceById(command.payload.sequenceId);
66
- break;
67
-
68
- default:
69
- DUtil.neverCheck(command);
70
- }
71
+ insertSequence(sequenceId: string) {
72
+ this.insertSequenceById(sequenceId);
71
73
  }
72
74
 
73
- // getNextPage():
74
- // | { kind: "first-page"; readonly page: PageDto }
75
- // | { kind: "next-page"; readonly page: PageDto }
76
- // | { kind: "no-more-pages" } {
77
- // const next = this.nextQue.pop();
78
- // const a = this.nextQue.
79
- // if (next) {
80
- // return { kind: "next-page", page: next };
81
- // }
82
- // return { kind: "no-more-pages" };
83
- // }
84
-
85
75
  getNextPage(): PageDto | false {
86
76
  const next = this.nextQue.pop();
87
77
  return next ?? false;
@@ -98,9 +88,16 @@ export class DPlayer {
98
88
  }
99
89
 
100
90
  /**
101
- * Total number of pages.
91
+ * Total number of pages left in que
102
92
  */
103
- get pageCount(): number {
93
+ get pagesLeft(): number {
104
94
  return this.nextQue.pageCount;
105
95
  }
96
+
97
+ /**
98
+ * Total number of pages in test
99
+ */
100
+ get totalPageCount(): number {
101
+ return this.data.pages.length;
102
+ }
106
103
  }
@@ -5,7 +5,15 @@ import { PageDto } from "../page/Page";
5
5
  import { PageResult } from "../page/page-result";
6
6
 
7
7
  const p = (id: number): PageDto => {
8
- return { id: PageID.create(), components: [], initialTasks: [], staticElements: [], background: "", tags: [] };
8
+ return {
9
+ id: PageID.create(),
10
+ prefix: "prefix" + id,
11
+ components: [],
12
+ initialTasks: [],
13
+ staticElements: [],
14
+ background: "",
15
+ tags: [],
16
+ };
9
17
  };
10
18
 
11
19
  const pageResult = (id: number, value: number): PageResult => {
@@ -15,8 +23,8 @@ const pageResult = (id: number, value: number): PageResult => {
15
23
 
16
24
  const result: PageResult = {
17
25
  pageId: "_dummyId" + id,
18
- pageEntered,
19
- pageExited,
26
+ pagePrefix: "prefix" + id,
27
+ eventLog: [],
20
28
  pageTime,
21
29
  collectedFacts: [
22
30
  {
@@ -1,23 +1,6 @@
1
1
  import { Fact } from "../rules/fact";
2
- import { DTimestamp } from "../common/DTimestamp";
3
2
  import { PageResult } from "../page/page-result";
4
3
 
5
- // export interface AnsweredQuestion {
6
- // readonly timestamp: DTimestamp;
7
- // readonly fact: Fact;
8
- // }
9
-
10
- // export namespace AnsweredQuestion {
11
- // export const eq = (a: AnsweredQuestion, b: AnsweredQuestion): boolean => {
12
- // return a.fact === b.fact;
13
- // };
14
- // }
15
-
16
- // export interface PageHistory {
17
- // readonly pageId: string;
18
- // readonly answeredQuestions: AnsweredQuestion[];
19
- // }
20
-
21
4
  export class HistoryQue {
22
5
  private history: PageResult[] = [];
23
6
 
@@ -10,6 +10,7 @@ let que = new NextQue();
10
10
  const createPage = (tags: string[]): PageDto => {
11
11
  const dto: PageDto = {
12
12
  id: PageID.create(),
13
+ prefix: "prefix",
13
14
  staticElements: [],
14
15
  background: "white",
15
16
  components: [],
@@ -84,9 +84,17 @@ export class NextQue {
84
84
  get isEmpty(): boolean {
85
85
  return this.remaining.length === 0;
86
86
  }
87
+
88
+ /**
89
+ * Total number of pages left in que
90
+ */
87
91
  get size(): number {
88
92
  return this.remaining.length;
89
93
  }
94
+
95
+ /**
96
+ * Total number of pages in test
97
+ */
90
98
  get pageCount(): number {
91
99
  return this.originalOrder.length;
92
100
  }
@@ -0,0 +1,6 @@
1
+ import { PageID } from "../utils/ID";
2
+
3
+ export type RuleActionPageQue =
4
+ | { kind: "excludeByTag"; tagIds: string[] }
5
+ | { kind: "excludeByPageId"; pageIds: Array<PageID> }
6
+ | { kind: "jumpToPage"; pageId: PageID };
@@ -0,0 +1,63 @@
1
+ import { DTimestamp } from "../common/DTimestamp";
2
+
3
+ interface _MqEvent<K extends string, P extends object> {
4
+ readonly kind: K;
5
+ readonly timestamp: DTimestamp;
6
+ readonly payload: P;
7
+ }
8
+
9
+ export type MqEventEngineStart = _MqEvent<
10
+ "engine-start",
11
+ {
12
+ readonly schemaId: string;
13
+ readonly schemaPrefix: string;
14
+ }
15
+ >;
16
+ export interface MqEventPageEnter
17
+ extends _MqEvent<"page-enter", { readonly pageId: string; readonly pagePrefix: string }> {}
18
+ export interface MqEventPageLeave
19
+ extends _MqEvent<"page-leave", { readonly pageId: string; readonly pagePrefix: string }> {}
20
+
21
+ export type MqEventUserClicked = _MqEvent<
22
+ "user-clicked",
23
+ { readonly pageId: string; pagePrefix: string; action: string; descriptions: string }
24
+ >;
25
+
26
+ export type MqEvent = MqEventPageEnter | MqEventPageLeave | MqEventEngineStart | MqEventUserClicked;
27
+
28
+ export const MqEvent = {
29
+ engineStart(schemaId: string, schemaPrefix: string): MqEventEngineStart {
30
+ return {
31
+ kind: "engine-start",
32
+ timestamp: DTimestamp.now(),
33
+ payload: { schemaId, schemaPrefix },
34
+ };
35
+ },
36
+ pageEnter(pageId: string, pagePrefix: string): MqEventPageEnter {
37
+ return {
38
+ kind: "page-enter",
39
+ timestamp: DTimestamp.now(),
40
+ payload: { pageId, pagePrefix },
41
+ };
42
+ },
43
+ pageLeave(pageId: string, pagePrefix: string): MqEventPageLeave {
44
+ return {
45
+ kind: "page-leave",
46
+ timestamp: DTimestamp.now(),
47
+ payload: { pageId, pagePrefix },
48
+ };
49
+ },
50
+ userClicked(data: {
51
+ pageId: string;
52
+ pagePrefix: string;
53
+ action: string;
54
+ descriptions: string;
55
+ }): MqEventUserClicked {
56
+ const { pageId, pagePrefix, action, descriptions } = data;
57
+ return {
58
+ kind: "user-clicked",
59
+ timestamp: DTimestamp.now(),
60
+ payload: { pageId, pagePrefix, action, descriptions },
61
+ };
62
+ },
63
+ } as const;
package/src/page/Page.ts CHANGED
@@ -11,6 +11,12 @@ import { Fact } from "../rules/fact";
11
11
  import { DTimestamp } from "../common/DTimestamp";
12
12
  import { PageResult } from "./page-result";
13
13
  import { TaskState, TaskStateDiff } from "./task-state";
14
+ import {
15
+ MqEvent,
16
+ MqEventPageEnter,
17
+ MqEventPageLeave,
18
+ MqEventUserClicked,
19
+ } from "../events/mq-events";
14
20
 
15
21
  export interface VideoPlayerDto {
16
22
  playUrl: string;
@@ -19,6 +25,7 @@ export interface VideoPlayerDto {
19
25
 
20
26
  export interface PageDto {
21
27
  readonly id: string;
28
+ readonly prefix: string;
22
29
  readonly tags: string[];
23
30
  staticElements: Array<DElementDto>;
24
31
  background: string;
@@ -31,6 +38,7 @@ export const PageDto = {
31
38
  createDummy: (id: number): PageDto => {
32
39
  return {
33
40
  id: "id" + id,
41
+ prefix: "prefix" + id,
34
42
  tags: [],
35
43
  staticElements: [],
36
44
  background: "white",
@@ -57,6 +65,7 @@ export class Page {
57
65
  private components: PageComponent[] = [];
58
66
  private pageEntered: DTimestamp = DTimestamp.now();
59
67
  private previousState: TaskState | false = false;
68
+ private eventLog = new Array<MqEvent>();
60
69
 
61
70
  constructor(
62
71
  private readonly dto: PageDto,
@@ -66,8 +75,8 @@ export class Page {
66
75
  ) {
67
76
  this.components = dto.components.map((el) => {
68
77
  const component = new PageComponent(el, scaleService);
69
- component.onClick = (actions) => {
70
- this.handleButtonAction(actions);
78
+ component.onClick = (action) => {
79
+ this.handleButtonAction(action);
71
80
  };
72
81
  this.components.push(component);
73
82
 
@@ -93,15 +102,26 @@ export class Page {
93
102
  private createPageResult(facts: Fact[]): PageResult {
94
103
  const pageExited = DTimestamp.now();
95
104
  const pageTime = DTimestamp.diff(this.pageEntered, pageExited);
105
+ const pageExit = MqEvent.pageLeave(this.dto.id, this.dto.prefix);
106
+ this.eventLog.push(pageExit);
107
+ const eventLog = [...this.eventLog];
96
108
  return {
109
+ pagePrefix: this.dto.prefix,
97
110
  pageId: this.dto.id,
98
- pageEntered: this.pageEntered,
99
- pageExited,
111
+ eventLog,
100
112
  pageTime,
101
113
  collectedFacts: facts,
102
114
  };
103
115
  }
104
116
  private handleButtonAction(a: ButtonClickAction) {
117
+ const event = MqEvent.userClicked({
118
+ pageId: this.dto.id,
119
+ pagePrefix: this.dto.prefix,
120
+ action: a.kind,
121
+ descriptions: ButtonClickAction.describe(a),
122
+ });
123
+ this.eventLog.push(event);
124
+
105
125
  switch (a.kind) {
106
126
  case "next-page":
107
127
  const nextPageResult = this.createPageResult([]);
@@ -135,6 +155,9 @@ export class Page {
135
155
  }
136
156
 
137
157
  appendYourself(parent: HTMLElement) {
158
+ const pageEnterEvent = MqEvent.pageEnter(this.dto.id, this.dto.prefix);
159
+ this.pageEntered = DTimestamp.now();
160
+ this.eventLog.push(pageEnterEvent);
138
161
  this.staticElements.forEach((el) => {
139
162
  el.appendYourself(parent);
140
163
  });
@@ -145,7 +168,6 @@ export class Page {
145
168
  }
146
169
 
147
170
  destroy() {
148
- // console.log("DESTROY PAGE ");
149
171
  this.taskManager.clear();
150
172
  }
151
173
 
@@ -1,11 +1,11 @@
1
1
  import { DTimestamp } from "../common/DTimestamp";
2
2
  import { Fact } from "../rules/fact";
3
+ import { MqEvent } from "../events/mq-events";
3
4
 
4
5
  export interface PageResult {
5
6
  readonly pageId: string;
6
- readonly pagePrefix?: string;
7
- readonly pageEntered: DTimestamp;
8
- readonly pageExited: DTimestamp;
7
+ readonly pagePrefix: string;
8
+ readonly eventLog: ReadonlyArray<MqEvent>;
9
9
  readonly pageTime: DTimestamp.Diff;
10
10
  readonly collectedFacts: Fact[];
11
11
  }
@@ -27,8 +27,10 @@ export class TaskManager {
27
27
 
28
28
  this.pauseVideo();
29
29
  this.pauseAudio();
30
- this.videoElement.src = "";
31
- this.audioElement.src = "";
30
+ this.videoElement.removeAttribute("src");
31
+ this.videoElement.load();
32
+ this.audioElement.removeAttribute("src");
33
+ this.audioElement.load();
32
34
  this.taskList = [];
33
35
  this.runningTask = false;
34
36
  this.hideVideo();
@@ -74,12 +76,9 @@ export class TaskManager {
74
76
  }
75
77
  };
76
78
  this.videoElement.onerror = (e) => {
77
- if (e instanceof Event) {
78
- console.log(e.target);
79
- console.log("IS EVENT");
79
+ if (this.videoElement.src !== "") {
80
+ onError("Error playing video: " + this.videoElement.src);
80
81
  }
81
- console.log("VIDEO ERROR WHY ?? ");
82
- onError("Error playing video." + this.videoElement.src);
83
82
  };
84
83
  this.audioElement.onended = () => {
85
84
  const next = this.getNextTask();
@@ -94,6 +93,8 @@ export class TaskManager {
94
93
  execute(task: Task): boolean {
95
94
  // console.log("EXECUTE TASK" + task.kind);
96
95
  const curr = this.runningTask;
96
+ // TODO Background-task should be handeled as its own kind or something.
97
+ let isBackgroundTask = false;
97
98
 
98
99
  // Check if we should remove the current task.
99
100
  if (curr && Task.shallRemoveCurrent(task) && Task.notEq(curr.task, task)) {
@@ -119,6 +120,7 @@ export class TaskManager {
119
120
  this.loadVideo(task.url);
120
121
  if (task.loop) {
121
122
  this.videoElement.loop = true;
123
+ isBackgroundTask = true;
122
124
  } else {
123
125
  this.videoElement.loop = false;
124
126
  }
@@ -140,6 +142,28 @@ export class TaskManager {
140
142
  }
141
143
  this.audioElement.play();
142
144
  }
145
+
146
+ if (task.kind === "delay-task") {
147
+ if (typeof this.delayRef === "number") {
148
+ window.clearTimeout(this.delayRef);
149
+ }
150
+ this.delayRef = window.setTimeout(() => {
151
+ const next = this.getNextTask();
152
+ if (next) {
153
+ this.execute(next);
154
+ } else {
155
+ this.runningTask = false;
156
+ }
157
+ }, task.duration);
158
+ }
159
+
160
+ if (isBackgroundTask) {
161
+ const startNextTask = this.getNextTask();
162
+ if (startNextTask) {
163
+ this.execute(startNextTask);
164
+ }
165
+ }
166
+
143
167
  return true;
144
168
  }
145
169
 
@@ -153,6 +177,9 @@ export class TaskManager {
153
177
  const next = this.getNextTask();
154
178
  if (next) {
155
179
  this.execute(next);
180
+ if (next.kind === "play-video-task" && next.loop) {
181
+ this.videoElement.loop = true;
182
+ }
156
183
  }
157
184
  }
158
185
 
@@ -164,6 +191,16 @@ export class TaskManager {
164
191
  this.showVideo();
165
192
  }
166
193
 
194
+ private playVideoElement() {
195
+ this.videoElement
196
+ .play()
197
+ .then(() => {})
198
+ .catch((e) => {
199
+ console.log(e);
200
+ this.onError("Error playing video.");
201
+ });
202
+ }
203
+
167
204
  private showVideo() {
168
205
  this.videoElement.style.display = "block";
169
206
  }
@@ -195,7 +232,7 @@ export class TaskManager {
195
232
  }
196
233
 
197
234
  private getNextTask(): Task | false {
198
- // console.log("Getting next task.");
235
+ console.log("Getting next task.");
199
236
  // console.log(this.taskList);
200
237
  const first = this.taskList.shift();
201
238
  return first ?? false;
package/src/page/task.ts CHANGED
@@ -60,10 +60,13 @@ const eq = (a: Task, b: Task) => {
60
60
  const deleteTaskList = (task: Task) => {
61
61
  return task.priority === "replace-all" || task.priority === "replace-queue";
62
62
  };
63
+
63
64
  const shallRemoveCurrent = (task: Task) => {
64
65
  return task.priority === "replace-current" || task.priority === "replace-all";
65
66
  };
67
+
66
68
  const notEq = (a: Task, b: Task) => !eq(a, b);
69
+
67
70
  const is = (task: Task | undefined | false | null | {}): task is Task => {
68
71
  if (!task) {
69
72
  return false;
package/src/public-api.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export * from "./engine/SchemaEngine";
2
2
  export * from "./engine/SchemaDto";
3
- export * from "./engine/DCommand";
3
+ export * from "./engine/page-que-ruleengine-action";
4
4
  export * from "./rules/rule";
5
5
  export * from "./rules/fact";
6
6
  export * from "./rules/rule-engine";
@@ -2,24 +2,17 @@ import { RuleEngine } from "../rule-engine";
2
2
  import { Rule } from "../rule";
3
3
  import { Fact } from "../fact";
4
4
  import { Condition } from "../condition";
5
- import { PageQueCommand } from "../../engine/DCommand";
5
+ import { RuleActionPageQue } from "../../engine/page-que-ruleengine-action";
6
6
  import { PageID } from "../../utils/ID";
7
7
 
8
- const excludeById = (ids: PageID[]): PageQueCommand => {
8
+ const excludeById = (ids: PageID[]): RuleActionPageQue => {
9
9
  return {
10
- kind: "PAGE_QUE_EXCLUDE_BY_PAGE_ID_COMMAND",
11
- target: "PAGE_QUE",
12
- targetId: "PAGE_QUE",
13
- payload: { pageIds: ids },
10
+ kind: "excludeByPageId",
11
+ pageIds: ids,
14
12
  };
15
13
  };
16
14
 
17
- const excludeByTag = (id: string): PageQueCommand => ({
18
- kind: "PAGE_QUE_EXCLUDE_BY_TAG_COMMAND",
19
- target: "PAGE_QUE",
20
- targetId: "PAGE_QUE",
21
- payload: { tagIds: [id] },
22
- });
15
+ const excludeByTag = (id: string): RuleActionPageQue => ({ kind: "excludeByTag", tagIds: [id] });
23
16
 
24
17
  let engine = new RuleEngine();
25
18
  // const x = 'x';
package/tsconfig.json CHANGED
@@ -10,6 +10,8 @@
10
10
  "skipLibCheck": true,
11
11
  "forceConsistentCasingInFileNames": true,
12
12
  "rootDir": "./src",
13
+ "strictPropertyInitialization": true,
14
+ "strictNullChecks": true,
13
15
  "outDir": "./dist",
14
16
  "composite": true
15
17
  },
@@ -1,21 +0,0 @@
1
- import { PageID } from "../utils/ID";
2
-
3
- type CommandTarget = "PAGE_QUE";
4
- type CommandKind = `${Uppercase<CommandTarget>}_${Uppercase<string>}_COMMAND`;
5
-
6
- export type NavigationCommand =
7
- // | CommandDto<"PAGE_QUE_NEXT_PAGE_COMMAND", "PAGE_QUE", {}>
8
- | CommandDto<"PAGE_QUE_GO_TO_SEQUENCE_COMMAND", "PAGE_QUE", { sequenceId: string }>
9
- | CommandDto<"PAGE_QUE_GO_TO_PAGE_COMMAND", "PAGE_QUE", { pageId: string }>;
10
-
11
- interface CommandDto<K extends CommandKind, T extends CommandTarget, P> {
12
- readonly kind: K;
13
- readonly target: T;
14
- readonly targetId: T | Omit<string, T>;
15
- readonly payload: P;
16
- }
17
-
18
- export type PageQueCommand =
19
- | CommandDto<"PAGE_QUE_EXCLUDE_BY_TAG_COMMAND", "PAGE_QUE", { tagIds: string[] }>
20
- | CommandDto<"PAGE_QUE_EXCLUDE_BY_PAGE_ID_COMMAND", "PAGE_QUE", { pageIds: Array<PageID> }>
21
- | CommandDto<"PAGE_QUE_JUMP_TO_PAGE_COMMAND", "PAGE_QUE", { readonly pageId: string }>;
@@ -1 +0,0 @@
1
- {"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/typescript/lib/lib.es2022.full.d.ts","./src/rules/fact.ts","./src/utils/DUtil.ts","./src/rules/condition.ts","./src/rules/rule.ts","./src/utils/ID.ts","./src/engine/DCommand.ts","./src/Delement/css.ts","./src/Delement/DStyle.ts","./src/engine/scale.ts","./src/Delement/DElement.ts","./src/common/DTimestamp.ts","./src/page/task.ts","./src/page/task-state.ts","./src/page/task-manager.ts","./src/Delement/DText.ts","./src/Delement/DImg.ts","./src/Delement/Ddiv.ts","./src/Delement/DElement.dto.ts","./src/Delement/element-factory.ts","./src/Delement/button-click-action.ts","./src/page/page-component.ts","./src/page/page-result.ts","./src/page/Page.ts","./src/engine/SchemaDto.ts","./src/engine/history-que.ts","./src/rules/rule-engine.ts","./src/engine/next-que.ts","./src/engine/dplayer.ts","./src/engine/SchemaEngine.ts","./src/public-api.ts","./src/Delement/DStyle-utils.ts","./src/Delement/css.spec.ts","./src/common/DMaybe.ts","./src/common/DTmestamp.spec.ts","./src/common/result.ts","./src/engine/dplayer.spec.ts","./src/engine/history-que.spec.ts","./src/engine/next-que.spec.ts","./src/engine/scale.spec.ts","./src/page/media-player.ts","./src/rules/__test__/complex-condition.spec.ts","./src/rules/__test__/conditon.spec.ts","./src/rules/__test__/numeric-condition.spec.ts","./src/rules/__test__/rule-engine.spec.ts","./src/rules/__test__/rule-evaluation.spec.ts","./src/rules/__test__/string-condition.spec.ts","./src/utils/ID.spec.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/graceful-fs/index.d.ts","../../node_modules/@types/istanbul-lib-coverage/index.d.ts","../../node_modules/@types/istanbul-lib-report/index.d.ts","../../node_modules/@types/istanbul-reports/index.d.ts","../../node_modules/@jest/expect-utils/build/index.d.ts","../../node_modules/chalk/index.d.ts","../../node_modules/@sinclair/typebox/typebox.d.ts","../../node_modules/@jest/schemas/build/index.d.ts","../../node_modules/pretty-format/build/index.d.ts","../../node_modules/jest-diff/build/index.d.ts","../../node_modules/jest-matcher-utils/build/index.d.ts","../../node_modules/expect/build/index.d.ts","../../node_modules/@types/jest/index.d.ts","../../node_modules/parse5/dist/common/html.d.ts","../../node_modules/parse5/dist/common/token.d.ts","../../node_modules/parse5/dist/common/error-codes.d.ts","../../node_modules/parse5/dist/tokenizer/preprocessor.d.ts","../../node_modules/parse5/dist/tokenizer/index.d.ts","../../node_modules/parse5/dist/tree-adapters/interface.d.ts","../../node_modules/parse5/dist/parser/open-element-stack.d.ts","../../node_modules/parse5/dist/parser/formatting-element-list.d.ts","../../node_modules/parse5/dist/parser/index.d.ts","../../node_modules/parse5/dist/tree-adapters/default.d.ts","../../node_modules/parse5/dist/serializer/index.d.ts","../../node_modules/parse5/dist/common/foreign-content.d.ts","../../node_modules/parse5/dist/index.d.ts","../../node_modules/@types/tough-cookie/index.d.ts","../../node_modules/@types/jsdom/base.d.ts","../../node_modules/@types/jsdom/index.d.ts","../../node_modules/@types/stack-utils/index.d.ts","../../node_modules/@types/yargs-parser/index.d.ts","../../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"2ac9cdcfb8f8875c18d14ec5796a8b029c426f73ad6dc3ffb580c228b58d1c44","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc",{"version":"0075fa5ceda385bcdf3488e37786b5a33be730e8bc4aa3cf1e78c63891752ce8","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"c5c5565225fce2ede835725a92a28ece149f83542aa4866cfb10290bff7b8996","affectsGlobalScope":true},{"version":"7d2dbc2a0250400af0809b0ad5f84686e84c73526de931f84560e483eb16b03c","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"09226e53d1cfda217317074a97724da3e71e2c545e18774484b61562afc53cd2","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"8b41361862022eb72fcc8a7f34680ac842aca802cf4bc1f915e8c620c9ce4331","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"709efdae0cb5df5f49376cde61daacc95cdd44ae4671da13a540da5088bf3f30","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"bc496ef4377553e461efcf7cc5a5a57cf59f9962aea06b5e722d54a36bf66ea1","affectsGlobalScope":true},{"version":"038a2f66a34ee7a9c2fbc3584c8ab43dff2995f8c68e3f566f4c300d2175e31e","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"f5c92f2c27b06c1a41b88f6db8299205aee52c2a2943f7ed29bd585977f254e8","affectsGlobalScope":true},{"version":"930b0e15811f84e203d3c23508674d5ded88266df4b10abee7b31b2ac77632d2","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"b9ea5778ff8b50d7c04c9890170db34c26a5358cccba36844fe319f50a43a61a","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"50d53ccd31f6667aff66e3d62adf948879a3a16f05d89882d1188084ee415bbc","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"f35a831e4f0fe3b3697f4a0fe0e3caa7624c92b78afbecaf142c0f93abfaf379","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"1df2366de6650547b3dc1d7c4147355c0f6b4729c964e3839636fa418982d131",{"version":"36931507c8175a801c2ede547ba09510c86f19b263159131ef5d8579a2ef27bc","signature":"f876c605641f279abe4080b485c32780f9dad3cae6a44a5968aca0c903ff54ae"},{"version":"223bc57c00aea3ee5412e1067a510592f0dad8b19edf5d8c967e67b38c9e1d4f","signature":"1a1b9b86c1b356ab33614af6972359f5564aaa63c508c77ac0c51314fbe2b900"},{"version":"180e039c0a282c8c418ea87ef50d4363a8bb9bc410b08115e4fdde256f093ba6","signature":"e697691cf9f8db5d91d007963fdb653d47d45cfcdc1db3757c0fa5f36f6d473a"},{"version":"141d070af5f1017a0195dec9b14076ef93dab9aab3cc7e0eb7c284e309c24d65","signature":"77dd426bbf22942bd9ae591a5e3fc3f7dbe9e24e068a72bd596defc15ab77815"},{"version":"616b0aa62c4b91cb774487fd0ad853fde82ab8d364a2d45357084077c25d4e0c","signature":"7f67b7e5b2eae2aa7e33858919065293bab9056cce8288c7bc5f2d01c4c6b3b1"},{"version":"33f7f47be9214277835f710d04a17b66f17e8050a807e9acb575a0ba257e578c","signature":"404cbbf53fd903113da6853e7123d39a6f7ff7eda3045736fc8eb429c38c7ebc"},{"version":"e8251d706c8468fd3be461e3504cb7cafb24246ec2253ac232c3eedbd99a100f","signature":"63ab08f0d6202377173f6e6b25309955e2491d90b113c8a25d5f0c24e949df74"},{"version":"c94748016c23cad5f81b23a986d5f32dcb6883eb3c5c4a308bd0383944e72b7f","signature":"b78e9b884fd9baf806580f7bb9dabc2ce29b08532ecc388a33317cb090642875"},{"version":"86a216e2a6066fc0433c2d7715045029da934b633842107563a5c3da3bc313d7","signature":"e8553b2f5e1da3321482fd7da2242da3af6e2bbe910e8fff4be54de83e4b4e65"},{"version":"448068fb01dd1e87a659e3df829a5226f9a9e1a2f8ddac35d67fd75483576504","signature":"9697d4d277a5ff805c19ba8a81f7dbe442affcf4a202f3114b9f386c2229a5f4"},{"version":"7d7b546e891f966ddb80b5d083ab265d32c71055e706855ab8a01c9639c02ca5","signature":"6561daa96e7dd7d81b0599bff00725c7e9e8533d5ded9dfee47ae2978b3eb4c9"},{"version":"54620e5d8787a92d3d787a8cce08e466b076de0b1a331fc3404fe49d0f4cc1c8","signature":"05c9e5e74938ee67e53b0ff0a04957d843d5115a719bd8bcbf11c8b49139d47b"},{"version":"13b9ce5362f91e33eebc027cdc3b726a742cd2b3da9975c0efe9c1100e53cdd3","signature":"9494ff1536f8e3c60f1af038f505e526681ef7dbb49c1754ad8356cb3f30d397"},{"version":"d1882da550cfd4668752bbaa0e8777a711f8760dbf6b853526565990ac53dafa","signature":"54077ef09c24be7c9528bde2a65704ce3583b81bb3b8b5c19219b082d3e3574f"},{"version":"6a0512608b708cad50792da53754ed25ad48feb5721eeb298189eef7cf06aed6","signature":"7379941b98d8ed41947b86ace961babe57cbf5e8c873643fbb01500d566fbd11"},{"version":"309db3d321f53c014df75e6e9fba4cf27f3324c6fdac2ae7f339a0a53d908616","signature":"ce20e6b845c6623c81483476aa05dde24840bb1936f35ef68ae36875eb1b2053"},{"version":"95db28b0965c44096690635bf36bc775c5ec8c0187652d71320edb22661b57aa","signature":"b46d3a3ba8314e2c7a0757c78db2655c0d20f327762affbc7d0af18bd7a02d2f"},{"version":"20023f10a5407d3aba15164e18c0b370334cdb582171a140b914590e746eff0d","signature":"15b142546f53be86a8d8f9593590fe4d6835ba097aca49fe76d8854bc09155f8"},{"version":"47da2987c87da765bf1076e3a6901a3cc0b52ce0215d08ab13972eab125e7c0a","signature":"e3c8d9c3c006bfd0b0c5b98fde14e38d6c9494a1f0cb3b081e2248a1d82b6d75"},{"version":"23b0a7ba9bf7c1df09dc6a4799106237205431d04d962a6366d40d022c88d6d8","signature":"1462c244736f367461fcf107a00048bd493588990f016b0564b33cae1305de90"},{"version":"c3a43045f2627d593efec43c7e1bf4a96a651c859a4601d905dc61df78a842ac","signature":"60367de76c83af25d848112c6dee30e3de02934b35f0fad7f22eacf6d648ca6d"},{"version":"e3c4014ebb5c0c0b2e3a15f94ff709b56aa512be0ba08419510ceeddeab68a08","signature":"6652354f70c00b53e681d738685e6783e7eaee860e26f8ad09ab704c2a9eac1c"},{"version":"900963755852969bb8e940124a6cb95defa1b6bc3bfca91d395eaa4c6c883a33","signature":"8abcc5a1bc910af0396c75d4e657e92ad1e73b5b606e2538dcc148203dbc6a63"},{"version":"b0719a3402563b5c1e9954f1853a2f46c8a410cb9084df9cfde3216dedaa30f4","signature":"7f45afcf634e1a11ea8a59d31caf8f0c1dd7219b843fe12aca39ff9db77c08fa"},{"version":"39714dae0a9a0f96763c286e8da80a833372824210d3af19c6635497ed1ccb56","signature":"859baf2de60dc08965c7fb217162219714a4364229c26a5429a5fe9025f2e914"},{"version":"a525ac31c3f5589407c14cf3b06ee1ce082fb141fbe6e401edbe807f9ff4b711","signature":"d29a105df75e55d76d144a26f7971ff059b56492fb6fb411557d29a37eb23364"},{"version":"ea449944bae793040c8054c85f8d0a030ea1ef17d1dd3b8e5f8ac11d8d9342db","signature":"80f64be8838717790d2c11d28f2c9221c96f99e68b6226ed5c573d8f1c4753e2"},{"version":"52b64b31dcc8faa9fbb1f34ccb78c54ea5b59693cbb5451cb99118d8d5711177","signature":"773ed6ba189ba67d5151d5e2900c9b15db4afc60a432442e7303f5a9eedcc526"},"888eadad04f98b8dd4151eb69853818d5ace645cc3ea6d21caa210d8c591bdcb",{"version":"79132864a6fa41537003fdaa489ab9c94d3d2a1d8aa14f95a86c1c42aac84cd3","signature":"e5bee44181678c32f2d27a1d091ca4c1d9616ac26f66833d73b4a077ce9c1ae8"},{"version":"ebec14c3a0eb4d1ee5b93d3f3362c0814349e7dea48e6a1874712a12e35fed2e","signature":"6a1cba631b89835bf8f8362cb0e49e53922f739501d8740b82d9ab7a4115444d"},{"version":"d20ddc99a8d61430f208ecf1065ee42dd5e7da1428dc7a99d84380552a3c99ea","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"194abfa044a6ec690fd5ee04f7886538cb74581c3207db3aa88edb56906fd37c","signature":"b04d80601628d0ba08cce1e2a204953a87f8ec315b2a00b0615271bfed5c8a24"},{"version":"5763f83e354241493f89be6cc7fc38669dcd4f8cfb9b91972f2dfe55e3584712","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"25c25a229f7eac668a8d853cc6d662de21030058f49156eb9735edc7601f202b","signature":"d8f51a5218cce768dfc52206cf2e81b79538bfe8cbf5cf6728fadbc91e6f5b8e"},{"version":"ce2e476c9dc1b21cd55c480d89a722d1b890b509b6d30e26f83b82a7a2771f0a","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c9ad1a3fe03df96a35213b0862c77965c71c24a3f5665bbb307fd60dee1dd18a","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"b62e947ab54f7880bfbdf1ce2c4866d662d08c2a0108c5eb1d2a1b3f1ecc0874","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"0eae4e60b94e609ce9dac80d4cc29be4d6909a762337f18ed2c22180c77080ac","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"acb3319e98c76435495c52397d454e837ec374f1249216653c504460773998f6","signature":"cd8c81ef492bf04266c7543d94040326a548b24525822e1ee7dcb03367f4a8d6"},{"version":"80e72b94cff981708983c1fbbe5f8f09569006738b92380f3a34b9bee57fcbdd","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"9c01e8c4f7e02804ee6410f35292b369e18464539a72074a9ffa36087b617302","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"fa82e158eaf54b572bf3a7efa9f5e6d73e50d9a60776bede510166aeb44539f7","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"c04cd79ab0bd3c0c0fb1775adcb029195a476b869f668530f0ef00b1b817ba85","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"e4e877ec9d648dd8900c33a8d390d2e2776a7dfd0cba25c2c025cab418939606","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"99cfa83e08b54f9613a8800b803b46e9ab6b5a591ade2009872a8ceab9ae3ff4","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"6f3eb33c7bc0eae890803ebeebabe6a8fad605a093cc639457fe476aea8b7adc","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"12afc6cfb246f7108c7a6b08b4cc3e5fb127d0205812069d5dce6203eee70dd8","cc957354aa3c94c9961ebf46282cfde1e81d107fc5785a61f62c67f1dd3ac2eb","a2e86df4db576d80704e25293cec6f20fc6101a11f4747440e2eef58fb3c860c","93de1c6dab503f053efe8d304cb522bb3a89feab8c98f307a674a4fae04773e9","6704f0b54df85640baaeebd86c9d4a1dbb661d5a4d57a75bc84162f562f6531d","9d255af1b09c6697089d3c9bf438292a298d8b7a95c68793c9aae80afc9e5ca7","587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"d32f90e6cf32e99c86009b5f79fa50bc750fe54e17137d9bb029c377a2822ee2","affectsGlobalScope":true},"7a435e0c814f58f23e9a0979045ec0ef5909aac95a70986e8bcce30c27dff228",{"version":"c81c51f43e343b6d89114b17341fb9d381c4ccbb25e0ee77532376052c801ba7","affectsGlobalScope":true},"3dd49afd822c82b63b3905a13e22240f34cf367aea4f4dd0e6564f4bddcb8370","57135ce61976a8b1dadd01bb412406d1805b90db6e8ecb726d0d78e0b5f76050",{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","f302f3a47d7758f67f2afc753b9375d6504dde05d2e6ecdb1df50abbb131fc89","93db4c949a785a3dbef7f5e08523be538e468c580dd276178b818e761b3b68cd","5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"6e335a70826a634c5a1a1fa36a2dacbf3712ef2be7a517540ae1de8a1e8ea4f6","affectsGlobalScope":true},"576115ea69691c96f8f2b9fcfde5d0fb9b5f047dfa7dec242ebc08694c3b3190","df8529626079d6f9d5d3cd7b6fb7db9cda5a3118d383d8cd46c52aadb59593e7","55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","3122a3f1136508a27a229e0e4e2848299028300ffa11d0cdfe99df90c492fe20","42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","d0cc270398605df704892142947b7b90e7b0ae354523dd2e1ae9a185a06440e7",{"version":"0066ebbd0f4ef9656983a2017969afa6460879e894ebaf6f2969631ad9b5b430","affectsGlobalScope":true},"fe6dba0e8c69f2b244e3da38e53dd2cc9e51b2543e647e805396af73006613f7","5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d",{"version":"5810080a0da989a944d3b691b7b479a4a13c75947fb538abb8070710baa5ccee","affectsGlobalScope":true},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true},"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","8904e5b670bbfc712dda607853de9227206e7dad93ac97109fe30875c5f12b78","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270",{"version":"99822adc2defda34dc1b28b727577ec7c098d878d713157dbe90d212c6bf5e58","affectsGlobalScope":true},{"version":"8a985c7d30aea82342d5017730b546bb2b734fe37a2684ca55d4734deb019d58","affectsGlobalScope":true},"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","5bc85813bfcb6907cc3a960fec8734a29d7884e0e372515147720c5991b8bc22","812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661",{"version":"4d06f3abc2a6aae86f1be39e397372f74fb6e7964f594d645926b4a3419cc15d","affectsGlobalScope":true},{"version":"0e08c360c9b5961ecb0537b703e253842b3ded53151ee07024148219b61a8baf","affectsGlobalScope":true},"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","5ba5b760345053acdf5beb1a9048ff43a51373f3d87849963779c1711ea7cbcc","16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b",{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true},"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"4905d61a3e1e9b12e12dbf8660fc8d2f085734da6da8d725f395bf41a04853d6","bf88ef4208a770ca39a844b182b3695df536326ea566893fdc5b8418702a331e","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec",{"version":"1fe4f59d471c69fd533049505081f7e5d6d56486416b12aafb22ba9616034ab7","affectsGlobalScope":true},"3411c785dbe8fd42f7d644d1e05a7e72b624774a08a9356479754999419c3c5a","8fb8fdda477cd7382477ffda92c2bb7d9f7ef583b1aa531eb6b2dc2f0a206c10","66995b0c991b5c5d42eff1d950733f85482c7419f7296ab8952e03718169e379","33f3795a4617f98b1bb8dac36312119d02f31897ae75436a1e109ce042b48ee8","2850c9c5dc28d34ad5f354117d0419f325fc8932d2a62eadc4dc52c018cd569b","c753948f7e0febe7aa1a5b71a714001a127a68861309b2c4127775aa9b6d4f24","3e7a40e023e1d4a9eef1a6f08a3ded8edacb67ae5fce072014205d730f717ba5","a77be6fc44c876bc10c897107f84eaba10790913ebdcad40fcda7e47469b2160","382100b010774614310d994bbf16cc9cd291c14f0d417126c7a7cfad1dc1d3f8","91f5dbcdb25d145a56cffe957ec665256827892d779ef108eb2f3864faff523b","4fdf56315340bd1770eb52e1601c3a98e45b1d207202831357e99ce29c35b55c","927955a3de5857e0a1c575ced5a4245e74e6821d720ed213141347dd1870197f","be6fd74528b32986fbf0cd2cfa9192a5ed7f369060b32a7adcb0c8d055708e61","cc256fd958b33576ed32c7338c64adb0d08fc0c2c6525010202fab83f32745da","fd0589ca571ad090b531d8c095e26caa53d4825c64d3ff2b2b1ab95d72294175",{"version":"669843ecafb89ae1e944df06360e8966219e4c1c34c0d28aa2503272cdd444a7","affectsGlobalScope":true},"b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","e9eb1b173aa166892f3eddab182e49cfe59aa2e14d33aedb6b49d175ed6a3750"],"root":[[63,109]],"options":{"composite":true,"declaration":true,"esModuleInterop":true,"module":1,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":9},"fileIdsList":[[110,162],[162],[162,176],[110,111,112,113,114,162],[110,112,162],[133,162,169],[162,171],[162,172],[162,178,181],[132,162,164,169,195,196,198],[162,197],[116,162],[119,162],[120,125,153,162],[121,132,133,140,150,161,162],[121,122,132,140,162],[123,162],[124,125,133,141,162],[125,150,158,162],[126,128,132,140,162],[127,162],[128,129,162],[132,162],[130,132,162],[132,133,134,150,161,162],[132,133,134,147,150,153,162],[162,166],[128,132,135,140,150,161,162],[132,133,135,136,140,150,158,161,162],[135,137,150,158,161,162],[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],[132,138,162],[139,161,162,166],[128,132,140,150,162],[141,162],[142,162],[119,143,162],[144,160,162,166],[145,162],[146,162],[132,147,148,162],[147,149,162,164],[120,132,150,151,152,153,162],[120,150,152,162],[150,151,162],[153,162],[154,162],[119,150,162],[132,156,157,162],[156,157,162],[125,140,150,158,162],[159,162],[140,160,162],[120,135,146,161,162],[125,162],[150,162,163],[139,162,164],[162,165],[120,125,132,134,143,150,161,162,164,166],[150,162,167],[162,200],[162,174,180],[162,178],[162,175,179],[162,184],[162,183,184],[162,183],[162,183,184,185,187,188,191,192,193,194],[162,184,188],[162,183,184,185,187,188,189,190],[162,183,188],[162,188,192],[162,184,185,186],[162,185],[162,183,184,188],[162,177],[77,78,79,162],[70,71,162],[71,72,73,162],[64,69,162],[71,72,162],[71,72,77,78,162],[63,74,162],[69,70,162],[64,162],[71,72,77,78,79,80,162],[73,162],[67,162],[63,66,67,68,85,162],[71,76,84,85,86,90,162],[66,68,73,84,85,86,90,162],[63,64,68,84,85,86,87,88,89,162],[67,73,84,85,87,162],[63,73,84,162],[67,85,89,162],[85,162],[71,162],[63,70,71,72,73,74,75,76,80,81,82,83,84,162],[70,162],[70,71,72,75,80,81,82,162],[63,73,162],[70,71,73,74,75,162],[63,64,65,66,67,68,69,70,72,74,77,78,79,80,82,83,85,86,88,91,162],[65,162],[63,65,162],[63,65,66,67,68,88,162],[63,65,66,162],[63,64,162],[63,66,162],[63,64,65,162],[77,78,79],[70,71],[71,72],[69],[71,72,77,78],[63,74],[71,72,80],[67],[63,66,67,68,85],[63,68,84,85,86],[63,84],[85],[70,71,74,76,80,83,84],[70,71,75,80,82],[63,73],[70,71,74,75],[63,64,65,66,67,68,69,70,72,74,77,78,79,80,82,83,85,86,88,91],[63],[63,66],[63,65]],"referencedMap":[[112,1],[110,2],[174,2],[177,3],[176,2],[115,4],[111,1],[113,5],[114,1],[170,6],[171,2],[172,7],[173,8],[182,9],[197,10],[198,11],[116,12],[117,12],[119,13],[120,14],[121,15],[122,16],[123,17],[124,18],[125,19],[126,20],[127,21],[128,22],[129,22],[131,23],[130,24],[132,23],[133,25],[134,26],[118,27],[168,2],[135,28],[136,29],[137,30],[169,31],[138,32],[139,33],[140,34],[141,35],[142,36],[143,37],[144,38],[145,39],[146,40],[147,41],[148,41],[149,42],[150,43],[152,44],[151,45],[153,46],[154,47],[155,48],[156,49],[157,50],[158,51],[159,52],[160,53],[161,54],[162,55],[163,56],[164,57],[165,58],[166,59],[167,60],[199,2],[196,2],[200,2],[201,61],[175,2],[181,62],[179,63],[180,64],[185,65],[194,66],[183,2],[184,67],[195,68],[190,69],[191,70],[189,71],[193,72],[187,73],[186,74],[192,75],[188,66],[178,76],[60,2],[61,2],[10,2],[11,2],[15,2],[14,2],[2,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[3,2],[4,2],[24,2],[28,2],[25,2],[26,2],[27,2],[29,2],[30,2],[31,2],[5,2],[32,2],[33,2],[34,2],[35,2],[6,2],[39,2],[36,2],[37,2],[38,2],[40,2],[7,2],[41,2],[46,2],[47,2],[42,2],[43,2],[44,2],[45,2],[8,2],[51,2],[48,2],[49,2],[50,2],[52,2],[9,2],[53,2],[62,2],[54,2],[55,2],[58,2],[56,2],[57,2],[1,2],[59,2],[13,2],[12,2],[80,77],[72,78],[78,79],[93,2],[70,80],[77,81],[79,82],[82,83],[94,84],[69,85],[81,86],[95,2],[73,2],[96,87],[97,2],[68,88],[86,89],[91,90],[98,91],[90,92],[99,93],[87,94],[100,95],[89,96],[101,97],[71,2],[85,98],[102,99],[83,100],[84,101],[76,102],[75,2],[74,2],[92,103],[103,104],[104,105],[105,105],[106,106],[107,107],[108,105],[65,108],[63,2],[88,109],[66,110],[64,2],[109,88],[67,2]],"exportedModulesMap":[[112,1],[110,2],[174,2],[177,3],[176,2],[115,4],[111,1],[113,5],[114,1],[170,6],[171,2],[172,7],[173,8],[182,9],[197,10],[198,11],[116,12],[117,12],[119,13],[120,14],[121,15],[122,16],[123,17],[124,18],[125,19],[126,20],[127,21],[128,22],[129,22],[131,23],[130,24],[132,23],[133,25],[134,26],[118,27],[168,2],[135,28],[136,29],[137,30],[169,31],[138,32],[139,33],[140,34],[141,35],[142,36],[143,37],[144,38],[145,39],[146,40],[147,41],[148,41],[149,42],[150,43],[152,44],[151,45],[153,46],[154,47],[155,48],[156,49],[157,50],[158,51],[159,52],[160,53],[161,54],[162,55],[163,56],[164,57],[165,58],[166,59],[167,60],[199,2],[196,2],[200,2],[201,61],[175,2],[181,62],[179,63],[180,64],[185,65],[194,66],[183,2],[184,67],[195,68],[190,69],[191,70],[189,71],[193,72],[187,73],[186,74],[192,75],[188,66],[178,76],[60,2],[61,2],[10,2],[11,2],[15,2],[14,2],[2,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[3,2],[4,2],[24,2],[28,2],[25,2],[26,2],[27,2],[29,2],[30,2],[31,2],[5,2],[32,2],[33,2],[34,2],[35,2],[6,2],[39,2],[36,2],[37,2],[38,2],[40,2],[7,2],[41,2],[46,2],[47,2],[42,2],[43,2],[44,2],[45,2],[8,2],[51,2],[48,2],[49,2],[50,2],[52,2],[9,2],[53,2],[62,2],[54,2],[55,2],[58,2],[56,2],[57,2],[1,2],[59,2],[13,2],[12,2],[80,111],[72,112],[78,113],[70,114],[77,113],[79,115],[82,116],[81,117],[68,118],[86,119],[91,90],[90,120],[87,121],[89,122],[85,123],[83,124],[84,125],[76,126],[92,127],[65,128],[88,129],[66,130]],"semanticDiagnosticsPerFile":[112,110,174,177,176,115,111,113,114,170,171,172,173,182,197,198,116,117,119,120,121,122,123,124,125,126,127,128,129,131,130,132,133,134,118,168,135,136,137,169,138,139,140,141,142,143,144,145,146,147,148,149,150,152,151,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,199,196,200,201,175,181,179,180,185,194,183,184,195,190,191,189,193,187,186,192,188,178,60,61,10,11,15,14,2,16,17,18,19,20,21,22,23,3,4,24,28,25,26,27,29,30,31,5,32,33,34,35,6,39,36,37,38,40,7,41,46,47,42,43,44,45,8,51,48,49,50,52,9,53,62,54,55,58,56,57,1,59,13,12,80,72,78,93,70,77,79,82,94,69,81,95,73,96,97,68,86,91,98,90,99,87,100,89,101,71,85,102,83,84,76,75,74,92,103,104,105,106,107,108,65,63,88,66,64,109,67],"affectedFilesPendingEmit":[80,72,78,93,70,77,79,82,94,69,81,95,73,96,97,68,86,91,98,90,99,87,100,89,101,71,85,102,83,84,76,75,74,92,103,104,105,106,107,108,65,63,88,66,64,109,67],"emitSignatures":[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]},"version":"5.2.2"}