linearly 0.0.0

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.
@@ -0,0 +1,88 @@
1
+ import { EPSILON } from './common';
2
+ import * as mat2d from './mat2d';
3
+ function areMat2dEqual(a, b) {
4
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {
5
+ return undefined;
6
+ }
7
+ for (let i = 0; i < a.length; i++) {
8
+ const nearlyEqual = Math.abs(a[i] - b[i]) <=
9
+ EPSILON * Math.max(1, Math.abs(a[i]), Math.abs(b[i]));
10
+ if (!nearlyEqual) {
11
+ return undefined;
12
+ }
13
+ }
14
+ return true;
15
+ }
16
+ ;
17
+ expect.addEqualityTesters([areMat2dEqual]);
18
+ const matA = [1, 2, 3, 4, 5, 6];
19
+ const matB = [7, 8, 9, 10, 11, 12];
20
+ describe('invert', () => {
21
+ expect(mat2d.invert(matA)).toEqual([-2, 1, 1.5, -0.5, 1, -2]);
22
+ expect(mat2d.invert([1, 0, 2, 0, 0, 0])).toEqual(0);
23
+ });
24
+ describe('determinant', () => {
25
+ expect(mat2d.determinant(matA)).toEqual(-2);
26
+ });
27
+ describe('multiply', () => {
28
+ expect(mat2d.multiply(matA, matB)).toEqual([31, 46, 39, 58, 52, 76]);
29
+ });
30
+ describe('rotate', () => {
31
+ expect(mat2d.rotate(matA, Math.PI * 0.5)).toEqual([3, 4, -1, -2, 5, 6]);
32
+ });
33
+ describe('scale', () => {
34
+ expect(mat2d.scale(matA, [2, 3])).toEqual([2, 4, 9, 12, 5, 6]);
35
+ });
36
+ describe('translate', () => {
37
+ expect(mat2d.translate(matA, [2, 3])).toEqual([1, 2, 3, 4, 16, 22]);
38
+ });
39
+ describe('frob', () => {
40
+ expect(mat2d.frob(matA)).toEqual(Math.sqrt(Math.pow(1, 2) +
41
+ Math.pow(2, 2) +
42
+ Math.pow(3, 2) +
43
+ Math.pow(4, 2) +
44
+ Math.pow(5, 2) +
45
+ Math.pow(6, 2) +
46
+ 1));
47
+ });
48
+ describe('add', () => {
49
+ expect(mat2d.add(matA, matB)).toEqual([8, 10, 12, 14, 16, 18]);
50
+ });
51
+ describe('subtract', () => {
52
+ expect(mat2d.subtract(matA, matB)).toEqual([-6, -6, -6, -6, -6, -6]);
53
+ });
54
+ describe('multiplyScalar', () => {
55
+ expect(mat2d.multiplyScalar(matA, 2)).toEqual([2, 4, 6, 8, 10, 12]);
56
+ });
57
+ describe('multiplyScalarAndAdd', () => {
58
+ expect(mat2d.multiplyScalarAndAdd(matA, matB, 0.5)).toEqual([
59
+ 4.5, 6, 7.5, 9, 10.5, 12,
60
+ ]);
61
+ });
62
+ describe('exactEquals', () => {
63
+ const matA = [0, 1, 2, 3, 4, 5];
64
+ const matB = [0, 1, 2, 3, 4, 5];
65
+ const matC = [1, 2, 3, 4, 5, 6];
66
+ it('should return true for identical matrices', () => {
67
+ expect(mat2d.exactEquals(matA, matB)).toBe(true);
68
+ });
69
+ it('should return false for different matrices', () => {
70
+ expect(mat2d.exactEquals(matA, matC)).toBe(false);
71
+ });
72
+ });
73
+ describe('equals', () => {
74
+ const matA = [0, 1, 2, 3, 4, 5];
75
+ const matB = [0, 1, 2, 3, 4, 5];
76
+ const matC = [1, 2, 3, 4, 5, 6];
77
+ const matD = [1e-16, 1, 2, 3, 4, 5];
78
+ it('should return true for identical matrices', () => {
79
+ expect(mat2d.equals(matA, matB)).toBe(true);
80
+ });
81
+ it('should return false for different matrices', () => {
82
+ expect(mat2d.equals(matA, matC)).toBe(false);
83
+ });
84
+ it('should return true for close but not identical matrices', () => {
85
+ expect(mat2d.equals(matA, matD)).toBe(true);
86
+ });
87
+ });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0MmQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXQyZC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFFaEMsT0FBTyxLQUFLLEtBQUssTUFBTSxTQUFTLENBQUE7QUFFaEMsU0FBUyxhQUFhLENBQUMsQ0FBVSxFQUFFLENBQVU7SUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNwRSxPQUFPLFNBQVMsQ0FBQTtLQUNoQjtJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sV0FBVyxHQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXRELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDakIsT0FBTyxTQUFTLENBQUE7U0FDaEI7S0FDRDtJQUNELE9BQU8sSUFBSSxDQUFBO0FBQ1osQ0FBQztBQUVELENBQUM7QUFBQyxNQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0FBRXBELE1BQU0sSUFBSSxHQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN0QyxNQUFNLElBQUksR0FBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFFekMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7SUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDcEQsQ0FBQyxDQUFDLENBQUE7QUFFRixRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtJQUM1QixNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzVDLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7SUFDekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQ3JFLENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7SUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxN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QUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDM0QsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO0tBQ3hCLENBQUMsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7SUFDNUIsTUFBTSxJQUFJLEdBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3RDLE1BQU0sSUFBSSxHQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN0QyxNQUFNLElBQUksR0FBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFFdEMsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDakQsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1FBQ3JELE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsRCxDQUFDLENBQUMsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUFBO0FBRUYsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7SUFDdkIsTUFBTSxJQUFJLEdBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3RDLE1BQU0sSUFBSSxHQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN0QyxNQUFNLElBQUksR0FBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDdEMsTUFBTSxJQUFJLEdBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBRTFDLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7UUFDcEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVDLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsRUFBRTtRQUNyRCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDN0MsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMseURBQXlELEVBQUUsR0FBRyxFQUFFO1FBQ2xFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM1QyxDQUFDLENBQUMsQ0FBQTtBQUNILENBQUMsQ0FBQyxDQUFBIn0=
package/lib/mat3.d.ts ADDED
@@ -0,0 +1,117 @@
1
+ import { Mat4 } from './mat4';
2
+ import { Quat } from './quat';
3
+ import { Vec2 } from './vec2';
4
+ import { Vec3 } from './vec3';
5
+ export type Mat3 = readonly [
6
+ number,
7
+ number,
8
+ number,
9
+ number,
10
+ number,
11
+ number,
12
+ number,
13
+ number,
14
+ number
15
+ ];
16
+ /**
17
+ * 3x3 Matrix
18
+ * @module mat3
19
+ */
20
+ /**
21
+ * Copies the upper-left 3x3 values into the given mat3.
22
+ */
23
+ export declare function fromMat4(a: Mat4): Mat3;
24
+ /**
25
+ * The identity matrix of mat3
26
+ */
27
+ export declare const identity: readonly number[];
28
+ /**
29
+ * Transpose the values of a mat3
30
+ */
31
+ export declare function transpose(a: Mat3): Mat3;
32
+ /**
33
+ * Inverts a mat3
34
+ */
35
+ export declare function invert(a: Mat3): Mat3 | null;
36
+ /**
37
+ * Calculates the adjugate of a mat3
38
+ */
39
+ export declare function adjoint(a: Mat3): Mat3;
40
+ /**
41
+ * Calculates the determinant of a mat3
42
+ */
43
+ export declare function determinant(a: Mat3): number;
44
+ /**
45
+ * Multiplies two mat3's
46
+ */
47
+ export declare function multiply(a: Mat3, b: Mat3): Mat3;
48
+ /**
49
+ * Translate a mat3 by the given vector
50
+ */
51
+ export declare function translate(a: Mat3, v: Vec3): Mat3;
52
+ /**
53
+ * Rotates a mat3 by the given angle
54
+ */
55
+ export declare function rotate(a: Mat3, rad: number): Mat3;
56
+ /**
57
+ * Scales the mat3 by the dimensions in the given vec2
58
+ **/
59
+ export declare function scale(a: Mat3, v: Vec2): Mat3;
60
+ /**
61
+ * Creates a matrix from a vector translation
62
+ */
63
+ export declare function fromTranslation(v: Vec2): Mat3;
64
+ /**
65
+ * Creates a matrix from a given angle
66
+ */
67
+ export declare function fromRotation(rad: number): Mat3;
68
+ /**
69
+ * Creates a matrix from a vector scaling
70
+ */
71
+ export declare function fromScaling(v: Vec2): Mat3;
72
+ /**
73
+ * Copies the values from a mat2d into a mat3
74
+ **/
75
+ export declare function fromMat2d(a: Mat3): Mat3;
76
+ /**
77
+ * Calculates a 3x3 matrix from the given quaternion
78
+ *
79
+ */
80
+ export declare function fromQuat(q: Quat): Mat3;
81
+ /**
82
+ * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix
83
+ *
84
+ */
85
+ export declare function normalFromMat4(a: Mat4): Mat3 | null;
86
+ /**
87
+ * Generates a 2D projection matrix with the given bounds
88
+ */
89
+ export declare function projection(width: number, height: number): Mat3;
90
+ /**
91
+ * Returns Frobenius norm of a mat3
92
+ */
93
+ export declare function frob(a: Mat3): number;
94
+ /**
95
+ * Adds two mat3's
96
+ */
97
+ export declare function add(a: Mat3, b: Mat3): Mat3;
98
+ /**
99
+ * Subtracts matrix b from matrix a
100
+ */
101
+ export declare function subtract(a: Mat3, b: Mat3): Mat3;
102
+ /**
103
+ * Multiply each element of the matrix by a scalar.
104
+ */
105
+ export declare function multiplyScalar(a: Mat3, s: number): Mat3;
106
+ /**
107
+ * Adds two mat3's after multiplying each element of the second operand by a scalar value.
108
+ */
109
+ export declare function multiplyScalarAndAdd(a: Mat3, b: Mat3, scale: number): Mat3;
110
+ /**
111
+ * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
112
+ */
113
+ export declare function exactEquals(a: Mat3, b: Mat3): boolean;
114
+ /**
115
+ * Returns whether or not the matrices have approximately the same elements in the same position.
116
+ */
117
+ export declare function equals(a: Mat3, b: Mat3): boolean;
package/lib/mat3.js ADDED
@@ -0,0 +1,390 @@
1
+ import * as Common from './common';
2
+ /**
3
+ * 3x3 Matrix
4
+ * @module mat3
5
+ */
6
+ /**
7
+ * Copies the upper-left 3x3 values into the given mat3.
8
+ */
9
+ export function fromMat4(a) {
10
+ // prettier-ignore
11
+ return [
12
+ a[0], a[1], a[2],
13
+ a[4], a[5], a[6],
14
+ a[8], a[9], a[10]
15
+ ];
16
+ }
17
+ /**
18
+ * The identity matrix of mat3
19
+ */
20
+ // prettier-ignore
21
+ export const identity = Object.freeze([
22
+ 1, 0, 0,
23
+ 0, 1, 0,
24
+ 0, 0, 1,
25
+ ]);
26
+ /**
27
+ * Transpose the values of a mat3
28
+ */
29
+ export function transpose(a) {
30
+ // prettier-ignore
31
+ return [
32
+ a[0], a[3], a[6],
33
+ a[1], a[4], a[7],
34
+ a[2], a[5], a[8]
35
+ ];
36
+ }
37
+ /**
38
+ * Inverts a mat3
39
+ */
40
+ export function invert(a) {
41
+ const [a00, a01, a02, a10, a11, a12, a20, a21, a22] = a;
42
+ const b01 = a22 * a11 - a12 * a21;
43
+ const b11 = -a22 * a10 + a12 * a20;
44
+ const b21 = a21 * a10 - a11 * a20;
45
+ // Calculate the determinant
46
+ const det = a00 * b01 + a01 * b11 + a02 * b21;
47
+ if (!det) {
48
+ return null;
49
+ }
50
+ const detinv = 1 / det;
51
+ return [
52
+ b01 * detinv,
53
+ (-a22 * a01 + a02 * a21) * detinv,
54
+ (a12 * a01 - a02 * a11) * detinv,
55
+ b11 * detinv,
56
+ (a22 * a00 - a02 * a20) * detinv,
57
+ (-a12 * a00 + a02 * a10) * detinv,
58
+ b21 * detinv,
59
+ (-a21 * a00 + a01 * a20) * detinv,
60
+ (a11 * a00 - a01 * a10) * detinv,
61
+ ];
62
+ }
63
+ /**
64
+ * Calculates the adjugate of a mat3
65
+ */
66
+ export function adjoint(a) {
67
+ const [a00, a01, a02, a10, a11, a12, a20, a21, a22] = a;
68
+ return [
69
+ a11 * a22 - a12 * a21,
70
+ a02 * a21 - a01 * a22,
71
+ a01 * a12 - a02 * a11,
72
+ a12 * a20 - a10 * a22,
73
+ a00 * a22 - a02 * a20,
74
+ a02 * a10 - a00 * a12,
75
+ a10 * a21 - a11 * a20,
76
+ a01 * a20 - a00 * a21,
77
+ a00 * a11 - a01 * a10,
78
+ ];
79
+ }
80
+ /**
81
+ * Calculates the determinant of a mat3
82
+ */
83
+ export function determinant(a) {
84
+ const [a00, a01, a02, a10, a11, a12, a20, a21, a22] = a;
85
+ return (a00 * (a22 * a11 - a12 * a21) +
86
+ a01 * (-a22 * a10 + a12 * a20) +
87
+ a02 * (a21 * a10 - a11 * a20));
88
+ }
89
+ /**
90
+ * Multiplies two mat3's
91
+ */
92
+ export function multiply(a, b) {
93
+ const [a00, a01, a02, a10, a11, a12, a20, a21, a22] = a;
94
+ const [b00, b01, b02, b10, b11, b12, b20, b21, b22] = b;
95
+ return [
96
+ b00 * a00 + b01 * a10 + b02 * a20,
97
+ b00 * a01 + b01 * a11 + b02 * a21,
98
+ b00 * a02 + b01 * a12 + b02 * a22,
99
+ b10 * a00 + b11 * a10 + b12 * a20,
100
+ b10 * a01 + b11 * a11 + b12 * a21,
101
+ b10 * a02 + b11 * a12 + b12 * a22,
102
+ b20 * a00 + b21 * a10 + b22 * a20,
103
+ b20 * a01 + b21 * a11 + b22 * a21,
104
+ b20 * a02 + b21 * a12 + b22 * a22,
105
+ ];
106
+ }
107
+ /**
108
+ * Translate a mat3 by the given vector
109
+ */
110
+ export function translate(a, v) {
111
+ const [a00, a01, a02, a10, a11, a12, a20, a21, a22] = a;
112
+ const [x, y] = v;
113
+ // prettier-ignore
114
+ return [
115
+ a00, a01, a02,
116
+ a10, a11, a12,
117
+ x * a00 + y * a10 + a20,
118
+ x * a01 + y * a11 + a21,
119
+ x * a02 + y * a12 + a22,
120
+ ];
121
+ }
122
+ /**
123
+ * Rotates a mat3 by the given angle
124
+ */
125
+ export function rotate(a, rad) {
126
+ const [a00, a01, a02, a10, a11, a12, a20, a21, a22] = a;
127
+ const s = Math.sin(rad);
128
+ const c = Math.cos(rad);
129
+ // prettier-ignore
130
+ return [
131
+ c * a00 + s * a10,
132
+ c * a01 + s * a11,
133
+ c * a02 + s * a12,
134
+ c * a10 - s * a00,
135
+ c * a11 - s * a01,
136
+ c * a12 - s * a02,
137
+ a20, a21, a22,
138
+ ];
139
+ }
140
+ /**
141
+ * Scales the mat3 by the dimensions in the given vec2
142
+ **/
143
+ export function scale(a, v) {
144
+ const [x, y] = v;
145
+ // prettier-ignore
146
+ return [
147
+ a[0] * x, a[1] * x, a[2] & x,
148
+ a[3] * y, a[4] * y, a[5] * y,
149
+ a[6], a[7], a[8],
150
+ ];
151
+ }
152
+ /**
153
+ * Creates a matrix from a vector translation
154
+ */
155
+ export function fromTranslation(v) {
156
+ const [x, y] = v;
157
+ // prettier-ignore
158
+ return [
159
+ 1, 0, 0,
160
+ 0, 1, 0,
161
+ x, y, 1,
162
+ ];
163
+ }
164
+ /**
165
+ * Creates a matrix from a given angle
166
+ */
167
+ export function fromRotation(rad) {
168
+ const s = Math.sin(rad);
169
+ const c = Math.cos(rad);
170
+ // prettier-ignore
171
+ return [
172
+ c, s, 0,
173
+ -s, c, 0,
174
+ 0, 0, 1,
175
+ ];
176
+ }
177
+ /**
178
+ * Creates a matrix from a vector scaling
179
+ */
180
+ export function fromScaling(v) {
181
+ const [x, y] = v;
182
+ // prettier-ignore
183
+ return [
184
+ x, 0, 0,
185
+ 0, y, 0,
186
+ 0, 0, 1
187
+ ];
188
+ }
189
+ /**
190
+ * Copies the values from a mat2d into a mat3
191
+ **/
192
+ export function fromMat2d(a) {
193
+ // prettier-ignore
194
+ return [
195
+ a[0], a[1], 0,
196
+ a[2], a[3], 0,
197
+ a[4], a[5], 1
198
+ ];
199
+ }
200
+ /**
201
+ * Calculates a 3x3 matrix from the given quaternion
202
+ *
203
+ */
204
+ export function fromQuat(q) {
205
+ const [x, y, z, w] = q;
206
+ const x2 = x + x;
207
+ const y2 = y + y;
208
+ const z2 = z + z;
209
+ const xx = x * x2;
210
+ const yx = y * x2;
211
+ const yy = y * y2;
212
+ const zx = z * x2;
213
+ const zy = z * y2;
214
+ const zz = z * z2;
215
+ const wx = w * x2;
216
+ const wy = w * y2;
217
+ const wz = w * z2;
218
+ return [
219
+ 1 - yy - zz,
220
+ yx - wz,
221
+ zx + wy,
222
+ yx + wz,
223
+ 1 - xx - zz,
224
+ zy - wx,
225
+ zx - wy,
226
+ zy + wx,
227
+ 1 - xx - yy,
228
+ ];
229
+ }
230
+ /**
231
+ * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix
232
+ *
233
+ */
234
+ export function normalFromMat4(a) {
235
+ // prettier-ignore
236
+ const [a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23, a30, a31, a32, a33] = a;
237
+ const b00 = a00 * a11 - a01 * a10;
238
+ const b01 = a00 * a12 - a02 * a10;
239
+ const b02 = a00 * a13 - a03 * a10;
240
+ const b03 = a01 * a12 - a02 * a11;
241
+ const b04 = a01 * a13 - a03 * a11;
242
+ const b05 = a02 * a13 - a03 * a12;
243
+ const b06 = a20 * a31 - a21 * a30;
244
+ const b07 = a20 * a32 - a22 * a30;
245
+ const b08 = a20 * a33 - a23 * a30;
246
+ const b09 = a21 * a32 - a22 * a31;
247
+ const b10 = a21 * a33 - a23 * a31;
248
+ const b11 = a22 * a33 - a23 * a32;
249
+ // Calculate the determinant
250
+ const det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
251
+ if (!det) {
252
+ return null;
253
+ }
254
+ const detinv = 1 / det;
255
+ return [
256
+ (a11 * b11 - a12 * b10 + a13 * b09) * detinv,
257
+ (a12 * b08 - a10 * b11 - a13 * b07) * detinv,
258
+ (a10 * b10 - a11 * b08 + a13 * b06) * detinv,
259
+ (a02 * b10 - a01 * b11 - a03 * b09) * detinv,
260
+ (a00 * b11 - a02 * b08 + a03 * b07) * detinv,
261
+ (a01 * b08 - a00 * b10 - a03 * b06) * detinv,
262
+ (a31 * b05 - a32 * b04 + a33 * b03) * detinv,
263
+ (a32 * b02 - a30 * b05 - a33 * b01) * detinv,
264
+ (a30 * b04 - a31 * b02 + a33 * b00) * detinv,
265
+ ];
266
+ }
267
+ /**
268
+ * Generates a 2D projection matrix with the given bounds
269
+ */
270
+ export function projection(width, height) {
271
+ return [2 / width, 0, 0, 0, -2 / height, 0, -1, 1, 1];
272
+ }
273
+ /**
274
+ * Returns Frobenius norm of a mat3
275
+ */
276
+ export function frob(a) {
277
+ return Math.sqrt(a[0] * a[0] +
278
+ a[1] * a[1] +
279
+ a[2] * a[2] +
280
+ a[3] * a[3] +
281
+ a[4] * a[4] +
282
+ a[5] * a[5] +
283
+ a[6] * a[6] +
284
+ a[7] * a[7] +
285
+ a[8] * a[8]);
286
+ }
287
+ /**
288
+ * Adds two mat3's
289
+ */
290
+ export function add(a, b) {
291
+ return [
292
+ a[0] + b[0],
293
+ a[1] + b[1],
294
+ a[2] + b[2],
295
+ a[3] + b[3],
296
+ a[4] + b[4],
297
+ a[5] + b[5],
298
+ a[6] + b[6],
299
+ a[7] + b[7],
300
+ a[8] + b[8],
301
+ ];
302
+ }
303
+ /**
304
+ * Subtracts matrix b from matrix a
305
+ */
306
+ export function subtract(a, b) {
307
+ return [
308
+ a[0] - b[0],
309
+ a[1] - b[1],
310
+ a[2] - b[2],
311
+ a[3] - b[3],
312
+ a[4] - b[4],
313
+ a[5] - b[5],
314
+ a[6] - b[6],
315
+ a[7] - b[7],
316
+ a[8] - b[8],
317
+ ];
318
+ }
319
+ /**
320
+ * Multiply each element of the matrix by a scalar.
321
+ */
322
+ export function multiplyScalar(a, s) {
323
+ return [
324
+ a[0] * s,
325
+ a[1] * s,
326
+ a[2] * s,
327
+ a[3] * s,
328
+ a[4] * s,
329
+ a[5] * s,
330
+ a[6] * s,
331
+ a[7] * s,
332
+ a[8] * s,
333
+ ];
334
+ }
335
+ /**
336
+ * Adds two mat3's after multiplying each element of the second operand by a scalar value.
337
+ */
338
+ export function multiplyScalarAndAdd(a, b, scale) {
339
+ return [
340
+ a[0] + b[0] * scale,
341
+ a[1] + b[1] * scale,
342
+ a[2] + b[2] * scale,
343
+ a[3] + b[3] * scale,
344
+ a[4] + b[4] * scale,
345
+ a[5] + b[5] * scale,
346
+ a[6] + b[6] * scale,
347
+ a[7] + b[7] * scale,
348
+ a[8] + b[8] * scale,
349
+ ];
350
+ }
351
+ /**
352
+ * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)
353
+ */
354
+ export function exactEquals(a, b) {
355
+ return (a[0] === b[0] &&
356
+ a[1] === b[1] &&
357
+ a[2] === b[2] &&
358
+ a[3] === b[3] &&
359
+ a[4] === b[4] &&
360
+ a[5] === b[5] &&
361
+ a[6] === b[6] &&
362
+ a[7] === b[7] &&
363
+ a[8] === b[8]);
364
+ }
365
+ /**
366
+ * Returns whether or not the matrices have approximately the same elements in the same position.
367
+ */
368
+ export function equals(a, b) {
369
+ const a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8];
370
+ const b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = b[6], b7 = b[7], b8 = b[8];
371
+ return (Math.abs(a0 - b0) <=
372
+ Common.EPSILON * Math.max(1, Math.abs(a0), Math.abs(b0)) &&
373
+ Math.abs(a1 - b1) <=
374
+ Common.EPSILON * Math.max(1, Math.abs(a1), Math.abs(b1)) &&
375
+ Math.abs(a2 - b2) <=
376
+ Common.EPSILON * Math.max(1, Math.abs(a2), Math.abs(b2)) &&
377
+ Math.abs(a3 - b3) <=
378
+ Common.EPSILON * Math.max(1, Math.abs(a3), Math.abs(b3)) &&
379
+ Math.abs(a4 - b4) <=
380
+ Common.EPSILON * Math.max(1, Math.abs(a4), Math.abs(b4)) &&
381
+ Math.abs(a5 - b5) <=
382
+ Common.EPSILON * Math.max(1, Math.abs(a5), Math.abs(b5)) &&
383
+ Math.abs(a6 - b6) <=
384
+ Common.EPSILON * Math.max(1, Math.abs(a6), Math.abs(b6)) &&
385
+ Math.abs(a7 - b7) <=
386
+ Common.EPSILON * Math.max(1, Math.abs(a7), Math.abs(b7)) &&
387
+ Math.abs(a8 - b8) <=
388
+ Common.EPSILON * Math.max(1, Math.abs(a8), Math.abs(b8)));
389
+ }
390
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0My5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXQzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFBO0FBYWxDOzs7R0FHRztBQUVIOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxDQUFPO0lBQy9CLGtCQUFrQjtJQUNsQixPQUFPO1FBQ04sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDakIsQ0FBQTtBQUNGLENBQUM7QUFFRDs7R0FFRztBQUNILGtCQUFrQjtBQUNsQixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNyQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDUCxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUE7QUFFRjs7R0FFRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBTztJQUNoQyxrQkFBa0I7SUFDbEIsT0FBTztRQUNOLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFD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a0I7SUFDbEIsTUFBTSxDQUNMLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFDbEIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUNsQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQ2xCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FDbEIsR0FBRyxDQUFDLENBQUE7SUFFTCxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUE7SUFDakMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQTtJQUNqQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUE7SUFDakMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQTtJQUNqQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUE7SUFDakMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQTtJQUNqQyxNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUE7SUFDakMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO0lBQ2pDLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQTtJQUVqQyw0QkFBNEI7SUFDNUIsTUFBTSxHQUFHLEdBQ1IsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUE7SUFFdEUsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNULE9BQU8sSUFBSSxDQUFBO0tBQ1g7SUFDRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFBO0lBRXRCLE9BQU87UUFDTixDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTTtRQUM1QyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTTtRQUM1QyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTTtRQUU1QyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTTtRQUM1QyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTTtRQUM1QyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTTtRQUU1QyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTTtRQUM1QyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTTtRQUM1QyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTTtLQUM1QyxDQUFBO0FBQ0YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFhLEVBQUUsTUFBYztJQUN2RCxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUN0RCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLENBQU87SUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNmLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNaLENBQUE7QUFDRixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQU8sRUFBRSxDQUFPO0lBQ25DLE9BQU87UUFDTixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDWCxDQUFBO0FBQ0YsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxDQUFPLEVBQUUsQ0FBTztJQUN4QyxPQUFPO1FBQ04sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENB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QyxFQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNWLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNULEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDVixPQUFPLENBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDekQsQ0FBQTtBQUNGLENBQUMifQ==