UNPKG

@d4c/numjs

Version:

Like NumPy, in TypeScript and JavaScript

763 lines 55.1 kB
/** * 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"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.diag = exports.ifft = exports.fft = exports.fftconvolve = exports.convolve = exports.round = exports.concatenate = exports.dot = exports.arctan = exports.tan = exports.arcsin = exports.sin = exports.arccos = exports.cos = exports.abs = exports.tanh = exports.leakyRelu = exports.clip = exports.sigmoid = exports.softmax = exports.random = exports.empty = exports.ones = exports.zeros = exports.arange = exports.negative = exports.transpose = exports.mod = exports.max = exports.min = exports.std = exports.mean = exports.sum = exports.power = exports.sqrt = exports.log = exports.exp = exports.reshape = exports.flatten = exports.equal = exports.subtract = exports.divide = exports.multiply = exports.add = exports.broadcast = exports.errors = exports.NdArray = exports.ndarray = exports.dtypes = exports.config = void 0; exports.uint8Clamped = exports.float64 = exports.float32 = exports.uint32 = exports.int32 = exports.uint16 = exports.int16 = exports.uint8 = exports.int8 = exports.remainder = exports.array = exports.rot90 = exports.flip = exports.stack = exports.identity = void 0; const cwise_1 = __importDefault(require("cwise")); const ndarray_ops_1 = __importDefault(require("ndarray-ops")); const ndarray_fft_1 = __importDefault(require("ndarray-fft")); var config_1 = require("./config"); Object.defineProperty(exports, "config", { enumerable: true, get: function () { return __importDefault(config_1).default; } }); var dtypes_1 = require("./dtypes"); Object.defineProperty(exports, "dtypes", { enumerable: true, get: function () { return __importDefault(dtypes_1).default; } }); var ndarray_1 = require("ndarray"); Object.defineProperty(exports, "ndarray", { enumerable: true, get: function () { return __importDefault(ndarray_1).default; } }); const ndarray_2 = require("./ndarray"); Object.defineProperty(exports, "NdArray", { enumerable: true, get: function () { return ndarray_2.NdArray; } }); const errors = __importStar(require("./errors")); exports.errors = errors; const utils_1 = __importDefault(require("./utils")); 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(); } exports.broadcast = broadcast; /** * Add arguments, element-wise. */ function add(a, b) { return ndarray_2.NdArray.new(a).add(b); } exports.add = add; /** * Multiply arguments, element-wise. */ function multiply(a, b) { return ndarray_2.NdArray.new(a).multiply(b); } exports.multiply = multiply; /** * Divide `a` by `b`, element-wise. */ function divide(a, b) { return ndarray_2.NdArray.new(a).divide(b); } exports.divide = divide; /** * Subtract second argument from the first, element-wise. */ function subtract(a, b) { return ndarray_2.NdArray.new(a).subtract(b); } exports.subtract = subtract; /** * Return true if two arrays have the same shape and elements, false otherwise. */ function equal(array1, array2) { return ndarray_2.NdArray.new(array1).equal(array2); } exports.equal = equal; /** * Return a copy of the array collapsed into one dimension using row-major order (C-style) */ function flatten(array) { return ndarray_2.NdArray.new(array).flatten(); } exports.flatten = 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 */ function reshape(array, shape) { // TypeScript is not smart enought on parameters detection on overloading // workaround way if (typeof shape == "number") { return ndarray_2.NdArray.new(array).reshape(shape); } else { return ndarray_2.NdArray.new(array).reshape(shape); } } exports.reshape = reshape; /** * Calculate the exponential of all elements in the input array, element-wise. */ function exp(x) { return ndarray_2.NdArray.new(x).exp(); } exports.exp = exp; /** * Calculate the natural logarithm of all elements in the input array, element-wise. */ function log(x) { return ndarray_2.NdArray.new(x).log(); } exports.log = log; /** * Calculate the positive square-root of all elements in the input array, element-wise. */ function sqrt(x) { return ndarray_2.NdArray.new(x).sqrt(); } exports.sqrt = sqrt; /** * Raise first array elements to powers from second array, element-wise. */ function power(x1, x2) { return ndarray_2.NdArray.new(x1).pow(x2); } exports.power = power; /** * Return the sum of input array elements. */ function sum(x) { return ndarray_2.NdArray.new(x).sum(); } exports.sum = sum; /** * Return the arithmetic mean of input array elements. */ function mean(x) { return ndarray_2.NdArray.new(x).mean(); } exports.mean = mean; /** * Returns the standard deviation, a measure of the spread of a distribution, of the input array elements. */ function std(x, options) { return ndarray_2.NdArray.new(x).std(options); } exports.std = std; /** * Return the minimum value of the array */ function min(x) { return ndarray_2.NdArray.new(x).min(); } exports.min = min; /** * Return the maximum value of the array */ function max(x) { return ndarray_2.NdArray.new(x).max(); } exports.max = 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. */ function mod(x1, x2) { return ndarray_2.NdArray.new(x1).mod(x2); } exports.mod = mod; /** * Permute the dimensions of the input array according to the given axes. */ function transpose(x, axes) { return ndarray_2.NdArray.new(x).transpose(axes); } exports.transpose = transpose; /** * Return the inverse of the input array, element-wise. */ function negative(x) { return ndarray_2.NdArray.new(x).negative(); } exports.negative = negative; function arange(...args) { if (arguments.length === 1) { return arange(0, arguments[0], 1, undefined); } else if (arguments.length === 2 && utils_1.default.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 && !utils_1.default.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_2.NdArray.new(result, dtype); } exports.arange = arange; /** * 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. * */ function zeros(shape, dtype) { if (utils_1.default.isNumber(shape) && shape >= 0) { shape = [shape]; } const s = utils_1.default.shapeSize(shape); const T = utils_1.default.getType(dtype); const arr = new ndarray_2.NdArray(new T(s), shape); if (arr.dtype === "array") { ndarray_ops_1.default.assigns(arr.selection, 0); } return arr; } exports.zeros = zeros; /** * 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 */ function ones(shape, dtype) { if (utils_1.default.isNumber(shape) && shape >= 0) { shape = [shape]; } const s = utils_1.default.shapeSize(shape); const T = utils_1.default.getType(dtype); const arr = new ndarray_2.NdArray(new T(s), shape); ndarray_ops_1.default.assigns(arr.selection, 1); return arr; } exports.ones = ones; /** * 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 */ function empty(shape, dtype) { if (utils_1.default.isNumber(shape) && shape >= 0) { shape = [shape]; } const s = utils_1.default.shapeSize(shape); const T = utils_1.default.getType(dtype); return new ndarray_2.NdArray(new T(s), shape); } exports.empty = empty; function random(...args) { let shape; if (arguments.length === 0) { return ndarray_2.NdArray.new(Math.random()); } else if (arguments.length === 1) { shape = utils_1.default.isNumber(args[0]) ? [args[0] | 0] : args[0]; } else { shape = [].slice.call(arguments); } const s = utils_1.default.shapeSize(shape); const arr = new ndarray_2.NdArray(new Float64Array(s), shape); ndarray_ops_1.default.random(arr.selection); return arr; } exports.random = random; /** * Return the softmax, or normalized exponential, of the input array, element-wise. */ function softmax(x) { const e = ndarray_2.NdArray.new(x).exp(); const se = e.sum(); // scalar ndarray_ops_1.default.divseq(e.selection, se); return e; } exports.softmax = softmax; /* istanbul ignore next */ const doSigmoid = (0, cwise_1.default)({ 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 */ function sigmoid(x, t = 1) { x = ndarray_2.NdArray.new(x).clone(); t = t || 1; doSigmoid(x.selection, t); return x; } exports.sigmoid = sigmoid; /* istanbul ignore next */ const doClip = (0, cwise_1.default)({ 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. */ 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_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); doClip(s.selection, min, max); return s; } exports.clip = clip; const doLeakyRelu = (0, cwise_1.default)({ args: ["array", "scalar"], body: function leakyReluCwise(xi, alpha) { xi = Math.max(alpha * xi, xi); }, }); function leakyRelu(x, alpha) { alpha = alpha || 1e-3; const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); doLeakyRelu(s.selection, alpha); return s; } exports.leakyRelu = leakyRelu; /* istanbul ignore next */ const doTanh = (0, cwise_1.default)({ 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. */ function tanh(x) { const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); doTanh(s.selection); return s; } exports.tanh = tanh; /** * Return absolute value of the input array, element-wise. */ function abs(x) { const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); ndarray_ops_1.default.abseq(s.selection); return s; } exports.abs = abs; /** * Return trigonometric cosine of the input array, element-wise. */ function cos(x) { const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); ndarray_ops_1.default.coseq(s.selection); return s; } exports.cos = cos; /** * Return trigonometric inverse cosine of the input array, element-wise. */ function arccos(x) { const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); ndarray_ops_1.default.acoseq(s.selection); return s; } exports.arccos = arccos; /** * Return trigonometric sine of the input array, element-wise. */ function sin(x) { const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); ndarray_ops_1.default.sineq(s.selection); return s; } exports.sin = sin; /** * Return trigonometric inverse sine of the input array, element-wise. */ function arcsin(x) { const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); ndarray_ops_1.default.asineq(s.selection); return s; } exports.arcsin = arcsin; /** * Return trigonometric tangent of the input array, element-wise. */ function tan(x) { const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); ndarray_ops_1.default.taneq(s.selection); return s; } exports.tan = tan; /** * Return trigonometric inverse tangent of the input array, element-wise. */ function arctan(x) { const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x); ndarray_ops_1.default.ataneq(s.selection); return s; } exports.arctan = arctan; /** * Dot product of two arrays. * * WARNING: supported products are: * - matrix dot matrix * - vector dot vector * - matrix dot vector * - vector dot matrix */ function dot(a, b) { return ndarray_2.NdArray.new(a).dot(b); } exports.dot = dot; 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_2.NdArray ? a.tolist() : utils_1.default.isNumber(a) ? [a] : a; } let m = arrays[0]; for (i = 1; i < arrays.length; i++) { a = arrays[i]; const mShape = utils_1.default.getShape(m); const aShape = utils_1.default.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_2.NdArray.new(m, arrays[0].dtype); } exports.concatenate = concatenate; /** * Round an array to the to the nearest integer. */ function round(x) { return ndarray_2.NdArray.new(x).round(); } exports.round = 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. */ function convolve(a, b) { return ndarray_2.NdArray.new(a).convolve(b); } exports.convolve = convolve; /** * 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. */ function fftconvolve(a, b) { return ndarray_2.NdArray.new(a).fftconvolve(b); } exports.fftconvolve = fftconvolve; function fft(x) { x = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.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; (0, ndarray_fft_1.default)(1, x.selection.pick.apply(x.selection, rPicker), x.selection.pick.apply(x.selection, iPicker)); return x; } exports.fft = fft; function ifft(x) { x = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.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; (0, ndarray_fft_1.default)(-1, x.selection.pick.apply(x.selection, rPicker), x.selection.pick.apply(x.selection, iPicker)); return x; } exports.ifft = ifft; /** * Extract a diagonal or construct a diagonal array. * @returns a view a of the original array when possible, a new array otherwise */ function diag(x) { return ndarray_2.NdArray.new(x).diag(); } exports.diag = 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 */ function identity(n, dtype) { const arr = zeros([n, n], dtype); for (let i = 0; i < n; i++) arr.set(i, i, 1); return arr; } exports.identity = identity; /** * 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. */ 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 (utils_1.default.isNumber(a) ? a : ndarray_2.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; } exports.stack = stack; /** * 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. */ function flip(m, axis) { m = ndarray_2.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); } exports.flip = flip; /** * 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. */ function rot90(m, k = 1, axes = [0, 1]) { k = k || 1; while (k < 0) { k += 4; } k = k % 4; m = ndarray_2.NdArray.new(m); let axes2 = ndarray_2.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]); } } exports.rot90 = rot90; /** * @param dtype Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array. */ exports.array = ndarray_2.NdArray.new; exports.remainder = mod; function int8(array) { return ndarray_2.NdArray.new(array, "int8"); } exports.int8 = int8; function uint8(array) { return ndarray_2.NdArray.new(array, "uint8"); } exports.uint8 = uint8; function int16(array) { return ndarray_2.NdArray.new(array, "int16"); } exports.int16 = int16; function uint16(array) { return ndarray_2.NdArray.new(array, "uint16"); } exports.uint16 = uint16; function int32(array) { return ndarray_2.NdArray.new(array, "int32"); } exports.int32 = int32; function uint32(array) { return ndarray_2.NdArray.new(array, "uint32"); } exports.uint32 = uint32; function float32(array) { return ndarray_2.NdArray.new(array, "float32"); } exports.float32 = float32; function float64(array) { return ndarray_2.NdArray.new(array, "float64"); } exports.float64 = float64; function uint8Clamped(array) { return ndarray_2.NdArray.new(array, "uint8_clamped"); } exports.uint8Clamped = uint8Clamped; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFYixrREFBMEI7QUFDMUIsOERBQThCO0FBQzlCLDhEQUFnQztBQUVoQyxtQ0FBNkM7QUFBcEMsaUhBQUEsT0FBTyxPQUFVO0FBQzFCLG1DQUE2QztBQUFwQyxpSEFBQSxPQUFPLE9BQVU7QUFDMUIsbUNBQTZDO0FBQXBDLG1IQUFBLE9BQU8sT0FBVztBQUMzQix1Q0FLbUI7QUFDVix3RkFMUCxpQkFBTyxPQUtPO0FBQ2hCLGlEQUFtQztBQUMxQix3QkFBTTtBQUVmLG9EQUF3QjtBQUV4QixTQUFnQixTQUFTLENBQUMsTUFBZ0IsRUFBRSxNQUFnQjtJQUMxRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzlDLE9BQU87S0FDUjtJQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RCxNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFL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RyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsa0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLEdBQUcsQ0FBQyxDQUFvQztJQUN0RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsa0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxDQUFvQztJQUN6RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsd0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLEdBQUcsQ0FBQyxDQUFvQztJQUN0RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsa0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxDQUFvQztJQUN6RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsd0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLEdBQUcsQ0FBQyxDQUFvQztJQUN0RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsa0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxDQUFvQztJQUN6RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsd0JBSUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLEdBQUcsQ0FDakIsQ0FBMkIsRUFDM0IsQ0FBMkI7SUFFM0IsT0FBTyxpQkFB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