UNPKG

ddb-table

Version:

Strongly typed library for querying and modeling DynamoDB documents.

143 lines (142 loc) 20.9 kB
"use strict"; require("mocha"); var _chai = require("chai"); var _UpdateExpression = _interopRequireDefault(require("./UpdateExpression")); var _ExpressionAttributeNames = _interopRequireDefault(require("./ExpressionAttributeNames")); var _ExpressionAttributeValues = _interopRequireDefault(require("./ExpressionAttributeValues")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } describe('UpdateExpression', () => { describe('init -> serialize()', () => { function assetSerialize(test, expected = test.trim().replace(/\s+/g, ' ')) { it(test, () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const exp = new _UpdateExpression.default(names, values, test); _chai.assert.equal(exp.serialize(), expected); }); } assetSerialize('SET #foo = :foo'); assetSerialize('SET foo = :foo'); assetSerialize('set foo = :foo', 'SET foo = :foo'); assetSerialize(' SET foo = :foo '); assetSerialize('SET\nfoo=:foo', 'SET foo = :foo'); assetSerialize('SET foo = :foo ADD #delete :d'); assetSerialize('SET foo = :foo REMOVE #c ADD #delete :d DELETE #a[2] :a'); assetSerialize('DELETE #a[2] :a'); }); describe('.set()', () => { it('Set foo.bar', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const update = new _UpdateExpression.default(names, values); update.set(['foo', 'bar'], 23); _chai.assert.deepEqual(update.serialize(), 'SET #foo.#bar = :bar'); _chai.assert.deepEqual(names.serialize(), { '#foo': 'foo', '#bar': 'bar' }); _chai.assert.deepEqual(values.serialize(), { ':bar': 23 }); }); it('Set list', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const update = new _UpdateExpression.default(names, values); update.set('list', [123, 1]); _chai.assert.deepEqual(update.serialize(), 'SET #list = :list'); _chai.assert.deepEqual(names.serialize(), { '#list': 'list' }); _chai.assert.deepEqual(values.serialize(), { ':list': [123, 1] }); }); it('Set list', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const update = new _UpdateExpression.default(names, values); update.set('list', [123, 1]); _chai.assert.deepEqual(update.serialize(), 'SET #list = :list'); _chai.assert.deepEqual(names.serialize(), { '#list': 'list' }); _chai.assert.deepEqual(values.serialize(), { ':list': [123, 1] }); }); it('Set exp', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const update = new _UpdateExpression.default(names, values); update.set('list', exp => exp.listAppend([123])); _chai.assert.deepEqual(update.serialize(), 'SET #list = list_append(#list, :list)'); _chai.assert.deepEqual(names.serialize(), { '#list': 'list' }); _chai.assert.deepEqual(values.serialize(), { ':list': [123] }); }); }); describe('.remove()', () => { it('Basic use case', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const update = new _UpdateExpression.default(names, values); update.remove('set'); update.remove('foo', 'bar'); _chai.assert.deepEqual(update.serialize(), 'REMOVE #set, #foo.#bar'); _chai.assert.deepEqual(names.serialize(), { '#set': 'set', '#foo': 'foo', '#bar': 'bar' }); }); }); describe('.add()', () => { it('number', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const update = new _UpdateExpression.default(names, values); update.add(['foo', 'bar'], 4); _chai.assert.deepEqual(update.serialize(), 'ADD #foo.#bar :bar'); _chai.assert.deepEqual(names.serialize(), { '#foo': 'foo', '#bar': 'bar' }); _chai.assert.deepEqual(values.serialize(), { ':bar': 4 }); }); it('set', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const update = new _UpdateExpression.default(names, values); update.add('set', new Set(['test'])); _chai.assert.deepEqual(update.serialize(), 'ADD #set :set'); _chai.assert.deepEqual(names.serialize(), { '#set': 'set' }); _chai.assert.deepEqual(values.serialize(), { ':set': new Set(['test']) }); }); }); describe('.delete()', () => { it('set', () => { const names = new _ExpressionAttributeNames.default(); const values = new _ExpressionAttributeValues.default(); const update = new _UpdateExpression.default(names, values); update.delete('set', new Set(['test'])); _chai.assert.deepEqual(update.serialize(), 'DELETE #set :set'); _chai.assert.deepEqual(names.serialize(), { '#set': 'set' }); _chai.assert.deepEqual(values.serialize(), { ':set': new Set(['test']) }); }); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlIiwiX2NoYWkiLCJfVXBkYXRlRXhwcmVzc2lvbiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzIiwiX0V4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMiLCJvYmoiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImRlc2NyaWJlIiwiYXNzZXRTZXJpYWxpemUiLCJ0ZXN0IiwiZXhwZWN0ZWQiLCJ0cmltIiwicmVwbGFjZSIsIml0IiwibmFtZXMiLCJFeHByZXNzaW9uQXR0cmlidXRlTmFtZXMiLCJ2YWx1ZXMiLCJFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzIiwiZXhwIiwiVXBkYXRlRXhwcmVzc2lvbiIsImFzc2VydCIsImVxdWFsIiwic2VyaWFsaXplIiwidXBkYXRlIiwic2V0IiwiZGVlcEVxdWFsIiwibGlzdEFwcGVuZCIsInJlbW92ZSIsImFkZCIsIlNldCIsImRlbGV0ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHByZXNzaW9ucy9VcGRhdGVFeHByZXNzaW9uLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdtb2NoYSc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICdjaGFpJztcbmltcG9ydCBVcGRhdGVFeHByZXNzaW9uIGZyb20gJy4vVXBkYXRlRXhwcmVzc2lvbic7XG5pbXBvcnQgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzIGZyb20gJy4vRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzJztcbmltcG9ydCBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzIGZyb20gJy4vRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyc7XG5cbmludGVyZmFjZSBEZW1vSXRlbSB7XG4gIGZvbzoge1xuICAgIGJhcjogbnVtYmVyO1xuICB9O1xuICBoZWxsbz86IHN0cmluZztcbiAgbGlzdDogbnVtYmVyW107XG4gIHNldD86IFNldDxzdHJpbmc+O1xufVxuXG5kZXNjcmliZSgnVXBkYXRlRXhwcmVzc2lvbicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2luaXQgLT4gc2VyaWFsaXplKCknLCAoKSA9PiB7XG4gICAgZnVuY3Rpb24gYXNzZXRTZXJpYWxpemUoXG4gICAgICB0ZXN0OiBzdHJpbmcsXG4gICAgICBleHBlY3RlZDogc3RyaW5nID0gdGVzdC50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpLFxuICAgICk6IHZvaWQge1xuICAgICAgaXQodGVzdCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXMoKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgZXhwID0gbmV3IFVwZGF0ZUV4cHJlc3Npb24obmFtZXMsIHZhbHVlcywgdGVzdCk7XG5cbiAgICAgICAgYXNzZXJ0LmVxdWFsKGV4cC5zZXJpYWxpemUoKSwgZXhwZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXNzZXRTZXJpYWxpemUoJ1NFVCAjZm9vID0gOmZvbycpO1xuICAgIGFzc2V0U2VyaWFsaXplKCdTRVQgZm9vID0gOmZvbycpO1xuICAgIGFzc2V0U2VyaWFsaXplKCdzZXQgZm9vID0gOmZvbycsICdTRVQgZm9vID0gOmZvbycpO1xuICAgIGFzc2V0U2VyaWFsaXplKCcgU0VUICBmb28gPSA6Zm9vICcpO1xuICAgIGFzc2V0U2VyaWFsaXplKCdTRVRcXG5mb289OmZvbycsICdTRVQgZm9vID0gOmZvbycpO1xuXG4gICAgYXNzZXRTZXJpYWxpemUoJ1NFVCBmb28gPSA6Zm9vIEFERCAjZGVsZXRlIDpkJyk7XG4gICAgYXNzZXRTZXJpYWxpemUoJ1NFVCBmb28gPSA6Zm9vIFJFTU9WRSAjYyBBREQgI2RlbGV0ZSA6ZCBERUxFVEUgI2FbMl0gOmEnKTtcbiAgICBhc3NldFNlcmlhbGl6ZSgnREVMRVRFICNhWzJdIDphJyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcuc2V0KCknLCAoKTogdm9pZCA9PiB7XG4gICAgaXQoJ1NldCBmb28uYmFyJywgKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbmFtZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzPERlbW9JdGVtPigpO1xuICAgICAgY29uc3QgdmFsdWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IG5ldyBVcGRhdGVFeHByZXNzaW9uPERlbW9JdGVtPihuYW1lcywgdmFsdWVzKTtcblxuICAgICAgdXBkYXRlLnNldChbJ2ZvbycsICdiYXInXSwgMjMpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHVwZGF0ZS5zZXJpYWxpemUoKSwgJ1NFVCAjZm9vLiNiYXIgPSA6YmFyJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgICcjZm9vJzogJ2ZvbycsXG4gICAgICAgICcjYmFyJzogJ2JhcicsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgICc6YmFyJzogMjMsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdTZXQgbGlzdCcsICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczxEZW1vSXRlbT4oKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzKCk7XG4gICAgICBjb25zdCB1cGRhdGUgPSBuZXcgVXBkYXRlRXhwcmVzc2lvbjxEZW1vSXRlbT4obmFtZXMsIHZhbHVlcyk7XG5cbiAgICAgIHVwZGF0ZS5zZXQoJ2xpc3QnLCBbMTIzLCAxXSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodXBkYXRlLnNlcmlhbGl6ZSgpLCAnU0VUICNsaXN0ID0gOmxpc3QnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobmFtZXMuc2VyaWFsaXplKCksIHtcbiAgICAgICAgJyNsaXN0JzogJ2xpc3QnLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbHVlcy5zZXJpYWxpemUoKSwge1xuICAgICAgICAnOmxpc3QnOiBbMTIzLCAxXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1NldCBsaXN0JywgKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbmFtZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzPERlbW9JdGVtPigpO1xuICAgICAgY29uc3QgdmFsdWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IG5ldyBVcGRhdGVFeHByZXNzaW9uPERlbW9JdGVtPihuYW1lcywgdmFsdWVzKTtcblxuICAgICAgdXBkYXRlLnNldCgnbGlzdCcsIFsxMjMsIDFdKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh1cGRhdGUuc2VyaWFsaXplKCksICdTRVQgI2xpc3QgPSA6bGlzdCcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChuYW1lcy5zZXJpYWxpemUoKSwge1xuICAgICAgICAnI2xpc3QnOiAnbGlzdCcsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgICc6bGlzdCc6IFsxMjMsIDFdLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2V0IGV4cCcsICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczxEZW1vSXRlbT4oKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzKCk7XG4gICAgICBjb25zdCB1cGRhdGUgPSBuZXcgVXBkYXRlRXhwcmVzc2lvbjxEZW1vSXRlbT4obmFtZXMsIHZhbHVlcyk7XG5cbiAgICAgIHVwZGF0ZS5zZXQoJ2xpc3QnLCAoZXhwKSA9PiBleHAubGlzdEFwcGVuZChbMTIzXSkpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICB1cGRhdGUuc2VyaWFsaXplKCksXG4gICAgICAgICdTRVQgI2xpc3QgPSBsaXN0X2FwcGVuZCgjbGlzdCwgOmxpc3QpJyxcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgICcjbGlzdCc6ICdsaXN0JyxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWx1ZXMuc2VyaWFsaXplKCksIHtcbiAgICAgICAgJzpsaXN0JzogWzEyM10sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5yZW1vdmUoKScsICgpOiB2b2lkID0+IHtcbiAgICBpdCgnQmFzaWMgdXNlIGNhc2UnLCAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBuYW1lcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlTmFtZXM8RGVtb0l0ZW0+KCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcygpO1xuICAgICAgY29uc3QgdXBkYXRlID0gbmV3IFVwZGF0ZUV4cHJlc3Npb248RGVtb0l0ZW0+KG5hbWVzLCB2YWx1ZXMpO1xuXG4gICAgICB1cGRhdGUucmVtb3ZlKCdzZXQnKTtcbiAgICAgIHVwZGF0ZS5yZW1vdmUoJ2ZvbycsICdiYXInKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh1cGRhdGUuc2VyaWFsaXplKCksICdSRU1PVkUgI3NldCwgI2Zvby4jYmFyJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgICcjc2V0JzogJ3NldCcsXG4gICAgICAgICcjZm9vJzogJ2ZvbycsXG4gICAgICAgICcjYmFyJzogJ2JhcicsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5hZGQoKScsICgpOiB2b2lkID0+IHtcbiAgICBpdCgnbnVtYmVyJywgKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbmFtZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzPERlbW9JdGVtPigpO1xuICAgICAgY29uc3QgdmFsdWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IG5ldyBVcGRhdGVFeHByZXNzaW9uPERlbW9JdGVtPihuYW1lcywgdmFsdWVzKTtcblxuICAgICAgdXBkYXRlLmFkZChbJ2ZvbycsICdiYXInXSwgNCk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodXBkYXRlLnNlcmlhbGl6ZSgpLCAnQUREICNmb28uI2JhciA6YmFyJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgICcjZm9vJzogJ2ZvbycsXG4gICAgICAgICcjYmFyJzogJ2JhcicsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgICc6YmFyJzogNCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NldCcsICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczxEZW1vSXRlbT4oKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzKCk7XG4gICAgICBjb25zdCB1cGRhdGUgPSBuZXcgVXBkYXRlRXhwcmVzc2lvbjxEZW1vSXRlbT4obmFtZXMsIHZhbHVlcyk7XG5cbiAgICAgIHVwZGF0ZS5hZGQoJ3NldCcsIG5ldyBTZXQoWyd0ZXN0J10pKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh1cGRhdGUuc2VyaWFsaXplKCksICdBREQgI3NldCA6c2V0Jyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5hbWVzLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgICcjc2V0JzogJ3NldCcsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLnNlcmlhbGl6ZSgpLCB7XG4gICAgICAgICc6c2V0JzogbmV3IFNldChbJ3Rlc3QnXSksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJy5kZWxldGUoKScsICgpOiB2b2lkID0+IHtcbiAgICBpdCgnc2V0JywgKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgbmFtZXMgPSBuZXcgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzPERlbW9JdGVtPigpO1xuICAgICAgY29uc3QgdmFsdWVzID0gbmV3IEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXMoKTtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IG5ldyBVcGRhdGVFeHByZXNzaW9uPERlbW9JdGVtPihuYW1lcywgdmFsdWVzKTtcblxuICAgICAgdXBkYXRlLmRlbGV0ZSgnc2V0JywgbmV3IFNldChbJ3Rlc3QnXSkpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHVwZGF0ZS5zZXJpYWxpemUoKSwgJ0RFTEVURSAjc2V0IDpzZXQnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobmFtZXMuc2VyaWFsaXplKCksIHtcbiAgICAgICAgJyNzZXQnOiAnc2V0JyxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh2YWx1ZXMuc2VyaWFsaXplKCksIHtcbiAgICAgICAgJzpzZXQnOiBuZXcgU2V0KFsndGVzdCddKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBQSxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLHlCQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSywwQkFBQSxHQUFBRixzQkFBQSxDQUFBSCxPQUFBO0FBQW9FLFNBQUFHLHVCQUFBRyxHQUFBLFdBQUFBLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLEdBQUFELEdBQUEsS0FBQUUsT0FBQSxFQUFBRixHQUFBO0FBV3BFRyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsTUFBTTtFQUNqQ0EsUUFBUSxDQUFDLHFCQUFxQixFQUFFLE1BQU07SUFDcEMsU0FBU0MsY0FBY0EsQ0FDckJDLElBQVksRUFDWkMsUUFBZ0IsR0FBR0QsSUFBSSxDQUFDRSxJQUFJLEVBQUUsQ0FBQ0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFDN0M7TUFDTkMsRUFBRSxDQUFDSixJQUFJLEVBQUUsTUFBTTtRQUNiLE1BQU1LLEtBQUssR0FBRyxJQUFJQyxpQ0FBd0IsRUFBRTtRQUM1QyxNQUFNQyxNQUFNLEdBQUcsSUFBSUMsa0NBQXlCLEVBQUU7UUFDOUMsTUFBTUMsR0FBRyxHQUFHLElBQUlDLHlCQUFnQixDQUFDTCxLQUFLLEVBQUVFLE1BQU0sRUFBRVAsSUFBSSxDQUFDO1FBRXJEVyxZQUFNLENBQUNDLEtBQUssQ0FBQ0gsR0FBRyxDQUFDSSxTQUFTLEVBQUUsRUFBRVosUUFBUSxDQUFDO01BQ3pDLENBQUMsQ0FBQztJQUNKO0lBRUFGLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztJQUNqQ0EsY0FBYyxDQUFDLGdCQUFnQixDQUFDO0lBQ2hDQSxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7SUFDbERBLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztJQUNuQ0EsY0FBYyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQztJQUVqREEsY0FBYyxDQUFDLCtCQUErQixDQUFDO0lBQy9DQSxjQUFjLENBQUMseURBQXlELENBQUM7SUFDekVBLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztFQUNuQyxDQUFDLENBQUM7RUFFRkQsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFZO0lBQzdCTSxFQUFFLENBQUMsYUFBYSxFQUFFLE1BQVk7TUFDNUIsTUFBTUMsS0FBSyxHQUFHLElBQUlDLGlDQUF3QixFQUFZO01BQ3RELE1BQU1DLE1BQU0sR0FBRyxJQUFJQyxrQ0FBeUIsRUFBRTtNQUM5QyxNQUFNTSxNQUFNLEdBQUcsSUFBSUoseUJBQWdCLENBQVdMLEtBQUssRUFBRUUsTUFBTSxDQUFDO01BRTVETyxNQUFNLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7TUFFOUJKLFlBQU0sQ0FBQ0ssU0FBUyxDQUFDRixNQUFNLENBQUNELFNBQVMsRUFBRSxFQUFFLHNCQUFzQixDQUFDO01BQzVERixZQUFNLENBQUNLLFNBQVMsQ0FBQ1gsS0FBSyxDQUFDUSxTQUFTLEVBQUUsRUFBRTtRQUNsQyxNQUFNLEVBQUUsS0FBSztRQUNiLE1BQU0sRUFBRTtNQUNWLENBQUMsQ0FBQztNQUNGRixZQUFNLENBQUNLLFNBQVMsQ0FBQ1QsTUFBTSxDQUFDTSxTQUFTLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEVBQUU7TUFDVixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRlQsRUFBRSxDQUFDLFVBQVUsRUFBRSxNQUFZO01BQ3pCLE1BQU1DLEtBQUssR0FBRyxJQUFJQyxpQ0FBd0IsRUFBWTtNQUN0RCxNQUFNQyxNQUFNLEdBQUcsSUFBSUMsa0NBQXlCLEVBQUU7TUFDOUMsTUFBTU0sTUFBTSxHQUFHLElBQUlKLHlCQUFnQixDQUFXTCxLQUFLLEVBQUVFLE1BQU0sQ0FBQztNQUU1RE8sTUFBTSxDQUFDQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO01BRTVCSixZQUFNLENBQUNLLFNBQVMsQ0FBQ0YsTUFBTSxDQUFDRCxTQUFTLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQztNQUN6REYsWUFBTSxDQUFDSyxTQUFTLENBQUNYLEtBQUssQ0FBQ1EsU0FBUyxFQUFFLEVBQUU7UUFDbEMsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUFDO01BQ0ZGLFlBQU0sQ0FBQ0ssU0FBUyxDQUFDVCxNQUFNLENBQUNNLFNBQVMsRUFBRSxFQUFFO1FBQ25DLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO01BQ2xCLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGVCxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQVk7TUFDekIsTUFBTUMsS0FBSyxHQUFHLElBQUlDLGlDQUF3QixFQUFZO01BQ3RELE1BQU1DLE1BQU0sR0FBRyxJQUFJQyxrQ0FBeUIsRUFBRTtNQUM5QyxNQUFNTSxNQUFNLEdBQUcsSUFBSUoseUJBQWdCLENBQVdMLEtBQUssRUFBRUUsTUFBTSxDQUFDO01BRTVETyxNQUFNLENBQUNDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFFNUJKLFlBQU0sQ0FBQ0ssU0FBUyxDQUFDRixNQUFNLENBQUNELFNBQVMsRUFBRSxFQUFFLG1CQUFtQixDQUFDO01BQ3pERixZQUFNLENBQUNLLFNBQVMsQ0FBQ1gsS0FBSyxDQUFDUSxTQUFTLEVBQUUsRUFBRTtRQUNsQyxPQUFPLEVBQUU7TUFDWCxDQUFDLENBQUM7TUFDRkYsWUFBTSxDQUFDSyxTQUFTLENBQUNULE1BQU0sQ0FBQ00sU0FBUyxFQUFFLEVBQUU7UUFDbkMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7TUFDbEIsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUZULEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBWTtNQUN4QixNQUFNQyxLQUFLLEdBQUcsSUFBSUMsaUNBQXdCLEVBQVk7TUFDdEQsTUFBTUMsTUFBTSxHQUFHLElBQUlDLGtDQUF5QixFQUFFO01BQzlDLE1BQU1NLE1BQU0sR0FBRyxJQUFJSix5QkFBZ0IsQ0FBV0wsS0FBSyxFQUFFRSxNQUFNLENBQUM7TUFFNURPLE1BQU0sQ0FBQ0MsR0FBRyxDQUFDLE1BQU0sRUFBR04sR0FBRyxJQUFLQSxHQUFHLENBQUNRLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7TUFFbEROLFlBQU0sQ0FBQ0ssU0FBUyxDQUNkRixNQUFNLENBQUNELFNBQVMsRUFBRSxFQUNsQix1Q0FBdUMsQ0FDeEM7TUFDREYsWUFBTSxDQUFDSyxTQUFTLENBQUNYLEtBQUssQ0FBQ1EsU0FBUyxFQUFFLEVBQUU7UUFDbEMsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUFDO01BQ0ZGLFlBQU0sQ0FBQ0ssU0FBUyxDQUFDVCxNQUFNLENBQUNNLFNBQVMsRUFBRSxFQUFFO1FBQ25DLE9BQU8sRUFBRSxDQUFDLEdBQUc7TUFDZixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRmYsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFZO0lBQ2hDTSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsTUFBWTtNQUMvQixNQUFNQyxLQUFLLEdBQUcsSUFBSUMsaUNBQXdCLEVBQVk7TUFDdEQsTUFBTUMsTUFBTSxHQUFHLElBQUlDLGtDQUF5QixFQUFFO01BQzlDLE1BQU1NLE1BQU0sR0FBRyxJQUFJSix5QkFBZ0IsQ0FBV0wsS0FBSyxFQUFFRSxNQUFNLENBQUM7TUFFNURPLE1BQU0sQ0FBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQztNQUNwQkosTUFBTSxDQUFDSSxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztNQUUzQlAsWUFBTSxDQUFDSyxTQUFTLENBQUNGLE1BQU0sQ0FBQ0QsU0FBUyxFQUFFLEVBQUUsd0JBQXdCLENBQUM7TUFDOURGLFlBQU0sQ0FBQ0ssU0FBUyxDQUFDWCxLQUFLLENBQUNRLFNBQVMsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sRUFBRSxLQUFLO1FBQ2IsTUFBTSxFQUFFLEtBQUs7UUFDYixNQUFNLEVBQUU7TUFDVixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRmYsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFZO0lBQzdCTSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQVk7TUFDdkIsTUFBTUMsS0FBSyxHQUFHLElBQUlDLGlDQUF3QixFQUFZO01BQ3RELE1BQU1DLE1BQU0sR0FBRyxJQUFJQyxrQ0FBeUIsRUFBRTtNQUM5QyxNQUFNTSxNQUFNLEdBQUcsSUFBSUoseUJBQWdCLENBQVdMLEtBQUssRUFBRUUsTUFBTSxDQUFDO01BRTVETyxNQUFNLENBQUNLLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7TUFFN0JSLFlBQU0sQ0FBQ0ssU0FBUyxDQUFDRixNQUFNLENBQUNELFNBQVMsRUFBRSxFQUFFLG9CQUFvQixDQUFDO01BQzFERixZQUFNLENBQUNLLFNBQVMsQ0FBQ1gsS0FBSyxDQUFDUSxTQUFTLEVBQUUsRUFBRTtRQUNsQyxNQUFNLEVBQUUsS0FBSztRQUNiLE1BQU0sRUFBRTtNQUNWLENBQUMsQ0FBQztNQUNGRixZQUFNLENBQUNLLFNBQVMsQ0FBQ1QsTUFBTSxDQUFDTSxTQUFTLEVBQUUsRUFBRTtRQUNuQyxNQUFNLEVBQUU7TUFDVixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRlQsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFZO01BQ3BCLE1BQU1DLEtBQUssR0FBRyxJQUFJQyxpQ0FBd0IsRUFBWTtNQUN0RCxNQUFNQyxNQUFNLEdBQUcsSUFBSUMsa0NBQXlCLEVBQUU7TUFDOUMsTUFBTU0sTUFBTSxHQUFHLElBQUlKLHlCQUFnQixDQUFXTCxLQUFLLEVBQUVFLE1BQU0sQ0FBQztNQUU1RE8sTUFBTSxDQUFDSyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUlDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7TUFFcENULFlBQU0sQ0FBQ0ssU0FBUyxDQUFDRixNQUFNLENBQUNELFNBQVMsRUFBRSxFQUFFLGVBQWUsQ0FBQztNQUNyREYsWUFBTSxDQUFDSyxTQUFTLENBQUNYLEtBQUssQ0FBQ1EsU0FBUyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxFQUFFO01BQ1YsQ0FBQyxDQUFDO01BQ0ZGLFlBQU0sQ0FBQ0ssU0FBUyxDQUFDVCxNQUFNLENBQUNNLFNBQVMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sRUFBRSxJQUFJTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7TUFDMUIsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZ0QixRQUFRLENBQUMsV0FBVyxFQUFFLE1BQVk7SUFDaENNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBWTtNQUNwQixNQUFNQyxLQUFLLEdBQUcsSUFBSUMsaUNBQXdCLEVBQVk7TUFDdEQsTUFBTUMsTUFBTSxHQUFHLElBQUlDLGtDQUF5QixFQUFFO01BQzlDLE1BQU1NLE1BQU0sR0FBRyxJQUFJSix5QkFBZ0IsQ0FBV0wsS0FBSyxFQUFFRSxNQUFNLENBQUM7TUFFNURPLE1BQU0sQ0FBQ08sTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJRCxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO01BRXZDVCxZQUFNLENBQUNLLFNBQVMsQ0FBQ0YsTUFBTSxDQUFDRCxTQUFTLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQztNQUN4REYsWUFBTSxDQUFDSyxTQUFTLENBQUNYLEtBQUssQ0FBQ1EsU0FBUyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxFQUFFO01BQ1YsQ0FBQyxDQUFDO01BQ0ZGLFlBQU0sQ0FBQ0ssU0FBUyxDQUFDVCxNQUFNLENBQUNNLFNBQVMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sRUFBRSxJQUFJTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7TUFDMUIsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=