@d4c/numjs
Version:
Like NumPy, in TypeScript and JavaScript
677 lines • 49.7 kB
JavaScript
/**
* This is default exported `nj` module page. Below References, Namespaces, Properties, Functions are all exported.
* For example, after import `nj` via `import nj from "@d4c/numjs";` or `const nj = require('@d4c/numjs').default;`,
* you can use `nj.array` to use create a `NdArray`.
*
* @packageDocumentation
*/
"use strict";
import cwise from "cwise";
import ops from "ndarray-ops";
import ndFFT from "ndarray-fft";
export { default as config } from "./config";
export { default as dtypes } from "./dtypes";
export { default as ndarray } from "ndarray";
import { NdArray, } from "./ndarray";
export { NdArray };
import * as errors from "./errors";
export { errors };
import _ from "./utils";
export function broadcast(shape1, shape2) {
if (shape1.length === 0 || shape2.length === 0) {
return;
}
const reversed1 = shape1.slice().reverse();
const reversed2 = shape2.slice().reverse();
const maxLength = Math.max(shape1.length, shape2.length);
const outShape = new Array(maxLength);
for (let i = 0; i < maxLength; i++) {
if (!reversed1[i] || reversed1[i] === 1) {
outShape[i] = reversed2[i];
}
else if (!reversed2[i] || reversed2[i] === 1) {
outShape[i] = reversed1[i];
}
else if (reversed1[i] === reversed2[i]) {
outShape[i] = reversed1[i];
}
else {
return;
}
}
return outShape.reverse();
}
/**
* Add arguments, element-wise.
*/
export function add(a, b) {
return NdArray.new(a).add(b);
}
/**
* Multiply arguments, element-wise.
*/
export function multiply(a, b) {
return NdArray.new(a).multiply(b);
}
/**
* Divide `a` by `b`, element-wise.
*/
export function divide(a, b) {
return NdArray.new(a).divide(b);
}
/**
* Subtract second argument from the first, element-wise.
*/
export function subtract(a, b) {
return NdArray.new(a).subtract(b);
}
/**
* Return true if two arrays have the same shape and elements, false otherwise.
*/
export function equal(array1, array2) {
return NdArray.new(array1).equal(array2);
}
/**
* Return a copy of the array collapsed into one dimension using row-major order (C-style)
*/
export function flatten(array) {
return NdArray.new(array).flatten();
}
/**
* Gives a new shape to an array without changing its data.
* @param array
* @param shape - The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length
*/
export function reshape(array, shape) {
// TypeScript is not smart enought on parameters detection on overloading
// workaround way
if (typeof shape == "number") {
return NdArray.new(array).reshape(shape);
}
else {
return NdArray.new(array).reshape(shape);
}
}
/**
* Calculate the exponential of all elements in the input array, element-wise.
*/
export function exp(x) {
return NdArray.new(x).exp();
}
/**
* Calculate the natural logarithm of all elements in the input array, element-wise.
*/
export function log(x) {
return NdArray.new(x).log();
}
/**
* Calculate the positive square-root of all elements in the input array, element-wise.
*/
export function sqrt(x) {
return NdArray.new(x).sqrt();
}
/**
* Raise first array elements to powers from second array, element-wise.
*/
export function power(x1, x2) {
return NdArray.new(x1).pow(x2);
}
/**
* Return the sum of input array elements.
*/
export function sum(x) {
return NdArray.new(x).sum();
}
/**
* Return the arithmetic mean of input array elements.
*/
export function mean(x) {
return NdArray.new(x).mean();
}
/**
* Returns the standard deviation, a measure of the spread of a distribution, of the input array elements.
*/
export function std(x, options) {
return NdArray.new(x).std(options);
}
/**
* Return the minimum value of the array
*/
export function min(x) {
return NdArray.new(x).min();
}
/**
* Return the maximum value of the array
*/
export function max(x) {
return NdArray.new(x).max();
}
/**
* Return element-wise remainder of division.
* Computes the remainder complementary to the `floor` function. It is equivalent to the Javascript modulus operator``x1 % x2`` and has the same sign as the divisor x2.
*/
export function mod(x1, x2) {
return NdArray.new(x1).mod(x2);
}
/**
* Permute the dimensions of the input array according to the given axes.
*/
export function transpose(x, axes) {
return NdArray.new(x).transpose(axes);
}
/**
* Return the inverse of the input array, element-wise.
*/
export function negative(x) {
return NdArray.new(x).negative();
}
export function arange(...args) {
if (arguments.length === 1) {
return arange(0, arguments[0], 1, undefined);
}
else if (arguments.length === 2 && _.isNumber(arguments[1])) {
return arange(arguments[0], arguments[1], 1, undefined);
}
else if (arguments.length === 2) {
return arange(0, arguments[0], 1, arguments[1]);
}
else if (arguments.length === 3 && !_.isNumber(arguments[2])) {
return arange(arguments[0], arguments[1], 1, arguments[2]);
}
let start = arguments[0];
const stop = arguments[1];
const step = arguments[2];
const dtype = arguments[3];
const result = [];
let i = 0;
while (start < stop) {
result[i++] = start;
start += step;
}
return NdArray.new(result, dtype);
}
/**
* Return a new array of given shape and type, filled with zeros.
*
* @param shape - Shape of the new array, e.g., [2, 3] or 2.
* @param dtype Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
*
*/
export function zeros(shape, dtype) {
if (_.isNumber(shape) && shape >= 0) {
shape = [shape];
}
const s = _.shapeSize(shape);
const T = _.getType(dtype);
const arr = new NdArray(new T(s), shape);
if (arr.dtype === "array") {
ops.assigns(arr.selection, 0);
}
return arr;
}
/**
* Return a new array of given shape and type, filled with ones.
*
* @param shape - Shape of the new array, e.g., [2, 3] or 2.
* @param dtype - Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
*
* @return Array of ones with the given shape and dtype
*/
export function ones(shape, dtype) {
if (_.isNumber(shape) && shape >= 0) {
shape = [shape];
}
const s = _.shapeSize(shape);
const T = _.getType(dtype);
const arr = new NdArray(new T(s), shape);
ops.assigns(arr.selection, 1);
return arr;
}
/**
* Return a new array of given shape and type, filled with `undefined` values.
*
* @param shape - Shape of the new array, e.g., [2, 3] or 2.
* @param dtype - Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
*
* @return Array of `undefined` values with the given shape and dtype
*/
export function empty(shape, dtype) {
if (_.isNumber(shape) && shape >= 0) {
shape = [shape];
}
const s = _.shapeSize(shape);
const T = _.getType(dtype);
return new NdArray(new T(s), shape);
}
export function random(...args) {
let shape;
if (arguments.length === 0) {
return NdArray.new(Math.random());
}
else if (arguments.length === 1) {
shape = _.isNumber(args[0]) ? [args[0] | 0] : args[0];
}
else {
shape = [].slice.call(arguments);
}
const s = _.shapeSize(shape);
const arr = new NdArray(new Float64Array(s), shape);
ops.random(arr.selection);
return arr;
}
/**
* Return the softmax, or normalized exponential, of the input array, element-wise.
*/
export function softmax(x) {
const e = NdArray.new(x).exp();
const se = e.sum(); // scalar
ops.divseq(e.selection, se);
return e;
}
/* istanbul ignore next */
const doSigmoid = cwise({
args: ["array", "scalar"],
body: function sigmoidCwise(a, t) {
a = a < -30 ? 0 : a > 30 ? 1 : 1 / (1 + Math.exp(-1 * t * a));
},
});
/**
* Return the sigmoid of the input array, element-wise.
* @param x
* @param t - stifness parameter
*/
export function sigmoid(x, t = 1) {
x = NdArray.new(x).clone();
t = t || 1;
doSigmoid(x.selection, t);
return x;
}
/* istanbul ignore next */
const doClip = cwise({
args: ["array", "scalar", "scalar"],
body: function clipCwise(a, min, max) {
a = Math.min(Math.max(min, a), max);
},
});
/**
* Clip (limit) the values in an array between min and max, element-wise.
*/
export function clip(x, min = 0, max = 1) {
if (arguments.length === 1) {
min = 0;
max = 1;
}
else if (arguments.length === 2) {
max = 1;
}
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
doClip(s.selection, min, max);
return s;
}
const doLeakyRelu = cwise({
args: ["array", "scalar"],
body: function leakyReluCwise(xi, alpha) {
xi = Math.max(alpha * xi, xi);
},
});
export function leakyRelu(x, alpha) {
alpha = alpha || 1e-3;
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
doLeakyRelu(s.selection, alpha);
return s;
}
/* istanbul ignore next */
const doTanh = cwise({
args: ["array"],
body: function tanhCwise(xi) {
xi = (Math.exp(2 * xi) - 1) / (Math.exp(2 * xi) + 1);
},
});
/**
* Return hyperbolic tangent of the input array, element-wise.
*/
export function tanh(x) {
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
doTanh(s.selection);
return s;
}
/**
* Return absolute value of the input array, element-wise.
*/
export function abs(x) {
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
ops.abseq(s.selection);
return s;
}
/**
* Return trigonometric cosine of the input array, element-wise.
*/
export function cos(x) {
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
ops.coseq(s.selection);
return s;
}
/**
* Return trigonometric inverse cosine of the input array, element-wise.
*/
export function arccos(x) {
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
ops.acoseq(s.selection);
return s;
}
/**
* Return trigonometric sine of the input array, element-wise.
*/
export function sin(x) {
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
ops.sineq(s.selection);
return s;
}
/**
* Return trigonometric inverse sine of the input array, element-wise.
*/
export function arcsin(x) {
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
ops.asineq(s.selection);
return s;
}
/**
* Return trigonometric tangent of the input array, element-wise.
*/
export function tan(x) {
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
ops.taneq(s.selection);
return s;
}
/**
* Return trigonometric inverse tangent of the input array, element-wise.
*/
export function arctan(x) {
const s = x instanceof NdArray ? x.clone() : NdArray.new(x);
ops.ataneq(s.selection);
return s;
}
/**
* Dot product of two arrays.
*
* WARNING: supported products are:
* - matrix dot matrix
* - vector dot vector
* - matrix dot vector
* - vector dot matrix
*/
export function dot(a, b) {
return NdArray.new(a).dot(b);
}
export function concatenate(...args) {
let arrays;
if (args.length > 1) {
arrays = [].slice.call(args);
}
else {
arrays = args[0];
}
let i, a;
for (i = 0; i < arrays.length; i++) {
a = arrays[i];
arrays[i] = a instanceof NdArray ? a.tolist() : _.isNumber(a) ? [a] : a;
}
let m = arrays[0];
for (i = 1; i < arrays.length; i++) {
a = arrays[i];
const mShape = _.getShape(m);
const aShape = _.getShape(a);
if (mShape.length !== aShape.length) {
throw new errors.ValueError("all the input arrays must have same number of dimensions");
}
else if (mShape.length === 1 && aShape.length === 1) {
m = m.concat(a);
}
else if ((mShape.length === 2 && aShape.length === 2 && mShape[0] === aShape[0]) ||
(mShape.length === 1 && aShape.length === 2 && mShape[0] === aShape[0]) ||
(mShape.length === 2 && aShape.length === 1 && mShape[0] === aShape[0])) {
for (let row = 0; row < mShape[0]; row++) {
m[row] = m[row].concat(a[row]);
}
}
else if ((mShape.length === 3 &&
aShape.length === 3 &&
mShape[0] === aShape[0] &&
mShape[1] === aShape[1]) ||
(mShape.length === 2 &&
aShape.length === 3 &&
mShape[0] === aShape[0] &&
mShape[1] === aShape[1]) ||
(mShape.length === 3 &&
aShape.length === 2 &&
mShape[0] === aShape[0] &&
mShape[1] === aShape[1])) {
for (let rowI = 0; rowI < mShape[0]; rowI++) {
const rowV = new Array(mShape[1]);
for (let colI = 0; colI < mShape[1]; colI++) {
rowV[colI] = m[rowI][colI].concat(a[rowI][colI]);
}
m[rowI] = rowV;
}
}
else {
throw new errors.ValueError('cannot concatenate "' + mShape + '" with "' + aShape + '"');
}
}
return NdArray.new(m, arrays[0].dtype);
}
/**
* Round an array to the to the nearest integer.
*/
export function round(x) {
return NdArray.new(x).round();
}
/**
* Convolve 2 N-dimensionnal arrays
*
* @note: Arrays must have the same dimensions and a must be greater than b.
* @note: The convolution product is only given for points where the signals overlap completely. Values outside the signal boundary have no effect. This behaviour is known as the 'valid' mode.
*/
export function convolve(a, b) {
return NdArray.new(a).convolve(b);
}
/**
* Convolve 2 N-dimensionnal arrays using Fast Fourier Transform (FFT)
*
* @note: Arrays must have the same dimensions and a must be greater than b.
* @note: The convolution product is only given for points where the signals overlap completely. Values outside the signal boundary have no effect. This behaviour is known as the 'valid' mode.
*/
export function fftconvolve(a, b) {
return NdArray.new(a).fftconvolve(b);
}
export function fft(x) {
x = x instanceof NdArray ? x.clone() : NdArray.new(x);
const xShape = x.shape;
const d = xShape.length;
if (xShape[d - 1] !== 2) {
throw new errors.ValueError("expect last dimension of the array to have 2 values (for both real and imaginary part)");
}
let rPicker = new Array(d);
let iPicker = new Array(d);
rPicker[d - 1] = 0;
iPicker[d - 1] = 1;
ndFFT(1, x.selection.pick.apply(x.selection, rPicker), x.selection.pick.apply(x.selection, iPicker));
return x;
}
export function ifft(x) {
x = x instanceof NdArray ? x.clone() : NdArray.new(x);
const xShape = x.shape;
const d = xShape.length;
if (xShape[d - 1] !== 2) {
throw new errors.ValueError("expect last dimension of the array to have 2 values (for both real and imaginary part)");
}
let rPicker = new Array(d);
let iPicker = new Array(d);
rPicker[d - 1] = 0;
iPicker[d - 1] = 1;
ndFFT(-1, x.selection.pick.apply(x.selection, rPicker), x.selection.pick.apply(x.selection, iPicker));
return x;
}
/**
* Extract a diagonal or construct a diagonal array.
* @returns a view a of the original array when possible, a new array otherwise
*/
export function diag(x) {
return NdArray.new(x).diag();
}
/**
* The identity array is a square array with ones on the main diagonal.
* @param n number of rows (and columns) in n x n output.
* @param dtype Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
* @return n x n array with its main diagonal set to one, and all other elements 0
*/
export function identity(n, dtype) {
const arr = zeros([n, n], dtype);
for (let i = 0; i < n; i++)
arr.set(i, i, 1);
return arr;
}
/**
* Join a sequence of arrays along a new axis.
* The axis parameter specifies the index of the new axis in the dimensions of the result.
* For example, if axis=0 it will be the first dimension and if axis=-1 it will be the last dimension.
* @param arrays Sequence of array_like
* @param axis The axis in the result array along which the input arrays are stacked.
* @return The stacked array has one more dimension than the input arrays.
*/
export function stack(arrays, axis = 0) {
axis = axis || 0;
if (!arrays || arrays.length === 0) {
throw new errors.ValueError("need at least one array to stack");
}
const arrays2 = arrays.map(function (a) {
return (_.isNumber(a) ? a : NdArray.new(a));
});
const expectedShape = arrays2[0].shape || []; // for numbers
for (let i = 1; i < arrays2.length; i++) {
const shape = arrays2[i].shape || []; // for numbers
const len = Math.max(expectedShape.length, shape.length);
for (let j = 0; j < len; j++) {
if (expectedShape[j] !== shape[j])
throw new errors.ValueError("all input arrays must have the same shape");
}
}
let stacked;
if (expectedShape.length === 0) {
// stacking numbers
stacked = concatenate(arrays2);
}
else {
stacked = zeros([arrays2.length].concat(expectedShape));
for (let i = 0; i < arrays2.length; i++) {
stacked.pick(i).assign(arrays2[i], false);
}
}
if (axis) {
// recompute neg axis
if (axis < 0)
axis = stacked.ndim + axis;
const d = stacked.ndim;
const axes = new Array(d);
for (let i = 0; i < d; i++) {
axes[i] = i < axis ? i + 1 : i === axis ? 0 : i;
}
return stacked.transpose(axes);
}
return stacked;
}
/**
* Reverse the order of elements in an array along the given axis.
* The shape of the array is preserved, but the elements are reordered.
* New in version 0.15.0.
* @param m Input array.
* @param axis Axis in array, which entries are reversed.
* @return A view of `m` with the entries of axis reversed. Since a view is returned, this operation is done in constant time.
*/
export function flip(m, axis) {
m = NdArray.new(m);
const indexer = ones(m.ndim).tolist();
let cleanaxis = axis;
while (cleanaxis < 0) {
cleanaxis += m.ndim;
}
if (indexer[cleanaxis] === undefined) {
throw new errors.ValueError("axis=" + axis + "invalid for the " + m.ndim + "-dimensional input array");
}
indexer[cleanaxis] = -1;
return m.step.apply(m, indexer);
}
/**
* Rotate an array by 90 degrees in the plane specified by axes.
* Rotation direction is from the first towards the second axis.
* New in version 0.15.0.
* @param m array_like
* @param k Number of times the array is rotated by 90 degrees.
* @param axes Default [0, 1]. The array is rotated in the plane defined by the axes. Axes must be different.
* @return A rotated view of m.
*/
export function rot90(m, k = 1, axes = [0, 1]) {
k = k || 1;
while (k < 0) {
k += 4;
}
k = k % 4;
m = NdArray.new(m);
let axes2 = NdArray.new(axes || [0, 1]);
if (axes2.shape.length !== 1 || axes2.shape[0] !== 2) {
throw new errors.ValueError("len(axes) must be 2");
}
axes2 = axes2.tolist();
if (axes2[0] === axes2[1] || abs(axes2[0] - axes2[1]).ndim === m.ndim) {
throw new errors.ValueError("Axes must be different.");
}
if (k === 0) {
return m;
}
if (k === 2) {
return flip(flip(m, axes2[0]), axes2[1]);
}
const axesList = arange(m.ndim).tolist();
const keep = axesList[axes2[0]];
axesList[axes2[0]] = axesList[axes2[1]];
axesList[axes2[1]] = keep;
if (k === 1) {
return transpose(flip(m, axes2[1]), axesList);
}
else {
return flip(transpose(m, axesList), axes2[1]);
}
}
/**
* @param dtype Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
*/
export const array = NdArray.new;
export const remainder = mod;
export function int8(array) {
return NdArray.new(array, "int8");
}
export function uint8(array) {
return NdArray.new(array, "uint8");
}
export function int16(array) {
return NdArray.new(array, "int16");
}
export function uint16(array) {
return NdArray.new(array, "uint16");
}
export function int32(array) {
return NdArray.new(array, "int32");
}
export function uint32(array) {
return NdArray.new(array, "uint32");
}
export function float32(array) {
return NdArray.new(array, "float32");
}
export function float64(array) {
return NdArray.new(array, "float64");
}
export function uint8Clamped(array) {
return NdArray.new(array, "uint8_clamped");
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILFlBQVksQ0FBQztBQUViLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUM7QUFDOUIsT0FBTyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBRWhDLE9BQU8sRUFBRSxPQUFPLElBQUksTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLElBQUksTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLElBQUksT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxPQUFPLEdBSVIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ25CLE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUVsQixPQUFPLENBQUMsTUFBTSxTQUFTLENBQUM7QUFFeEIsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFnQixFQUFFLE1BQWdCO0lBQzFELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUMsT0FBTztLQUNSO0lBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELE1B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QUFFO1lBQ3JELENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pCO2FBQU0sSUFDTCxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkUsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUN2RTtZQUNBLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ3hDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2hDO1NBQ0Y7YUFBTSxJQUNMLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUNsQixNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUNsQixNQUFNLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQzFCO1lBQ0EsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUNsRDtnQkFDRCxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ2hCO1NBQ0Y7YUFBTTtZQUNMLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUN6Qix1QkFBdUIsR0FBRyxNQUFNLEdBQUcsVUFBVSxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQzdELENBQUM7U0FDSDtLQUNGO0lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxDQUEyQjtJQUMvQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDaEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsQ0FBMkIsRUFDM0IsQ0FBMkI7SUFFM0IsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixDQUEyQixFQUMzQixDQUEyQjtJQUUzQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQTJCO0lBQzdDLENBQUMsR0FBRyxDQUFDLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUN2QixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hCLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdkIsTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQ3pCLHdGQUF3RixDQUN6RixDQUFDO0tBQ0g7SUFDRCxJQUFJLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixJQUFJLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixLQUFLLENBQ0gsQ0FBQyxFQUNELENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUM1QyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FDN0MsQ0FBQztJQUNGLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELE1BQU0sVUFBVSxJQUFJLENBQUMsQ0FBMkI7SUFDOUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDeEIsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2QixNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FDekIsd0ZBQXdGLENBQ3pGLENBQUM7S0FDSDtJQUNELElBQUksT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLElBQUksT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLEtBQUssQ0FDSCxDQUFDLENBQUMsRUFDRixDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFDNUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQzdDLENBQUM7SUFDRixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLENBQTJCO0lBQzlDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUN0QixDQUFTLEVBQ1QsS0FBb0M7SUFFcEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUNuQixNQUFnRCxFQUNoRCxJQUFJLEdBQUcsQ0FBQztJQUVSLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ2pCLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbEMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUMsQ0FBQztLQUNqRTtJQUNELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQXFCLENBQUM7SUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLGFBQWEsR0FBSSxPQUFPLENBQUMsQ0FBQyxDQUFhLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGNBQWM7SUFFekUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxLQUFLLEdBQUksT0FBTyxDQUFDLENBQUMsQ0FBYSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxjQUFjO1FBQ2pFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FDekIsMkNBQTJDLENBQzVDLENBQUM7U0FDTDtLQUNGO0lBQ0QsSUFBSSxPQUFPLENBQUM7SUFDWixJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzlCLG1CQUFtQjtRQUNuQixPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ2hDO1NBQU07UUFDTCxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzQztLQUNGO0lBRUQsSUFBSSxJQUFJLEVBQUU7UUFDUixxQkFBcUI7UUFDckIsSUFBSSxJQUFJLEdBQUcsQ0FBQztZQUFFLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUV6QyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2hDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLENBQTJCLEVBQUUsSUFBWTtJQUM1RCxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztJQUNyQixPQUFPLFNBQVMsR0FBRyxDQUFDLEVBQUU7UUFDcEIsU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7S0FDckI7SUFDRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLEVBQUU7UUFDcEMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQ3pCLE9BQU8sR0FBRyxJQUFJLEdBQUcsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FDMUUsQ0FBQztLQUNIO0lBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQ25CLENBQTJCLEVBQzNCLENBQUMsR0FBRyxDQUFDLEVBQ0wsT0FBMkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWpDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ1osQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNSO0lBQ0QsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLEtBQUssR0FBUSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3BELE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7S0FDcEQ7SUFDRCxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFO1FBQ3JFLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLENBQUM7S0FDeEQ7SUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDWCxPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMxQztJQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDekMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDWCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQW9CLENBQUMsQ0FBQztLQUMzRDtTQUFNO1FBQ0wsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFvQixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDM0Q7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUVqQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBRTdCLE1BQU0sVUFBVSxJQUFJLENBQUMsS0FBOEI7SUFDakQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUE4QjtJQUNsRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFDRCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQThCO0lBQ2xELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUNELE1BQU0sVUFBVSxNQUFNLENBQUMsS0FBOEI7SUFDbkQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBQ0QsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUE4QjtJQUNsRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFDRCxNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQThCO0lBQ25ELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUNELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBOEI7SUFDcEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBQ0QsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUE4QjtJQUNwRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFDRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQThCO0lBQ3pELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDN0MsQ0FBQyJ9