firebase-bolt
Version:
Firebase Bolt Security and Modeling Language Compiler
479 lines (478 loc) • 77.7 kB
JavaScript
"use strict";
exports.__esModule = true;
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var chai_1 = require("chai");
var fileIO = require("../file-io");
var readFile = fileIO.readFile;
var logger = require("../logger");
var ast = require("../ast");
var bolt = require("../bolt");
var helper = require("./test-helper");
var sample_files_1 = require("./sample-files");
var parser = require('../rules-parser');
var parse = parser.parse;
// TODO: Test duplicated function, and schema definitions.
suite("Rules Parser Tests", function () {
test("Empty input", function () {
var result = parse("");
chai_1.assert.ok(result instanceof ast.Symbols);
});
suite("Function Samples", function () {
var tests = [
{ data: "function f() { return true; }",
expect: { f: { params: [], body: ast.boolean(true) } }
},
{ data: "function longName() { return false; }",
expect: { longName: { params: [], body: ast.boolean(false) } }
},
{ data: "function f(){return true;} function g(){return false;}",
expect: { f: { params: [], body: ast.boolean(true) },
g: { params: [], body: ast.boolean(false) } }
}
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = parse(data);
chai_1.assert.deepEqual(result.functions, expect);
});
});
suite("Literals", function () {
var tests = [
["true", ast.boolean(true)],
["false", ast.boolean(false)],
["null", ast.nullType()],
["1", ast.number(1)],
["1.1", ast.number(1.1)],
["+3", ast.number(3)],
["-3", ast.number(-3)],
["0x2", ast.number(2)],
["[1, 2, 3]", ast.array([ast.number(1), ast.number(2), ast.number(3)])],
["\"string\"", ast.string("string")],
["'string'", ast.string("string")],
["''", ast.string('')],
["/pattern/", ast.regexp("pattern")],
["/pattern/i", ast.regexp("pattern", "i")],
["/pat\\ntern/", ast.regexp("pat\\ntern")],
["/pat\\/tern/", ast.regexp("pat\\/tern")],
["/pat\\tern/", ast.regexp("pat\\tern")],
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = parse("function f() { return " + data + ";}");
chai_1.assert.deepEqual(result.functions.f.body, expect);
});
});
suite("Expressions", function () {
var tests = [
["a", ast.variable('a')],
["a.b", ast.reference(ast.variable('a'), ast.string('b'))],
["a['b']", ast.reference(ast.variable('a'), ast.string('b'))],
["a[b]", ast.reference(ast.variable('a'), ast.variable('b'))],
["a()", ast.call(ast.variable('a'), [])],
["a.b()", ast.call(ast.reference(ast.variable('a'), ast.string('b')), [])],
["a().b", ast.reference(ast.call(ast.variable('a'), []), ast.string('b'))],
["-a", ast.neg(ast.variable('a'))],
// TODO: This should be an error - looks like pre-decrement
["--a", ast.neg(ast.neg(ast.variable('a')))],
["+a", ast.variable('a')],
["!a", ast.not(ast.variable('a'))],
["2 * a", ast.mult(ast.number(2), ast.variable('a'))],
["2 / a", ast.div(ast.number(2), ast.variable('a'))],
["a % 2", ast.mod(ast.variable('a'), ast.number(2))],
["1 + 1", ast.add(ast.number(1), ast.number(1))],
["a - 1", ast.sub(ast.variable('a'), ast.number(1))],
// Unary precedence
["a - -b", ast.sub(ast.variable('a'), ast.neg(ast.variable('b')))],
// Left associative
["a + b + c", ast.add(ast.add(ast.variable('a'), ast.variable('b')), ast.variable('c'))],
// Multiplcation precedence
["a + b * c", ast.add(ast.variable('a'), ast.mult(ast.variable('b'), ast.variable('c')))],
["(a + b) * c", ast.mult(ast.add(ast.variable('a'), ast.variable('b')), ast.variable('c'))],
["a < 7", ast.lt(ast.variable('a'), ast.number(7))],
["a > 7", ast.gt(ast.variable('a'), ast.number(7))],
["a <= 7", ast.lte(ast.variable('a'), ast.number(7))],
["a >= 7", ast.gte(ast.variable('a'), ast.number(7))],
["a == 3", ast.eq(ast.variable('a'), ast.number(3))],
["a != 0", ast.ne(ast.variable('a'), ast.number(0))],
["a === 3", ast.eq(ast.variable('a'), ast.number(3))],
["a !== 0", ast.ne(ast.variable('a'), ast.number(0))],
["3 * a == b", ast.eq(ast.mult(ast.number(3), ast.variable('a')), ast.variable('b'))],
["a == 1 && b <= 2", ast.and(ast.eq(ast.variable('a'), ast.number(1)), ast.lte(ast.variable('b'), ast.number(2)))],
["a == 1 || b <= 2", ast.or(ast.eq(ast.variable('a'), ast.number(1)), ast.lte(ast.variable('b'), ast.number(2)))],
// Left associative (even though execution is short-circuited!
["a && b && c", ast.and(ast.and(ast.variable('a'), ast.variable('b')), ast.variable('c'))],
["a || b || c", ast.or(ast.or(ast.variable('a'), ast.variable('b')), ast.variable('c'))],
// && over || precendence
["a && b || c && d", ast.or(ast.and(ast.variable('a'), ast.variable('b')), ast.and(ast.variable('c'), ast.variable('d')))],
["a ? b : c", ast.ternary(ast.variable('a'), ast.variable('b'), ast.variable('c'))],
["a || b ? c : d", ast.ternary(ast.or(ast.variable('a'), ast.variable('b')), ast.variable('c'), ast.variable('d'))],
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = parse("function f() { return " + data + ";}");
chai_1.assert.deepEqual(result.functions.f.body, expect);
});
});
suite("Whitespace", function () {
var fn = "function f() { return true; }";
var fnAST = { params: [], body: ast.boolean(true) };
var tests = [
" " + fn,
fn + " ",
" " + fn + " ",
"\t" + fn,
"\n" + fn,
"\r\n" + fn,
fn + "\n",
fn + "\r\n",
" \t" + fn + " \r\n"
];
helper.dataDrivenTest(tests, function (data) {
chai_1.assert.deepEqual(parse(data).functions.f, fnAST);
});
});
suite("Comments", function () {
var fn = "function f() { return true; }";
var fnAST = { params: [], body: ast.boolean(true) };
var tests = [
"//Single Line\n" + fn,
fn + " // My rule",
"// Line 1\n// Line 2\n" + fn,
"/* inline */ " + fn,
"/* pre */ " + fn + " /* post */"
];
helper.dataDrivenTest(tests, function (data, expect) {
chai_1.assert.deepEqual(parse(data).functions.f, fnAST);
});
});
suite("Paths", function () {
var tests = [
{ data: "path / {}",
expect: [{ template: new ast.PathTemplate(),
isType: ast.typeType('Any'),
methods: {} }] },
{ data: "path /x {}",
expect: [{ template: new ast.PathTemplate(['x']),
isType: ast.typeType('Any'),
methods: {} }] },
{ data: "path /p/{$q} { write() { return true; }}",
expect: [{ isType: ast.typeType('Any'),
template: new ast.PathTemplate(['p', '$q']),
methods: { write: { params: [], body: ast.boolean(true) } } }] },
{ data: "path /p/{q} { write() { return true; }}",
expect: [{ isType: ast.typeType('Any'),
template: new ast.PathTemplate(['p', new ast.PathPart('$q', 'q')]),
methods: { write: { params: [], body: ast.boolean(true) } } }] },
{ data: "path /x/y { read() { true } }",
expect: [{ isType: ast.typeType('Any'),
template: new ast.PathTemplate(['x', 'y']),
methods: { read: { params: [], body: ast.boolean(true) } } }] },
{ data: "path /x { read() { true } /y { write() { true } }}",
expect: [{ isType: ast.typeType('Any'),
template: new ast.PathTemplate(['x']),
methods: { read: { params: [], body: ast.boolean(true) } } },
{ isType: ast.typeType('Any'),
template: new ast.PathTemplate(['x', 'y']),
methods: { write: { params: [], body: ast.boolean(true) } } }] },
{ data: "path /x { read() { true } /y { write() { true } path /{$id} { validate() { false } }}}",
expect: [{ isType: ast.typeType('Any'),
template: new ast.PathTemplate(['x']),
methods: { read: { params: [], body: ast.boolean(true) } } },
{ isType: ast.typeType('Any'),
template: new ast.PathTemplate(['x', 'y']),
methods: { write: { params: [], body: ast.boolean(true) } } },
{ isType: ast.typeType('Any'),
template: new ast.PathTemplate(['x', 'y', '$id']),
methods: { validate: { params: [], body: ast.boolean(false) } } },
] },
{ data: "path /hyphen-key {}",
expect: [{ template: new ast.PathTemplate(['hyphen-key']),
isType: ast.typeType('Any'),
methods: {} }] },
];
helper.dataDrivenTest(tests, function (data, expect) {
chai_1.assert.deepEqual(sortPaths(parse(data).paths), sortPaths(expect));
});
});
suite("Schema", function () {
var tests = [
{ data: "type Foo { a: Number }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.typeType('Number') },
methods: {},
params: []
} },
{ data: "type Foo { a: Number, b: String }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.typeType('Number'),
b: ast.typeType('String') },
methods: {},
params: []
} },
{ data: "type Foo extends Bar {}",
expect: { derivedFrom: ast.typeType('Bar'),
properties: {},
methods: {},
params: []
} },
{ data: "type Foo { a: Number validate() { return true; }}",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.typeType('Number') },
methods: { validate: { params: [],
body: ast.boolean(true) } },
params: []
} },
{ data: "type Foo { a: Number, validate() { return true; }}",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.typeType('Number') },
methods: { validate: { params: [],
body: ast.boolean(true) } },
params: []
} },
{ data: "type Foo { a: Number | String }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.unionType([ast.typeType('Number'),
ast.typeType('String')]) },
methods: {},
params: []
} },
{ data: "type Foo extends Number | String;",
expect: { derivedFrom: ast.unionType([ast.typeType('Number'), ast.typeType('String')]),
properties: {},
methods: {},
params: []
} },
{ data: "type Foo { a: Map<String, Number> }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.genericType('Map', [ast.typeType('String'),
ast.typeType('Number')]) },
methods: {},
params: []
} },
{ data: "type Foo extends Map<String, Number>;",
expect: { derivedFrom: ast.genericType('Map', [ast.typeType('String'), ast.typeType('Number')]),
properties: {},
methods: {},
params: []
} },
// Alias for Map<String, Other>
{ data: "type Foo { a: Other[] }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.genericType('Map', [ast.typeType('String'),
ast.typeType('Other')]) },
methods: {},
params: []
} },
{ data: "type Foo { a: Multi<String, Number, Boolean> }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.genericType('Multi', [ast.typeType('String'),
ast.typeType('Number'),
ast.typeType('Boolean')]) },
methods: {},
params: []
} },
{ data: "type Foo { a: Gen1<String> }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.genericType('Gen1', [ast.typeType('String')]) },
methods: {},
params: []
} },
{ data: "type Foo<T> { a: T }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { a: ast.typeType('T') },
methods: {},
params: ["T"]
} },
{ data: "type Foo { name: String, age: Number }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { name: ast.typeType('String'),
age: ast.typeType('Number') },
methods: {},
params: []
} },
{ data: "type Foo { name: String; age: Number; }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { name: ast.typeType('String'),
age: ast.typeType('Number') },
methods: {},
params: []
} },
{ data: "type Foo { 'hyphen-prop': String }",
expect: { derivedFrom: ast.typeType('Object'),
properties: { "hyphen-prop": ast.typeType('String') },
methods: {},
params: []
} },
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = parse(data).schema.Foo;
chai_1.assert.deepEqual(result, expect);
});
});
suite("Function variations", function () {
var tests = [
"function f(x) { return x + 1; }",
"function f(x) { return x + 1 }",
"function f(x) { x + 1; }",
"function f(x) { x + 1 }",
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = parse(data);
chai_1.assert.deepEqual(result.functions.f.body, ast.add(ast.variable('x'), ast.number(1)));
});
});
suite("Method variations", function () {
var tests = [
"validate() { return this; }",
"validate() { return this }",
"validate() { this; }",
"validate() { this }",
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = parse("type T {" + data + "}");
chai_1.assert.deepEqual(result.schema.T.methods.validate.body, ast.variable('this'));
});
});
suite("Path variations", function () {
var tests = [
"path /p/{c} {}",
"/p/{c} {}",
"/p/{c};",
"path /p/{c} is String {}",
"path /p/{c} is String;",
"/p/{c} is String {}",
"/p/{c} is String;",
"/p/{c=*} is String;",
"/p/{c = *} is String;",
"/p/{c} { validate() { return true; } }",
"/p/{c} { validate() { return true } }",
"/p/{c} { validate() { true } }",
"/p/{c} { validate() { true; } }",
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = parse(data);
chai_1.assert.deepEqual(result.paths[0].template, new ast.PathTemplate(['p', new ast.PathPart('$c', 'c')]));
});
});
suite("Type variations", function () {
var tests = [
"type T extends Any {}",
"type T extends Any;",
"type T {}",
"type T;"
];
helper.dataDrivenTest(tests, function (data, expect) {
var result = parse(data);
chai_1.assert.deepEqual(result.schema.T, { derivedFrom: ast.typeType('Any'),
methods: {},
properties: {},
params: []
});
});
});
suite("Sample files", function () {
helper.dataDrivenTest(sample_files_1.samples, function (data) {
var filename = 'samples/' + data + '.' + bolt.FILE_EXTENSION;
return readFile(filename)
.then(function (response) {
var result = parse(response.content);
chai_1.assert.ok(result, response.url);
return true;
});
});
});
suite("Parser Errors", function () {
var tests = [
{ data: "path /x/y/ is String;",
expect: /end in a slash/ },
{ data: "path /x//y is String;",
expect: /empty part/ },
// BUG: Following errors should expect /empty part/ - PEG parser error?
{ data: "path //x is String;",
expect: /./ },
{ data: "path // is String;",
expect: /./ },
{ data: "path /x { validate() { return this.test(/a/g); } }",
expect: /unsupported regexp modifier/i },
{ data: "path {}",
expect: /missing path template/i },
{ data: "path / }",
expect: /missing body of path/i },
{ data: "function foo { 7 }",
expect: /missing parameters/i },
{ data: "foo { 7 }",
expect: /expected.*function/i },
{ data: "foo(x)",
expect: /missing.*body/i },
{ data: "path /x { foo(x); }",
expect: /invalid path or method/i },
{ data: "foo(x) { x = 'a' }",
expect: /equality/i },
{ data: "type X { bad-prop: String; }",
expect: /invalid property or method/i },
{ data: "type { foo: String;}",
expect: /missing type name/i },
];
helper.dataDrivenTest(tests, function (data, expect) {
try {
parse(data);
}
catch (e) {
chai_1.assert.match(e.message, expect);
return;
}
chai_1.assert.fail(undefined, undefined, "No exception thrown.");
});
});
suite("Syntax warnings.", function () {
var tests = [
{ data: "path /x { read() { true }; }",
expect: /extra separator/i },
];
helper.dataDrivenTest(tests, function (data, expect) {
parse(data);
chai_1.assert.match(logger.getLastMessage(), expect);
});
});
suite("Deprecation warnings.", function () {
var tests = [
{ data: "path /x/$y is String;",
expect: /path segment is deprecated/ },
{ data: "f(x) = x + 1;",
expect: /fn\(x\) = exp; format is deprecated/ },
{ data: "f(x) = x + 1",
expect: /fn\(x\) = exp; format is deprecated/ },
];
helper.dataDrivenTest(tests, function (data, expect) {
parse(data);
chai_1.assert.match(logger.getLastMessage(), expect);
});
});
});
function sortPaths(paths) {
function cmpStr(a, b) {
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
}
paths.sort(function (a, b) {
return cmpStr(a.template.getLabels().join('~'), b.template.getLabels().join('~'));
});
return paths;
}
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBRTtZQUMxQixDQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFFO1lBQzVELENBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUU7WUFDL0QsQ0FBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBRTtZQUMvRCxDQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUU7WUFDMUMsQ0FBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFFO1lBQzVFLENBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBRTtZQUM1RSxDQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBRTtZQUNwQywyREFBMkQ7WUFDM0QsQ0FBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFFO1lBQzlDLENBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUU7WUFDM0IsQ0FBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUU7WUFDcEMsQ0FBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBRTtZQUN2RCxDQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFFO1lBQ3RELENBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUU7WUFDdEQsQ0FBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRTtZQUNsRCxDQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFO1lBQ3RELG1CQUFtQjtZQUNuQixDQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRTtZQUNwRSxtQkFBbUI7WUFDbkIsQ0FBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBRTtZQUMxRiwyQkFBMkI7WUFDM0IsQ0FBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBRTtZQUMzRixDQUFFLGFBQWEsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFFO1lBQzdGLENBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUU7WUFDckQsQ0FBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRTtZQUNyRCxDQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFO1lBQ3ZELENBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUU7WUFDdkQsQ0FBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRTtZQUN0RCxDQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFO1lBQ3RELENBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUU7WUFDdkQsQ0FBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRTtZQUN2RCxDQUFFLFlBQVksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFFO1lBQ3ZGLENBQUUsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FB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QUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwiZmlsZSI6InRlc3QvcGFyc2VyLXRlc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ